【发布时间】:2020-01-01 16:24:02
【问题描述】:
我用gcc -fpie test.c 编译了一个简单的hello world c 代码,现在使用objdump 查看二进制文件:
Disassembly of section __TEXT,__text:
__text:
100000f40: 55 pushq %rbp
100000f41: 48 89 e5 movq %rsp, %rbp
100000f44: 48 83 ec 10 subq $16, %rsp
100000f48: 89 7d fc movl %edi, -4(%rbp)
100000f4b: 8b 75 fc movl -4(%rbp), %esi
100000f4e: 48 8d 3d 5d 00 00 00 leaq 93(%rip), %rdi
100000f55: b0 00 movb $0, %al
...
考虑到我用-fpie 编译,这些虚拟(运行时)地址是吗?如果代码与位置无关,它们的用途是什么。
如果我删除fpie,我会在左侧得到相同的地址,并且我假设它们是虚拟地址,这些指令将被加载以纠正?
【问题讨论】:
-
大多数时候使用
-fpie是没有意义的,因为 GCC 默认会生成 PIE。尝试使用-fno-pie编译。 -
但我想看看为什么我们在饼图模式下仍然有内存地址
-
另外,您可以使用
file命令判断 EFL 是否与位置无关:对于位置无关的 ELF,它将显示为ELF Shared Object,对于正常的可执行文件,它将显示为ELF Executable。 -
在 PIE 模式下你没有内存地址,当你启动程序时这些地址会改变。您看到的是相对地址。
-
那么代码必须有一个基地址才能开始。那么“位置无关”的分辨率将是一个简单的“向所有地址添加偏移量”。
标签: c shared-libraries objdump