可执行目标文件中的.rela.plt节是什么?

问题描述

我使用静态链接生成可执行对象文件,并使用readelf检查文件,发现其中一个部分称为:.rela.plt

关键字“ rela”表示这与重定位有关。但是由于我使用静态链接,而不使用任何共享库,因此输出可执行文件应该是完全链接的可执行文件,那么为什么该文件仍包含重定位信息?

解决方法

在静态链接程序中,有两种方法可以使运行时重定位结束。

  • GNU工具链支持在运行时使用IFUNC mechanism选择不同的函数实现。在x86-64上,这些显示为R_X86_64_IRELATIVE重定位。
  • 某些目标支持静态链接的位置无关可执行文件(通过GNU工具链中的-static-pie)。由于由于地址空间布局随机化,加载的地址因程序而异,因此,包含指针的任何全局数据对象都需要在运行时进行重定位。在x86-64上,这些重定位显示为R_X86_64_RELATIVE

(在其他情况下,在静态链接程序中可能还有其他需要重定位的地方。)