如何在Mac上使用C++执行64位syscall
。
我需要使以下内容正常工作:
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
int main() {
long* addr = (long*) syscall(SYS_mmap, 0, 100, 1 | 2, 2 | 4096, -1, 0);
}
问题在于下面的
addr
应该是64位的指针,但它将结果截断为32位值。我使用以下编译方式:
g++ ./mmap.cc -o ./mmap
附言:我知道存在mmap
函数,上面只是一个例子,我需要让syscall
函数正常工作。
另外,问题在于在64位系统上,syscall
应该返回64位值,但在Mac的unistd.h
中它被定义为int
:
int syscall(int, ...);
这是一个bug吗?mmap
系统调用正确地返回了void*
:
void * mmap(void *, size_t, int, int, int, off_t) __DARWIN_ALIAS(mmap);
请问 "mmap" 的实际实现过程是怎样的?
P.P.P.S.
在 Linux 上,只要正确定义,就可以使用它:
long syscall(long number, ...);
syscall()
已过时吗?在unistd.h
中的函数声明已经被标记为过时属性,并包含语句“syscall(2) 不受支持,请切换到受支持的接口。”您正试图做的事情在 macOS 上是明确不受支持的。此外,苹果公司已经解释说,库接口(例如mmap()
等函数)是 ABI 兼容接口,直接系统调用不能保证跨操作系统更新后仍然可用或兼容。 - Ken Thomasessyscall
而不使用汇编吗? - Vad