2014-03-12 130 views
2

我有许多关于gdb和objdump的问题。使用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通过代码

踩着我,而我没有源代码的二进制文件。我想通过该程序,但没有符号信息。我无法在函数名称或亚麻布上设置断点。我试图在地址上设置一个断点,这个工作,但我不知道如何一步一步地通过程序。当我这样做: (gdb)s 或 (gdb)n 它说它没有线路信息,只是运行整个功能。 有没有一种方法可以逐步完成它,或者单步执行装配说明?

回答

3

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

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

如果您没有调试信息,则可以使用stepinexti(分别为短表格sini)。 layout asm如果你不使用某个GUI前端,朋友也可能会有用。