在某些目标文件上有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等是什么意思?
您将看到目标文件中每个节的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
块,并在其中使用block DATA
语句为其赋予初始值。
该.bss
部分(历史名称,是Block Started by Symbol的缩写)是最简单的部分。它使用静态存储类保存未初始化的变量。它是类型的一部分,SHT_NOBITS
在文件中不占空间。内存ALLOC
为此分配了内存,但没有从文件中读取任何内容来预填充内存-它仅保留内核内存分配器提供的所有零。
常量通常进入该.rodata
节(在您的示例中不存在),该节看起来像.data
但未标记为可写,因此显示为READONLY
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句