问题描述
我使用静态链接生成可执行对象文件,并使用readelf
检查文件,发现其中一个部分称为:.rela.plt
关键字“ rela”表示这与重定位有关。但是由于我使用静态链接,而不使用任何共享库,因此输出可执行文件应该是完全链接的可执行文件,那么为什么该文件仍包含重定位信息?
解决方法
在静态链接程序中,有两种方法可以使运行时重定位结束。
- GNU工具链支持在运行时使用IFUNC mechanism选择不同的函数实现。在x86-64上,这些显示为
R_X86_64_IRELATIVE
重定位。 - 某些目标支持静态链接的位置无关可执行文件(通过GNU工具链中的
-static-pie
)。由于由于地址空间布局随机化,加载的地址因程序而异,因此,包含指针的任何全局数据对象都需要在运行时进行重定位。在x86-64上,这些重定位显示为R_X86_64_RELATIVE
。
(在其他情况下,在静态链接程序中可能还有其他需要重定位的地方。)