我已经完成了大量有关动态链接器重定位和位置无关代码的阅读,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要PLT和GOT。我在ubuntu x86_64机器上编译了一个hello world程序,当我转储节标题时,readelf -S它显示了PLT和GOT节。
我还创建了一个共享库,它带有一个简单的增量函数,gcc -shared不带该函数即可进行编译,-fpic并且还可以看到PLT和GOT部分。我也没想到这一点。
我不明白为什么静态链接的可执行文件需要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 仍需要该部分。
| 归档时间: |
|
| 查看次数: |
427 次 |
| 最近记录: |