我正在用这个把我的头撞到墙上。
在我的项目中,当我使用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
我正在用这个把我的头撞到墙上。在我的项目中,当我使用mmap分配内存时,映射(/ proc / self / maps)显示,尽管我请求了...
Linux有一个称为execution domain的READ_IMPLIES_EXEC
,这会使分配给PROT_READ
的所有页面也都被赋予PROT_EXEC
。该程序将向您显示是否已对其本身启用:
作为使用特定于GNU的section指令变体来修改程序集文件的替代方法,您可以在命令行中添加-Wa,--noexecstack
以生成程序集文件。例如,在musl的configure
中查看我的操作方法: