2016-12-18 18 views
0

runの後にGDBでメモリマッピングが変更されるのはなぜですか?
たとえば、以下の主な機能は、最初は0x00000560にあり、その後runの後には、0x80000560になります。GDB:実行後にメモリマッピングが変更されるのはなぜですか?

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

、以下の主な機能は、0x00000560で最初にされ、その後、実行した後に、それはあなたが位置独立実行可能ファイル(共有ライブラリの本当にただの特別な種類を持って0x80000

であります、-pieフラグにリンクされています)。それは実行を開始する前にランダムアドレスに再配置されます。

通常、GDBはアドレスのランダム化を無効にしようとします。そのため、ランダムアドレスはGDBでは実際には変化しません。ただし、となります。プログラムがGDBの外部で実行された場合、または(gdb) set disable-randomization offを使用している場合は異なります。

関連する問題