12

在某个目标文件上有 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

这些标志 CONTENTS、ALLOC、LOAD 等是什么意思?

4

2 回答 2

28

您看到的是对目标文件中每个部分的 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因为它是 type SHT_PROGBITS。应该为这个部分保留内存,因为它是ALLOC,并且它的内容应该从文件中加载,因为它被放置在一个LOAD-able 段中。程序代码通常是不可修改的,因此该部分被放置在只读存储器中。它包含要执行的指令和CODE标志。

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

.bss部分(历史名称,Block Started by Symbol的缩写)是最简单的部分。它保存具有静态存储类的未初始化变量。它是类型的一部分,SHT_NOBITS在文件中不占用空间。内存已被ALLOC占用,但没有从文件中读取任何内容来预填充内存 - 它只是保持内核内存分配器提供的全零。

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

于 2012-06-25T20:43:46.637 回答
4

找到了一些信息Ubuntu elf man page,这只是我的理解。
我认为它们是来自program header和的信息section 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.

希望这可以帮助

于 2012-06-25T20:32:01.113 回答