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

Mik*_*ney 3 linux linker gcc

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

我还创建了一个共享库,它带有一个简单的增量函数,gcc -shared不带该函数即可进行编译,-fpic并且还可以看到PLT和GOT部分。我也没想到这一点。

Emp*_*ian 5

我不明白为什么静态链接的可执行文件需要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
Run Code Online (Sandbox Code Playgroud)

注意:不要删除.rela.plt,因为实现IFUNCs 仍需要该部分。