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

ecbunoof  于 2023-01-16  发布在  Linux
关注(0)|答案(1)|浏览(133)

我正在为Linux编写一个静态程序加载器,我正在阅读ELF程序头并将段Map到内存。
我遇到了一个可执行文件,它假定其第一段的虚拟地址为0。我的内存Map失败,在地址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;
}

我编译它:

gcc mmaptests.c

下面是它返回的内容:

$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)

我很乐意听取任何见解。
谢谢B

jtw3ybtb

jtw3ybtb1#

如果您有权限,Linux将只允许您mmap第0页。

gcc mmaptests.c && sudo ./a.out

应该能让你:

mmap result (nil) (errno Success)

相关问题