Linux 对象文件的objdump输出中的标志

Linux 对象文件的objdump输出中的标志,linux,elf,objdump,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, L

在某些对象文件上有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等是什么意思?

Ubuntu elf手册页上找到了一些信息,这只是我的理解。
我认为它们是来自
程序标题
部分标题
的信息

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.

希望这有助于理解对象文件中每个节的ELF段标志、节类型和节标志的组合

  • LOAD
    表示节驻留在可加载段中,即在创建进程时,可以将其内容从文件读入内存
节标志在SystemV应用程序二进制接口的中有很好的文档记录,尽管其名称与
objdump
显示的名称略有不同

  • code
    表示该节包含可执行代码;它由节标题中的
    SHF_EXECINSTR
    标志指示
  • DATA
    表示节不是可执行的,而是可写的,由
    SHF_WRITE
    标志指示
  • READONLY
    表示该节既不是可执行的,也不是可写的,应该放在只读内存页中
  • ALLOC
    表示节占用内存,例如,当创建进程时,内存页实际上被分配来保存节内容,由
    SHF_ALLOC
    标志指示。某些部分,例如包含调试信息的部分,在正常程序执行期间不会读入内存,也不会标记为
    ALLOC
    ,以节省内存
类型为
SHT\u PROGBITS
的节在文件中具有相应的内容,并显示为
CONTENTS
。某些节在文件中没有相应的内容,例如
.bss
节,其类型为
SHT\u NOBITS

.text
部分包含程序可执行代码。它显示为
内容
,因为它的类型为
SHT\u PROGBITS
。应为该节保留内存,因为它是
ALLOC
,其内容应从文件加载,因为它位于
LOAD
可加载的段中。程序代码通常是不可修改的,因此该节被置于只读内存中。它包含要执行的指令,因此包含
code
标志

带有静态存储类的初始化变量进入
.data
部分。它们的初始值存储在文件中,并在创建进程时从文件中读取。在C/C++中,这些变量是全局变量、静态局部变量和C++静态成员变量,它们被适当初始化,例如:代码>静态int a=10;<代码>。Fortran将初始化的
SAVE
-d变量和
COMMON
块放在一起,在那里用block
DATA
语句给出初始值

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


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

链接#2现在断开:(我试着在一个可重新定位的文件(raw.o文件,即没有程序头的文件)上运行objdump-h,但它仍然列出了部分(例如,text)使用LOAD属性。所以我不清楚LOAD和ALLOC之间的区别。可能只是LOAD=ALLOC&&CONTENTS@TroelsFolke,是的,
objdump
所构建的BFD库具有硬编码逻辑,该逻辑段占用二进制(
内容
)和内存(
ALLOC
)中的空间应进入可加载段(
LOAD
)。
LOAD
是段属性,并且由于
.o
文件没有程序头,因此它在
objdump
输出中的存在是“假”(或者更确切地说是假设的)@TroelsFolke,还值得一提的是,
objdump
显示的是抽象BFD部分,其抽象属性是通过组合底层对象文件类型元素的属性而构建的。因此,
readelf
更适合分析ELF文件。