C++ はシンボル名をマングルします。名前はデバッグ時に使用できますが、バイナリが削除されていない場合に限ります。その他の使用シナリオは共有ライブラリです。シンボル名をエクスポートして、ライブラリで表示できます。
しかし、両方で:
a. むき出しのビルド、
b. かつ、通常の非共有ライブラリ ビルド
バイナリで使用できるシンボルはありませんか? たとえば、文字列ツールは記号を出力しませんか?
C++ はシンボル名をマングルします。名前はデバッグ時に使用できますが、バイナリが削除されていない場合に限ります。その他の使用シナリオは共有ライブラリです。シンボル名をエクスポートして、ライブラリで表示できます。
しかし、両方で:
a. むき出しのビルド、
b. かつ、通常の非共有ライブラリ ビルド
バイナリで使用できるシンボルはありませんか? たとえば、文字列ツールは記号を出力しませんか?
このコマンドは、イメージからデバッグシンボルstrip
を削除します。共有オブジェクトにエクスポートされるシンボルはデバッグシンボルではなく、によって削除されません。これらのシンボルは、関数/データを見つけるために使用できますが、コードをソースに関連付けません。strip
a。ストリップビルド
b。非共有ライブラリビルド
A)とB)の両方を満たすビルドについて質問しているのか、A)とB)のシナリオを別々に満たすビルドについて質問しているのかは明確ではありません。
両方(非共有、ストリップビルド)の場合、はい、シンボルはすべて消えているはずです。
A)の場合、いいえ:共有ライブラリを使用している場合、シンボルは(デフォルトで)そこからエクスポートされ、strip
削除されません。を使用している場合は、egまたは同等のメカニズムを使用しELF
てシンボルの可視性を制限できます。__attribute__((visibility("hidden")))
B)-ストリップされていない、共有されていないビルドの場合、シンボルは通常、シンボルテーブルに存在するため、strings
それらが表示されます。それらを取り除くには、strip
(これをAに変換します)とB)を組み合わせて使用します)。
共有ライブラリではないストリップビルド(a)では、シンボルは使用できません。
「通常の」ビルド(デバッグもストリップもされない)(b)では、関数名のシンボルは保持されますが、他のすべてのデバッグシンボルは保持されません。デバッガーでは、関数名を使用してスタックトレースをキャプチャできますが、パラメーターを調べたり、スタック変数の値を出力したりすることはできません。