gpt4 book ai didi

c - 如何限制64位进程地址空间小于4G?

转载 作者:太空狗 更新时间:2023-10-29 11:20:30 25 4
gpt4 key购买 nike

当我执行一个 64 位进程并查看 /proc/[pid]/maps 时,布局显示共享库和堆栈部分位于更大的地址;例如:

7ffff7ffc000-7ffff7ffd000 r--p 0001d000 08:03 16643      /lib/ld-2.11.2.so
7ffff7ffd000-7ffff7ffe000 rw-p 0001e000 08:03 16643 /lib/ld-2.11.2.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffea000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]

我可以将这些部分限制在 4G 空间内并且它仍然必须是 64 位进程而不是将其编译为 32 位进程吗?

最佳答案

虽然prelink(8)工具和概念被广泛厌恶(并且可能未在您的发行版中提供),您可以使用它将库链接到二进制文件到低内存中:

-r --reloc-only=ADDRESS
Instead of prelinking, just relink given shared libraries
to the specified base address.

由于库将映射到进程中的地址由 ld(1) 确定,您可以修改 Makefile 以调用 ld 具有不同的 --section-start 值:

--section-start SECTION=ADDRESS
Set address of named section
-Tbss ADDRESS Set address of .bss section
-Tdata ADDRESS Set address of .data section
-Ttext ADDRESS Set address of .text section
-Ttext-segment ADDRESS Set address of text segment

我将 text 和 bss 段向下移动到较低的地址:

$ gcc -Wl,-Ttext-segment=0x200000 -Wl,-Tbss=0x400000 -o broken broken.c
$ readelf -a broken
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x200450
...

如果您可以使用 --section-start 移动可执行文件中提供的所有部分,并使用 prelink(8) 将库向下移动,您也许能够将所有代码加载到 4 GB 以下。

关于c - 如何限制64位进程地址空间小于4G?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5388208/

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