Uderzam w to głową w ścianę.
W moim projekcie, gdy przydzielam pamięć za mmap
pomocą mapowania ( /proc/self/maps
) pokazuje, że jest to region możliwy do odczytu i wykonywania, mimo że zażądałem tylko pamięci do odczytu.
Po przejrzeniu strace (który wyglądał dobrze) i innym debugowaniu udało mi się zidentyfikować jedyną rzecz, która wydaje się unikać tego dziwnego problemu: usunięcie plików asemblera z projektu i pozostawienie tylko czystego C. (co ?!)
Oto mój dziwny przykład: pracuję nad Ubunbtu 19.04 i domyślnym gcc.
Jeśli kompilujesz docelowy plik wykonywalny z plikiem ASM (który jest pusty), a następnie mmap
zwraca czytelny i wykonywalny region, jeśli kompilujesz bez niego, zachowa się poprawnie. Zobacz dane wyjściowe, /proc/self/maps
które osadziłem w moim przykładzie.
przyklad.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;
}
przyklad.s : jest pusty plik!
Wyjścia
Dzięki dołączonej wersji ASM
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Bez wersji dołączonej do ASM
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.