1

C++ はシンボル名をマングルします。名前はデバッグ時に使用できますが、バイナリが削除されていない場合に限ります。その他の使用シナリオは共有ライブラリです。シンボル名をエクスポートして、ライブラリで表示できます。

しかし、両方で:

a. むき出しのビルド、

b. かつ、通常の非共有ライブラリ ビルド

バイナリで使用できるシンボルはありませんか? たとえば、文字列ツールは記号を出力しませんか?

4

3 に答える 3

1

このコマンドは、イメージからデバッグシンボルstripを削除します。共有オブジェクトにエクスポートされるシンボルはデバッグシンボルではなく、によって削除されません。これらのシンボルは、関数/データを見つけるために使用できますが、コードをソースに関連付けません。strip

于 2012-09-04T00:49:44.980 に答える
1

a。ストリップビルド

b。非共有ライブラリビルド

A)とB)の両方を満たすビルドについて質問しているのか、A)とB)のシナリオを別々に満たすビルドについて質問しているのかは明確ではありません。

両方(非共有、ストリップビルド)の場合、はい、シンボルはすべて消えているはずです。

A)の場合、いいえ:共有ライブラリを使用している場合、シンボルは(デフォルトで)そこからエクスポートされ、strip削除されません。を使用している場合は、egまたは同等のメカニズムを使用しELFてシンボルの可視性を制限できます。__attribute__((visibility("hidden")))

B)-ストリップされていない、共有されていないビルドの場合、シンボルは通常、シンボルテーブルに存在するため、stringsそれらが表示されます。それらを取り除くには、strip(これをAに変換します)とB)を組み合わせて使用​​します)。

于 2012-09-04T03:09:34.543 に答える
1

共有ライブラリではないストリップビルド(a)では、シンボルは使用できません。

「通常の」ビルド(デバッグもストリップもされない)(b)では、関数名のシンボルは保持されますが、他のすべてのデバッグシンボルは保持されません。デバッガーでは、関数名を使用してスタックトレースをキャプチャできますが、パラメーターを調べたり、スタック変数の値を出力したりすることはできません。

于 2012-09-04T03:15:34.697 に答える