最佳答案
我脑袋都快被这玩意儿砸烂了。
在我的项目中,当我使用 mmap
分配内存时,映射(/proc/self/maps
)显示它是一个可读和可执行的区域 尽管如此,我只请求可读内存。
在研究了 strace (看起来不错)和其他调试之后,我能够确定唯一一件似乎可以避免这个奇怪问题的事情: 从项目中删除汇编文件,只留下纯 C (什么? !)
这是我的一个奇怪的例子,我在 Ubunbtu 19.04和默认 gcc 上工作。
如果使用 ASM 文件编译目标可执行文件(空) ,那么 mmap
返回一个可读和可执行区域,如果不使用 ASM 文件编译目标可执行文件,那么它的行为就是正确的。查看我在示例中嵌入的 /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