有没有办法在Linux x86_64“高内存”中加载a.out?

时间:2016-10-21 18:11:53

标签: linux memory x86-64

如果我在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的一部分,或者可以使用以下方法之一将此加载地址移动到其他区域:

  • 运行时加载程序标志
  • 创建可执行文件时的链接器标志

1 个答案:

答案 0 :(得分:2)

是。将Linux x86-64应用程序构建为与位置无关的可执行文件将导致它和它的堆映射到高内存,以及libc和其他库。这应该留出2GB以下的空间供您使用。 (但是,请注意,内核可能会保护第一个64KB左右的内存不被映射以保护它免受某些攻击;请查找vm.mmap_min_addr以获取信息。)

要将应用程序构建为与位置无关的可执行文件,请将-pie -fPIE传递给编译器。