2014年1月5日

Chap-4 Section 4.2.4 指令修正方式

摘要: 对于X86平台下的ELF文件的重定位入口所修正的指令寻址方式只有两种:绝对近址32寻址和相对近址32寻址。这两种指令修正方式每个被修正的位置的长度都为32位,即4个字节,而且都是近址寻址,不用考虑Intel的段间远址寻址。r_info成员的低8位表示重定位入口的类型。X86基本重定位类型宏定义 值 重定位修正方法R_386_32 1 绝对寻址修正 S + AR_386_PC32 2 相对寻址修正 S + A - PA = 保存在指令中被修正位置的值P = 被修正的位置(相对于段开始的偏移量或者虚拟地址),该值可以通过r_offset... 阅读全文

posted @ 2014-01-05 01:01 Persistence 阅读(851) 评论(0) 推荐(0)

Chap-4 Section 4.2.3 符号解析

摘要: 4.2.3 符号解析在平时的编程过程中,之所以要进行链接是因为我们目标文件中用到的符号被定义在其他文件中,所以要将它们链接起来。例如,直接用ld来链接a.o,而不将b.o做为输入,链接器就会发现shared和swap这两个符号没有被定义,会出现下面如图4.2.6的错误:***图4.2.6***上图所示的错误也是我们平时编程过程中遇到的常见问题之一,就是链接符号未定义。导致这个问题的原因很多,最常见的一般都是链接时缺少某个库,或者输入目标文件路径不正确,或者符号的定义和生命不一样。通过上面的介绍,可以深层次的理解为什么缺少符号的定义会导致链接错误,其实重定位的过程也伴随着符号解析的过程,每个目标 阅读全文

posted @ 2014-01-05 00:56 Persistence 阅读(220) 评论(0) 推荐(0)

Chap-4 Section 4.2.2 重定位表

摘要: 4.2.2 重定位表链接器怎么知道那些指令是要被调整?而这些指令的中那些部分需要被调整?记得在ELF文件中有一个重定位表,专门保存这些与重定位相关的信息,重定位表往往是一个或者多个重定位段。对于每个要被重定位的段在ELF中都会有一个对应的重定位段。比如代码段“.text”有要被重定位的地方,那么会有一个相对应的“.rel.text”段保存代码段中的重定位表。可以用objdump -r a.o来查看ELF文件的重定位表。如图4.2.4所示:***图4.2.4***上图显示了目标文件a.o中所引用到的外部符号的地址。每个要被重定位的地方叫重定位入口(Relocation Entry),可以看到a. 阅读全文

posted @ 2014-01-05 00:54 Persistence 阅读(471) 评论(0) 推荐(0)

导航