Sto sbattendo la testa contro il muro con questo.
Nel mio progetto, quando sto allocando memoria con mmap
il mapping ( /proc/self/maps
) mostra che è una regione leggibile ed eseguibile nonostante abbia richiesto solo memoria leggibile.
Dopo aver esaminato strace (che sembrava buono) e altri debug, sono stato in grado di identificare l'unica cosa che sembra evitare questo strano problema: rimuovere i file di assemblaggio dal progetto e lasciare solo C. (cosa ?!)
Quindi, ecco il mio strano esempio, sto lavorando su Ubunbtu 19.04 e default gcc.
Se si compila l'eseguibile di destinazione con il file ASM (che è vuoto) mmap
restituisce un'area leggibile ed eseguibile, se si costruisce senza di allora si comporta correttamente. Vedi l'output di /proc/self/maps
cui ho incorporato il mio esempio.
example.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;
}
esempio.s : è un file vuoto!
Uscite
Con la versione ASM inclusa
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Senza la versione inclusa di ASM
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.