【发布时间】:2021-01-31 20:11:31
【问题描述】:
假设这个简单的代码:
int main(){return 0;}
使用objdump我们可以看到内存地址:
0000000100003fa0 _main:
100003fa0: 55 pushq %rbp
100003fa1: 48 89 e5 movq %rsp, %rbp
100003fa4: 31 c0 xorl %eax, %eax
100003fa6: c7 45 fc 00 00 00 00 movl $0, -4(%rbp)
100003fad: 5d popq %rbp
100003fae: c3 retq
我知道0x100003fa0(例如)是一个虚拟内存地址。
加载我的程序时,操作系统会将其映射到物理内存。
2 个问题:
1- main 的起始地址可以是随机的吗?因为它们是虚拟的,我猜它可能是
任何价值,因为虚拟内存会照顾其余的?即我可以从 0x1 开始(而不是 0x0,因为它保留为 null)?
2- 链接器如何得出初始地址? (又是起始地址是随机的吗?)
【问题讨论】:
-
即基地址+偏移量,前者通常可以在构建镜像时设置为链接器配置的一部分。有时为了加快消耗数十或数百个可加载模块的项目的加载时间,通常会“重新设置”模块以确保它们每个都加载到不被其他任何人占用的虚拟空间中(因此不需要在加载时重新定位) .随着ASLR 的出现,最前沿的准备几乎毫无价值。你仍然可以强迫它,但你最好有充分的理由这样做。
标签: c memory memory-management linker virtual-memory