目标文件的objdump输出中的标志

在某个目标文件上有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等是什么意思?

Solutions Collecting From Web of "目标文件的objdump输出中的标志"

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

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

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

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

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

.text部分包含程序可执行代码。 它显示为CONTENTS因为它是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类型的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. 

希望这可以帮助