我尝试使用 this syscall macro for arm_64
它与 SYS_open、read 和 close 一起工作。可以正常看到文件内容。
之后 Android APK 崩溃并显示以下消息:
A/libc: stack corruption detected A/libc: Fatal signal 6 (SIGABRT) at 0x00007689 (code=-6), thread 32141 (Thread-2910)
有人知道怎么解决吗?
最佳答案
您发布的 Godbolt 链接的代码中至少有一个错误。这些语句导致缓冲区溢出(删除了周围的代码和 if() 条件。)
char buffer[2048];
length = syscall_read(fd, buffer, sizeof(buffer));
buffer[length] = 0;
buffer[length] = 0;
如果 sys_read
返回 2048,则访问数组外部。如手册页所述,read()
尝试读取最多 count
个字节,而不是 count-1
。如果数组分配在重要内容的正下方,这可能会导致堆栈损坏。
如果你想将它用作 C 隐式长度字符串而不是使用 write
或 memcpy
的显式长度缓冲区+大小,你必须为 0 终止符留出空间> 或其他。请记住,文件数据可以包含 0
个字节。
像往常一样,使用调试器,并确保您的代码适用于正常的系统调用以及内联包装器。
关于android - Android NDK 中的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655696/