実行可能ファイルのスペースを節約しようとしていますが、呼び出したことがないにもかかわらず、いくつかの関数がオブジェクト ファイルに追加されていることに気付きました (コードはライブラリからのものです)。
これらの関数を自動的に削除するよう gcc に指示する方法はありますか、それとも手動で削除する必要がありますか?
実行可能ファイルのスペースを節約しようとしていますが、呼び出したことがないにもかかわらず、いくつかの関数がオブジェクト ファイルに追加されていることに気付きました (コードはライブラリからのものです)。
これらの関数を自動的に削除するよう gcc に指示する方法はありますか、それとも手動で削除する必要がありますか?
オブジェクト ファイル (実行可能ファイルではない) にコンパイルする場合、static
その関数を呼び出す別のオブジェクト ファイルに対してオブジェクト ファイルをリンクすることが常に可能であるため、コンパイラは非関数を削除しません。したがって、最初のステップは、できるだけ多くの関数を宣言することstatic
です。
次に、コンパイラが未使用の関数を削除する唯一の方法は、実行可能ファイルを静的にリンクすることです。その場合、少なくともプログラムが現れて、どの機能が使用され、どの機能が使用されていないかを把握する可能性があります。
問題は、gcc が実際にこの種のクロスモジュール最適化を行っているとは思えないことです。あなたの最善の策は、-Os
コードサイズを最適化するためのフラグですが、それでも、未使用の非静的関数を含むオブジェクトファイル abc.o があり、実行可能な def.exe に対して静的にリンクしている場合、私はそれを信じていませんgcc は、未使用の関数のコードを取り除きます。
本当にこれを行う必要がある場合は、実際#include
にファイルをまとめて、プリプロセッサ パスの後に単一の .c ファイルがコンパイルされるようにする必要があると思います。gcc で巨大な巨大なソース ファイルを 1 つコンパイルすると、未使用の関数が削除される可能性が高くなります。
-Os(サイズを最適化)を使用してgccを呼び出すことを検討しましたか?未到達のコードが削除されるかどうかはわかりませんが、テストするのは簡単です。また、実行可能ファイルを取り戻した後、それを「削除」することもできます。同じことを行うためのgccコマンドライン引数があると確信しています-それは--dead_stripですか?
-Os
サイズを最適化することに加えて、このリンクが役立つ場合があります。
私がこの質問をしたので、GCC 4.5がリリースされました。これには、すべてのファイルを結合するオプションが含まれているため、1つの巨大なソースファイルのように見えます。このオプションを使用すると、未使用の機能を簡単に取り除くことができます。
詳細はこちら
IIRC リンカは、デフォルトで特定のケースで必要なことを行います。要するに、ライブラリ ファイルには一連のオブジェクト ファイルが含まれており、参照ファイルのみがリンクされているということです。GCC で各関数を独自のオブジェクト ファイルに出力し、これをライブラリにビルドする方法を理解できる場合は、取得する必要があります。あなたが探しているもの。
実際にこれを実行できるコンパイラを 1 つだけ知っています: here (-lib フラグを見てください)