gpt4 book ai didi

android - Android Marshmallow libsqlite.so 源码调用ftruncate时如何使用ftruncate64?

转载 作者:行者123 更新时间:2023-11-29 01:17:30 24 4
gpt4 key购买 nike

我们的 Android 软件为 SQLite 使用虚拟文件系统 (VFS),该系统一直正常运行。一旦我们开始将它与 Android 6 (Marshmallow) 一起使用,就会开始出现各种奇怪的错误,包括传递给 ftruncate() 的大量负偏移、堆栈溢出、数据损坏等。使用 readelf(以及其他工具),我们最终将问题追溯到 libsqlite.so 使用的导入的变化:Lollipop 和更早的导入 ftruncatemmap,最新的库导入 ftruncate64mmap64。我们通过根据 API 版本更改我们使用的函数来“解决”了这个问题(Marshmallow 是版本 23):

/*
* Empirical testing of Tab S2 running Marshmallow revealed the SQLite
* unix_syscall table uses "ftruncate" and "mmap" as connection points,
* but the actual functions linked against are the *64 versions. This
* leads to stack corruption and all sorts of nasty errors as a result.
*/
if (getApiVersion() >= 23) // for Marshmallow
{ setUnixSystemCall(NULL, "ftruncate", our_ftruncate64);
setUnixSystemCall(NULL, "mmap", our_mmap64);
}
else // for Lollipop & older
{ setUnixSystemCall(NULL, "ftruncate", our_ftruncate);
setUnixSystemCall(NULL, "mmap", our_mmap);
}

查看来自 http://www.sqlite.org/2015/sqlite-amalgamation-3081002.zip 的源代码和 https://github.com/android/platform_external_sqlite/blob/master/dist/sqlite3.c C 源调用的所有内容都是 ftruncatemmap,这使我们的方法充其量是“有问题的”。

libsqlite.so如何导入和使用ftruncate64mmap64 其中源码只调用了ftruncatemmap?我们不是在查看正确的源代码存储库吗?链接步骤是否发生了什么? Marshmallow 是否删除了对这些函数的非 64 位版本的支持?

最佳答案

事实证明,NDK 中的 header 与操作系统构建时使用的相应 header 不完全匹配!

仿生:https://android.googlesource.com/platform/bionic.git/+/marshmallow-release/libc/include

这是构建 NDK 的方法:https://android.googlesource.com/platform/ndk/+/marshmallow-release

特别是,

https://android.googlesource.com/platform/bionic.git/+/marshmallow-release/libc/include/unistd.h

#if defined(__USE_FILE_OFFSET64)
extern int truncate(const char *, off_t) __RENAME(truncate64);
extern off_t lseek(int, off_t, int) __RENAME(lseek64);
extern ssize_t pread(int, void *, size_t, off_t) __RENAME(pread64);
extern ssize_t pwrite(int, const void *, size_t, off_t) __RENAME(pwrite64);
extern int ftruncate(int, off_t) __RENAME(ftruncate64);

https://android.googlesource.com/platform/bionic.git/+/marshmallow-release/libc/include/sys/mman.h mmap 具有类似的宏 - __RENAME() 在系统头文件中 意味着使用系统头文件构建的任何代码(例如, libc.so) 将仅导出 ftruncate64,而不导出 ftruncate,并且当调用 ftruncate 的应用链接到 时libc.so,而是导入 ftruncate64 而不是编写源代码时使用的调用。

我们没有深入研究 __RENAME() 宏来研究这种魔法是如何发生的 - 试图将产品推出市场的现实限制了我们可以深入兔子洞的深度。然而,如果有人想对此进行进一步调查,这就是您的起点。

关于android - Android Marshmallow libsqlite.so 源码调用ftruncate时如何使用ftruncate64?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38647446/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com