1

所以我们知道linker(在我的情况下ldProgram HeadersRelocatable file创建实际的Executable.

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

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

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

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

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

但是bash11 个程序头

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

1 回答 1

2

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

这个问题太笼统,无法回答。您可能希望阅读这一系列解释链接器工作原理的博文。

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

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

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

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

于 2018-08-22T17:19:59.230 回答