项目中包含汇编文件时,mmap行为不正确

问题描述 投票:27回答:2

我正在用这个把我的头撞到墙上。

在我的项目中,当我使用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)显示,尽管我请求了...

c linux assembly mmap
2个回答
31
投票

Linux有一个称为execution domainREAD_IMPLIES_EXEC,这会使分配给PROT_READ的所有页面也都被赋予PROT_EXEC。该程序将向您显示是否已对其本身启用:


8
投票

作为使用特定于GNU的section指令变体来修改程序集文件的替代方法,您可以在命令行中添加-Wa,--noexecstack以生成程序集文件。例如,在musl的configure中查看我的操作方法:

© www.soinside.com 2019 - 2024. All rights reserved.