gpt4 book ai didi

linux - 为什么我的代码/数据/bss 段在内存中如此之高?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:47 24 4
gpt4 key购买 nike

我曾经认为,当一个ELF镜像加载到RAM中时,code/data/bss段,栈和堆的地址是从低到高分配的。所以当我运行类似的东西时:

#include <stdio.h>

int ext;

int main(void) {
printf("%p\n", &ext);
return 0;
}

结果在 24 位区间内的某处。令我惊讶的是,当我在另一台机器上从头开始安装 Linux 发行版时,我得到的地址类似于 0x55ae11d1e034(两台机器都是 64 位)。

我尝试了各种东西,比如玩 ulimit/proc/sys/kernel/shmmaxsetarch 但我无法获得该死的前 4 GB 地址。

有人可以解释这里发生了什么以及为什么吗?

最佳答案

虚拟地址空间(高地址)不受可用 RAM 大小的限制。这就是 virtual memory 的重点.通常不需要控制加载地址。

如果您确实想要地址(任何随机地址都可能不起作用——需要是页面大小的倍数),您可以传递链接器选项 -Ttext-segment:

-Ttext-segment=org
When creating an ELF executable, it will set the address of the first byte of the text segment.

参见 ld(1) 的手册页.

比如在我的机器上编译你的程序显示:

$ gcc -Wl,-Ttext-segment,0x10000000 test.c
0x10201014

关于linux - 为什么我的代码/数据/bss 段在内存中如此之高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47014574/

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