gpt4 book ai didi

c - PIE 文件在链接期间是否给出了虚拟内存地址?

转载 作者:太空宇宙 更新时间:2023-11-04 03:09:45 27 4
gpt4 key购买 nike

我用 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

...

我们可以清楚地看到内存地址仍然由左侧的链接器计算。 pie 文件不应该没有静态关联的内存地址吗?

我的第二个问题是,pic 文件(如共享库)如何加载到内存中?他们有自己的虚拟地址空间吗?如果是这样,为什么他们需要独立于位置?还是它们被加载到进程地址空间?

最佳答案

那些不是地址。您应该查看的是与 PC 相关的偏移量:

leaq    93(%rip), %rdi

这些表示代码是 PIC/PIE。

共享库被映射到使用它们的每个正在运行的进程中。
然而,这些库需要重新定位(以适应程序的地址空间限制),因此需要使用 PIC(位置无关代码,也就是通常具有 PC 相对偏移量)进行编译。

关于c - PIE 文件在链接期间是否给出了虚拟内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683867/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com