ILD

ELF:Intel architecture and System V Release 4 Dependencies
作者:Herbert Yuan 邮箱:yuanjp89@163.com
发布时间:2017-12-31 站点:Inside Linux Development

Sections

Special sections

.got 包含global offset tables

.plt 包含procedure linkage table

NameTypeAttributes
.gotSHT_PROGBITSSHF_ALLOC+SHF_WRITE
.pltSHT_PROGBITSSHF_ALLOC+SHF_EXECINSTR


Symbol Table

symbol values

如果一个可执行文件包含定义在其依赖共享库中的函数的引用,则符号表section包含一个那个符号的条目。st_shndx的值位SHN_UNDEF,这告诉动态链接器那个函数的定义不包含在可执行文件中。如果那个符号在可执行文件中分配了一个PLT条目。这符号表中的st_value值为那个PLT条目的第一条指令的虚拟地址。否则st_value的值为0。动态链接器使用PLT条目的地址来解析对函数地址的引用。


Relocation

Relocation Types

A

 一个加数,如一个section内的偏移。


B

通常是共享库加载到内存的地址,通常共享库链接为0地址,但是执行地址将不同。


G

GOT表的偏移,在执行期间,重定向条目的符号的地址位于那个地址。


GOT

GOT表的地址。


L

PLT条目的地址(section offset或address)PLT条目定向函数调用到合适的目的地,链接器创建初始的PLT,动态链接器在程序执行时修改条目。


P

要重定向的存储单元的地址(section offset或address)。通过重定向的r_offset计算。


S

要重定向的符号的值。


NameValueFieldCalculation
R_386_GOT323word32G + A
R_386_PLT324word32L + A - P
R_386_COPY5nonenone
R_386_GLOB_DAT6word32S
R_386_JMP_SLOT7word32S
R_386_RELATIVE8word32B + A
R_386_GOTOFF9word32S + A - GOT
R_386_GOTPC10word32GOT + A - P



R_386_GLOB_DAT    

用于设置GOT条目为指定符号的地址。


R_386_JMP_SLOT    

链接编辑器创建这个重定向类型用于动态链接,它的偏移给出了重定向条目的位置。动态链接器修改PLT条目,来转移控制到符号的地址。


R_386_RELATIVE    

链接器创建这个重定向类型用于动态链接,它的偏移给出了shared object中的一个位置,这个位置包含一个相对地址。这种重定向条目的符号表索引必须为0,意味着这种条目没有对应的符号。


R_386_GOTOFF

符号值和GOT表的偏移。


R_386_GOTPC        

和R_386_PC32类似,不过它计算GOT表和当前PC的偏移。这个重定向类型的符号通常是_GLOBAL_OFFSET_TABLE_


Program Loading and Dynamic Linking

program loading


Dynamic Linking

Dynamic Section

Dynamic setcion中的条目给出了动态链接器需要的信息。这些信息是处理器相关的。

DT_PLTGOT,在Intel架构上,给出了GOT表的第一个条目的地址。


Global Offset Table

位置独立代码不能包含绝对虚拟地址。GOT在私有数据中保存了绝对地址。程序通位置独立寻址来引用GOT表,提取绝对地址。

R_386_GLOB_DAT重定向类型指向GOT表,来重定向符号的绝对地址。

如果程序要求直接访问一个符号的绝对地址,那个符号将有一个GOT条目。因为可执行文件和共享库有独立的GOT,因此一个符号可能出现在多个表中。动态链接器在将控制交给进程之前会处理所有的GOT重定向。

GOT的前3条保留。

GOT可能在.got section的中间。


Function addresses


Procedure Linkage Table



Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.