gpt4 book ai didi

c - ELF 文件中的程序头和节头

转载 作者:行者123 更新时间:2023-11-30 17:30:04 24 4
gpt4 key购买 nike

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

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

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

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

谢谢

最佳答案

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

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

但是可执行文件也可以包含节 - 来描述文件的内容以及每段代码或数据的开始位置。共享对象也使用节。它们包含用于动态链接的符号表和类似的东西。

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

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

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

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

<小时/>至于内存地址和其他东西:
在现代系统上,只有虚拟地址很重要。进程被操作系统欺骗,认为它在内存中单独运行,整个地址空间都可用(尽管由于物理内存限制,并非所有地址空间同时可用) )。系统动态地将虚拟地址映射到物理地址,对进程来说是透明的。

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

关于c - ELF 文件中的程序头和节头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com