assembly - 使用 gdb 和 objdump 进行调试

标签 assembly gdb memory-address objdump

我有很多关于 gdb 和 objdump 的问题。

objdump 中的地址

如果我这样做:objdump -d binary-file-name,那么我会得到包含这部分的输出:

Disassembly of section .text:

080484a0 <_start>:
 80484a0:   31 ed                   xor    %ebp,%ebp
 80484a2:   5e                      pop    %esi
 80484a3:   89 e1                   mov    %esp,%ecx

我假设第一列中的这些数字是地址?但我不明白这些地址是如何知道的,因为当一个进程被加载时,它被放置在内存中的一个随机位置,这意味着代码每次都有不同的地址?或者这些地址是否与进程的地址空间相关?

<_start> 下列出的值是什么?

GDB 单步执行代码

我得到了一个没有源代码的二进制文件。我想单步执行程序,但没有符号信息。我无法在函数名或行号上设置断点。我试图在地址上设置一个断点,这很有效,但我不知道如何一步一步地完成程序。当我做: (gdb) 小号 或者 (gdb) n 它说它没有行信息,只是运行整个功能。 有没有办法单步执行它,或者单步执行组装说明?

最佳答案

是的,第一列是地址列。可执行文件在特定地址加载(每个部分都有自己的),除非它们被特别标记为 PIE(位置独立可执行文件),在这种情况下,显示的地址将从 0 开始,并且实际上只是与随机加载地址的偏移量。然而,共享库默认情况下是位置独立的,并且可以映射到不同的地址。

第二列是机器代码本身:程序作为字节序列存储在内存中,以及处理器实际看到和执行的内容。

如果您不这样做,您可以使用 stepinexti(分别为短格式 sini) '没有调试信息。如果您不使用某些 GUI 前端,layout asm 和 friend 也会很有用。

关于assembly - 使用 gdb 和 objdump 进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363215/

相关文章:

c - 如何打印进程在 C 中使用的内存的每个字节?

assembly - 为什么 cmp $0xffffffffffffffff, %edi 用于汇编?

c - 在操作系统中安装编译器

c - 内存地址字面量

gdb - 相当于 "info locals"以十六进制转储局部变量

c++ - 条件断点失败的 GDB Eigen 调试

architecture - 了解虚拟地址和虚拟地址空间

assembly - 如何在 MPLAB X 中使用 mips 汇编为每个宏调用创建唯一标签

performance - ARM7 Cortex A8上的浮点状态传输

debugging - kdevelop 调试器在几个步骤后自动从进程中分离