我有很多关于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)s或(gdb)n它说它没有行信息,只运行整个函数。有没有办法逐步完成它,或逐步完成装配说明?
是的,第一列是地址列。可执行文件在特定地址加载(每个部分都有自己的),除非它们被特别标记为PIE(位置无关可执行文件),在这种情况下显示的地址将从0开始,并且实际上只是从随机加载地址偏移。但是,共享库默认情况下与位置无关,可以映射到不同的地址。
第二列是机器代码本身:程序作为存储在存储器中的字节序列以及处理器实际看到和执行的内容。
如果您没有调试信息,可以使用stepi
或nexti
(分别为si
和ni
)。如果你没有使用一些GUI前端,layout asm
和朋友也可能有用。
要添加@Jester的注释,您还可以使用'x'命令检查指令,例如在达到您可以编写的gdb设置的断点之后
(gdb) x/10xb *[address] (to get next 10 bytes of instructions)