2012-06-25 20 views
11

有这种输出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 

做这些标志内容ALLOC,LOAD等是什么意思?

回答

20

你看到的是ELF段标志,款型和节标志为对象文件中的每个部分相结合的解释。

  • LOAD意味着该部分驻留在可装入段,即,其含量可从该文件时创建进程

部分标志在系统的Chapter 4有案可稽读入存储器V应用程序二进制接口,但与objdump显示的名称略有不同。

  • CODE表示该部分包含可执行代码;它是由在节头
  • DATASHF_EXECINSTR标记指示装置,该部分是不可执行的,但是可写的,由SHF_WRITE标志
  • READONLY的存在指示意味着该部分是既不可执行也不writtable和应置于只读存储器页面
  • 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块,其被赋予intiial值与块DATA声明那里。

.bss部分(历史名称,从的缩写块起始于符号)是最简单的一个。它包含未初始化的变量与静态存储类。它是SHT_NOBITS类型的一部分,并且不占用文件中的空间。内存是ALLOC - 为它,但从文件中读取预填充内存 - 它只是保持全零,由内核内存分配器交付。

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

+0

路段#2现在是打破了。所以:( –

+0

太糟糕了,确实如此。 –

+0

我试过一个再定位文件(原始.o文件将,即没有程序头文件)运行objdump的-H,它仍然列出的部分(如的.text)与load属性。这是我不清楚LOAD或Alloc之间的区别是什么。也许这只是LOAD = ALLOC &&目录 –

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. 

希望这有助于