GNU/Linux >> Linux の 問題 >  >> Linux

nm コマンドの出力に奇妙なシンボル名が表示される

これは、C++ の名前マングリングが原因です

nm -C

名前のマングリングを防ぐために、

  • C コンパイラ (g++ ではなく gcc) を使用し、ソース ファイルに .c (.cpp ではなく) という名前を付けます
  • または extern "C" を宣言:

.

my.h

  extern "C" 
  {
        void start();
        void finish();
  }

これにより、「C」リンケージが提供されます。つまり、オーバーロードできず、参照渡しもできず、c++ もありません:)


C++ の名前マングリングのように聞こえます。


他の回答が述べているように、これはおそらく C++ の名前マングリングが原因です。 「マングルされていない」名前でシンボルにアクセスできるようにし、それが C++ で実装されている場合は、extern "C" を使用する必要があります。 C リンケージがあることを C++ コンパイラに伝えます。

関数プロトタイプを含むヘッダーには、次のようなものが必要です:

#if defined(__cplusplus)
extern "C" {
#endif

// the prototype for start()...


#if defined(__cplusplus)
}
#endif

これにより、関数が C++ コンパイラによって使用される場合、extern "C" が取得されます。 宣言で、それが C モジュールで使用されている場合、extern "C" によって混乱されることはありません。 指定子。

関数定義の前にヘッダーを含める場合、.cpp ファイルに実装する必要はありません。前の宣言から見たリンケージ仕様を使用します。ただし、関数定義を extern "C" で装飾することを好みます すべてが同期していることを確認するためだけに (.cpp ファイルでは #ifdef は必要ないことに注意してください) 前処理のもの - 常に C++ としてコンパイルされます。


Linux
  1. Linux 時間コマンドの例

  2. 10 実用的な Linux nm コマンドの例

  3. PS コマンドの完全な出力の表示

  1. stat コマンド出力のデバイス番号

  2. Linux のパイプ記号 |行う?

  3. docker でのコマンド出力のリダイレクト

  1. コマンドの出力をシェル変数に保存しますか?

  2. ツリーコマンドの出力をJson形式に変換しますか?

  3. 「最後の」コマンドの出力?