有没有办法在 linux x86_64 "high memory" 中加载 a.out?
Is there a way to have a.out loaded in linux x86_64 "high memory"?
如果我查看 Linux (x86_64) 上 64 位进程的内存映射,我发现 a.out 映射到相当低的内存中:
$ cat /proc/1160/maps
00400000-004dd000 r-xp 00000000 103:03 536876177 /usr/bin/bash
006dc000-006dd000 r--p 000dc000 103:03 536876177 /usr/bin/bash
006dd000-006e6000 rw-p 000dd000 103:03 536876177 /usr/bin/bash
006e6000-006ec000 rw-p 00000000 00:00 0
00e07000-00e6a000 rw-p 00000000 00:00 0 [heap]
7fbeac11c000-7fbeac128000 r-xp 00000000 103:03 1074688839 /usr/lib64/libnss_files-2.17.so
7fbeac128000-7fbeac327000 ---p 0000c000 103:03 1074688839 /usr/lib64/libnss_files-2.17.so
我想在内存的最低部分映射一个 2G 内存区域,但必须将其放在这些 a.out 映射之后的区域,进入第二个 2G 区域。
这里映射的 a.out 是 x86_64 ABI 的一部分,还是可以使用以下方法之一将该加载地址移动到不同的区域:
- 运行时加载程序标志
- 创建可执行文件时的链接器标志
?
是的。将 Linux x86-64 应用程序构建为位置无关的可执行文件将导致它及其堆与 libc 和其他库一起映射到高端内存。这应该会留下 2GB 以下的 space 供您免费使用。 (但是,请注意,内核可能会保护前 64KB 左右的内存不被映射,以保护它免受某些攻击;查找 vm.mmap_min_addr
以获取信息。)
要将您的应用程序构建为与位置无关的可执行文件,请将 -pie -fPIE
传递给编译器。
如果我查看 Linux (x86_64) 上 64 位进程的内存映射,我发现 a.out 映射到相当低的内存中:
$ cat /proc/1160/maps
00400000-004dd000 r-xp 00000000 103:03 536876177 /usr/bin/bash
006dc000-006dd000 r--p 000dc000 103:03 536876177 /usr/bin/bash
006dd000-006e6000 rw-p 000dd000 103:03 536876177 /usr/bin/bash
006e6000-006ec000 rw-p 00000000 00:00 0
00e07000-00e6a000 rw-p 00000000 00:00 0 [heap]
7fbeac11c000-7fbeac128000 r-xp 00000000 103:03 1074688839 /usr/lib64/libnss_files-2.17.so
7fbeac128000-7fbeac327000 ---p 0000c000 103:03 1074688839 /usr/lib64/libnss_files-2.17.so
我想在内存的最低部分映射一个 2G 内存区域,但必须将其放在这些 a.out 映射之后的区域,进入第二个 2G 区域。
这里映射的 a.out 是 x86_64 ABI 的一部分,还是可以使用以下方法之一将该加载地址移动到不同的区域:
- 运行时加载程序标志
- 创建可执行文件时的链接器标志
?
是的。将 Linux x86-64 应用程序构建为位置无关的可执行文件将导致它及其堆与 libc 和其他库一起映射到高端内存。这应该会留下 2GB 以下的 space 供您免费使用。 (但是,请注意,内核可能会保护前 64KB 左右的内存不被映射,以保护它免受某些攻击;查找 vm.mmap_min_addr
以获取信息。)
要将您的应用程序构建为与位置无关的可执行文件,请将 -pie -fPIE
传递给编译器。