小编Ben*_*erg的帖子

当项目中包含程序集文件时,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;
}
Run Code Online (Sandbox Code Playgroud)

example.s:是一个空文件!

产出

附带ASM版本

VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0 
Run Code Online (Sandbox Code Playgroud)

没有ASM随附的版本

VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 …
Run Code Online (Sandbox Code Playgroud)

c linux assembly mmap

94
推荐指数
2
解决办法
2506
查看次数

指定在Linux上启动可执行文件时要使用的动态链接器/加载程序

我有一个奇怪的Linux系统,其中大部分软件是针对Glibc编译的,而其他一些软件是针对uClibc编译的.

由于Linux是我发布和执行时的标准发行版,因此从glibc调用标准动态链接器(/lib/ld.so.1).

我正在寻找一种在启动任何可执行文件之前指定动态加载程序的方法,所以当我想运行针对uClibc编译的软件时,我可以定义启动机制来使用uClibc动态加载器(/lib/ld-uClibc.so.0 ).

有任何想法吗?

linux linker glibc ld uclibc

5
推荐指数
1
解决办法
2474
查看次数

在 Linux 上使用 mmap 分配地址零失败

我正在为 Linux 编写一个静态程序加载器,我正在读取 ELF 程序头并将段映射到内存。

我遇到过一个可执行文件,它假定其第一个段的虚拟地址为 0。我的内存映射失败,在地址分配虚拟页时出错0

我想知道是否可以在0用户空间的地址处分配所有内存。

请参阅此示例代码:

/*mmaptests.c*/
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    void* p = mmap(0, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
    printf("mmap result %p (errno %s)\n",p,strerror(errno));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我用以下方法编译它:

gcc mmaptests.c
Run Code Online (Sandbox Code Playgroud)

这是它返回的内容:

$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)
Run Code Online (Sandbox Code Playgroud)

我将很高兴获得任何见解。

谢谢B

c linux mmap

5
推荐指数
1
解决办法
1460
查看次数

标签 统计

linux ×3

c ×2

mmap ×2

assembly ×1

glibc ×1

ld ×1

linker ×1

uclibc ×1