システムレベルのソフトウェア開発にも携わっているLinuxユーザーの場合、オブジェクトファイル内のシンボルに関連する情報が必要な状況に陥る可能性があります。 nmと呼ばれるコマンドラインユーティリティが存在することを知って喜ぶでしょう。 -これらの状況で使用できます。
このチュートリアルでは、わかりやすい例を使用して、このツールの基本について説明します。ただし、その前に、ここでのすべての例がUbuntu16.04LTSマシンでテストされていることを言及する価値があります。
Linuxnmコマンド
nmコマンドラインユーティリティは、基本的にオブジェクトファイルからのシンボルを一覧表示します。ツールの構文は次のとおりです。
nm [OPTIONS] OBJECT-FILENAME
そして、以下はコマンドのマニュアルページがそれを説明する方法です:
GNU nm lists the symbols from object files objfile.... If no object
files are listed as arguments, nm assumes the file a.out.
以下は、nmがどのように機能するかについてのより良いアイデアを提供するいくつかのQ&Aスタイルの例です。
Q1。 nmコマンドはどのように機能しますか?
このコマンドの基本的な使用法は非常に簡単です。「nm」コマンドを実行し、オブジェクトファイルの名前を入力として渡すだけです。たとえば、「apl」バイナリファイルでnmコマンドを使用しました:
nm apl
次のスクリーンショットは、上記のコマンドが生成した出力の種類を示しています。
出力で生成される3つの列は、それぞれシンボル値、シンボルタイプ、およびシンボル名を表します。記号にはいくつかの種類があります。完全な詳細を知るには、nmコマンドのマニュアルページにアクセスしてください。
Q2。出力の各記号の前にファイル名を付けるにはどうすればよいですか?
これは、 -Aを使用して実行できます コマンドラインオプション。
nm -A [obj-file]
例:
nm -A apl
したがって、各行の先頭にファイル名が追加されていることがわかります。
Q3。 nmにデバッガシンボルも表示させる方法は?
nmが出力にデバッガシンボルも表示するようにするには、 -aを使用します。 コマンドラインオプション。
nm -a [obj-filename]
例:
nm -a apl
上記のコマンドは、通常はリストされていないデバッガーのみのシンボルを含む、すべてのシンボルを表示します。
Q4。 nmに低レベルのシンボル名をデコードさせる方法は?
必要に応じて、nmに低レベルのシンボル名をユーザーレベルの名前にデコードさせることもできます。これは、-Cコマンドラインオプションを使用して実行できます。
nm -C [obj-file]
例:
nm -C apl
このオプションについてのマニュアルページの内容は次のとおりです。
Besides removing any initial underscore prepended by the system,
this makes C++ function names readable. Different compilers have
different mangling styles. The optional demangling style argument
can be used to choose an appropriate demangling style for your
compiler.
Q5。 nmに動的シンボルのみを表示させる方法は?
nmに通常の記号ではなく動的な記号のみを表示させたい場合は、 -Dを使用します。 コマンドラインオプション。
nm -D [obj-file]
例:
nm -D apl
したがって、nmは出力で動的シンボルのみを生成したことがわかります。
Q6。さまざまなnm出力形式を使用するにはどうすればよいですか?
さまざまな出力形式を有効にするには、-fコマンドラインオプションを使用します。デフォルトでは、出力はbsd形式で生成されますが、必要に応じて、「sysv」および「posix」形式を有効にすることもできます。
nm -f [format] [obj-filename]
例:
nm -f posix apl
今すぐフォーマットの変更を確認してください。
Q7。 nmに外部シンボルのみを表示させるにはどうすればよいですか?
これは、-gコマンドラインオプションを使用して実現できます。
nm -g [obj-file]
例:
nm -g apl
Q8。 nmが提供するすべての並べ替えオプションは何ですか?
デフォルトでは、記号はアルファベット順にソートされています。ただし、必要に応じて、 -n を使用して、アドレスで数値で並べ替えることができます。 コマンドラインオプション。
nm -n [objfile]
例:
nm -n apl
これで、出力がアドレスでソートされていることがわかります。
nmに(デフォルトで使用されるものを含めて)どのような種類のソートも適用させたくない場合は、-pコマンドラインオプションを使用します。次に進み、既存の並べ替えを元に戻すには、-rコマンドラインオプションを使用します。
Q9。 nmに未定義の記号のみを表示させるにはどうすればよいですか?
これは、 -uを使用して実行できます コマンドラインオプション。
nm -u [obj-file]
例:
nm -u apl
Q10。 nmに定義済みの記号のみを表示させるにはどうすればよいですか?
nmに定義済みの記号のみを表示させるには、-defined-onlyを使用します コマンドラインオプション。
nm --defined-only [obj-file]
例:
nm --defined-only apl
同意しました。nmコマンドにはニッチなオーディエンスがいますが、私の個人的な経験では、自分をそのオーディエンスの一部と見なしていなくても、そのようなツールが存在することを覚えておいてください。また、このユーティリティを使用したい場合は、ここですべての例を練習したら、nmのマニュアルページにアクセスして詳細を確認してください。