Páginas superpuestas con mmap (MAP_FIXED)

Debido a algunas razones oscuras que no son relevantes para esta pregunta, debo recurrir al uso de MAP_FIXED para obtener una página cercana a la ubicación de la sección de texto de libc en la memoria.

Antes de leer mmap (2) (lo que debería haber hecho en primer lugar), esperaba obtener un error si llamaba a mmap con MAP_FIXED y una dirección base que se superponía a un área ya asignada.

Sin embargo, este no es el caso. Por ejemplo, aquí es parte de / proc / maps para cierto proceso

7ffff7299000-7ffff744c000 r-xp 00000000 08:05 654098                     /lib/x86_64-linux-gnu/libc-2.15.so

Que, después de hacer la siguiente llamada mmap ...

  mmap(0x7ffff731b000,
       getpagesize(),
       PROT_READ | PROT_WRITE | PROT_EXEC,
       MAP_ANONYMOUS | MAP_PRIVATE | MAP_FIXED,
       0,
       0);

... se convierte en:

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

Lo que significa que he sobrescrito parte del espacio de direcciones virtuales dedicado a libc con mi propia página. Claramente no es lo que quiero ...

En la parte MAP_FIXED del manual mmap (2), indica claramente:

Si la región de memoria especificada por addr y len se superpone a las páginas de cualquiera de los mapas existentes, entonces la parte superpuesta de los mapas existentes serádescartado.

Lo que explica lo que estoy viendo, pero tengo un par de preguntas:

¿Hay alguna forma de detectar si algo ya estaba asignado a cierta dirección? ¿Sin acceder a / proc / mapas?¿Hay alguna forma de forzar el mmap para que falle en el caso de encontrar páginas superpuestas?

Respuestas a la pregunta(3)

Su respuesta a la pregunta