Páginas sobrepostas com o mmap (MAP_FIXED)

Devido a algumas razões obscuras que não são relevantes para esta questão, eu preciso recorrer ao uso de MAP_FIXED para obter uma página perto de onde a seção de texto da libc vive na memória.

Antes de ler o mmap (2) (que eu deveria ter feito em primeiro lugar), eu esperava obter um erro se eu chamei o mmap com MAP_FIXED e um endereço base sobreposto a uma área já mapeada.

No entanto, esse não é o caso. Por exemplo, aqui faz parte de / proc / maps para determinado processo

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

Que, depois de fazer a seguinte chamada mmap ...

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

... torna-se em:

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

O que significa que eu substituí parte do espaço de endereço virtual dedicado à libc com a minha própria página. Claramente não é o que eu quero ...

Na parte MAP_FIXED do manual mmap (2), ele afirma claramente:

Se a região de memória especificada por addr e len sobrepuser as páginas de qualquer mapeamento existente, a parte sobreposta do (s) mapeamento (s) existente (s) será (ão)descartado.

O que explica o que estou vendo, mas tenho algumas perguntas:

Existe uma maneira de detectar se algo já foi mapeado para determinado endereço? sem acesso / proc / maps?Existe uma maneira de forçar o mmap a falhar no caso de encontrar páginas sobrepostas?

questionAnswers(3)

yourAnswerToTheQuestion