【发布时间】:2018-06-06 06:36:37
【问题描述】:
如何在 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, ...);
这是一个错误吗? 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) is unsupported; please switch to a supported interface”。 macOS 明确不支持您尝试做的事情。在其他地方,Apple 解释说库接口(例如mmap()之类的函数)是 ABI 兼容性接口,并且不保证直接系统调用在操作系统更新之间工作或保持兼容。 -
@KenThomases 我都知道了,你知道如何在不借助汇编的情况下执行 64 位
syscall吗?
标签: c++ macos system-calls