x86-64 objdump与pmap地址

问题描述 投票:0回答:2
#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已链接代码的完全不同的地址?

linker gdb elf objdump pmap
2个回答
1
投票

链接代码的地址完全不同?

您正在查看position-independent executable,它将在运行时重定位到随机地址。


1
投票

我在这里找到了答案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

© www.soinside.com 2019 - 2024. All rights reserved.