.got 包含global offset tables
.plt 包含procedure linkage table
Name | Type | Attributes |
.got | SHT_PROGBITS | SHF_ALLOC+SHF_WRITE |
.plt | SHT_PROGBITS | SHF_ALLOC+SHF_EXECINSTR |
如果一个可执行文件包含定义在其依赖共享库中的函数的引用,则符号表section包含一个那个符号的条目。st_shndx的值位SHN_UNDEF,这告诉动态链接器那个函数的定义不包含在可执行文件中。如果那个符号在可执行文件中分配了一个PLT条目。这符号表中的st_value值为那个PLT条目的第一条指令的虚拟地址。否则st_value的值为0。动态链接器使用PLT条目的地址来解析对函数地址的引用。
A
一个加数,如一个section内的偏移。
B
通常是共享库加载到内存的地址,通常共享库链接为0地址,但是执行地址将不同。
G
GOT表的偏移,在执行期间,重定向条目的符号的地址位于那个地址。
GOT
GOT表的地址。
L
PLT条目的地址(section offset或address)PLT条目定向函数调用到合适的目的地,链接器创建初始的PLT,动态链接器在程序执行时修改条目。
P
要重定向的存储单元的地址(section offset或address)。通过重定向的r_offset计算。
S
要重定向的符号的值。
Name | Value | Field | Calculation |
R_386_GOT32 | 3 | word32 | G + A |
R_386_PLT32 | 4 | word32 | L + A - P |
R_386_COPY | 5 | none | none |
R_386_GLOB_DAT | 6 | word32 | S |
R_386_JMP_SLOT | 7 | word32 | S |
R_386_RELATIVE | 8 | word32 | B + A |
R_386_GOTOFF | 9 | word32 | S + A - GOT |
R_386_GOTPC | 10 | word32 | GOT + 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_
略
Dynamic setcion中的条目给出了动态链接器需要的信息。这些信息是处理器相关的。
DT_PLTGOT,在Intel架构上,给出了GOT表的第一个条目的地址。
位置独立代码不能包含绝对虚拟地址。GOT在私有数据中保存了绝对地址。程序通位置独立寻址来引用GOT表,提取绝对地址。
R_386_GLOB_DAT重定向类型指向GOT表,来重定向符号的绝对地址。
如果程序要求直接访问一个符号的绝对地址,那个符号将有一个GOT条目。因为可执行文件和共享库有独立的GOT,因此一个符号可能出现在多个表中。动态链接器在将控制交给进程之前会处理所有的GOT重定向。
GOT的前3条保留。
GOT可能在.got section的中间。
Function addresses
Procedure Linkage Table