摘要: 这个问题在我大三的时候开始搞嵌入式编程一直困扰着我。后来做了一些实验搞懂了,但当时还没有写博客的习惯。 * p_vaddr 也就是运行地址 该成员给出了该段在内存中的首字节地址。* p_paddr 也就是加载地址 在物理地址定位有关联的系统中,该成员是为该段的物理地址而保留的。由于 System V 阅读全文
posted @ 2016-07-21 19:40 __sipl 阅读(760) 评论(0) 推荐(0) 编辑
摘要: 在编译共享库必须加上-fpic。这是为什么呢? 首先看一个简单的例子: 先不加-fpic的情况下生成库,反汇编查看fun1的机器码 可以看出调用printf的位置是那个唯一的一个call,并不是跳转到plt表,有关plt表的内容可以查看我前面的博文。也就是说在该库被加载时需要修改代码段来达到重定位的 阅读全文
posted @ 2016-07-21 13:51 __sipl 阅读(2775) 评论(0) 推荐(0) 编辑
摘要: 仅仅是记录一下自己写过的堆操作的代码,个人觉得堆的优势在于建立和获取最小或者最大元的方便,有任何次序要求的算法,堆并不合适。 阅读全文
posted @ 2016-07-20 15:49 __sipl 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 今天忽然想到cpu对各种基本运算的速度对比,我对比了异或,加法和乘法,结果发现速度时间,加法小于乘法小于异或, 原本我以为异或会是最快的,结果异或是最慢的,这跟cpu中的alu算术逻辑单元的实现有关,可能各个cpu的情况会不同, 阅读全文
posted @ 2016-07-16 20:49 __sipl 阅读(2453) 评论(0) 推荐(0) 编辑
摘要: 以下用大O表示节点,ABC表示三个集合。 仅分析左子树的情况,因为对称,右子树的情况一样。 插入节点前 O / \ O A / \ B C 插入节点后: O / \ O A / \ B C / O 此时造成了最高节点的不平衡,说明了B+2 - A = 2;另外可以知道B = C,考虑B<C,那么在插 阅读全文
posted @ 2016-07-14 19:36 __sipl 阅读(490) 评论(0) 推荐(0) 编辑
摘要: 对于二叉查找树的最大难处,我觉得是在于删除,当删除一个元素时,简单地说有两种情况,一种是节点,一种是叶子。假设被删除值为D 1.叶子,很简单,找到叶子的父节点,然后将这个父节点指向该叶子的树枝赋为0;有一种特殊情况是就一个根,那么释放根,然后返回0。 2.节点,需要做两步,找到该节点的左子树的最大值 阅读全文
posted @ 2016-07-13 17:25 __sipl 阅读(532) 评论(0) 推荐(0) 编辑
摘要: 声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享。 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的。也正因为这些错误,加深了我的学习深度。 最近因为在学习一些调试的技术,但是很少有提到如何在函数运行时 阅读全文
posted @ 2016-07-01 17:26 __sipl 阅读(9542) 评论(0) 推荐(2) 编辑
摘要: call和jmp都是跳转指令,但是call的同时会把pc地址压入堆栈,并且这两种方式都有远和近跳转。下面的分析不全,因为没有在网上找到足够的资料,个人创造这个情景还是有些困难。 1.例子中的call的机器码为0xe8。 0x400204ba <+30>: e8 41 b6 05 00 call 0x 阅读全文
posted @ 2016-07-01 10:39 __sipl 阅读(4824) 评论(0) 推荐(0) 编辑
摘要: 一般来讲,对非法地址的访问会导致应用程序收到由系统发送的sigsegv信号,默认情况下,函数对于这个信号的处理是退出。 但是为了方便调试,我们可以自己设置处理函数,使用signal函数。 这里比较重要的一点是,按照流程,cpu取完一条指令时,pc会指向下一条指令,那么如果我们指定函数对sigsegv 阅读全文
posted @ 2016-06-30 16:00 __sipl 阅读(1390) 评论(0) 推荐(0) 编辑
摘要: .plt的作用是一个跳板,保存了某个符号在重定位表中的偏移量(用来第一次查找某个符号)和对应的.got.plt的对应的地址 .rel.dyn重定向表,在程序启动时就需要重定位完成。 .rel.plt保存了重定位表的信息,可以使用lazy的连接方式 .got据说是保存了elf文件本身的各个符号的偏移量 阅读全文
posted @ 2016-06-21 16:37 __sipl 阅读(5731) 评论(0) 推荐(1) 编辑