我已经完成了一系列关于动态链接器重定位和位置无关代码的读取,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要PLT和GOT。我在我的ubuntu x86_64机器上编译了一个hello world程序,当我使用readelf -S
转储节标题时,它会显示PLT和GOT部分。
我还创建了一个带有简单增量函数的共享库,我使用gcc -shared
编译而没有-fpic
,我也看到了PLT和GOT部分。我也没想到这一点。
答案 0 :(得分:4)
我不明白为什么静态链接的可执行文件需要PLT和GOT。
没有。
我在我的ubuntu x86_64机器上编译了一个hello world程序,当我用readelf -S转储节头时,它显示了PLT和GOT部分。
这是实施的意外。这些部分来自crt1.o
,并且没有单独的crt1s.o
用于完全静态链接,因此您最终会获得.plt
和.got
条目。
您可以删除这些部分,二进制文件仍然有效:
objcopy -R.got -R.plt a.out a.out2
注意:请勿删除.rela.plt
,因为仍需要该部分来实现IFUNC
。