Aku membenturkan kepalaku ke dinding dengan ini.
Dalam proyek saya, ketika saya mengalokasikan memori dengan mmap
pemetaan ( /proc/self/maps
) menunjukkan bahwa itu adalah wilayah yang dapat dibaca dan dieksekusi meskipun saya hanya meminta memori yang dapat dibaca.
Setelah melihat ke dalam strace (yang terlihat bagus) dan debugging lainnya, saya dapat mengidentifikasi satu-satunya hal yang tampaknya menghindari masalah aneh ini: menghapus file assembly dari proyek dan hanya menyisakan C. murni (apa ?!)
Jadi di sini adalah contoh aneh saya, saya mengerjakan Ubunbtu 19.04 dan gcc default.
Jika Anda mengkompilasi target yang dapat dieksekusi dengan file ASM (yang kosong) kemudian mmap
mengembalikan wilayah yang dapat dibaca dan dieksekusi, jika Anda membangun tanpa itu maka berperilaku dengan benar. Lihat output /proc/self/maps
yang telah saya sisipkan dalam contoh saya.
contoh.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 : Apakah file kosong!
Keluaran
Dengan ASM termasuk versi
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Tanpa ASM termasuk versi
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.