nm (Unix)
| ナノメートル | |
|---|---|
| 原作者 | デニス・リッチー、 ケン・トンプソン (AT&Tベル研究所) |
| 開発者 | さまざまなオープンソースおよび商用開発者 |
| 初回リリース | 1971年11月3日 |
| 書かれた | C |
| オペレーティング·システム | Unix、Unixライク、Plan 9 |
| プラットフォーム | クロスプラットフォーム |
| タイプ | 指示 |
| ライセンス | プラン9: MITライセンス |
nmは、バイナリ実行可能ファイル (ライブラリ、コンパイルされたオブジェクト モジュール、共有オブジェクト ファイル、スタンドアロン実行可能ファイルを含む)
からシンボル テーブルとその属性をダンプするために使用されるUnixコマンドです。
の出力は、nm様々なシンボルタイプを区別します。例えば、オブジェクトモジュールによって提供される関数と、そのオブジェクトモジュールによって必要とされる関数を区別します。は、デバッグnmの補助として、名前の競合やC++の名前マングリングによって生じる問題の解決、およびツールチェーンの他の部分の検証に使用されます。
このコマンドは、 Plan 9を含むUnixおよび類似の オペレーティングシステムの多くの後継バージョンに同梱されています。GNUプロジェクトは、GNU Binutilsパッケージの一部としての実装を提供しています。nm
語源は、古いバージョン7 Unixnmのマニュアルページで、シンボルテーブルの代わりに名前リストという用語が使用されていたことに由来します。[1]
nm出力サンプル
/* * ファイル名: test.c * C コードのコンパイルには、次のようにします: * gcc -c test.c * * C++ コードのコンパイルには、次のようにします: * g++ -c test.cpp */intグローバル変数; int global_var_init = 26 ; 静的int static_var ;静的int static_var_init = 25 ; 静的int static_function () { 0を返す; } int global_function ( int p ) {静的int local_static_var ;静的int local_static_var_init = 5 ; ローカル静的変数= p ; local_static_var_init + local_static_varを返します。} int global_function2 () { int x ; int y ; return x + y ; } #ifdef __cplusplus extern "C" #endif void non_mangled_function () { // 何もしない} int main ( void ) { global_var = 1 ; static_var = 2 ; 0を返す; } 前のコードをgcc C コンパイラでコンパイルすると、コマンドの出力はnm次のようになります。
# nm test.o 0000000a T global_function 00000025 T global_function2 00000004 C global_var 00000000 D global_var_init 00000004 b local_static_var.1255 00000008 d local_static_var_init.1256 0000003b T main 00000036 T non_mangled_function 00000000 t static_function 00000000 b static_var 00000004 d static_var_initC++ コンパイラを使用すると、出力は異なります。
# nm test.o 0000000a T _Z15global_functioni 00000025 T _Z16global_function2v 00000004 b _ZL10static_var 00000000 t _ZL15static_functionv 00000004 d _ZL15static_var_init 00000008 b _ZZ15global_functioniE16local_static_var 00000008 d _ZZ15global_functioniE21local_static_var_init U __gxx_personality_v0 00000000 B global_var 00000000 D global_var_init 0000003b T main 00000036 T 非マングル関数出力の違いは、C++ コードでextern "C"を使用して名前マングリングの問題を解決する例も示しています。
| シンボルの種類 | 説明 |
|---|---|
| あ | グローバル絶対記号 |
| 1つの | ローカル絶対記号 |
| B | グローバルbssシンボル |
| b | ローカルbssシンボル |
| D | グローバルデータシンボル |
| d | ローカルデータシンボル |
| f | ソースファイル名のシンボル |
| R | グローバル読み取り専用シンボル |
| r | ローカル読み取り専用シンボル |
| T | グローバルテキストシンボル |
| t | ローカルテキストシンボル |
| あなた | 未定義のシンボル |
参照
参考文献
- ^ "NM(1)". Unix第7版一般コマンドマニュアル. 2025年3月14日閲覧。
外部リンク
- : オブジェクトファイルの名前リストを書き込む – シェルおよびユーティリティリファレンス、The Single UNIX 仕様、バージョン5、The Open Group
- – Plan 9プログラマーズマニュアル 第1巻