私たちのAndroidソフトウェアは正しく動作しているSQLite用の仮想ファイルシステム(VFS)を使用しています。 Android 6(Marshmallow)で使用すると、ftruncate()、スタックオーバーフロー、データ破損などに大きな負のオフセットが渡され、あらゆる種類の奇妙なエラーが発生し始めました(他のツールの中でも)。 libsqlite.so
:Lollipopで使用されているインポートの変更に問題があり、以前のインポートftruncate
とmmap
の場合、最新ライブラリではftruncate64
とmmap64
がインポートされます。私たちは、変更することで、問題を「解決」され、我々はAPIのバージョンに応じて、使用する関数(マシュマロは、バージョン23である):ソースがftruncateを呼び出すと、Android Marshmallow libsqlite.soはftruncate64をどのように使用しますか?
/*
* 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);
}
すべてC
ソースが呼び出すftruncate
との両方http://www.sqlite.org/2015/sqlite-amalgamation-3081002.zipとhttps://github.com/android/platform_external_sqlite/blob/master/dist/sqlite3.cからソースコードを見てみますmmap
は私たちの方法論をせいぜい疑わしいものにしています。
方法libsqlite.so
輸入とはftruncate64
とソースコードのみftruncate
とmmap
呼び出すmmap64
を使用していますか?正しいソースコードリポジトリを見ていないのですか?リンクステップで何かが起こっていますか? Marshmallowはこれらの関数の64ビット以外のバージョンのサポートを削除しましたか?