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 隐式长度字符串而不是具有 write
或 memcpy
或其他任何内容的显式长度缓冲区+大小,则必须为 0 终止符留出空间。请记住,文件数据可以包含 0
个字节。
像往常一样,使用调试器,并确保您的代码适用于正常的系统调用以及内联包装器。
我试过使用 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 隐式长度字符串而不是具有 write
或 memcpy
或其他任何内容的显式长度缓冲区+大小,则必须为 0 终止符留出空间。请记住,文件数据可以包含 0
个字节。
像往常一样,使用调试器,并确保您的代码适用于正常的系统调用以及内联包装器。