为什么在run
之后GDB中的内存映射会发生变化?
例如,下面的主要功能最初位于 0x00000560 ,然后在run
之后位于 0x80000560 。
是否可以按照从头开始显示实际映射的方式运行/配置gdb?
Reading symbols from prog...(no debugging symbols found)...done.
(gdb) disas main
Dump of assembler code for function main:
0x00000560 : push %ebp
0x00000561 : mov %esp,%ebp
0x00000563 : sub $0x10,%esp
0x00000566 : call 0x580
0x0000056b : add $0x1a95,%eax
0x00000570 : movl $0x0,-0x4(%ebp)
0x00000577 : addl $0x1,-0x4(%ebp)
0x0000057b : mov -0x4(%ebp),%eax
0x0000057e : leave
0x0000057f : ret
End of assembler dump.
(gdb) run
Starting program: /home/mike/gdb/prog
[Inferior 1 (process 9607) exited with code 01]
(gdb) disas main
Dump of assembler code for function main:
0x80000560 : push %ebp
0x80000561 : mov %esp,%ebp
0x80000563 : sub $0x10,%esp
0x80000566 : call 0x80000580
0x8000056b : add $0x1a95,%eax
0x80000570 : movl $0x0,-0x4(%ebp)
0x80000577 : addl $0x1,-0x4(%ebp)
0x8000057b : mov -0x4(%ebp),%eax
0x8000057e : leave
0x8000057f : ret
End of assembler dump.
答案 0 :(得分:1)
例如,下面的主要功能最初是0x00000560然后运行后它是0x80000
您有一个与位置无关的可执行文件(实际上只是一种特殊的共享库,与-pie
标志链接)。它在开始执行之前被重定位到一个随机地址。
请注意,GDB通常会尝试禁用地址随机化,因此随机地址实际上不会因GDB下的运行而异。但是,当程序在GDB之外运行时,或者如果您使用(gdb) set disable-randomization off
, 会有所不同。