gpt4 book ai didi

linux - 目标文件的 objdump 输出中的标志

转载 作者:IT王子 更新时间:2023-10-28 23:56:55 27 4
gpt4 key购买 nike

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 表示该部分驻留在可加载段中,即它的内容可以在创建进程时从文件中读取到内存中

节标志在 Chapter 4 中有详细记录System V 应用程序二进制接口(interface)的名称,尽管名称与 objdump 显示的略有不同。

  • CODE 表示该段包含可执行代码;它由节头中的 SHF_EXECINSTR 标志指示
  • DATA 表示该部分不可执行但可写,由 SHF_WRITE 标志的存在指示
  • READONLY 表示该段既不可执行也不可写,应放在只读内存页中
  • ALLOC 表示该段占用内存,例如内存页面实际上是在创建进程时分配的,用于保存部分内容,由 SHF_ALLOC 标志指示。一些部分,例如那些包含调试信息的,在正常程序执行期间不会被读入内存,也不会被标记为 ALLOC 以节省内存。

SHT_PROGBITS 类型的部分在文件中有相应的内容,并显示为 CONTENTS。某些部分在文件中没有相应的内容,例如.bss 部分,类型为 SHT_NOBITS

.text 部分包含程序的可执行代码。它显示为 CONTENTS,因为它属于 SHT_PROGBITS 类型。应该为这个部分保留内存,因为它是 ALLOC,并且它的内容应该从文件中加载,因为它被放置在一个 LOAD-able 段中。程序代码通常是不可修改的,因此该部分位于只读存储器中。它包含要执行的指令,因此包含 CODE 标志。

已初始化 具有静态存储类的变量进入 .data 部分。它们的初始值存储在文件中,并在创建进程时从那里读取。在 C/C++ 中,这些是全局变量、静态局部变量和经过适当初始化的 C++ 静态成员变量,例如static int a = 10;。 Fortran 放置初始化的 SAVE-d 变量和 COMMON block ,它们在 block DATA 语句中被赋予初始值。

.bss 部分(历史名称,Block Started by Symbol 的缩写)是最简单的部分。它包含具有静态存储类的未初始化 变量。它是 SHT_NOBITS 类型的一部分,在文件中不占用空间。内存是 ALLOC 的,但没有从文件中读取任何内容来预填充内存 - 它只是保持内核内存分配器提供的全零。

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

关于linux - 目标文件的 objdump 输出中的标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11196048/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com