Je me tape la tête contre le mur avec ça.
Dans mon projet, lorsque j'alloue de la mémoire avec mmap
le mapping ( /proc/self/maps
), cela montre que c'est une région lisible et exécutable bien que je n'aie demandé que de la mémoire lisible.
Après avoir examiné strace (qui avait l'air bien) et d'autres débogages, j'ai pu identifier la seule chose qui semble éviter cet étrange problème: supprimer les fichiers d'assembly du projet et ne laisser que du C. pur (quoi?!)
Voici donc mon étrange exemple, je travaille sur Ubunbtu 19.04 et gcc par défaut.
Si vous compilez l'exécutable cible avec le fichier ASM (qui est vide), puis mmap
retourne une région lisible et exécutable, si vous construisez sans, il se comportera correctement. Voir la sortie /proc/self/maps
dont j'ai intégré dans mon exemple.
exemple.c
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
int main()
{
void* p;
p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0);
{
FILE *f;
char line[512], s_search[17];
snprintf(s_search,16,"%lx",(long)p);
f = fopen("/proc/self/maps","r");
while (fgets(line,512,f))
{
if (strstr(line,s_search)) fputs(line,stderr);
}
fclose(f);
}
return 0;
}
example.s : est un fichier vide!
Les sorties
Avec la version ASM incluse
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Sans la version incluse ASM
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.