Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ mmap系统调用失败,错误号为14_C++_C_Linux_System Calls_Mmap - Fatal编程技术网

C++ mmap系统调用失败,错误号为14

C++ mmap系统调用失败,错误号为14,c++,c,linux,system-calls,mmap,C++,C,Linux,System Calls,Mmap,我试图在另一个进程上使用MMAP进行系统调用注入,但失败了。我注意到系统调用正在正确执行,因此问题应该是其他问题。我决定通过目标程序直接运行syscall,使其更易于理解。毫不奇怪,它也不起作用,我真的不知道为什么: #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/

我试图在另一个进程上使用MMAP进行系统调用注入,但失败了。我注意到系统调用正在正确执行,因此问题应该是其他问题。我决定通过目标程序直接运行syscall,使其更易于理解。毫不奇怪,它也不起作用,我真的不知道为什么:

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <sys/errno.h>

int main()
{
    void* addr = 0;
    size_t len = sysconf(_SC_PAGE_SIZE);
    int prot = PROT_EXEC | PROT_READ | PROT_WRITE;
    int flags = MAP_PRIVATE | MAP_ANON;
    int fd = -1;
    off_t offset = 0;
    
    void* alloc0 = mmap(addr, len, prot, flags, fd, offset); //this works
    void* alloc1 = syscall(__NR_mmap, addr, len, prot, flags, fd, offset); //this doesn't work

    printf("Alloc0: %p\n", alloc0);
    printf("Alloc1: %p\n", alloc1);
    printf("Errno:  %i\n", errno);

    return 0;
}
为什么正常的mmap工作,而具有相同参数的mmap系统调用不工作?

我运行的是Manjaro,程序是用GCC在32位上编译的。而且,当我用64位编译它时,它工作得很好,没有错误。有什么想法吗?

传统的32位(至少32位x86)系统调用没有该签名。它只接受一个指向
结构mmap_arg_struct32
的指针的参数;看见自90年代中后期以来,此系统调用已被弃用,不应使用。错误号14是
EFAULT
,反映您的第一个参数不是指向此类结构的有效指针


现代的替代品是
\uu NR\u mmap2
,它采用与
mmap
函数类似的参数,只是
offset
是一个4k单位的32位计数,而不是直接偏移。这允许寻址偏移量高达2^44。

传统的32位(至少32位x86)系统调用没有该签名。它只接受一个指向
结构mmap_arg_struct32
的指针的参数;看见自90年代中后期以来,此系统调用已被弃用,不应使用。错误号14是
EFAULT
,反映您的第一个参数不是指向此类结构的有效指针


现代的替代品是
\uu NR\u mmap2
,它采用与
mmap
函数类似的参数,只是
offset
是一个4k单位的32位计数,而不是直接偏移。这允许寻址偏移量高达2^44。

您应该在系统调用失败后立即保存
errno
的值,因为
printf
可能会覆盖它。此外,使用
perror()
strerror()
来获取可读的错误消息,而不是“errno 14”。您应该在失败的系统调用后立即保存
errno
的值,因为
printf
可能会覆盖它。另外,使用
perror()
strerror()
来获取人类可读的错误消息,而不是“errno 14”。
Alloc0: 0xf7fac000
Alloc1: 0xffffffff
Errno:  14