これら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"によって行われないシンボルテーブルを削除します。再配置情報を削除すると、アドレススペースレイアウトのランダム化に何らかの影響があることに注意してください。 this リンクを参照してください。
それらは同様のことを行いますが、stripはファイルから削除されるものをよりきめ細かく制御できます。