Linker x86-64 objdump与pmap地址 #包括 int main(){ printf(“位于%p\n的文本”,main); int c=getchar(); }
在VirtualBox Ubuntu 64位上编译上述代码并运行,我得到: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 链接的代码的地址完全不同 链接代码的地址完全不同 您正在查看,它在运行时被
文本位于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();
}