#include <stdio.h>
int main() {
printf("text at %p\n", main);
int c = getchar();
}
在VirtualBox Ubuntu 64位上编译以上代码并运行它,我得到:0x55555555468a处的文字pmap:0000555555554000 4K r-x-- a.out
但是,
objdump -dj .text a.out | sed -n'/:/,/ ^ $ / p':000000000000068a:68a:55推送%rbpgdb a.out函数main的汇编代码转储:0x000000000000068a :推送%rbp已链接代码的完全不同的地址?
链接代码的地址完全不同?
您正在查看position-independent executable,它将在运行时重定位到随机地址。
我在这里找到了答案What is the -fPIE option for position-independent executables in gcc and ld?当我用标志-no-pie进行编译时,a.out的输出为:文字在0x400537pmap的输出是:0000000000400000 4K收发器-a.outobjdump的输出是:0000000000400537主:
但是,默认情况下,gcc(版本7.4.0)会创建与位置无关的可执行文件,以便可以将其加载到随机地址。因此,pmap中的地址与objdump中的地址有很大不同。使用标志-no-pie进行编译时,命令“ file”输出:a.out:ELF 64位LSB可执行文件,x86-64在不带标志的情况下进行编译时,命令“文件”输出:a.out:ELF 64位LSB 共享对象,x86-64