Linker x86-64 objdump与pmap地址 #包括 int main(){ printf(“位于%p\n的文本”,main); int c=getchar(); }

Linker x86-64 objdump与pmap地址 #包括 int main(){ printf(“位于%p\n的文本”,main); int c=getchar(); },linker,gdb,elf,objdump,pmap,Linker,Gdb,Elf,Objdump,Pmap,在VirtualBox Ubuntu 64位上编译上述代码并运行,我得到: 文本位于0x55468A pmap: 00005540004K r-x--a输出 但是, objdump-dj.text a.out | sed-n'/:/,/^$/p': 000000000000068a: 68a:55%rbp gdb a.out 主功能的汇编程序代码转储: 0x000000000000068a:推送%rbp 链接的代码的地址完全不同 链接代码的地址完全不同 您正在查看,它在运行时被

在VirtualBox Ubuntu 64位上编译上述代码并运行,我得到:
文本位于0x55468A
pmap:
00005540004K r-x--a输出

但是,

objdump-dj.text a.out | sed-n'/:/,/^$/p':
000000000000068a
68a:55%rbp

gdb a.out
主功能的汇编程序代码转储:
0x000000000000068a:推送%rbp

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

链接代码的地址完全不同

您正在查看,它在运行时被重新定位到一个随机地址

链接代码的地址完全不同

您正在查看,它在运行时被重新定位到一个随机地址。

我在这里找到了答案

当我使用标志-no pie编译时,a.out的输出为:
文本位于0x400537

pmap的输出为:
0000000000 400000 4K r-x--a输出

objdump的输出为:
0000000000 400537主:

但是,默认情况下,gcc(7.4.0版)会创建一个独立于位置的可执行文件, 这样就可以将其加载到随机地址。
因此,pmap中的地址与objdump中的地址非常不同。

使用flag-no pie编译时,“文件”命令输出:
a、 输出:ELF 64位LSB可执行文件,x86-64

在不带标志的情况下编译时,命令“file”输出:
a、 out:ELF 64位LSB共享对象,x86-64

我在这里找到了答案

当我使用标志-no pie编译时,a.out的输出为:
文本位于0x400537

pmap的输出为:
0000000000 400000 4K r-x--a输出

objdump的输出为:
0000000000 400537主:

但是,默认情况下,gcc(7.4.0版)会创建一个独立于位置的可执行文件, 这样就可以将其加载到随机地址。
因此,pmap中的地址与objdump中的地址非常不同。

使用flag-no pie编译时,“文件”命令输出:
a、 输出:ELF 64位LSB可执行文件,x86-64

在不带标志的情况下编译时,命令“file”输出:

a、 out:ELF 64位LSB共享对象,x86-64

文件a.out的输出是什么?不同类型的可执行文件有不同的重新定位规则。
文件a.out
的输出是什么?对于不同类型的可执行文件,有不同的重新定位规则。
#include <stdio.h>
int main() {
    printf("text at %p\n", main);
    int c = getchar();
}