バイナリツール:nm_ターゲットファイルのシンボルテーブルを一覧表示]
一.nm紹介
nmは、ターゲットファイルのシンボルリストをリストするために用いる.ここのターゲットファイルは、一般的には.a拡張子の静的接続ライブラリファイルとコンパイルされたターゲットファイル.linuxの下には、動的接続ライブラリ(.so)と静的接続ライブラリ(.a)の2つのライブラリファイルがあります.nmは、静的接続ライブラリのシンボルリストを表示するためのツールである.
二.nm基本用法
以下、一例としてnmの使用方法を説明する.
1.ソースファイルの作成
それぞれ2つのファイルを作成します.cとfred.c.
2.ターゲットファイルにコンパイル
3.静的ライブラリとして作成
三.nmコマンドのフォーマット
を選択します.
説明
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
.
?
このシンボルタイプは定義されていません
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
.
?
このシンボルタイプは定義されていません