問題タブ [nm]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
objective-c - Objective-C マングル名 (_OBJC_CLASS_ vs .objc_class_name_)
ライブラリをリンクしているときにいくつかの未解決の参照を修正しようとしていましたが、欠落しているクラスが次のように定義されていることに気付きました
によるnm。ただし、このクラスが定義されているライブラリを確認すると、次のことがわかりました。
ここに質問があります-b/wプレフィックス_OBJC_CLASS_との違いは何.objc_class_name_ですか? リンカーがシンボルを適切に解決するのに役立たないようです。
リンクも歓迎します。
c++ - std c++ ライブラリのヘッダー インクルード後の未定義シンボル
g++ -E main.cppプリプロセッサの実行後に、このコンパイル ユニットを取得するためにコマンドを使用します。前処理後、約 20k 行が含まれます。そして、 の定義を持つコードのこの部分が含まれていますoperator<<(double __f)。
次に、実行
g++ -c main.cppしてnm main.o
_ZNSolsEdはマングルされた名前でoperator<<(double)、その行には"U" The symbol is undefined. ただし、この演算子の定義はコンパイル済みソースにあります。その理由は何ですか?
c++ - C++ リンカー エラーのデバッグ
最初に、私が抱えている問題について具体的な詳細を説明します。次に、問題をデバッグしようとしたときに nm から得られる興味深い結果について説明します。nm の第一人者がこれらの結果を解釈できることを願っています。
カサブランカ C++ REST SDK をライブラリ libcpprest.a に静的にコンパイルしました。それはうまくいきますが、次のコマンドを使用して自分のコードにリンクすると:
エラーが発生します:
_extract_json(bool) は http_msg.cpp で定義されているようです。これは、libcpprest.a を作成した詳細な出力を見ると、コンパイルされているようにも見えます。ここで、 nm -e --demangle libcpprest.a を実行すると、次の 2 行が表示されます (何千もの行で区切られています)。
私は nm を初めて使用しますが、_extract_json(bool) がコード セクションと未定義シンボルのリストの両方にあるように見えます。nm の結果を解釈するより良い方法はありますか?
余談ですが、cpprest を動的ライブラリとしてコンパイルしてリンクすると、すべて正常に動作しますが、さまざまな理由で dcodr_service の静的バイナリを作成する必要があります。
編集: πάντα ῥεῖからのコメントをフォローアップすると、 _extract_json(bool) は次のコンテキストで使用されます。
つまり、ラムダ関数内で使用されます。それはリンカーエラーを引き起こす可能性がありますか?
c++ - llvm::outs() をファイルにリダイレクトする方法は?
いくつかの LLVM ツール (などllvm-nm) を静的ライブラリとして使用しています。つまり、ソースllvm-nm.cppをコピーし、名前を変更main(..)しllvm_nm(..)て静的ライブラリとしてコンパイルしました。標準出力を自分のファイルに転送したいと思います。
私は次のアプローチを使用しようとしました:
問題は、転送されてprintf()いないことです (出力ではなく nm ソース コードを追加すると機能しnmます)。llvm::outs()ソースを調べたところ、ストリームを使用して出力が行われていることがわかります。
そして、それは次の方法で実装されます:
その出力を自分のファイルにリダイレクトするにはどうすればよいですか?
linker - 2 つの依存ライブラリ間の未定義シンボル
まず、タイトルで申し訳ありませんが、私はそれをどのように言えばいいのかよくわかりません。自由に編集してください。
第二に、私は広範な調査を行いましたが、解決策を見つけることができませんでした. Google で解決策を見つけても怒らないでください。私はそれを探しましたが、私はそれを見つけられませんでした (または私は愚かです。
私の問題について:
私はhacc、彼の多数の依存関係の中でdiyとを持つプログラムをコンパイルしようとしていますtess。さらに、diyの依存関係の 1 つでもありtessます。
にdiyコンパイルしましたlibdiy.a
にtessコンパイルしましたlibtess.a
コンパイルしようとするhaccと、エラーが発生しました
nmは私に言います:
haccリンクフラグを使用してコンパイルされます
どこで何か間違ったことをしましたか? tess内部の依存関係からすべてのシンボルを含めてコンパイルしようとする必要がありlibtess.aますか?
c++ - 「nm」出力に Boost.Exception シンボルが表示される場合、それはどういう意味ですか? それらは ODR 違反を引き起こしますか?
これをサードパーティの静的にリンクされたライブラリで実行しています。ヘッダーのみのライブラリなので (一部の MSVC バージョンを除く)、表示されないと思いました。nm が何を表示するべきかを誤解しているのかもしれません。私が本当に知りたいのは、別のバージョンの Boost でコンパイルされたライブラリにリンクしている場合に ODR 違反が発生するかどうかです。
次の出力を参照してください: http://codepad.org/kJ86hiQg
短いサンプリング:
ios - nm(1) を使用して、OS X 上の arm64 用にビルドされたオブジェクト ファイルからシンボルを一覧表示する
arm64 アーキテクチャ用に構築したオブジェクト ファイルからシンボルを一覧表示する方法を知っている人はいますか?
使用しようとしnmましたが、エラーが発生しました:
を使用して同じことを行うことは可能otoolですか?
gdb - GDB の異なるオブジェクト ファイルから同じ名前のシンボルを区別するにはどうすればよいですか?
同じ名前のグローバルを持つ 2 つのソース ファイル (C) があります。グローバルは静的です。オブジェクト ファイルからシンボルをダンプするために使用nmすると、デバッグ情報が含まれていることがわかります。
ただし、リンクが完了した後に ELF ファイルからシンボルをダンプすると、これらの重複したシンボルのデバッグ情報が削除されたように見えます。これは正常な動作ですか?つまり、ここで説明されていることは自動的に行われますか?
すべてのデバッグ情報が取り除かれているわけではないことに注意してくださいapp_gpiote_user_enable。のような複製の 1 つを印刷しようとするとm_user_array_size、gdb は教えてくれますが、No symbol "m_user_array_size" in current context.印刷するapp_gpiote_user_enableと、gdb はそれに満足します。
- gdbで重複したシンボルを出力するにはどうすればよいですか? シンボルの代わりにアドレスを使用する必要がありますか?
.5782重複記号の末尾にある などの数字は何ですか? シンボルをオブジェクト ファイルにマップし直すのに役立ちますか?
注:変数の名前を変更するだけではなく、両方ともサードパーティのライブラリで定義されています。
c++ - テンプレート基本クラスの静的メンバーが共有ライブラリにエクスポートされない
テンプレートクラス「TModelManager」から派生したクラス「ModelManager」があります。彼らの宣言は次のとおりです。
「共有」と「サーバー」という 2 つの共有ライブラリがあります。
「共有」ライブラリでは、DLLNETWORK は '__attribute__((visibility("default")))' に相当し、Linux システムではクラスをエクスポートします。テンプレート クラスのメンバーは次のように定義されます (cpp ファイル内)。
「サーバー」ライブラリでは、クラスが確実にインポートされるように、DLLNETWORK は空の定義です。「サーバー」ライブラリは、「共有」ライブラリに対してリンクされています。
これは問題なくコンパイルされています。
実行時に、「サーバー」ライブラリが動的に読み込まれ、「共有」ライブラリも読み込まれます。ただし、次のエラーが発生します。
「サーバー」ライブラリで「ldd」ユーティリティを使用しました。これにより、「共有」ライブラリに対してリンクされていることが確認され、それを見つけることができます。
次に、「nm」ユーティリティを使用して、TModelManager クラスに関連するすべてのシンボルを探しました。結果は次のとおりです。
「m_marked」メンバーを除いて、すべてがそこにあります。「m_models」メンバーが異なるアドレスで 2 回見つかりました。
私は本当にこれをまったく理解していません.「m_marked」メンバーは「m_models」メンバーと同じ方法で定義されているのに、なぜエクスポートされないのですか? 「m_models」メンバーが 2 回表示されるのはなぜですか?
// 編集:
「m_models」の nm-results の前にある「U」に気づきませんでした。これは、それらが未定義であることを意味します。
それらを定義するのに何か問題がありますか?
c - これらのシンボルは、プログラミングの観点から何を意味しますか?
コンパイル時にA、B、およびVnm型のシンボル出力を返す C ファイルを作成する必要があります。のマニュアルページを読んでオンラインで検索しましたが、これらのタイプのシンボルがどのように作成されるかを理解するのに役立ちません。これらのシンボルは、プログラミングの観点から何を意味しますか? また、私が見るべき良い参考文献はありますか?nm