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

时间:2012-06-25 19:29:27

标签: linux elf 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等是什么意思?

2 个答案:

答案 0 :(得分:23)

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

  • LOAD表示该部分位于可加载段中,即在创建进程时可以将其内容从文件读入内存

在System V应用程序二进制接口的Chapter 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语句的intiial值。

.bss部分(历史名称,来自按标志开始的块的缩写)是最简单的部分。它包含未初始化的变量和静态存储类。它是SHT_NOBITS类型的一部分,文件中不占用空格。内存为ALLOC - 但它没有从文件中读取任何内容以预先填充内存 - 它只是保留内核内存分配器提供的所有零。

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

答案 1 :(得分:4)

找到关于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.

希望这有帮助