2008-09-16 12 views
5

Linux/Gcc/LD - ツールチェーン。C++ - STL/Boostデバッグシンボルを削除します(...または作成しません)

私は二つの理由から、ライブラリと実行可能ファイルからSTL /ブースト・デバッグシンボルを削除したい

  1. リンクが
  2. デバッグは迷惑であるSTL /ブーストコードへジャンプし、大きなプログラムのために非常に遅くなります

1.インクリメンタルリンクは大きな改善ですが、AFAIK ldはインクリメンタルリンクをサポートしていません。 1999 dr.dobbのジャーナル(Webではなく、archive.org)には、「擬似インクリメンタルリンク」の回避策があります(すべてのものを動的ライブラリに入れ、更新されたオブジェクトファイルはすべて、ロードされた2番目のものに入れます

2.スクリプトにはhereがありますが、a)それは私のためには機能しませんでした(シンボルは削除されませんでした)、b)動作が遅いですパイプの終わりでは、より早くシンボルを削除する方が効率的です。

明らかに、他のデバッグシンボルはそのまま残ります。

答えて

-1

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

+0

に、その方法を教えてください。 – gbjbaanb

+0

些細なことかもしれませんが、それはたくさんのタイピングです...彼はVSにはないことが分かります。 – hatcat

1

おそらく、共有ライブラリからデバッグシンボルを削除したくない場合があります。

デバッグにGDBまたはDDDを使用している場合、ソースパスからBoostソースファイルを削除して機能をトレースできない場合があります。

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

リンク先のスクリプトと同様に、ストリッププログラム(「マンストリップ」)を参照して、すべてまたは特定の記号を削除することができます。

1

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

最初にデバッグしないでビルドしてみませんか?

2

私が知る限り、あなたがgccで望むことをするための本当の選択肢はありません。主な問題は、デバッグシンボルを削除するコードがすべてヘッダに定義されていることです。

その他ライブラリを個別に構築し、削除し、削除したバージョンとリンクすることは可能です。

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

3

GNU stripは--strip-symbols = への正規表現引数を受け入れます。STLとブーストシンボルは、それらの名前空間のために名前が変更されています。私はこの時点で便利なGCC binutilsを持っていませんが、名前空間に使われている名前のマングリングを見て、名前空間Xからのシンボルの正規表現を構築して--strip-symbols =

+0

これはあまり役に立ちません。テンプレートから生成されたすべての関数が独自のシンボルを取得するわけではありません。これを、std :: vectorを使用する単純なプログラムで試してみてください。 –

+0

@ n.m .:シンボルが_removing_シンボルに関するものだと考えると、シンボルになっていない関数を開始することさえ理由はありません。 – MSalters

+0

申し訳ありません私はちょうど、デバッグについての質問の第二の部分を意味します。シンボルを壊すことは、gdbが最初にシンボルを持たない関数aに入るのを妨げません! –

1

に渡します。 STLシンボルを取り除くためのMSaltersの回答作業を行うために必要ないくつかの詳細。

STLシンボル名はマングルされています。そのトリックは、これらの名前をカバーする正規表現を見つけることです。私は、GNUのBinutilsのでこれらのシンボルを見上げ:私は基本的にresizeのように、STL機能で検索

> nm --debug-syms <objectfile> 

。これが困難な場合は、次のコマンドを使用した場合、出力が読めるようになります。

> nm --debug-syms --demangle <objectfile> 

STL関数コールを含む行番号を検索し、その後、ルックアップするには、最初のコマンドを提供を使用して、その同じ行数にマングルされた名前です。これは私がGNUストリップは、私が使用し、これらのシンボルを削除できるようにするには

など、すべてのSTLのシンボル名は、_ZNSt [0-9] +または_ZStから始まったこと[0-9] +を見ることができ:

> strip --wildcard    \ 
    --strip-symbol='_ZNKSt*' \ 
    --strip-symbol='_ZNSt*'  \ 
    --strip-symbol='_ZSt*'  \ 
    --strip-symbol='_ZNSa*'  \ 
    <objectfile> 

これらのコマンドは、コンパイル/リンクされたバイナリで直接使用しました。削除の前後でnmの出力を比較してこれらのシンボルの削除を確認しました(出力をファイルに書き込んでvimdiffを使用)。 --wildcardオプションを使用すると、正規表現を使用できます。 [0-9] *は無限の数値に0を意味しますが、ここでは実際には1つの数字の後に無限の何かが続くことを意味します(行末まで)。

あなたがに探している場合here行ったように、これは、GDBのskip fileコマンドによって達成することができるSTLコードに乗りません。

希望すると助かります

関連する問題