繁体   English   中英

在gdb中运行后`main`函数的运动?

[英]Movement of `main` function after running in gdb?

我在ret0.c有以下C代码。

int main(){
  return 0;
}

编译并通过gdb运行,​​我有以下输出:

(gdb) disas main
Dump of assembler code for function main:
   0x0000000000001119 <+0>: push   %rbp
   0x000000000000111a <+1>: mov    %rsp,%rbp
   0x000000000000111d <+4>: mov    $0x0,%eax
   0x0000000000001122 <+9>: pop    %rbp
   0x0000000000001123 <+10>:    retq   
End of assembler dump.
(gdb) run
Starting program: /home/michael/core/mind/ob/thm/cs/lang/other/c/ret0 
[Inferior 1 (process 14766) exited normally]
(gdb) disas main
Dump of assembler code for function main:
   0x0000555555555119 <+0>: push   %rbp
   0x000055555555511a <+1>: mov    %rsp,%rbp
   0x000055555555511d <+4>: mov    $0x0,%eax
   0x0000555555555122 <+9>: pop    %rbp
   0x0000555555555123 <+10>:    retq   
End of assembler dump.

那么执行一次后, main在内存中的位置发生了变化吗? 这里发生了什么?

在开始该过程之前,先打印出第一个输出。 在这种情况下,gdb在二进制文件中打印偏移量。

第二个输出是在进程终止之后,您会在进程的内存空间中看到实际地址。

这里发生了什么?

您有一个与位置无关的可执行文件 (实际上是共享库的一种特殊形式),该可执行文件在运行时会重定位到随机地址。

您可以通过运行file ret0来验证这file ret0 ,该file ret0将显示ELF 64-bit LSB pie executable, x86-64, version 1 ... file ret0 ELF 64-bit LSB pie executable, x86-64, version 1 ...

要构建非PIE可执行文件,请使用gcc -no-pie ... 非位置无关的可执行文件必须在它们链接的地址处加载, main会保留在原位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM