0

大きなライブラリ liblarge と、liblarge にリンクするアプリケーション app があるとします。

Liblarge は LGPL ライセンスの下にあり、アプリは独自のライセンスの下にあります。app から使用されていないすべての「デッド コード」を liblarge から削除できるようにしたいと考えています。どうにかしてこれを行うことはできますか?おそらく使用されている関数のリストをリンカーに提供しますか?

4

1 に答える 1

0

簡単に進める方法はありません。

上記の手法 (私のコメント) をプライベート コピーで使用して、削除できる *.o をワークアウトすることができます。次に、DSO/DLL をビルドする独自の変更された liblarge ソース ツリーをビルドできますが、不要であることが判明した後は、リンカー コマンド ライン (DSO/DLL をビルドするため) から *.o を削除します。

これは、コードがオブジェクト コードに変換されると、多くの情報が失われる C/C++ のしくみです。

たとえば、各 *.o ファイルのサイズを減らしたいと思うかもしれません。これを行う主な方法は、 .c/ .cpp コンパイル ユニットを分割することです。

C/C++ ABI の問題は、コンパイラが *.o ファイル内の任意の場所に自由にコードを配置し、相対オフセットを使用してその中のセグメントにジャンプしたり、セグメントからジャンプしたりできることです。*.o に保存されているメタデータは、コンパイルされたコードを分解して、機能するために必要なすべての依存関係を確認できるほど十分ではありません。これを行うには、入力ソース コードを手動で分割する必要があります。

これが、メモリ フットプリントが重要であった組み込みソフトウェア開発で、ソース ファイル内に文字通り 1 つの関数を配置する理由の 1 つです。最近の組み込みシステムには大量のメモリが搭載されています。

于 2012-09-19T06:52:38.420 に答える