linux – 对象文件的objdump输出中的标志

前端之家收集整理的这篇文章主要介绍了linux – 对象文件的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,DATA
  2 .bss          00000000  00000000  00000000  00000040  2**2
                  ALLOC
  3 .note.GNU-stack 00000000  00000000  00000000  00000040  2**0
                  CONTENTS,CODE

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

解决方法

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

> 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的,但从文件中没有读取来预填充内存 – 它只保留内核内存分配器提供的所有零.

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

猜你在找的Linux相关文章