Android静的リンクとglibcに対する動的リンク

私はいくつかのLinuxツール(およびいくつかの独自のCコード)をAndroidにクロスコンパイルしてきました。 Androidのlibc(たとえば、このhttp://credentiality2.blogspot.com/2010/08/compile-ncurses-for-android.htmlのような問題の場合)

Q1:armツールチェーン(またはndk-build)とクロスコンパイルしながら、glibc(およびその他の依存関係)に対して静的にリンクするにはどうすればよいですか?

Q2:Androidのバイナリのglibcに対して静的にリンクするのは良い考えですか?静的にリンクを開始する場合、何かが壊れると予想する必要がありますか?パフォーマンス/メモリの問題はありますか?

ここから静的リンクと動的リンクの長所と短所のほとんどを理解しています-
C++ application – should I use static or dynamic linking for the libraries?および
Static linking vs dynamic linking

したがって、バイナリをクロスコンパイルするときに、glibcをAndroid用に静的にリンクする必要があるかどうかを知りたいと思います。

ベストアンサー
最初にlibcについての小さなメモ。 Android libcは、GNU libc(glibc)ではなくBionic libc(https://github.com/android/platform_bionic/)です。したがって、Androidデバイスで利用可能なlibcと同様に、NDKに含まれるlibcはBionicです。

glibcに関する限り、NDKを使用してビルドできます。ただし、Androidデバイスにインストールすると、その名前はシステムlibcと衝突します。これは、動的ライブラリを構築する場合のみであることに注意してください。 GNU libcを静的ライブラリとしてビルドする場合、静的ライブラリをインストールする必要がないため、上記の問題はすべて回避されます。

質問に答えましょう:

> Q1:NDKを使用してglibcを構築している場合、Android.mkは変数BUILD_STATIC_LIBRARYを使用して静的ライブラリを構築します。ただし、NDKを使用しない場合、おそらく多くの頭痛に苦しむ必要があります(どのくらいかわからない)。 glibcのビルド(静的または動的)を試したことがないため、これについて詳しく説明することはできません。また、glibcとの静的リンクは、非モバイルプラットフォームでは少なくとも推奨されていないと思われます。
>破損の観点からは、静的リンクと動的リンクの間に違いはありません。起動の観点からは、動的ライブラリのロード手順が不要なため、静的実行可能ファイルの起動が速くなります。静的または動的にリンクされた実行可能ファイルには、メモリまたは実行速度のペナルティはありません。静的実行可能ファイルの場合、ディスクストレージの要件は大きくなります。

バイオニックlibcの機能が欠落しているという問題に関しては、ほとんどのGNUソフトウェアで使用されている方法を使用できます。つまり、システムライブラリにない場合に独自の関数実装を提供します。 file-5.11、GNU make 3.82、diffutils-2.8 for Androidをコンパイルし、NDK toolchains / includes / libsをautotools(./configure …)に渡しました。これらのプログラムには、標準ライブラリが提供していない場合(この場合はBionic)に備えて、ほとんどの非コアライブラリ関数の実装が含まれているようです。

注:静的glibcを作成して、成功/失敗したときに答えを更新します。

転載記事の出典を記入してください: Android静的リンクとglibcに対する動的リンク - コードログ