Why is GDB filling the 0s of a memory address with 5s during a register info?

喜夏-厌秋 提交于 2020-01-24 10:12:11

问题


I am using GDB on a x64 CPU. As you can see, I am trying to access the value of the rip register and for some reason the address of the instruction the register is pointing to is displayed using 5s instead of 0s as it should be.

   Dump of assembler code for function main:
   0x0000000000001139 <+0>:     push   rbp
   0x000000000000113a <+1>:     mov    rbp,rsp
   0x000000000000113d <+4>:     sub    rsp,0x10
   0x0000000000001141 <+8>:     mov    DWORD PTR [rbp-0x4],0x0
   0x0000000000001148 <+15>:    mov    DWORD PTR [rbp-0x4],0x0
   0x000000000000114f <+22>:    jmp    0x1161 <main+40>
   0x0000000000001151 <+24>:    lea    rdi,[rip+0xeac]        # 0x2004
   0x0000000000001158 <+31>:    call   0x1030 <puts@plt>
   0x000000000000115d <+36>:    add    DWORD PTR [rbp-0x4],0x1
   0x0000000000001161 <+40>:    cmp    DWORD PTR [rbp-0x4],0x9
   0x0000000000001165 <+44>:    jle    0x1151 <main+24>
   0x0000000000001167 <+46>:    mov    eax,0x0
   0x000000000000116c <+51>:    leave  
   0x000000000000116d <+52>:    ret    
End of assembler dump.
(gdb) break main
Breakpoint 1 at 0x1141: file Desktop/myprogram.c, line 6.
(gdb) run
Starting program: /home/william/Desktop/a.out 

Breakpoint 1, main () at Desktop/myprogram.c:6
6         int i = 0;
(gdb) info register rip
rip            0x555555555141   0x555555555141 <main+8>

As you can see, the rip register contains the address of the mov instruction listed above but for some reason has replaced all the 0s for 5s. Any idea why?


回答1:


Before running a position-independent executable, there is no base address so gcc assumes 0. This matches what you'll see from objdump -drwC -Mintel /bin/ls or whatever.

On running the executable to create a process, the OS's program-loader maps it to an address. x86-64 Linux chooses a page address that starts with 0x0000555555555... when GDB disables ASLR.

If you run it outside GDB, or with set disable-randomization off, then the address will still start with 0x000055555, but be randomized in some range.



来源:https://stackoverflow.com/questions/51791746/why-is-gdb-filling-the-0s-of-a-memory-address-with-5s-during-a-register-info

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!