转储可执行文件时,我只希望将代码段打印在标准输出上,而不是代码的偏移量和二进制形式。我无法从
man objdump
Run Code Online (Sandbox Code Playgroud)
有办法吗?
我的理解是,当您使用 编译 C 代码时gcc -g,gcc 将插入调试信息,其中包括对原始源代码的引用(例如行号)。然后其他程序如 gdb 和 objdump 可以稍后恢复这些引用。作为示例,我们将使用objdump -Swhich 打印与相应源代码交错的程序集。
我的目标是将编译后的二进制文件复制到另一台计算机,并且仍然能够检索此调试信息。但是,目前,当我这样做时,所有调试信息都丢失了。我也不介意复制源文件,但是第二台计算机运行的是不同的操作系统,所以文件结构不同,我不能将源文件放在完全相同的绝对位置,这会阻止 objdump 找到源代码。我查看了二进制文件,看到了一个看起来像这样的部分,中间穿插着一堆二进制文件:
/home/path/to/source/code
我尝试编辑它以匹配源的新路径,但它只是使二进制文件无效。
我还研究了gcc 标志,希望其中一个允许指定源代码的相对路径而不是绝对路径,但我找不到类似的东西。
作为参考,这是我希望从中获得的输出类型objdump - S:
0804840b <main>:
#include <stdio.h>
int main(){
804840b: 8d 4c 24 04 lea 0x4(%esp),%ecx
804840f: 83 e4 f0 and $0xfffffff0,%esp
8048412: ff 71 fc pushl -0x4(%ecx)
8048415: 55 push %ebp
8048416: 89 e5 mov %esp,%ebp
8048418: 51 push %ecx
8048419: 83 ec 14 sub $0x14,%esp
for(int varName = 0; varName < …Run Code Online (Sandbox Code Playgroud) 最近,我读了一些关于计算机科学的书。我编写了一些 C 代码,并使用gcc和objdump反汇编了它们。
以下C代码:
#include <stdio.h>
#include <stdbool.h>
int dojob()
{
static short num[ ][4] = { {2, 9, -1, 5}, {3, 8, 2, -6}};
static short *pn[ ] = {num[0], num[1]};
static short s[2] = {0, 0};
int i, j;
for (i=0; i<2; i++) {
for (j=0; j<4; j++){
s[i] += *pn[i]++;
}
printf ("sum of line %d: %d\n", i+1, s[i]);
}
return 0;
}
int main ( )
{
dojob();
}
Run Code Online (Sandbox Code Playgroud)
得到以下汇编代码(AT&T 语法;只有函数dojob …
如果您在计算机输出中考虑了特定的C代码行,那么如何在objdump输出中找到它.这是一个例子
if (cond)
foo;
bar();
Run Code Online (Sandbox Code Playgroud)
我想看看栏是否按照我的意愿内联.或者你会使用一些替代工具而不是objdump?
$ objdump -f ./a.out
./a.out: file format elf32-i386
architecture: i386, flags 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
start address 0x080484e0
Run Code Online (Sandbox Code Playgroud)
$ objdump -f function.o
function.o: file format elf32-i386
architecture: i386, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x00000000
Run Code Online (Sandbox Code Playgroud)
flags(flags 0x00000011:OR标志0x00000112 :)是什么意思?ELF头文件中的Nothin具有此标志.e_flag包含0.
有人对他的意思有所了解吗?
谢谢
我跑objdump -r了一个目标文件,得到了以下输出.每个列代表什么?我可能错过了它,但文档没有指定.
simple.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 30 sub $0x30,%rsp
8: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
f: 00 00
11: 48 89 45 f8 mov %rax,-0x8(%rbp)
15: 31 c0 xor %eax,%eax
17: c7 45 d8 00 00 00 00 movl $0x0,-0x28(%rbp)
1e: eb 64 jmp 84 <main+0x84>
20: 8b 45 d8 mov -0x28(%rbp),%eax
23: 89 …Run Code Online (Sandbox Code Playgroud) 分析零售构建中的核心转储通常需要关联objdump任何特定模块和源.通常,如果函数非常复杂,则将汇编转储与源关联起来会很麻烦.今天我尝试创建assembly listing一个特定模块(带有编译选项-S),期望我会看到带有汇编或某种相关性的交错源.不幸的是,列表不够友好,无法关联,所以我很想知道
objdump 通过重新编译,失败的模块组装清单-S选项的模块.是否可以与来源进行一对一的通信?
作为一个例子,我看到汇编列表为
.LBE7923:
.loc 2 4863 0
movq %rdi, %r14
movl %esi, %r12d
movl 696(%rsp), %r15d
movq 704(%rsp), %rbp
.LBB7924:
.loc 2 4880 0
testq %rdx, %rdx
je .L2680
.LVL2123:
testl %ecx, %ecx
jle .L2680
movslq %ecx,%rax
.loc 2 4882 0
testl %r15d, %r15d
.loc 2 4880 0
leaq (%rax,%rax,4), %rax
leaq -40(%rdx,%rax,8), %rdx
movq %rdx, 64(%rsp)
Run Code Online (Sandbox Code Playgroud)
但无法理解如何解释喜欢.LVL2123和指令之类的标签.loc 2 4863 0
注意 正如所描述的答案,通过汇编源阅读并直观地确定基于符号的模式(如函数调用,分支,返回语句)就是我通常所做的.我并不否认它不起作用,但是当一个函数非常复杂时,阅读汇编列表的页面是一件很痛苦的事情,并且你最终会因为函数内联或优化器被抛出而很少匹配列表.代码,因为它很高兴.我有一种感觉,看看如何有效地 …
我写了一个非常基本的Hello World程序来了解各个部分.使用后objdump我得到了所有部分.我在用ubuntu 12.04.
在输出中我发现它是这样的:
拆卸部分.init
拆卸部分.plt
部分.text的反汇编
__do_global_dtors_aux
部分.fini的反汇编
我想知道那些部分是什么?他们存储了哪些数据?特别.plt和.fini.关于.init,.text我可以猜,但其他人怎么样?
我没有成功找到这个问题的答案.
使用GDB,我可以使用命令"call"来获取函数的原型.例:
(gdb) call fn
$1 = {void (int, int)} 0x8048414 <fn>
Run Code Online (Sandbox Code Playgroud)
因此,GDB只能从elf文件中找出fn()返回void并将两个整数作为参数.
但是,我需要使用其他一些工具从elf文件中提取函数原型.最好,我想使用objdump/readelf.
有谁知道这是否可能?如果不可能,GDB如何做到这一点?elf文件的哪个部分是存储的函数原型?
请参阅以下objdump特定功能的特定目标文件的行(func):
3c: e03a b.n 78 <func+0x78>
Run Code Online (Sandbox Code Playgroud)
现在,e03a目标系统(ARMv6-M)中的操作码显示跳转到的位置PC + 0x78。正确的解释是:
3c: e03a b.n B4 <func+0xB4>
Run Code Online (Sandbox Code Playgroud)
每个其他函数和文件都包含正确的b.n解释,并在其objdump转储中包含正确的值计算。由于某些原因,仅此功能会导致objdump“混淆”。
注意:func从开始0x0。
我无法想到这种情况的任何原因。而且由于我具有解析和使用objdump转储的工具,因此这对我造成了很大的问题。有什么合理的理由吗?
工具链: gcc-arm-none-eabi-4_9-2015q3
运行此工具链的平台: Ubuntu 16.04.2 LTS
编辑:我附加部分转储:
Disassembly of section i.func:
00000000 <func>:
0: b531 push {r0, r4, r5, lr}
2: b088 sub sp, #32
4: 2100 movs r1, #0
6: 9106 str r1, [sp, #24]
8: 482c ldr r0, [pc, #176] …Run Code Online (Sandbox Code Playgroud)