为什么静态链接的可执行文件中存在全局偏移表和过程链接表?

时间:2016-01-18 08:19:25

标签: linux gcc linker

我已经完成了一系列关于动态链接器重定位和位置无关代码的读取,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要PLT和GOT。我在我的ubuntu x86_64机器上编译了一个hello world程序,当我使用readelf -S转储节标题时,它会显示PLT和GOT部分。

我还创建了一个带有简单增量函数的共享库,我使用gcc -shared编译而没有-fpic,我也看到了PLT和GOT部分。我也没想到这一点。

1 个答案:

答案 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