代码之家  ›  专栏  ›  技术社区  ›  Phillip

android ndk系统调用

  •  1
  • Phillip  · 技术社区  · 8 年前

    我试过用 this syscall macro for arm_64

    它可以在系统打开、读取和关闭时工作。我能正确地看到文件内容。

    之后,android apk崩溃,并显示以下消息:

    A/LIBC:堆栈损坏检测到A/LIBC:致命信号6(sigabrt) 0x00007689(代码=-6),螺纹32141(螺纹-2910)

    有人知道怎么修吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Peter Cordes    8 年前

    你发布的godbolt链接上的代码中至少有一个bug。这些语句导致缓冲区溢出(删除了周围的代码和if()条件)。

    char buffer[2048];
    
        length = syscall_read(fd, buffer, sizeof(buffer));
    
            buffer[length] = 0;
    

    buffer[length] = 0; 如果 sys_read 返回2048。正如手册页上说的, read() 试图读到 count 字节 count-1 . 如果数组被分配到某个重要项的正下方,这可能会导致堆栈损坏。

    如果要将0作为c隐式长度字符串而不是显式长度缓冲区+大小 write memcpy 或者别的什么。记住,文件数据可以包含 0 字节。

    像往常一样,使用调试器,并确保代码与正常的系统调用以及内联包装器一起工作。