2

私たちのAndroidソフトウェアは正しく動作しているSQLite用の仮想ファイルシステム(VFS)を使用しています。 Android 6(Marshmallow)で使用すると、ftruncate()、スタックオーバーフロー、データ破損などに大きな負のオフセットが渡され、あらゆる種類の奇妙なエラーが発生し始めました(他のツールの中でも)。 libsqlite.so:Lollipopで使用されているインポートの変更に問題があり、以前のインポートftruncatemmapの場合、最新ライブラリではftruncate64mmap64がインポートされます。私たちは、変更することで、問題を「解決」され、我々は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.ziphttps://github.com/android/platform_external_sqlite/blob/master/dist/sqlite3.cからソースコードを見てみますmmapは私たちの方法論をせいぜい疑わしいものにしています。

方法libsqlite.so輸入とはftruncate64とソースコードのみftruncatemmap呼び出すmmap64を使用していますか?正しいソースコードリポジトリを見ていないのですか?リンクステップで何かが起こっていますか? Marshmallowはこれらの関数の64ビット以外のバージョンのサポートを削除しましたか?

答えて

1

NDKのヘッダーは、OSが組み込まれている対応するヘッダーと正確に一致しません。

バイオニック: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.hmmapのための同様のマクロを持っている - __RENAME()でシステムヘッダは、任意のコード(例えば、libc.soは)のみftruncate64、ないftruncateをエクスポートするシステムヘッダを使用して構築されたことを意味し、ftruncateを呼び出すアプリケーションをlibc.soに対してリンクされている場合、それは代わりに、ソースコードを用いて書かれた呼び出しではなくftruncate64をインポートします。

この魔法の仕組みを調べるために、__RENAME()マクロには潜んでいませんでした。ドアから製品を手に入れようとする現実は、ウサギの穴をどれくらい深く掘り下げることを禁じています。しかし、誰かがこれをさらに調査したい場合は、これが始まる場所です。

関連する問題