android NDK 中的系统调用

Syscall in android NDK

我试过使用 this syscall macro for arm_64

它适用于 SYS_open,阅读并关闭。可以正常看到文件内容了

之后 Android APK 崩溃并显示以下消息:

A/libc: stack corruption detected A/libc: Fatal signal 6 (SIGABRT) at 0x00007689 (code=-6), thread 32141 (Thread-2910)

有人知道怎么解决吗?

您发布的 Godbolt link 的代码中至少有一个错误。这些语句导致缓冲区溢出(删除了周围的代码和 if() 条件。)

char buffer[2048];

    length = syscall_read(fd, buffer, sizeof(buffer));

        buffer[length] = 0;

buffer[length] = 0; 如果 sys_read returns 2048,则访问数组外部。如手册页所述,read() 尝试读取最多 count 字节 ,而不是 count-1。如果数组分配在重要内容的正下方,这可能会导致堆栈损坏。

如果您想将它用作 C 隐式长度字符串而不是具有 writememcpy 或其他任何内容的显式长度缓冲区+大小,则必须为 0 终止符留出空间。请记住,文件数据可以包含 0 个字节。

像往常一样,使用调试器,并确保您的代码适用于正常的系统调用以及内联包装器。