因此我们知道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
...
答案 0 :(得分:2)
首先ld如何计算这些标头并将其添加到文件中?
这个问题太笼统了。您不妨阅读this series的博客文章,其中介绍了链接程序的工作原理。
然后,如果程序头仅用于将程序加载到内存中(如果我错了,请纠正我),为什么不同的可执行文件具有不同数量的程序头?
可执行文件具有不同的程序标题,因为它们具有不同的需求。
例如,全静态可执行文件不需要与动态链接程序进行任何交互,因此不需要PT_DYNAMIC
段(以及描述该段的程序头)。
常见的动态链接的可执行文件将至少具有两个PT_LOAD
段(数据和代码),PT_INTERP
(用于说明要使用哪个运行时加载程序),PT_DYNAMIC
(用于说明哪些共享库)使用以及ld.so
,PT_NOTE
(用于链接器内部ID)和PT_PHDR
的其他信息。每一个都有自己的程序头。