2017-04-18 16 views
4

私はmain()の前に実行する必要があるいくつかの静的初期化コードを含むこのライブラリを持っています。すべての翻訳単位をまとめてコンパイルするだけではうまくいきますが、静的ライブラリ(.aファイル)を提供し、ユーザーがアプリケーションにリンクしても機能しません。つまり、リンカーは自分の静的な初期化。私は、すなわちGNUリンクに--whole-archiveオプションを指定して、GCCに-Wl,--whole-archiveオプションを指定した場合、リンカは、静的ライブラリにすべてを拾うことができますYリンクするとき、「必要なものをつかむ」と「すべてをつかむ」(-Wl、 - 全体アーカイブ)の間に何かがありますか?

オルタナティブ、。

しかし、中には何かがありますか?いくつかのシンボルをマークして、実行可能ファイルのためにリンカがそれらをピックアップできるようにすることはできますか?残りのシンボルは必要なときにだけ追加されますか?

モチベーション:私は工場でクラスを登録するためにstatic blocksを使用します。私は自分のコードを(非動的な)ライブラリとして利用できるようにしたいのですが、ユーザコードは、そのファクトリが実装されるための "魔法の呪文"を実行する必要はありません。

いくつかの関連質問:

答えて

1

あなたは、自然にこのから呼び出されたすべてのコードを与えられた機能を維持するために、リンカを強制する(とすることができます関数)。 linkコマンドに-u my_functionを追加します。多くのビルドシステムでは、スタティックライブラリでビルド設定を使用する人にビルド設定を 'エクスポート'できます。例えば、NDK-構築枠組みをアンドロイドために、あなたはあなたのモジュールAndroid.mk

include $(CLEAR_VARS) 
LOCAL_MODULE := the_best_static_library 
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libfoo.a 
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include 
LOCAL_EXPORT_LDFLAGS := -u my_function 
include $(PREBUILT_STATIC_LIBRARY) 

のようなものを指定することができます。人々は彼らのAndroid.mkに簡単な声明

$(call import-module,third_party/the_best_static_library) 

N.B.を追加することによって、それを再利用しますこのアプローチを使用するには、my_function()staticと宣言することはできません。いくつかのシンボルがファイルスコープで静的であると宣言されている場合、リンカーは名前ではそれを全く知らないと推測します。幸運にも、リンカーが保持することを決めたコードで参照されている場合は、それも取り除かれません。さらに、special effortを作成しない限り、リンカーはコンパイル単位(Cファイル)をすべて削除します。したがって、多くの機能とデータを保持するダミー関数を「アンカー」するのは通常はenoughです。

+1

(1)この例のどの部分がAndroid専用ですか? GNU ldはこれらのフラグをすべて尊重しますか? (2) 'static'について - ファイルスコープで静的であると宣言しているわけではないのですか?それは実際に私には問題になるでしょう...でも、今は+1してみてください。 – einpoklum

+0

私は** statuc **についての答えを広げました。リンカフラグに関しては、gccベースのツールチェーン上で、私が知る限り利用できます。 Android固有のものは、スタティックライブラリのユーザーにその知識をどのように配布するかです。ヘッダーファイルへのアクセスをどのように手助けしますか?あなたのコードはいくつかのサードパーティ製のライブラリに依存していると教えてくれますか? –

関連する問題