問題タブ [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.
c - 静的ライブラリ内の外部シンボルの予期される署名
私は静的ライブラリを持っていますlibTheLib.a
(他の誰かによってコンパイルされました)。私はそれを私のプログラムにリンクしようとしています。この lib がリンクに必要とする関数の 1 つがGetName
. プロジェクトに関数void GetName(char*, int)
がありますが、リンカーはまだシンボルが見つからないと不平を言っています。ライブラリが別の署名を持つ関数を探しているのではないかと推測しています。nm
探しているものを正確に明らかにすることを期待して使用してみましたが、それが言うのは
これはあまり役に立ちません。探しているシンボルの署名を見つける別の方法はありますか? または、署名はシンボルの一部ではなく、実際にその名前の任意のシンボルにリンクできますか?
lib は でC
、私のプログラムは で書かれC++
ていますが、関数は次のように宣言されています。
また、違いが生じる場合は、これはclang
ではなくを使用しています (XCode を使用)gcc
macos - Mac アプリでの NM の使用 -- 不正なオブジェクト
nmを含むいくつかのデバッグユーティリティを使い始めたばかりです。コンピューター上のいくつかのプログラムを分析したい。Sublime Text のようにダウンロードしたいくつかは、両方を使用しても問題なく動作します。
ただし、私が試して分析しようとする他のアプリは、次のようなエラーをスローします。
これには明らかな理由があると確信していますが、私は完全に空白を描いています。
c++ - 共有ライブラリで C++ isfinite() が解決される場所を見つける方法は?
isfinite()
C++ アプリケーションの が定義されている場所を突き止めようとしています。私はnm
共有ライブラリでgrep
for を実行してきましたが、isfinite
共有ライブラリの共有ライブラリでも再帰的に実行していますが、これまでのところ の定義を提供するライブラリは見つかりませんでしたがisfinite
、アプリケーションはシンボルを解決して実行します。特定の実行可能ファイルのシンボルを解決するライブラリを計算する Linux ツールはありますか?
c - C から nm を実行して出力をキャプチャする方法
別のプログラムのグローバル変数のサイズをチェックするプログラムを作成しようとしています。私のプログラムを「check」、チェックされたプログラムを「a.out」と呼びましょう。つまり、プログラムを次のように実行します。
次のコマンドを使用してこの値を見つけることができると思います。
fork/execl を使用してプログラム内からプログラムを実行できることは知っていますが、IO のパイプを書くのに少し苦労しています。
いくつかの単純な strcpy/strcats を使用して、上記の文字列を含む c-string を取得しました。これは execl を使用して呼び出すことができますが、何も出力されないようです。現在、次のようになっています。
誰かがこれらのパイプを設定する正しい方向に私を向けることができますか?
c - C で、0 に初期化された int 変数が「nm」によって初期化されていないと報告されるのはなぜですか?
私は次のCコードを持っています:
これらの変数のいずれかについて、値がゼロ以外の場合、「nm」コマンドによってタイプ「D」(初期化) として報告されることに気付きました。
ただし、0 に初期化されたものは "B" (初期化されていない) として報告されます。
「0 で初期化」と「0 以外で初期化」の違いはなぜですか?
c++ - ライブラリ内の C++ テンプレート インスタンスのシンボルの定義を強制する
テンプレート コードを提供するライブラリを提供したいと思います。ただし、テンプレートのさまざまな通常のタイプの使用法を推測できる場合は、このコード (生成されたコード) の所有権を可能な限り維持したいと考えています。これが私がやろうとしていることの例です:
lib1.h
lib1.cpp
以下を使用してライブラリをコンパイルします。
g++ -共有 -fPIC lib1.cpp -o lib1.so
そして、ライブラリを使用する場合:
main.cpp
以下でコンパイル:
g++ main.cpp -l1
ここで、シンボル print_me<0>() および print_me<1>() が定義され、lib1.so から使用され、print_me<2>() が定義され、実行可能ファイルに使用されることが期待されます ( nm --defined-only でチェック) )。しかし、そうではないようです!0 と 1 のシンボルは lib1.so で明確に定義されていますが、弱いシンボルとして定義されています。そして、私の実行可能ファイル(0、1、および2)で再び再定義されますが、弱いです。これは、実行可能ファイルの 0 と 1 のコードが main.cpp から取得されたものであることを意味しますが、これは必要なものではありません (main.cpp の仕様で確認しました)。
シンボルが既にどこかで定義されており、これらのシンボルを追加する必要がないことを main.cpp のコンパイル時に (たとえば lib1.h で) 言う方法はありますか?