gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:04:26 25 4
gpt4 key购买 nike

我一直在阅读ELF标准here。据我了解,每个ELF都包含ELF header ,程序 header (为什么要一个以上?)和段 header 。谁能解释一下:

  • 如何生成ELF文件?是编译器的责任吗?
  • 什么是节,为什么我们需要它们?
  • 什么是程序头,为什么我们需要它们?
  • 在程序 header 中,p_vaddr和p_paddr字段的含义是什么?
  • 每个节都有自己的节头吗?

  • 或者,是否有人可以链接到更友好的ELF文档?

    最佳答案

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

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

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

    在可执行文件中,节是可选的,但通常可以在节中描述文件中的内容以及从何处开始以及占用多少字节。
  • 什么是程序头,为什么我们需要它们?

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

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

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

    在可执行文件中,节是可选的,但最好具有它们,因为它们描述了文件中的内容并允许转储文件的选定部分(例如,使用objdump工具)。但是,有时有时需要它们来存储动态链接信息,符号表,调试信息之类的东西。
  • 在程序 header 中,p_vaddrp_paddr字段的含义是什么?

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

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

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

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

    您可以将“节标题表”视为书中的目录。没有目录,毕竟没有任何章节,因为它们未在任何地方列出。这本书可能有标题,但内容未分割为可通过目录找到的逻辑章节。 ELF文件中的部分也是如此:可以有一些数据区域,但是如果没有“目录”即SHT,就无法分辨。
  • 关于ELF文件-什么是部分,为什么我们需要它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16812574/

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