web-dev-qa-db-ja.com

nm: "U"シンボルは未定義です

私のライブラリのいずれかでnmを実行すると:

nm libmylib.so

私はこのような行を取得します

             U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

Nmのマニュアルページをチェックし、「U」を取得しました。シンボルは未定義です。未定義のシンボルとはどういう意味ですか?

それが本当に定義されていない場合、なぜnmはそれをまったく報告しないのですか?

49
bbazso

未定義のシンボルは、ライブラリが使用するシンボルですが、ライブラリの作成に使用されるオブジェクトファイルのいずれにも定義されていません。

通常、シンボルは別のライブラリで定義されます。このライブラリもアプリケーションにリンクする必要があります。または、シンボルを定義するコードをビルドするのを忘れているか、そのシンボルを含むオブジェクトファイルをライブラリに含めるのを忘れているため、シンボルは未定義です。

あなたの場合、それはあなたの実装のCライブラリからのシンボルのように見えるので、あなたはそれがあなた自身のライブラリで未定義であることを期待するでしょう。 libc.soで定義されます(どこでも/ usr/lib)。

43
Troubadour

これを解読するには、次のようにします。

           U _ZNSs4_Rep20_S_empty_rep_storageE@@GLIBCXX_3.4

手段:

    U->>> in your library its undefined

未定義とは何ですか?

     _ZNSs4_Rep20_S_empty_rep_storageE

どこで見つかるか?

      GLIBCXX_3.4

さて、あなたの質問:「なぜそれが未定義なのか:」、それはリンカーがその定義を見つけることができないからです

第二部:「その未定義の理由がまったく報告されている場合」、nmユーティリティは、libのシンボルテーブル全体を読み取って出力します。そのため、操作を適用せずに読み取りと印刷を行うだけです。

2
Fooo

ライブラリがそのシンボルを参照することを意味します(std::basic_string<char, std::char_traits<char>, std::allocator<char> >::_Rep::_S_empty_rep_storageこの場合?)しかし、それはそれを定義しません;リンクするプログラムの一部、または他のライブラリがそれを行うことになっています。ライブラリで定義するつもりだった場合、オブジェクトファイルをそのシンボルの定義とライブラリコードの残りの部分でリンクしなかったことを意味します。

0
Carl Norum