对象文件的对象转储输出中的标志



在某些目标文件上有objdump的输出:

$ objdump -h main.o
main.o:     file format elf32-i386
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .text         0000000b  00000000  00000000  00000034  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  00000000  00000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  00000000  00000000  00000040  2**2
                  ALLOC
  3 .note.GNU-stack 00000000  00000000  00000000  00000040  2**0
                  CONTENTS, READONLY, CODE

这些标志内容、分配、加载等是什么意思?

您看到的是目标文件中每个部分的 ELF 段标志、节类型和节标志组合的解释。

  • LOAD意味着该部分驻留在可加载的段中,即在创建进程时,其内容可以从文件中读取到内存中

节标志在System V应用程序二进制接口的第4章中有很好的记录,尽管名称与objdump显示的名称略有不同。

  • CODE表示该节包含可执行代码;它由节标题中的SHF_EXECINSTR标志指示
  • DATA 表示该部分不可执行,但可写,由 SHF_WRITE 标志的存在指示
  • READONLY表示该节既不可执行也不可写,应放在只读内存页中
  • ALLOC 表示该部分占用内存,例如,在创建进程时,内存页实际上是分配的,以保存该部分的内容,由 SHF_ALLOC 标志指示。某些部分(例如包含调试信息的部分)在正常程序执行期间不会读入内存,也不会标记为ALLOC以节省内存。

类型为 SHT_PROGBITS 的部分在文件中具有相应的内容,并显示为 CONTENTS 。某些部分在文件中没有相应的内容,例如.bss部分,其类型为 SHT_NOBITS

.text部分包含程序可执行代码。它显示为CONTENTS,因为它的类型是 SHT_PROGBITS .应为此部分保留内存,因为它是ALLOC的,并且由于文件放置在可LOAD的段中,因此应从文件加载其内容。程序代码通常是不可修改的,因此该部分放置在只读内存中。它包含要执行的指令,因此包含CODE标志。

具有静态存储类的初始化变量进入.data部分。它们的初始值存储在文件中,并在创建进程时从文件中读取。在 C/C++ 中,这些是全局变量、静态局部变量和C++适当初始化的静态成员变量,例如 static int a = 10; .Fortran 放置了初始化SAVE -d 变量和COMMON块,这些块被赋予初始值,并在那里有一个块DATA语句。

.bss部分(历史名称,符号开始的块的缩写)是最简单的部分。它使用静态存储类保存未初始化的变量。它是类型 SHT_NOBITS 的部分,在文件中不占用空间。内存ALLOC - 为它 - 但不会从文件中读取任何内容来预填充内存 - 它只是保持内核内存分配器提供的所有零。

常量通常进入.rodata部分(在您的示例中不存在),它看起来像.data但未标记为可写,因此显示为READONLY

找到了关于Ubuntu elf man page的信息,这只是我的理解。
我认为它们是来自program headersection header的信息.

LOAD: may correspond to PT_LOAD in the Program header table. Brief description:
It specifies the type of that particular element in the program header table.
The array element specifies a loadable segment
ALLOC: may correspond to SHF_ALLOC in the section table. Brief description:
Its specifies the flag of that particular element in the section header.
This  section  occupies  memory during process execution.
CODE/ DATA: indicates the belonging segment
READONLY: specifies a read-only segment
CONTENTS: I didn't find anything to conclude.

希望这有帮助

相关内容

最新更新