これら2つの違いは何だろうか:
gcc -s
処置: 実行可能ファイルからすべてのシンボル・テーブルおよび再配置情報を削除してください。strip
: オブジェクト ファイルからシンボルを破棄します。
同じ意味ですか?
どちらを使用しますか:
- 実行可能ファイルのサイズを縮小しますか?
- その実行を高速化しますか?
gcc
コンパイラ/リンカであるため、その-s
オプションはリンク中に行われるものです。また、構成することもできません。削除する一連の情報があり、それ以上でもそれ以下でもありません。
strip
すでにコンパイルされているオブジェクトファイルで実行できるものです。また、削除する情報を構成するために使用できるさまざまなコマンドラインオプションもあります。たとえば、追加-g
するデバッグ情報のみを削除します。gcc -g
strip
これはbashコマンドではないことに注意してください。ただし、bashシェルから実行している場合もあります。これは、GNUバイナリユーティリティスイートの一部であるbashとは完全に別のコマンドです。
受け入れられた回答は非常に優れていますが、さらなる質問を補完するためのものです (また、ここにたどり着く人の参考としても)。
一部のオプションを含むストリップに関して gcc -s に相当するものは何ですか?
どちらも同じことを行い、シンボル テーブルを完全に削除します。ただし、@JimLewis が指摘したように、strip を使用すると、より細かい制御が可能になります。たとえば、再配置可能なオブジェクトでstrip --strip-unneeded
は、そのグローバル シンボルは削除されません。ただし、完全なシンボル テーブルを削除しますstrip
。strip --strip-all
実行可能ファイルのサイズを縮小し、実行を高速化するために使用するものはどれですか
シンボル テーブルは、バイナリの割り当て不可のセクションです。これは、RAM メモリにロードされないことを意味します。たとえば、クラッシュが発生したときにスタックトレースを出力するなど、目的のデバッグに役立つ情報を保存します。シンボル テーブルを削除することが理にかなっているケースは、ストレージ容量に深刻な制約があるシナリオです (その点に関して、gcc -Os -s
またはmake CXXFLAGS="-Os -s" ...
サイズをさらに縮小するために削除される、より小さな低速のバイナリが生成されるため、便利です)。 . コメントされた理由により、シンボルテーブルを削除しても速度が向上するとは思いません。
最後に、共有オブジェクトの削除に関する次のリンクをお勧めします: http://www.technovelty.org/linux/stripping-shared-libraries.html
「gcc -s」は、 「strip」では行われない再配置情報とシンボル テーブルを削除します。再配置情報を削除すると、アドレス空間レイアウトのランダム化に何らかの影響があることに注意してください。このリンクを参照してください。
それらは同様のことをしますが、ストリップはファイルから削除されるものをよりきめ細かく制御することを可能にします。