当项目中包含程序集文件时,mmap产生了意外的执行权限
我用这个把我的头撞到墙上。 在我的项目中,当我使用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 …