l'allocation de l'adresse zéro sous Linux avec mmap échoue

Sep 08 2020

J'écris un chargeur de programme statique pour Linux, je lis les en-têtes de programme ELF et mappe les segments à la mémoire.

J'ai rencontré un exécutable qui suppose que l'adresse virtuelle de son premier segment est à 0. Mon mappage mémoire échoue, j'obtiens une erreur d'allocation de la page virtuelle à l'adresse 0.

Je me demande s'il est possible d'allouer du tout de la mémoire à l'adresse 0pour l'espace utilisateur.

Consultez cet exemple de code:

/*mmaptests.c*/
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    void* p = mmap(0, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
    printf("mmap result %p (errno %s)\n",p,strerror(errno));
    return 0;
}

Je le compile avec:

gcc mmaptests.c

C'est ce qu'il renvoie:

$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)

Je serai heureux pour toutes les informations.

Merci B

Réponses

1 PSkocik Sep 08 2020 at 16:18

Linux ne vous laissera mmapla 0-ème page que si vous avez des privilèges.

gcc mmaptests.c && sudo ./a.out

devrait vous obtenir:

mmap result (nil) (errno Success)