問題タブ [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.
debug-symbols - ライブラリのシンボル テーブルにアクセスして、ルーチン シンボル名を検索する方法
OpenSSL ライブラリにリンクする Linux 実行可能ファイルで使用される暗号化ルーチンのアドレスを特定する必要があります。openssl シンボル テーブルにアクセスするにはどうすればよいですか?
openssl cyptolib から上記の情報を取得するにはどうすればよいですか?
誰でもこの問題を解決するのを手伝ってもらえますか?
bash - find、nm、および grep を使用して、多くの共有ライブラリからシンボルを検索するにはどうすればよいですか?
次のことを行うための正しいコマンドに苦労しています:
特定のシンボルを含むすべての共有ライブラリ (*.so) を検索します。
これは私が試したことです:
上記は、見つかったシンボルを含むいくつかの出力を提供しますが、シンボルが発生したファイル名を特定しません.grepがstdinから供給されているため、ファイル名を出力するようにgrepに指示するフラグは失われます.
別の試み:
2 つの exec は完全に独立しているため、これは機能しません。
私は何をすべきか?
gcc - nm または objdump および/またはその他の利用可能なツールを使用して、問題のある関数/メソッドを.soファイルで特定する方法は?
問題: RH5 (gcc 4.1.2 および GLIBC 2.5) から RH6 (gcc 4.4.7 および GLIBC 2.12) への移行の問題
詳細: 大きなプロジェクトを RH5 (gcc 4.1.2) から RH6 (gcc 4.4.7) に移行していますが、すべて問題なくコンパイルおよびリンクされています。
RH5 でコンパイルされたコードは、両方のホスト マシン (RH5 と RH6) で正常に動作します。
ただし、RH6 でコンパイルされたコードはどちらでも動作しません。
実行時エラーはなく、私が実行した多くの回帰テストの 1 つにすぎず、失敗しました。
複雑な要因は次のとおりです。私のコードは、シミュレートされたマシン (マイクロプロセッサ) を作成します。回帰テストを実行するソフトウェア/ファームウェアは、このシミュレートされたマシンで実行されるソフトウェアであり、このファームウェアをデバッグしていません。
RH6 ホスト マシンでコードをコンパイルすると、バグが挿入されます。シミュレートされたマシンの一部である共有オブジェクト ファイル (.so) を作成するためにリンクされている 2 つのオブジェクト ファイル (.o) に問題を突き止めることができました。 .
RH6 マシン (回帰テスト中に実行可能ファイルが失敗する gcc 4.4.7 を搭載したマシン) でコードをコンパイルし、RH5 (gcc 4.1.2) でコンパイルされた 2 つの問題のある (.o) ファイルを追加して ( .so) ファイル (共有オブジェクト) をこれらの 2 つの .o ファイルを使用すると、すべて正常に動作し、私の回帰テストは問題なく合格します。ちなみに、RH5 マシンと RH6 マシンの両方で通過します。
「nm」と「objdump」を使用して、問題のある関数/関数またはライブラリ/ライブラリなどを把握しようとしています。
私の質問: 1- これらのツール (nm および/または objdump) をどのように活用して、犯人を特定することができますか? (上記のコマンドを RH5 と RH6 から生成された .so ファイルで実行し、出力ファイルを比較すると、大きな違いが見られますが、各コンパイラとそのコンテキストの詳細と、潜在的な問題)
2-これを調査して解決するのに本当に役立つツールは他にありますか?
3- RH6 の .so ファイルと RH6 の .so ファイルからの nm/objdump 出力を RH5 の 2 つの .o ファイルと比較すると、それらは似ていて、絡み合った行の端が見えず、もつれを解こうとしてもわかりません。 、これらの出力ファイルを見て問題を解決するにはどうすればよいでしょうか?
コメント、提案、貢献に感謝します。
gdb - nm 対 gdb ブレーク
私はUbuntu 14.04 LTSに取り組んでいます。
exec
からコンパイルされた実行可能ファイルがありますfile.c
。はfile.c
静的ライブラリの関数を利用します。たとえば、fubar()
で使用されているスタティック ライブラリの関数であるとしましょうfile.c
。これは私が気づいたことです。
nm exec | grep fubar
特定の値を与えます。
(私のシステムと実行可能ファイルの場合0808377f
)gdb ./exec
そしてbreak fubar
、異なる値を与えます。
(私のシステムと実行可能ファイルの場合0x8083785
)
別の実行可能ファイルに対して同様のことを行うと(exec1
からコンパイルされfile1.c
、両方のコマンドで同じ値が出力されます)。
どちらのコマンドも同じ仮想アドレスを出力するはずです。そうじゃない?私は明らかに何かが欠けています。誰かが正確に何が起こっているのか説明できますか? そして、両方のコマンドの違いは何ですか。
c - Cでnmまたはreadelf出力を使用して静的関数を区別するにはどうすればよいですか
実行可能ファイルで nm または readelf -s の出力を処理しようとしています。ただし、出力で静的関数を互いに区別するのに問題があります。
これが私が取り組んでいるものです:
test.c
その他.c
私はこれらを次のようにコンパイルします:
次に nm コマンドを実行して、すべてのシンボルを取得します。
その中には、次の 2 つの記号 (私の静的関数用) が表示されます。
特定の foo 関数がどのファイルから出現したかを区別できる方法はありますか? または、これを機能させるためにコンパイルする前に魔法をかける必要がありますか?
私のユースケースでは、最終的なバイナリとそれが使用するオブジェクトファイルにアクセスできますが、実際に自分でビルドしてシンボルテーブルがあることを確認することはできません。
ありがとう!
c++ - すべてのローカル変数は、データ/BSS セグメントに移動しますか?
ここのmanページnm
:MAN NMはそれを言います
シンボル タイプ。少なくとも次のタイプが使用されます。その他は、オブジェクト ファイルの形式によって異なります。小文字の場合、シンボルは通常ローカルです。大文字の場合、シンボルはグローバル (外部)
その下には、「初期化されていないデータ セクション (BSS として知られている)」を表す「b」と「B」、および「初期化されたデータ セクション」を表す「d」と「D」があります。
しかし、ローカル変数は常にスタック/ヒープに移動し、「データ」または「BSS」セクションには移動しないと思いました。それでは、nmが話しているローカル変数は何ですか?
c++ - GCC の nm は、メソッドの複数のエントリを一覧表示します
nm でリストされている単一のメソッドに対して複数のエントリがあるのは正常ですか? 私は以下を実行しました:
そして以下を受け取りました。
これは私には間違っているようです。それはあなたには間違っているように見えますか?もしそうなら、なぜそれが間違っているのか、何が原因なのかを詳しく説明していただけますか? 特定の状況下でのみ正しい場合は、nm 出力を見ている問題について詳しく説明し、そこから進むことができます。
c - 関数アドレスが nm 出力と gdb で異なる
機能だけに注目しましょうRect_IsEmpty()
。
コマンドを実行すると、次のnm
出力が得られます。
一方、gdb
この関数のアドレスを起動して見ると、次のようになります。
これらのアドレスが同じではない理由を誰か説明してくれませんか? gdb はこのアドレスをどこから取得しますか?
c++ - '_GLOBAL__sub_I_' は nm 出力で何を意味しますか?
静的リンクの問題を解決しようとしているときに_GLOBAL__sub_I_
、シンボル名の前にいくつかのプレフィックスがありました。を使っていたのに、その形で現れますnm --demangle(-C)
。
私はこの答えに出くわしました(グローバルな静的初期化の検索方法)。私のソース コードを見ると、確かにグローバルな静的変数の初期化のように見えます。
私が疑問に思っているのは、 __sub_ やその他のマングルされた名前に関する詳細情報はどこにあり__cxxabiv1
ますか?
c - GNU nm を使用すると、__DTOR_LIST__ が表示されません
「大きな」問題があります。現在、Linux 上のプログラム (仮想マシン) で dtor リストのアドレスを取得しようとしています。明らかにデストラクタ関数がありますが、nm を使用し、すべてのアドレスとその名前が表示されている場合、それを見つけることができません。それに関連する唯一のものは do_global_dtors_aux です。また、コードが実行されると、期待どおりに完全に機能します。これが私のコードです:
そして、これが私が使用するときですnm