GDB:为什么运行后内存映射会发生变化?

时间:2016-12-18 13:08:08

标签: gdb

为什么在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.

1 个答案:

答案 0 :(得分:1)

  

例如,下面的主要功能最初是0x00000560然后运行后它是0x80000

您有一个与位置无关的可执行文件(实际上只是一种特殊的共享库,与-pie标志链接)。它在开始执行之前被重定位到一个随机地址。

请注意,GDB通常会尝试禁用地址随机化,因此随机地址实际上不会因GDB下的运行而异。但是,当程序在GDB之外运行时,或者如果您使用(gdb) set disable-randomization off 会有所不同。