web-dev-qa-db-ja.com

「gcc -s」と「strip」コマンドの違いは何ですか?

これら2つの違いは何でしょうか。

  • gcc -s:実行可能ファイルからすべてのシンボルテーブルと再配置情報を削除します。

  • strip:オブジェクトファイルからシンボルを破棄します。

それらは同じ意味を持っていますか?

どちらを使用しますか:

  • 実行可能ファイルのサイズを小さくしますか?
  • その実行をスピードアップしますか?
65
Tim

gccはコンパイラ/リンカーであり、その-sオプションは、完了したものですリンク中。また、構成可能ではありません-削除する情報のセットがあり、それ以上でもありません。

stripは、既にコンパイルされているオブジェクトファイルで実行できるものです。また、どの情報を削除するかを構成するために使用できるさまざまなコマンドラインオプションがあります。例えば、 -gは、gcc -gが追加されます。

stripはbashコマンドではありませんが、bashシェルから実行している場合があります。 GNUバイナリユーティリティスイートの一部であるbashとはまったく別のコマンドです。

57
Cascabel

受け入れられた答えは非常に良いですが、あなたのさらなる質問を補完するだけです(そして、ここにたどり着く人の参照として).

いくつかのオプションを備えたストリップに関して、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

41
Diego Pino

"gcc -s"は再配置情報と "strip"によって行われないシンボルテーブルを削除します。再配置情報を削除すると、アドレススペースレイアウトのランダム化に何らかの影響があることに注意してください。 this リンクを参照してください。

12
Khaled

それらは同様のことを行いますが、stripはファイルから削除されるものをよりきめ細かく制御できます。

5
Jim Lewis