android - Android NDK 中的系统调用

标签 android assembly android-ndk system-calls

我尝试使用 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 隐式长度字符串而不是使用 writememcpy 的显式长度缓冲区+大小,你必须为 0 终止符留出空间> 或其他。请记住,文件数据可以包含 0 个字节。

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

关于android - Android NDK 中的系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50655696/

相关文章:

php - Android 从 mysql JSON 数据填充微调器

assembly - x86 代表前缀,计数为零 : what happens?

0xFFE700DE >0xA 的汇编代码比较失败

ffmpeg - 将 libavdevice.a 链接到 libffmpeg.so 时找不到 NDK 相机和媒体原生 API 符号

android - RingtonePreference 不保存其值

android - 如果 Spinner 或 EditText 更改,则更改 TextView

java - 我怎样才能取消?

linux - 减去ESP或RSP寄存器会产生哪个异常? (堆栈增长)

安卓 JNI : java. lang.UnsatisfiedLinkError

Android NDK 递归搜索 header