【问题标题】:Executable Section Headers - Meaning and use?可执行部分标题 - 含义和用途?
【发布时间】:2017-07-07 10:11:30
【问题描述】:

通过使用 7zip 在 Windows 中打开许多可执行文件(.exe..msi),我注意到许多常见的不同文件类型。这些包括 .text、.data、.bss、.rdata、.pdata 等。我试图获取有关它们的信息,但我无法找出它们的全部含义。以下是其中的一些:

  • .text :代码部分,包含程序的指令-只读-。
  • .data :一般用于具有一些初始化的非零内容的可写数据。因此,数据部分包含可以在应用程序执行期间更改的信息,并且必须为每个实例复制该部分。
  • .bss :用于初始化为零的可写静态数据。
  • .rdata:常量/任何类型的只读数据都存储在这里。
  • .edata : 导出目录、描述符和句柄
  • .idata:句柄和描述符的导入目录。可执行文件(exe、dll 等)使用它来指定导入和导出的函数。
  • .rsrc :包含可执行文件所需的各种其他资源的信息的部分,例如在资源管理器中查看可执行文件时显示的图标

还有很多其他的,很常见,我找不到任何信息。主要是:.pdata.tls.reloc、证书、.rsrc_1.aspack.adata.INITDATACODE、@987653。>p

其中大部分还包含rsrc 文件夹,其中包含 BITMAP、CURSOR、ICON、GROUP_CURSOR、GROUP_ICON、MENU、VERSION 等文件夹。

一些可执行文件还包含更多的可执行文件,.html 文件,.txt 文件等。我还打开了一个根本不包含任何内容的文件(至少用 7zip 打开它没有显示任何内容)! [ 我用 7zip 打开了它们。 ]


问题

  1. 我发布的那些部分/片段是做什么的?有没有可以全部找到的网站?
  2. 我看到的都是 Windows 的 PE。这些格式是否标准并以类似/相同的方式适用于 LINUX、UNIX 等?
  3. 为什么有些可执行文件里面包含其他可执行文件,或者.html、.txt等文件?启动可执行文件时如何处理这些?他们应该做什么? AFAIK 可执行文件中的所有内容都应该只有那些类似于汇编代码部分的“段”。
  4. rsrc文件夹有什么用?它拥有什么样的资源?

如果您能发布更多信息/链接,说明为什么使用所有这些(尽可能低级)以及通常可执行结构应该是什么样子,它应该包含什么等,我将不胜感激。

就是这样。


编辑

我发现了其他常见的节标题名称。为了完整起见,我将在这里发布它们的含义。

  • .reloc :包含重定位表。
  • .pdata :包含用于异常处理的函数表项数组,由图像数据目录中的异常表项指向
  • *data : 自定义数据部分名称
  • .init :此部分包含有助于进程初始化代码的可执行指令。也就是说,当程序开始运行时,系统会安排在主程序入口点(在 C 程序中称为 main)之前执行本节中的代码。
  • .fini :此部分包含有助于进程终止代码的可执行指令。即当程序正常退出时,系统会安排执行本节中的代码。
  • .ctors :保留构造函数列表的部分
  • .dtors :包含析构函数列表的部分

