バイナリツール:nm_ターゲットファイルのシンボルテーブルを一覧表示]


一.nm紹介
nmは、ターゲットファイルのシンボルリストをリストするために用いる.ここのターゲットファイルは、一般的には.a拡張子の静的接続ライブラリファイルとコンパイルされたターゲットファイル.linuxの下には、動的接続ライブラリ(.so)と静的接続ライブラリ(.a)の2つのライブラリファイルがあります.nmは、静的接続ライブラリのシンボルリストを表示するためのツールである.
二.nm基本用法
以下、一例としてnmの使用方法を説明する.
1.ソースファイルの作成
それぞれ2つのファイルを作成します.cとfred.c.
//bill.c
#include <stdio.h>
void bill(char *arg)
{
  printf("bill: you passed %s
",arg); }
// fred.c
#include <stdio.h>
void fred(int arg)
{
  printf("fred: you passwd %d
",arg); }

2.ターゲットファイルにコンパイル
# gcc -c bill.c fred.c
# nm bill.o
0000000000000000 T bill
                 U printf

3.静的ライブラリとして作成
# ar crv libfoo.a bill.o fred.o
# nm libfoo.a
bill.o:
0000000000000000 T bill
                 U printf

fred.o:
0000000000000000 T fred
                 U printf

三.nmコマンドのフォーマット
nm [-a|--debug-syms] [-g|--extern-only] [-B][-C|--demangle] [-D|--dynamic] [-s|--print-armap]
[-o|--print-file-name] [-n|--numeric-sort][-p|--no-sort] [-r|--reverse-sort] [--size-sort]
[-u|--undefined-only] [-l|--line-numbers] [--help][--version] [-t radix|--radix=radix]
[-P|--portability] [-f format|--format=format][--target=bfdname] [objfile...]

       nm        , nm       a.out.           ,     "-"       "—"      .

-A、-o --print-file-name:                 ,                     .

-a --debug-syms:      .
-B:   --format=bsd,    MIPS nm.
-C --demangle:        (demangle)      .      C++        .
-D --dynamic:      .           (          )   .
-f format:  format    .format    bsd、sysv posix,    GNU nm   .   bsd.
-g --extern-only:       .
-n、-v --numeric-sort:            ,           .
-p --no-sort:               ,   .
-P --portability:  POSIX.2               .        -f posix.
-s --print-armap:           ,    .       :             .
-r --reverse-sort:       (  ,      ).
--size-sort:         .                          .
-t radix --radix=radix:  radix       .radix   "d"     、"o"      "x"      .
--target=bfdname:           ,           .
-u --undefined-only:          (      ).
-l --line-numbers:     ,                 .        ,         .       ,              .          ,         .
-V --version:  nm    .
--help:  nm    . 


   ,nm (the symbol value), (the symbol type) (the symbol name)。

アイコン
を選択します.
説明
A
この記号の値は絶対的であり、以降のリンク中は変更は許されない.このようなシンボル値は、割り込みベクトルテーブルにしばしば現れ、例えば、割り込みベクトルテーブルにおける各割り込みベクトル関数の位置をシンボルで表す.
B
このシンボルの値は、非初期化データセグメントに表示されます.
(bss)
に表示されます.たとえば、1つのファイルでグローバルを定義します.
static int test
.シンボル
test
のタイプは
b

bss section
に表示されます.その値は記号が
bss
セグメントのオフセット.一般的には、
bss
セグメントの割り当て先
RAM

C
記号は
common
.
common symbol
未初期話データセグメントです.この記号は通常に含まれていません
section
に表示されます.割り当ては、リンク中にのみ行われます.シンボルの値は、シンボルに必要なバイト数を表します.たとえば、
c
ファイル、定義#ファイルテイギ#
int test
を選択し、記号が別の場所で参照される場合、その記号タイプは
C
.その他のタイプは
B
.
D
この記号は、初期話データセグメントにあります.一般的には、
data section
に表示されます.たとえば、グローバルの定義
int baud_table[5] = {9600, 19200, 38400, 57600, 115200}
を選択すると、初期化データ・セグメントに割り当てられます.
.
G
このシンボルは、初期化データセグメントにも存在する.主な用途
small object
アクセスの向上
small data object
の1つの方法です.
I
この記号は、別の記号への間接参照です.
N
この記号は
debugging
を選択します.
R
この記号は読み取り専用データ領域にあります.たとえば、グローバルの定義
const int test[] = {123, 123};

test
読み取り専用データ領域のシンボルです.に注意
cygwin
使用する場合
gcc
ダイレクトコンパイル
MZ
を選択します.
test
対応
_test
を選択します.
D
を選択します.でも使うなら
m6812-elf-gcc
このようなクロスコンパイルツールは、ソースファイルの
test
ターゲットファイルに対応する
test,
すなわち、下線は追加されず、記号タイプは
R
.一般的には、
rodata section
.関数で定義する場合は
const char *test = “abc”, const char test_int = 3
.使用
nm
シンボル情報は得られませんが、文字列"
abc
」読み取り専用メモリに割り当てる、
test
にある
rodata section
で、サイズは
4
.
S
シンボルは非初期化データ領域にあり、
small object
.
T
この記号はコード領域にある
text section
.
U
記号は現在のファイルでは定義されていません.すなわち、記号の定義は別のファイルにあります.たとえば、現在のファイルは別のファイルで定義された関数を呼び出し、この呼び出された関数は現在定義されていません.しかし、定義されたファイルのタイプは
T
.ただし、グローバル変数では、定義されたファイルのシンボルタイプは
C
を選択します.
U
.
V
この記号は
weak object
.
W
The symbol is a weak symbol that has not been specifically tagged as a weak object symbol.
-
この記号は
a.out
書式設定
stabs symbol
.
?
このシンボルタイプは定義されていません