この回答のメリットは、静的ライブラリを使用する理由によって異なります。リンカーが未使用のオブジェクトを後でドロップできるようにする場合は、追加することはほとんどありません。アプリケーションをリンクするために渡す必要があるオブジェクトの数を最小限に抑えるという組織化の目的である場合、雇用されたロシア人の回答のこの拡張が役立つ場合があります。
コンパイル時に、コンパイル単位内のすべてのシンボルの可視性は、次を使用して設定できます。
-fvisibility=hidden
-fvisibility=default
これは、ソースに注釈を付けることなく、デフォルトの可視性で単一のファイル「interface.c」をコンパイルし、非表示の可視性で多数の実装ファイルをコンパイルできることを意味します。再配置可能なリンクは、API 以外の関数が「隠されている」単一のオブジェクト ファイルを生成します。
ld -r interface.o implementation0.o implementation1.o -o relocatable.o
結合されたオブジェクト ファイルは、objcopy を実行できるようになりました。
objcopy --localize-hidden relocatable.o mylibrary.o
したがって、目的の API のみを公開する単一のオブジェクト ファイル「ライブラリ」または「モジュール」があります。
上記の戦略は、リンク時間の最適化と適度に相互作用します。-flto を使用してコンパイルし、コンパイラを介してリンカーに -r を渡すことで、再配置可能なリンクを実行します。
gcc -fuse-linker-plugin -flto -nostdlib -Wl,-r {objects} -o relocatable.o
以前のように objcopy を使用して非表示のシンボルをローカライズし、最後にリンカを呼び出して、ローカル シンボルと、lto 後のオブジェクトで検出された他のデッド コードを取り除きます。残念ながら、relocatable.o は lto 関連の情報を保持していない可能性があります。
gcc -nostdlib -Wl,-r,--discard-all relocatable.o mylibrary.o
lto の現在の実装は、再配置可能リンク段階でアクティブになっているように見えます。lto をオンにすると、hidden=>local シンボルが最後の再配置可能リンクによって削除されました。lto がなければ、hidden=>local シンボルは最終的な再配置可能なリンクを生き延びました。
lto の将来の実装では、再配置可能リンク ステージを通じて必要なメタデータを保持する可能性が高いようですが、現時点では、再配置可能リンクの結果は単純な古いオブジェクト ファイルのようです。