【发布时间】:2021-02-05 13:43:05
【问题描述】:
假设这个C 代码,用gcc file.c 编译:
int main(){
return 0;
}
使用objdump 生成的输出:
0000000000000660 <main>:
660: 55 push %rbp
661: 48 89 e5 mov %rsp,%rbp
664: b8 00 00 00 00 mov $0x0,%eax
669: 5d pop %rbp
66a: c3 retq
66b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
注意第一个地址是660。
这是来自GDB的相同输出:
0x555555554660 <main> push %rbp
0x555555554661 <main+1> mov %rsp,%rbp
0x555555554664 <main+4> mov $0x0,%eax
0x555555554669 <main+9> pop %rbp
0x55555555466a <main+10> retq
注意每个地址左侧添加的5s。
这是我的问题:
1- 左边的5s 是什么?为什么 objdump 没有它们?
2- 这些只是偏移量吗?或最终地址硬编码在二进制文件中,将加载到虚拟内存中。
3- 如果这些是偏移量,那么常规可执行文件和PIE 之间有什么区别?我认为只有 PIE 代码是位置独立的,并且在加载时分配了随机地址,我没有使用 -fpie 选项进行编译。我也用过-fno-pie,没什么区别。
【问题讨论】: