2012-02-11 12 views
3

誰かが私にバイナリストリッピングを説明できますか?どのくらい効果的です(バイナリをどれくらい減らすことができますか)。どのようにそれを適用しますか?バイナリストリッピングを簡単に

答えて

8

実際には2種類のストリッピングがあります。

バイナリを削除するは、バイナリのシンボルテーブルから不要なシンボルを削除します。シンボルテーブルには、プログラム内のすべてのオブジェクトの名前とデバッグ情報が含まれています。これは、プログラムがシンボルテーブルを介して通常は独自の関数にアクセスしないため、プログラムを実行するためには必要ありません。

シンボルテーブルは、プログラムがクラッシュしたときに便利なデバッグ情報を提供するので、プログラムがクラッシュしたときに呼び出された関数を示すバックトレースを取得できます。シンボルを削除すると、バックトレースにはメモリアドレスだけが含まれますが、関数名は含まれません。デバッグしているアプリケーションを削除しないでください。

バイナリを削除すると、実行可能ファイルをリバースエンジニアリングするのがやや難しくなりますが、私はあなたがその編集性ではないことを望んでいます。

バイナリを削除しても、プログラムが高速に読み込まれるわけではありません。シンボルテーブルは、プログラムがクラッシュした場合にバックトレースに必要でない限り、メモリにロードされません。

stripコマンドを使用してコマンドラインからバイナリを削除することができます。私はXcodeからこれをどのように起動するかについてはあまりよく分かりません。ストリッピング

strip MyExecutable 

デッドは、コードから未使用の関数やデータを削除する別のプロセスです。これはバイナリが作成されるリンク段階で発生します。これにより、コードのサイズが小さくなる可能性があります。違いは、使用していないデータがプログラムにどれくらいあるかによって異なります。それはたくさんあるかもしれませんし、まったく何もないかもしれません。デッドストリップを使用すると、ホットコードのローカリティが向上するため、アプリケーションを非常にわずかに高速化できます。 (大きな違いがある場合は、アプリケーションに深刻な問題があります)

デッドストリッピングの一般的な欠点はありませんので、私は常にオンにします。デッドストリッピングを有効にするには、リンカーフラグ-dead_stripに対応するXcodeを使用します。

gcc -o MyExecutable -Wl,-dead_strip .... 

注:別のサブセクションで各機能を置くことによってデッドストリッピング作品。アセンブリファイルを記述する場合は、.subsections_via_symbolsディレクティブを使用して各シンボルを別々のサブセクションに配置し、個々のシンボルをリンカがデッドストリップできるようにすることができます。 GCCは、私が知る限り、そのアセンブリの出力に常にその指令を生成します。

参考文献:

https://developer.apple.com/library/mac/#documentation/General/Conceptual/MOSXAppProgrammingGuide/Performance/Performance.html

+0

だから、死んストリッピングは、合計ファイルサイズを削除しますか? – theUser

+0

決して呼び出さない関数や、決して使用しないデータを記述すると、ファイルサイズが小さくなります。その差はおそらく非常に小さく、ゼロであり、非常に大きくなる可能性があります。あなたのアプリケーションによって異なります。また、ロード時間や実行時のパフォーマンスにも影響しますが、ごくわずかです(通知するには小さすぎます)。 –

+0

ええええええええええええええええええええええええええなたください、これらの設定は、あなたがリリース用のコンフィギュレーションで事前にセットアップしたみらいです。だから私は何も最適化することはできません。まあ、とにかくありがとう。また、知識が豊富なので、これを手伝うことができますか?http://stackoverflow.com/questions/9230550/how-big-are-the-armv6-and-armv7-architectures#comment11636946_9230550 – theUser