我有很多关于gdb和objdump的问题。
objdump中的地址
如果我这样做了: objdump -d二进制文件名,那么我将得到包含以下部分的输出:
Disassembly of section .text:
080484a0 <_start>:
80484a0: 31 ed xor %ebp,%ebp
80484a2: 5e pop %esi
80484a3: 89 e1 mov %esp,%ecx我假设第一列中的这些数字是地址?但是我不明白如何知道这些地址,因为当一个进程被加载时,它被放置在内存中的一个随机位置,这意味着代码每次都有不同的地址?还是这些地址相对于进程的地址空间?
在<_start>下列出的值是什么?
GDB逐步通过代码
我有一个二进制文件,我没有源代码。我想通过这个程序,但没有符号信息。我不能在函数名或linenumber上设置断点。我试图在一个地址上设置一个断点,但是我不知道如何一步一步地完成这个程序。当我这样做:(gdb) s或(gdb) n时,它说它没有行信息,只运行整个函数。是否有办法通过它,或逐步通过组装说明?
发布于 2014-03-12 22:51:35
是的,第一列是地址列。可执行文件是在特定地址加载的(每个部分都有自己的地址),除非它们被特别标记为饼(独立位置可执行),在这种情况下,显示的地址将从0开始,并且实际上只是与随机加载地址的抵消。但是,在默认情况下,共享库的位置是独立的,并且可以映射到不同的地址。
第二列是机器代码本身:程序是存储在内存中的字节序列,以及处理器实际看到和执行的内容。
如果您没有调试信息,可以使用stepi或nexti (分别是简表si和ni )。如果您不使用一些GUI前端,那么layout asm和朋友也可能是有用的。
发布于 2018-09-18 00:20:20
要添加@Jester的注释,还可以使用'x‘命令来检查指令,例如,在达到gdb设置的断点之后,可以编写
(gdb) x/10xb *[address] (to get next 10 bytes of instructions)https://stackoverflow.com/questions/22363215
复制相似问题