Tôi đang đập đầu vào tường với cái này.
Trong dự án của tôi, khi tôi phân bổ bộ nhớ với mmap
ánh xạ ( /proc/self/maps
) cho thấy đó là vùng có thể đọc và thực thi được mặc dù tôi chỉ yêu cầu bộ nhớ có thể đọc được.
Sau khi xem xét strace (trông có vẻ tốt) và gỡ lỗi khác, tôi đã có thể xác định điều duy nhất có vẻ để tránh vấn đề kỳ lạ này: xóa các tệp lắp ráp khỏi dự án và chỉ để lại C. thuần túy (gì?!)
Vì vậy, đây là ví dụ kỳ lạ của tôi, tôi đang làm việc trên Ubunbtu 19.04 và gcc mặc định.
Nếu bạn biên dịch đích thực thi với tệp ASM (trống) thì mmap
trả về một vùng có thể đọc và thực thi được, nếu bạn xây dựng mà không có thì nó sẽ hoạt động chính xác. Xem kết quả /proc/self/maps
mà tôi đã nhúng trong ví dụ của mình.
ví dụ
#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 : Là một tập tin trống!
Đầu ra
Với phiên bản bao gồm ASM
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
Không có phiên bản bao gồm ASM
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.