由于一些与此问题无关的模糊原因,我需要诉诸使用 MAP_FIXED 来获取靠近 libc 文本部分在内存中所在位置的页面。
在阅读 mmap(2) 之前(我应该首先完成),如果我使用 MAP_FIXED 调用 mmap 且基地址与已映射的区域重叠,我预计会收到错误。
然而事实并非如此。例如,这是某些进程的 /proc/maps 的一部分
7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
在进行以下 mmap 调用之后...
mmap(0x7ffff731b000,
getpagesize(),
PROT_READ | PROT_WRITE | PROT_EXEC,
MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
0,
0);
... 变成:
7ffff7299000-7ffff731b000 r-xp 00000000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
7ffff731b000-7ffff731c000 rwxp 00000000 00:00 0
7ffff731c000-7ffff744c000 r-xp 00083000 08:05 654098 /lib/x86_64-linux-gnu/libc-2.15.so
这意味着我已经用我自己的页面覆盖了专用于 libc 的部分虚拟地址空间。显然不是我想要的...
在mmap(2)手册的MAP_FIXED部分中,明确指出:
如果addr和len指定的内存区域与任何页面重叠
现有映射,则现有映射的重叠部分将是丢弃的.
这解释了我所看到的,但我有几个问题:
- 有没有办法检测某些内容是否已经映射到某个地址?不访问/proc/maps?
- 有没有办法在发现重叠页面的情况下强制 mmap 失败?