当社の Android ソフトウェアは、正常に動作している SQLite 用の仮想ファイル システム (VFS) を使用しています。Android 6 (Marshmallow) で使用を開始すると、ftruncate() に渡される大きな負のオフセット、スタック オーバーフロー、データの破損など、あらゆる種類の奇妙なエラーが発生し始めました。readelf(他のツールの中でも)使用して、最終的に問題を追跡しました。によって使用されるインポートの変更libsqlite.so: Lollipop と以前のインポートftruncateとmmap、最新のライブラリのインポートftruncate64とmmap64。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ソース呼び出しは、私たちの方法論ftruncateをmmapせいぜい「疑わしい」ものにします。
libsqlite.soimport と useはどのようftruncate64にmmap64行われ、ソース コードはftruncateとのみを呼び出しmmapますか? 正しいソース コード リポジトリを参照していませんか? リンクステップで何かが起こっていますか?Marshmallow は、これらの関数の非 64 ビット バージョンのサポートを削除しましたか?