3

Apple gccを使用して、再配布する予定の dylib をコンパイルしています。libzさまざまな理由から、いくつかのライブラリを使用していますが、簡単にするために言っておきましょう。

このライブラリは通常、Mac システムでは見つからないため、展開を簡素化するためにパスを渡すことで、使用されているシンボルの dylibへの静的リンクを作成したいと考えています。.a-file

これで、リンカは lib のすべてのシンボルを結果の dylib にリンクしますが、私はサブセットのみを参照しています。Linux では、この問題に遭遇したことはありません。リンカは、参照されていないシンボルをすべて喜んで破棄し、非常にスリムな実行可能ファイルを作成するため、可能なはずです。私が今持っているdylibファイルは、本来よりも10倍大きくなっています。

-dead_code リンカー フラグをいじってみましたが、役に立ちませんでした。私が理解していないだけなのではないでしょうか?

誰もこれに対する解決策を知っていますか?

4

1 に答える 1

5

試してみてください-Wl,--gc-sections

に関して-dead_strip(あなたがおそらく意味したこと-dead_code):

-dead_stripオプションをオンにする前に、デッドコードストリッピングを処理するためにプロジェクトを最初に「移植」する必要があります。これには、-gused(-gのデフォルト)から-gfullへの変更、およびMac OSX2004年6月リリースの新しいコンパイラを使用してプログラムにリンクされているすべてのオブジェクトファイルの再コンパイルが含まれます。また、実行可能ファイルからシンボルを使用するプラグインをロードする実行可能ファイルを構築する場合は、プラグインが使用するシンボルが削除されていないことを確認する必要があります( 属性を使用して)((使用済み))または-exported_symbols_listオプション)。エクスポートリストを使用して共有ライブラリを構築している場合、またはld(1)の-bundle_loaderフラグで使用される実行可能ファイルを構築している場合は、エクスポートされたC++シンボルのエクスポートリストに例外フレーム情報のシンボルを含める必要があります。 。これらの記号は.ehで終わり、nm(1)ツールで表示できます。

および

コマンドラインからのデッドコードストリッピングを有効にするには、-dead_stripオプションをldに渡します。また、-gfullオプションをGCCに渡して、コードのデバッグシンボルの完全なセットを生成する必要があります。リンカは、この追加のデバッグ情報を使用して、実行可能ファイルを完全に削除します。

お役に立てれば。

この回答のすべてのコンテンツは、「apple ld staticlinkunusedsymbols」の最初のいくつかのGoogle検索結果内にありました。:)

于 2011-04-08T09:06:42.107 に答える