GOT(Global Offset Table)和PLT(Procedure Linkage Table)是动态链接过程中非常重要的两个数据结构,理解它们对于掌握程序动态链接机制至关重要。
首次调用外部函数时:
后续调用同一函数时:
.got
:存储全局变量引用.got.plt
:存储函数引用GOT[n]: 0xXXXXXXXX (函数实际地址)
assembly
PLT[n]:
jmp *GOT[n] ; 第一次跳转到解析例程,之后跳转到真实函数
push n ; 压入函数索引
jmp PLT[0] ; 跳转到解析例程
readelf -S executable | grep -E 'plt|got'
readelf -r executable # 查看重定位表
objdump -d -j .plt executable
objdump -R executable # 查看动态重定位项
gdb executable
(gdb) disas function@plt # 查看函数的PLT条目
(gdb) x/x &function@got.plt # 查看GOT表中的地址
Partial RELRO
:重定位段在初始化后设为只读Full RELRO
:所有重定位在程序启动时完成,整个GOT设为只读gcc -Wl,-z,now -Wl,-z,relro # 启用Full RELRO
通过深入理解GOT和PLT表,你可以更好地掌握程序在动态链接环境下的行为,这对于系统编程、安全研究和性能优化都非常重要。