http://blogold.chinaunix.net/u3/105409/showart_2086528.html
重定位表中的每个表项都包含了如何修改某个目标项的信息,一般,同一个重定位表中的表项都是描述同一个节区中符号的修改信息.下面是重定位表项的数据结构:
typedefstructelf32_rel { /* The following are used with relocations */ #define ELF32_R_SYM(x) ((x) >> 8) #define ELF32_R_TYPE(x) ((x) & 0xff) |
其中,
r_offset表示的是从节区头部开始到将被重定位影响的存储单位之间的字节偏移 即指明了重定位操作的实施位置;
r_info也包含两个信息 一为重定位类型(低8位) 即指明了重定位操作的方法,二为被实施重定位的符号索引(高24位) 即指明了操作的实施对象.
下表是x86结构下重定位操作的类型和说明.
名称 | 数值 | 字段 | 计算 | 说明 |
R_386_NONE | 0 | (无) | (无) | |
R_386_32 | 1 | word32 | S+A | |
R_386_PC32 | 2 | word32 | S+A-P | |
R_386_GOT32 | 3 | word32 | G+A-P | 此重定位类型计算从全局偏移表基址到符号的全局偏移表项之间的距离。它会通知连接编辑器构造一个全局偏移表。 |
R_386_PLT32 | 4 | word32 | L+A-P | 此重定位类型计算符号的过程链接表项的地质,并通知链接编辑器构造一个过程链接表。 |
R_386_COPY | 5 | (无) | (无) | 链接编辑器创建这种重定位类型的目的是支持动态链接。其偏移量成员引用某个可写段中的某个位置。符号表索引规定符号应该既存在于当前目标文件中,也存在于某个共享目标中。在执行过程中,动态链接器把与共享目标的符号相关的数据复制到由偏移给出的位置。 |
R_386_GLOB_DAT | 6 | word32 | S | 此重定位类型用来把某个全局偏移表项设置为给定符号的地址。这种特殊的重定位类型允许确定符号与全局偏移表项之间的关系。 |
R_386_JMP_SLOT | 7 | word32 | S | 链接编辑器创建这种重定位类型主要是为了支持动态链接。其偏移地址成员给出过程链接表项的位置。动态链接器修改过程链接表项的内容,把控制传输给指定符号的地址。 |
R_386_RELATIVE | 8 | word32 | B+A | 链接编辑器创建这种重定位类型是为了支持动态链接。其偏移地址成员给出共享目标中的一个位置,在该位置包含了代表相对地址的一个数值。动态链接器通过把共享目标被加载到的虚地址和相对地址相加,计算对应的虚地址。这种类型的重定位项必须设置符号表索引为 0。 |
R_386_GOTOFF | 9 | word32 | S+A-GOT | 这种重定位类型会计算符号取值与全局偏移表地址间的差。并通知链接编辑器创建一个全局偏移表。 |
R_386_GOTPC | 10 | word32 | GOT+A-P | 此重定位类型与 R_386_PC32 类似,只不过它在计算时采用全局偏移表的地址。在此重定位项中引用的符号通常是_GLOBAL_OFFSET_TABLE_,这种类型也会暗示连接编辑器构造全局偏移表。 |