Я з цим стукаю головою в стіну.
У моєму проекті, коли я виділяю пам'ять за mmap
допомогою відображення ( /proc/self/maps
), видно, що це читабельна та виконувана область, незважаючи на те, що я запитував лише читабельну пам'ять.
Переглянувши strace (що виглядало добре) та інші налагодження, я зміг визначити єдине, що, здається, уникне цієї дивної проблеми: видалення файлів збірки з проекту та залишення лише чистого C. (що ?!)
Тож ось мій дивний приклад, я працюю над Ubunbtu 19.04 та gcc за замовчуванням.
Якщо ви компілюєте цільовий виконуваний файл з файлом ASM (який порожній), то mmap
повертає читабельну та виконувану область, якщо ви будуєте без цього, вона веде себе правильно. Дивіться результат, /proc/self/maps
який я вклав у свій приклад.
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;
}
example.s : це порожній файл!
Виходи
З ASM включеною версією
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Без включеної версії ASM
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.