ksaitoの日記

日々試したことの覚え書き

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
$