链接器如何将程序头添加到可重定位文件?

时间:2018-08-22 12:10:56

标签: linux linker ld elf readelf

因此我们知道linker(在我的情况下是ld)在创建实际的Program Headers时将Relocatable file添加到Executable

然后,这些标头用于在运行时将程序加载到内存中。

  • 首先ld如何计算并将这些标头添加到文件中?

  • 然后,如果Program Headers仅用于将程序加载到内存中(如果我错了,请纠正我),为什么不同的可执行文件具有不同数量的Program Headers? p>

例如,一个用汇编语言编写的简单helloworld具有 2个程序标头

readelf -h helloworld
...
  Number of program headers:         2
...

但是bash具有 11个程序标头

readelf -h /bin/bash
...
  Number of program headers:         11
...

1 个答案:

答案 0 :(得分:2)

  

首先ld如何计算这些标头并将其添加到文件中?

这个问题太笼统了。您不妨阅读this series的博客文章,其中介绍了链接程序的工作原理。

  

然后,如果程序头仅用于将程序加载到内存中(如果我错了,请纠正我),为什么不同的可执行文件具有不同数量的程序头?

可执行文件具有不同的程序标题,因为它们具有不同的需求。

例如,全静态可执行文件不需要与动态链接程序进行任何交互,因此不需要PT_DYNAMIC段(以及描述该段的程序头)。

常见的动态链接的可执行文件将至少具有两个PT_LOAD段(数据和代码),PT_INTERP(用于说明要使用哪个运行时加载程序),PT_DYNAMIC(用于说明哪些共享库)使用以及ld.soPT_NOTE(用于链接器内部ID)和PT_PHDR的其他信息。每一个都有自己的程序头。