标签: objdump

objdump,无偏移显示

转储可执行文件时,我只希望将代码段打印在标准输出上,而不是代码的偏移量和二进制形式。我无法从

man objdump
Run Code Online (Sandbox Code Playgroud)

有办法吗?

objdump

6
推荐指数
1
解决办法
4226
查看次数

gcc -g 标志:移动源代码

我的理解是,当您使用 编译 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 gdb objdump

6
推荐指数
1
解决办法
1062
查看次数

X86中mov和movl指令的区别?我在阅读汇编时遇到了一些麻烦

最近,我读了一些关于计算机科学的书。我编写了一些 C 代码,并使用gccobjdump反汇编了它们。

以下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 …

x86 assembly gcc objdump att

6
推荐指数
1
解决办法
3万
查看次数

在机器代码中查找位置(gcc/objdump -d)

如果您在计算机输出中考虑了特定的C代码行,那么如何在objdump输出中找到它.这是一个例子

if (cond)
   foo;
   bar();
Run Code Online (Sandbox Code Playgroud)

我想看看栏是否按照我的意愿内联.或者你会使用一些替代工具而不是objdump?

c gcc object-code objdump

5
推荐指数
1
解决办法
3690
查看次数

objdump - 头部ELF - 旗帜的含义?

$ 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

5
推荐指数
1
解决办法
5449
查看次数

objdump输出 - 列代表什么?

我跑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)

assembly objdump

5
推荐指数
1
解决办法
1966
查看次数

将源与C++程序的程序集列表相关联

分析零售构建中的核心转储通常需要关联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

注意 正如所描述的答案,通过汇编源阅读并直观地确定基于符号的模式(如函数调用,分支,返回语句)就是我通常所做的.我并不否认它不起作用,但是当一个函数非常复杂时,阅读汇编列表的页面是一件很痛苦的事情,并且你最终会因为函数内联或优化器被抛出而很少匹配列表.代码,因为它很高兴.我有一种感觉,看看如何有效地 …

c c++ linux gdb objdump

5
推荐指数
1
解决办法
1092
查看次数

在ac程序中拆卸部分

我写了一个非常基本的Hello World程序来了解各个部分.使用后objdump我得到了所有部分.我在用ubuntu 12.04.

在输出中我发现它是这样的:

  1. 拆卸部分.init

  2. 拆卸部分.plt

  3. 部分.text的反汇编

  4. __do_global_dtors_aux

  5. 部分.fini的反汇编

我想知道那些部分是什么?他们存储了哪些数据?特别.plt.fini.关于.init,.text我可以猜,但其他人怎么样?

c objdump disassembly

5
推荐指数
1
解决办法
3939
查看次数

如何从elf文件中提取函数原型?

我没有成功找到这个问题的答案.

使用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文件的哪个部分是存储的函数原型?

gdb elf objdump function-prototypes readelf

5
推荐指数
1
解决办法
2608
查看次数

objdump产生错误的分支操作码解释

请参阅以下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)

c assembly arm objdump cortex-m

5
推荐指数
1
解决办法
140
查看次数

标签 统计

objdump ×10

c ×5

assembly ×3

gcc ×3

gdb ×3

arm ×1

att ×1

c++ ×1

cortex-m ×1

disassembly ×1

elf ×1

function-prototypes ×1

linux ×1

object-code ×1

readelf ×1

x86 ×1