ELF文件中的程序头和节头

时间:2014-08-14 19:10:45

标签: c linker loader elf

这是一个问题的重复,但我无法快速找到问题的答案。这就是问问的原因。

某些ELF文件包含(可执行文件或共享库)程序头,用于解释段。 它们包含一个称为虚拟地址和文件偏移以及其他一些字段的字段。

还有相应的部分解释“内存中的地址”和文件偏移。

现在我对部分和细分如何相关感到困惑。 (对于静态编译的可执行文件和非静态编译的可执行文件。) 静态编译的二进制文件的文件偏移量有何不同?程序头中的虚拟地址与节头中的内存地址之间是否存在任何关系。

由于

1 个答案:

答案 0 :(得分:0)

是文件的最小连续区域。因此,ELF文件可细分为多个部分。节不能重叠,也就是说,任何字节都不能是一个以上节的一部分。但是可能存在不属于任何节(“垃圾”)的字节。

部分通常用于链接目的。它们包含文件的不同部分,可以由链接程序重新排列,合并等。

但是可执行文件也可以包含部分,以描述文件的内容以及每段代码或数据的起始位置。共享对象也使用节。这些包含用于动态链接的符号表之类的东西。

ELF文件中包含的所有节均在节标题表中进行了描述,每个节中都有一个条目。

但是要生成可执行文件,您还需要其他内容:。这些告诉加载程序应该将文件的哪些部分加载到内存中以及到哪个地址。因此,段映射到可执行进程的内存空间。它们可以包含代码和数据,因此可以将段细分为各个部分以实现此目的。我想这就是您的问题的答案。

可加载段在程序头表中描述。

长话短说:
在可执行文件中,您具有细分,可以细分为多个部分。段被加载到进程的内存中。各节是可选的,但可以帮助进一步细分各节或描述其内容。 在可重定位模块(编译器输出,.o文件)中,存在另一种方式:需要 section ,因为它们描述了文件中的内容并允许链接。


至于内存地址和内容:
在现代系统上,仅虚拟地址很重要。操作系统欺骗了一个进程,该进程在内存中单独运行,并具有整个地址空间(尽管由于物理内存限制,并非 all 可以同时使用该地址空间) )。系统将虚拟地址动态映射到物理地址,这对进程是透明的。

不使用物理地址,因此可以将其保留为零,但可以将其设置为相同的地址,以防万一。