- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
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/
我正在检查使用以下命令编译的 C 文件的 objdump: riscv64-unknown-elf-gcc -O0 -o maxmul.o maxmul.c riscv64-unknown-elf-o
当我运行 objdump 时,我无法找出为什么我的汇编代码中有时会缺少一些 .words。一行中单独的“...”代表什么? 最佳答案 在 -d 或 -D(反汇编)的 objdump 输出内部,通常会有
SYMBOL TABLE: 0000000000000000 w *UND* 0000000000000000 __gmon_start__ 我已经man ob
转储可执行文件时,我只希望将代码段打印在标准输出上,而不是代码的偏移量和二进制形式。我无法从 man objdump 有办法吗? 最佳答案 您可以使用以下命令抑制目标代码十六进制转储 --no-sho
$ objdump -f ./a.out ./a.out: file format elf32-i386 architecture: i386, flags 0x00000112: EXEC_
在 GCC 的早期版本中,objdump 报告的符号偏移量与代码实际执行期间使用的符号偏移量相匹配。例如: $ cat example.c #include int g_someGlobal = 0
当我运行objdump -d 时在 Linux 服务器(在大学)上,我得到以下信息: kmwe236@kmwe236:~/Downloads/buflab-handout$ objdump -d bu
我正在尝试使用 objdump 比较二进制文件的两个不同版本,想知道是否有人知道如何从我的 objdump 输出的以下行中解释符号名称: 102b33bc l O .rodata 000
如果我在一个函数中定义一个本地字符数组,然后使用 objdump 获取该特定函数的汇编代码,我能否在汇编代码中找到该数组的内存? 这是我的家庭作业问题。 最佳答案 当然,只要您的数组具有非零初始值设定
我使用 objdump -d a.out 获得以下内容。我最初假设第一列(例如 080482b4)是字节偏移量,但后来我注意到该文件只有 7190 字节长! a.out: file forma
我在 nasm (linux) 中写了一个简单的小程序: 使用命令 nasm -f elf32 -o file.o file.asm生成目标文件。 使用 objdump -M intel -d fil
有没有办法在 objdump 中获取完整地址?使用的命令是:objdump -d progname 前导零不正确。地址应如下所示: 地址中的最后三个值是正确的;但是,我非常希望在 objdump 中显
我发现不得不反汇编大量库代码只是为了获得足够的上下文来查看导致崩溃的原因,这真的很烦人。有没有什么办法可以让 objdump 一个地址,让它为我找到包含函数的边界? 编辑:更好的是,我可以让它为我分解
请参阅特定函数 (func) 的特定目标文件的以下 objdump 行: 3c: e03a b.n 78 现在,目标系统 (ARMv6-M) 中的操作码 e03a
我们如何使用objdump输出到二进制文件? 这绝对不是正确的做法: objdump -s -j .text /path/firmware.ko > /content.bin 因为它只呈现文本格式。我
如果我在 (linux amd64) .o 文件上运行 objdump -d,函数调用会在没有完成链接时间解析的情况下出现。示例: 90: 66 89 44 24 1c mo
例如,如果我在 perf report 中,我可以按 enter 键跟随一个分支。如果一个 bin 使用 -g 一些来源也会出现。 我真的不需要源代码,但如果我能跟着跳转会很方便。我该怎么做才能使阅读
这个问题在这里已经有了答案: meaning of objdump -d output assembly (2 个回答) 5 个月前关闭。 我跑了objdump -r在目标文件上并得到以下输出。这里的
我有以下汇编代码: global _start section .text _start: add byte [eax], al 编译和链接后,我尝试查看操作码: $ objdump -d eax.o
因此,我尝试使用 objdump 实用程序从程序集构建控制流图,但遇到了问题。基本上,每当发生分支并且目标地址是相对的时,我不知道如何知道下一个基本块从哪里开始。我不确定我是否清楚,所以我会添加一个例
我是一名优秀的程序员,十分优秀!