linux

nmコマンド

プログラムにリンクされているライブラリは、lddコマンドで調べられます。
例えば、whoamiコマンドでは下記のように3つのライブラリがリンクされています。

$ ldd /usr/bin/whoami
linux-gate.so.1 =>  (0xb7849000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb76db000)
/lib/ld-linux.so.2 (0xb784a000)
$

さらにnmコマンドでライブラリに定義されている名前を引くことができます。
オプションを付けないで実行するとダイナミックシンボルが見つかりません。

$ nm /lib/tls/i686/cmov/libc.so.6
nm: /lib/tls/i686/cmov/libc.so.6: no symbols
$ 

ダイナミックシンボルも参照するようにオプションを付けるとシンボルを見ることができます。
libc.so.6は、C言語の標準ライブラリでprintfのような標準ライブラリが見つかります。

$ nm -D /lib/tls/i686/cmov/libc.so.6  | grep fprintf
00049b80 W _IO_fprintf
0003f830 T _IO_vfprintf
000fba50 T __fprintf_chk
000fbcc0 T __vfprintf_chk
00049b80 T fprintf
0003f830 T vfprintf
$ nm -D -A /lib/tls/i686/cmov/libc.so.6  | grep fprintf
/lib/tls/i686/cmov/libc.so.6:00049b80 W _IO_fprintf
/lib/tls/i686/cmov/libc.so.6:0003f830 T _IO_vfprintf
/lib/tls/i686/cmov/libc.so.6:000fba50 T __fprintf_chk
/lib/tls/i686/cmov/libc.so.6:000fbcc0 T __vfprintf_chk
/lib/tls/i686/cmov/libc.so.6:00049b80 T fprintf
/lib/tls/i686/cmov/libc.so.6:0003f830 T vfprintf
$ nm -D -A /lib/tls/i686/cmov/libc.so.6  | grep "T getpwuid"
/lib/tls/i686/cmov/libc.so.6:0009e470 T getpwuid
/lib/tls/i686/cmov/libc.so.6:001271d0 T getpwuid_r
/lib/tls/i686/cmov/libc.so.6:0009eaa0 T getpwuid_r
$ nm -D -A /lib/tls/i686/cmov/libc.so.6  | grep getuid
/lib/tls/i686/cmov/libc.so.6:000a0670 W getuid
$
タイトルとURLをコピーしました