我有很多关于 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 开始,并且实际上只是与随机加载地址的偏移量。然而,共享库默认情况下是位置独立的,并且可以映射到不同的地址。
第二列是机器代码本身:程序作为字节序列存储在内存中,以及处理器实际看到和执行的内容。
如果您不这样做,您可以使用 stepi
或 nexti
(分别为短格式 si
和 ni
) '没有调试信息。如果您不使用某些 GUI 前端,layout asm
和 friend 也会很有用。
关于assembly - 使用 gdb 和 objdump 进行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22363215/