【问题讨论】:

    标签: assembly exe executable portable-executable


    【解决方案1】:

    这里没有魔法,也没有关于构建可执行文件的通用规则。您必须遵守相关操作系统的规则,并且只提供它可以理解的可执行格式。但即便如此,尽管几十年来在编译器中非常普遍地使用这些部分,但在技术上是任意的。您基本上完成了您需要做的所有工作并回答了您自己的问题。

    操作系统只需要知道几件事。这个文件中有多少实际上是可加载的数据,我在哪里加载它。操作系统不知道/从 .data 中看到 .text,它看到的是可加载块。它将这些块从文件复制到内存中,然后它看到定义的入口点,它分支到该入口点。其余的信息是......信息......对于调试器,无论是软件还是有兴趣查看编译器在 .data 部分中放置了多少或什么的人。

    直接或间接由程序员正确使用这些部分,通常程序员不会直接参与。称为引导程序的软件根据需要执行处理这些部分的工作。例如,引导程序通常会将 .bss 部分归零,这是编译器工具链中的系统设计解决方案,它告诉引导程序 .bss 的大小和起始地址,以及引导程序将 ram 归零。

    .data 和 .text 通常只是由操作系统加载,不需要进一步注意,因为它们正在加载到 ram 中。但是例如,如果这是一个微控制器,我们需要将我们的非零全局 .data 保存在非易失性存储(闪存/ROM)中,但是当我们启动并运行我们的编译代码时,我们需要它在 ram 中。因此,引导程序通常使用编译器系统设计解决方案将 .data 从闪存复制到 ram 的工作,用于告诉引导程序闪存中的起始地址和 ram 中的起始地址以及要复制的数量。

    我正在谈论的系统设计是一个变量,如果您愿意汇编语言(否则它是鸡还是先有蛋的问题)引导程序使用它,在链接器完成其工作并弄清楚如何使用后由链接器填充有很多东西,以及它们在二进制或内存映像中的位置。

    数据就是数据,您可以在二进制文件中嵌入数据,无论是文本、html 还是图像(jpg、bmp、png 等)或其他,正确的 hexdump 工具可以显示,使用的工具链甚至可能具有特殊的部分名称对于该数据。

    几乎所有这些部分名称部分用于调试编译器输出,部分用于提供信息。一个特定的工具链有它使用的特定的部分名称,或者甚至允许用户(程序员)创建他们自己的任意名称,这就是他们的全部。并且该特定工具链将该信息用作其系统设计的一部分,编译器从数据中整理出程序,并且它不必但历史上整理出非零全局数据,假设在启动全局数据时为零。也许比只读非零数据更深。它用名称标记这些对象 blob,以便链接器可以收集所有命名的 blob,并使用链接器脚本将这些 blob 组装成更大的 blob 并为其分配地址。然后根据需要修补二进制文件以解析外部地址/变量。

    问题 1:不,没有网站可以找到所有这些,如果不容易证明至少一个工具链允许用户发明自己的部分名称,这是很有可能的,因为这样是不可能的或许多网站来涵盖所有可能的部分名称以及某些程序员可能会想到的这些部分名称的定义。

    问题 2:有一个通用集合 .text、.data、.bss 已被所有目标系统(windows、unix 等)上的大多数工具链(如果不是所有工具链)都采用和使用,这是工具链不是操作系统,因为操作系统不知道或不关心。它只是将可加载的 blob 和分支加载到入口点。由于这些名称是任意的,并且只需要在工具链的系统设计中起作用,因此询问操作系统是没有意义的

    问题 3:所有部分,无论是否奇怪,都由工具链间接管理或在库中链接或直接由程序员管理。从 .bss 到 .somethingimadeup。

    问题 4:听起来是特定于操作系统的。了解操作系统定义了支持的可执行格式以及它们的组成。编译器必须符合这一要求才能生成工作二进制文件。例如,像windows这样的操作系统可能非常希望在“二进制”中有一个图标位图,以便它可以在桌面上显示程序名称旁边的程序名称,这也是二进制文件中的信息。因此,除了二进制文件格式需要具备的显而易见的东西(文件偏移量和内存中可加载数据块的大小和目标地址,以及执行入口点)之外,文件格式可能还有其他信息或其他项目。 “Windows 快捷方式”的文件格式可能是子集或特殊的“二进制”格式,其信息是另一个文件的路径和文件名,而不是您实际加载和运行的代码。或像您这样的快捷方式可能具有包含 url 的“二进制”文件格式。但这在很大程度上取决于操作系统的定义和依赖。

    【讨论】:

      【解决方案2】:

      部分名称与文件格式无关,工具链(通常是链接器)可以选择它喜欢的任何内容。操作系统不使用名称来查找它关心的部分,它使用文件头中的data directory。其中包含数字,而不是名称。该名称仅用作帮助识别部分的助记符。或者可能用于帮助语言运行时或调试器查找数据目录未覆盖的部分。

      部分名称​​有些一致,主要是按照惯例。像 BSS 这样的怪异部分名称可以追溯到 50 年代,用于 Fortran,是 Block Started by Symbol 的首字母缩写。在今天猜测它的用途并没有多大帮助:) 您可以假设名为 CODE 的部分将包含可执行代码,并且等效于 .text,这是更常见的名称选择。 .tls 和 .reloc 等名称可以轻松映射到相应的数据目录条目。

      .rsrc 的相同收据,映射到数据目录中的第三个条目。对于操作系统而言,像 LoadString 这样的 winapi 函数需要它。

      但是,只有详细了解工具链才能真正了解那些古怪的东西。

      操作系统加载程序通过使用可执行文件作为后备存储的内存映射文件将部分直接放入虚拟内存。这就是 .text、.data 和 .bss 等部分的使用方式,请注意它们在数据目录中没有相应的条目。链接器负责生成正确的地址,就像 25 多年前在不需要操作系统帮助的情况下完成的那样。如果文件无法映射到其首选基地址,则除了 .reloc 部分之外,这是旧的。

      【讨论】:

      • 非常有启发性的回答先生。这个链接是我想要的,并提供了所有信息。我还发现了很多其他常见的部分标题名称,我会将它们全部发布在上面,以便区分它们对应的数据目录中的位置。关于您和 old_timer 提到的“工具链”的另一个问题。我知道它是什么,但你到底指的是什么? AFAIK 在构建过程中使用了工具链,在启动可执行文件时不涉及链接器,仅涉及将其加载到 RAM 中的加载器。您能否详细说明该“工具链”?非常感谢。
      • 您使用工具链来构建程序。至少编译器和链接器,也许是资源编译器之类的附加工具。有些语言将所有这些工具组合在一个可执行文件中,任何事情都会发生。输入为源代码,输出为可执行文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 2016-03-05
      • 2014-01-16
      • 2016-05-23
      相关资源
      最近更新 更多