我已经阅读了大量有关动态链接器重定位和位置无关代码的内容,包括过程链接表和全局偏移表。我不明白为什么静态链接的可执行文件需要 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
and .got
来自那里的条目。
您可以删除这些部分,二进制文件仍然可以工作:
objcopy -R.got -R.plt a.out a.out2
注意:请勿剥离.rela.plt
,因为该部分仍需要实施IFUNC
s.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)