[英]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.