我编写了一个简单的汇编代码,现在我正尝试使用gdb对其进行调试。
在gdb中,我输入了:
(gdb) break _start
Breakpoint 1 at 0x4000b0
断点地址(0x4000b0)是否相对于代码行的硬盘存储位置?还是仅与程序长度有关? (我认为此时程序仍未加载到RAM中)
答案 0 :(得分:3)
这是RAM中的虚拟地址。您有一个与位置相关的可执行文件,因此将加载到的绝对地址就在ELF元数据中。 (您可以使用readelf my_program
或GDB命令info files
。)
如果您具有PIE可执行文件并在启动前设置了断点,GDB将为您提供尚未重定位的断点地址,因此文件的第一个字节被视为地址0
。例如
(gdb) b main
Breakpoint 1 at 0x64e: file hello.c, line 3.
(gdb) run
Starting program: /tmp/hello
Breakpoint 1, main () at hello.c:3
(gdb) info br
Num Type Disp Enb Address What
1 breakpoint keep y 0x000055555555464e in main at hello.c:3
breakpoint already hit 1 time
请注意,0x64e
和0x000055555555464e
在4k页面中具有相同的偏移量,因为文件已映射到页面对齐的地址。