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?