c++ - Mac 64 位系统调用

标签 c++ macos system-calls

如何使用 C++ 在 Mac 上执行 64 位 系统调用

我需要以下内容才能工作:

#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, ...);

最佳答案

经过一番搜索,我没有找到在 Mac 上执行 64 位系统调用的方法。

所以,我自己实现了这些,你 can find the functions here .

此外,如果您使用这些函数,请不要忘记将 0x2000000 Unix 系统调用类转移添加到您的系统调用编号中:

int SYS_write = 4;
int STDOUT = 1;
char* str = "Hello world\n";

syscall3(0x2000000 + SYS_write, STDOUT, str, 12);

关于c++ - Mac 64 位系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47961292/

相关文章:

macos - 如何在 Mac 中更改 docker 网络 IP 地址

linux - OSX 上的 "pkg-config script could not be found"

c - 了解 shell 实现中的命令执行

linux-kernel - 更改linux内核系统调用号

c++ - 导致错误: "no instance of overloaded function" when wanting to push_back vector list的shared_ptr vector

c++ - 将变量的名称传递给 C++ 中的函数

c++ - 启动时多线程?

c++ - 如何在 Mac OS 的发布版本中包含 Qt 库?

c - 如果 close(2) 因 EIO 而失败,文件描述符是否仍会被删除?

c++ - 难以衡量 C/C++ 性能