ELF文件 - 什么是部分,为什么我们需要它?

时间:2013-05-29 11:23:01

标签: elf

我一直在阅读ELF标准here。据我所知,每个ELF包含ELF头,程序头(为什么不止一个?)和节头。任何人都可以解释一下:

  1. 如何生成ELF文件?它是编译器的责任吗?
  2. 什么是部分,为什么我们需要它们?
  3. 什么是程序标题,为什么需要它们?
  4. 在程序头内,p_vaddr和p_paddr字段的含义是什么?
  5. 每个部分都有自己的章节标题吗?
  6. 或者,是否有人链接到更友好的ELF文件?

4 个答案:

答案 0 :(得分:1)

这是我发现的最佳文档:http://www.skyfree.org/linux/references/ELF_Format.pdf

  1. 每个部分只有一个部分标题,但可以有不带部分的部分标题

答案 1 :(得分:1)

This link包括更好的解释。

  1. 如何生成ELF文件?它是编译器的责任吗?*

    它取决于架构。

  2. 什么是部分,我们为什么需要它们?

    不同的部分有不同的信息,如代码,初始化数据,未初始化的数据等。这些信息将由编译器和链接器使用。

  3. 什么是程序标题,为什么我们需要它们?

    操作系统在加载可执行文件时使用程序头。这些头文件包含有关段的信息(具有一些权限的连续内存块),例如需要加载哪些部分,解释器信息等。

  4. 在程序头内,p_vaddr和p_paddr字段的含义是什么?

    通常虚拟地址和物理地址相同。但可能会有所不同取决于系统。

  5. 每个部分都有自己的章节标题吗?

    是肯定的。每个部分在部分标题表中都有一个部分标题条目。

答案 2 :(得分:0)

2 - 有许多不同的部分,例如:重定位部分为重定位符号重新进行许多信息。我使用信息加载elf对象并运行/重定位对象。 Antoher示例:调试部分记录调试信息,gdb使用数据显示调试消息。 符号部分记录符号信息。

3 - loader使用的编程头,loader通过查找编程头来加载elf执行文件。

答案 3 :(得分:0)

  1. 如何生成ELF文件?是编译器的责任吗?

    它们可以由编译器,汇编器或任何其他可以生成它们的工具生成。即使是您自己编写的用于生成ELF文件的程序,也是如此;)它们毕竟只是字节流,因此可以通过仅以二进制模式将字节写入文件来生成它们。您也可以这样做。

  2. 什么是部分,为什么我们需要它们?

    ELF文件分为几个部分。节是文件中最小的连续区域。您可以将它们视为组织器中的页面,每个页面都有其自己的名称和类型,以描述其中包含的内容。链接器使用此信息通过合并相同类型的部分(如果需要的话,将页面粘合在一起)将来自不同模块的程序的不同部分组合到一个可执行文件或库中。

    在可执行文件中,节是可选的,但通常可以在其中描述文件中的内容,从何处开始以及需要多少字节。

  3. 什么是程序头,为什么我们需要它们?

    它们主要用于制作可执行文件。为了运行程序,部分还不够,因为您不仅需要指定文件中的内容,还需要指定运行过程中文件的加载位置。程序标头仅用于此目的:它们描述,它们是正在运行的进程中具有不同访问权限和内容的内存区域。

    每个程序标头描述一个 segment 。它告诉加载程序应该将文件中的某个区域加载到内存中的什么位置,以及应该为该区域设置什么权限(例如,应该允许从该区域执行代码?应该可写还是仅用于读取?)

    细分可以进一步细分为多个部分。例如,如果必须指定将代码段进一步细分为程序显示的消息的代码和静态只读字符串。还是将您的数据段细分为时髦数据和核心数据:J由您决定。

    在可执行文件中,各节是可选的,但很高兴拥有它们,因为它们描述了文件中的内容并允许转储文件的选定部分(例如,使用objdump工具)。但是,有时有时需要它们来存储动态链接信息符号表调试信息之类的东西。

  4. 在程序标题中,p_vaddrp_paddr字段的含义是什么?

    这些是将加载文件中数据的地址。他们将文件的内容映射到其相应的内存位置。第一个是虚拟地址,第二个是物理地址

    物理地址是“原始”内存地址。在现代操作系统上,这些不再在用户区中使用。而是,用户级程序使用虚拟地址。操作系统认为用户态程序在内存中是单独存在的,并且整个地址空间都可用。在后台,操作系统将这些虚拟地址映射到实际内存中的物理地址,并且对程序透明地进行。

    当然,并非虚拟地址空间中的每个地址都同时可用。实际可用物理内存有一些限制。因此,操作系统只是为程序实际使用的段映射内存(在这里ELF文件的程序标头中的“段”部分开始起作用)。如果该进程尝试访问一些未映射的内存,则操作系统会介入并说:“抱歉,该内存不属于您”。 (该程序可以寻址,但是不能访问。)

  5. 每个部分都有自己的部分标题吗?

    是的。如果它在Section Headers Table中没有条目,则不是section:q因为它们是判断文件的某个部分是否为section的唯一方法,所以通过查看Section Headers Table可以知道哪些节在文件中定义以及在何处可以找到它们。

    您可以将“节标题表”视为书中的目录。没有目录,毕竟没有任何章节,因为它们未在任何地方列出。这本书可能有标题,但内容未细分为可通过目录找到的逻辑章节。 ELF文件中的部分也是如此:可以有一些数据区域,但是如果没有“目录”即SHT,就无法分辨。

相关问题