【问题标题】:program headers and section headers in ELF filesELF 文件中的程序头和节头
【发布时间】:2014-08-14 19:10:44
【问题描述】:

这是一个问题的重复,但我无法很快找到我的问题的答案。这就是为什么要问它。

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

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

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

谢谢

【问题讨论】:

  • 我自己发现了一篇很好的文章,它消除了我的大部分困惑:“mylinuxbook.com/readelf-command
  • 您能以回答问题的形式总结一下您学到的知识吗?

标签: c linker loader elf


【解决方案1】:

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

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

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

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

但是为了制作一个可执行文件,你还需要一些别的东西:segments。这些告诉加载器应该将文件的哪些部分加载到内存中以及加载到哪些地址。所以段映射到可执行进程的内存空间。它们可以包含代码和数据,因此可以将细分细分为多个部分来实现这一点。我想这就是你问题的答案。

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

长话短说:
在可执行文件中,您有段,可以进一步细分为部分。段被加载到进程的内存中。部分是可选的,但可以帮助进一步细分细分或描述其内容。 在可重定位模块(编译器输出、.o 文件)中,情况正好相反:sections 是必需的,因为它们描述了文件中的内容并允许链接。


至于内存地址和东西:
在现代系统上,只有虚拟地址很重要。一个进程被操作系统欺骗,它在内存中单独运行,整个地址空间都可供它使用(尽管不是所有由于物理内存限制,地址空间可能同时可用)。系统动态地将虚拟地址映射到物理地址,对进程透明。

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

【讨论】:

    猜你喜欢
    • 2014-06-16
    • 1970-01-01
    • 2020-08-15
    • 2023-03-15
    • 2015-06-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多