5

Linux/Gcc/LD - ツールチェーン。

次の 2 つの理由から、STL/Boost デバッグ シンボルをライブラリと実行可能ファイルから削除したいと考えています。

  1. 大きなプログラムではリンクが非常に遅くなります
  2. デバッグが stl/boost コードに飛び込み、煩わしい

1.インクリメンタルリンクは大きな改善になりますが、AFAIK ldはインクリメンタルリンクをサポートしていません。1999 年の dr.dobb のジャーナル (もう Web ではなく、archive.orgにあります) に「疑似インクリメンタル リンク」という回避策があります(アイデアは、すべてを動的ライブラリに入れ、すべての更新されたオブジェクト ファイルを 2 つ目のライブラリに入れることです)。が最初に読み込まれます) が、これは実際には一般的な解決策ではありません。

2.ここにスクリプトがありますが、a)私には機能しませんでした(シンボルを削除しませんでした)、b)パイプの最後で機能するため非常に遅くなりますが、削除する方が効率的です以前のシンボル。

もちろん、他のデバッグ シンボルはそのままにしておく必要があります。

4

6 に答える 6

3

GNUストリップは--strip-symbols=への正規表現引数を受け入れます。STLとブーストシンボルは、それらが含まれている名前空間のために名前がマングルされています。現時点ではGCC binutilsは便利ではありませんが、使用されている名前マングリングを覗いてみてください。名前空間の場合は、「名前空間Xからのシンボル」の正規表現を作成し、これを--strip-symbols=に渡します。

于 2008-09-17T10:03:31.357 に答える
2

私の知る限り、gcc でやりたいことを実行する実際のオプションはありません。主な問題は、デバッグ シンボルを取り除きたいすべてのコードがヘッダーで定義されていることです。

それ以外の場合は、ライブラリを個別に構築し、それを削除して、削除されたバージョンとリンクすることができます。

しかし、コンパイルユニットの特定の部分からデバッグシンボルを取得するだけで、ビルドとリンク (目的のリンク時間の高速化のため) は、私の知る限り gcc では不可能です。

于 2008-09-16T18:52:55.447 に答える
1

ストリップを使用することもできます。strip --strip-unneeded --strip-debug libfoo.so

そもそもデバッグせずにビルドしてみませんか?

于 2008-09-16T16:13:54.220 に答える
1

ある時点で必要になる可能性があるため、おそらく共有ライブラリからデバッグ シンボルを削除したくないでしょう。

デバッグに GDB または DDD を使用している場合、ソース パスから Boost ソース ファイルを削除して、関数を追跡できないようにすることができる場合があります。(または、それらをトレースしないで、トレースオーバーしてください!)

デバッグ シンボルを使用してプログラムをコンパイルするオプションを削除すると、リンク時間が短縮されます。

リンク先のスクリプトと同様に、strip プログラム (「man strip」) を参照して、すべてまたは特定のシンボルを削除できます。

于 2008-09-16T16:12:09.467 に答える
-1

どのコンパイラを使用していますか? たとえば、あなたの質問を正しく理解できれば、これは MS Visual Studio では些細なことです。

于 2008-09-16T15:27:41.587 に答える