全局偏移表(GOT)和过程链接表(PLT)
ELF 格式的共享库使用 PIC 技术使代码和数据的引用与地址无关,程序可以被加载到地址空间的任意位置。PIC 在代码中的跳转和分支指令不使用绝对地址。PIC 在 ELF 可执行映像的数据段中建立一个存放所有全局变量指针的全局偏移量表 GOT
对于模块外部引用的全局变量和全局函数,用 GOT 表的表项内容作为地址来间接寻址;对于本模块内的静态变量和静态函数,用 GOT 表的首地址作为一个基准,用相对于该基准的偏移量来引用,因为不论程序被加载到何种地址空间,模块内的静态变量和静态函数与 GOT 的距离是固定的,并且在链接阶段就可知晓其距离的大小。这样,PIC 使用 GOT 来引用变量和函数的绝对地址,把位置独立的引用重定向到绝对位置。
对于 PIC 代码,代码段内不存在重定位项,实际的重定位项只是在数据段的 GOT 表内。共享目标文件中的重定位类型有 R_386_RELATIVE、R_386_GLOB_DAT 和 R_386_JMP_SLOT,用于在动态链接器加载映射共享库或者模块运行的时候对指针类型的静态数据、全局变量符号地址和全局函数符号地址进行重定 位。

ELF格式的共享库利用PIC技术实现地址无关,GOT用于存放全局变量和函数的地址,PLT则用于位置无关的函数调用重定向。动态链接器在程序运行时对GOT和PLT进行重定位,确保程序正确执行。动态链接过程中,GOT的第1、2项有特殊用途,PLT支持惰性绑定并首次调用时执行符号解析。动态库加载涉及映射、动态段处理和重定位步骤。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



