$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,DATA 2 .bss 00000000 00000000 00000000 00000040 2**2 ALLOC 3 .note.GNU-stack 00000000 00000000 00000000 00000040 2**0 CONTENTS,CODE
这些标志是什么内容,LOAD等是什么意思?
解决方法
> LOAD意味着该段驻留在可加载段中,即当创建进程时,其内容可以从文件读入存储器
尽管与objdump显示的名称不同,但是System V应用程序二进制接口的Chapter 4中已经详细介绍了章节标志.
> CODE表示该部分包含可执行代码;它由段标题中的SHF_EXECINSTR标志指示
> DATA表示该段不可执行,但可写,由SHF_WRITE标志的存在指示
> READONLY意味着该段既不可执行也不可写,应放置在只读存储器页面中
ALLOC意味着该部分占用内存,例如当由SHF_ALLOC标志指示创建进程时,实际分配内存页面以保存部分内容.一些部分,例如那些包含调试信息的程序在正常程序执行期间不会被读入存储器,并且没有标记为ALLOC以节省内存.
类型SHT_PROGBITS的部分在文件中具有相应的内容,并显示为CONTENTS.某些部分在文件中没有相应的内容,例如.bss部分,类型为SHT_NOBITS.
.text部分包含程序可执行代码.它显示为CONTENTS,因为它是类型SHT_PROGBITS.应该为此部分保留内存,因为它是ALLOC,它的内容应该从文件加载,因为它被放置在可加载的段中.程序代码通常是不可修改的,因此该部分放置在只读存储器中.它包含要执行的指令,因此包含CODE标志.
具有静态存储类的初始化变量进入.data部分.它们的初始值存储在文件中,并从中创建进程.在C/C++中,这些是全局变量,静态局部变量和适当初始化的C静态成员变量,例如. static int a = 10; Fortran放置了SAVE-D变量和COMMON块,其中给出了一个带有DATA DATA语句的intiial值.
.bss部分(历史名称,由Symbol开始的缩写)是最简单的部分.它保存静态存储类的未初始化变量.它是类型为SHT_NOBITS的部分,在文件中不占用空间.内存是ALLOC的,但从文件中没有读取来预填充内存 – 它只保留内核内存分配器提供的所有零.