前回作成した実行ファイル「a.out」
前回C言語で作成した実行ファイル「a.out」ですが、ソースを検証する過程でfprintfというライブラリ関数をしていることが分かっています。
ではソースがない状態の実行ファイルの中で使用されているライブラリを調べる方法はないものでしょうか?
lddコマンドでライブラリを調べる
ということで調べた結果、以下のコマンドで調査できることがわかりました。
# ldd /var/soft/test/a.out ↓以下が実行結果 linux-vdso.so.1 => (0x00007fff40dd9000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe7bc319000) /lib64/ld-linux-x86-64.so.2 (0x00007fe7bc6e7000)
この「ldd」コマンドを使用すると実行ファイルに組み込まれたライブラリを調べることができます。
今回の場合は「libc.so.6」がライブラリの名前で「/lib/x86_64-linux-gnu/libc.so.6」がライブラリファイルとなるんですって。
では本当にこのライブラリファイルの中身に「fprintf」が含まれているのでしょうか?
nmコマンドでライブラリに登録された関数を調べる
続いてはライブラリファイルに登録された関数を調べてみることにします。ここでは「nm」コマンドを用います。
# nm /lib/x86_64-linux-gnu/libc.so.6 | grep "fprintf" nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols
ありゃ、「no symbols」ですって。調べてみるとnmコマンドで調べられるのは実体のみのようで、シンボリックリンクを含めた調査をする場合「-D」オプションをつける必要があるようです。では改めて。
# nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep "fprintf" 0000000000054260 W _IO_fprintf 0000000000049be0 T _IO_vfprintf 0000000000109fb0 T __fprintf_chk 000000000010a320 T __vfprintf_chk 0000000000054260 T fprintf 0000000000049be0 T vfprintf
はい。沢山出てきました。5行目に「fprintf」があることが確認できます。ではこのfprintf()関数のソースはどうやったらみれるんでしょう?その辺りはまた次回としましょう。
まとめると・・・
ソース不明の実行ファイルがあったとして、そこで使用されているライブラリについて調査しようと思った場合
- lddコマンドを使用すると組み込まれたライブラリ名とライブラリファイルのパスが分かる
- nmコマンドを用いるとライブラリファイルに組み込まれた関数を調べることができる
以上の方法で調べることが可能となります。
次回はライブラリファイルのソースを読む方法について見ていくことにしましょう。