プログラミング

C言語で作成した実行ファイルと組み込まれたライブラリ

前回作成した実行ファイル「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()関数のソースはどうやったらみれるんでしょう?その辺りはまた次回としましょう。

 

まとめると・・・

ソース不明の実行ファイルがあったとして、そこで使用されているライブラリについて調査しようと思った場合

 

  1. lddコマンドを使用すると組み込まれたライブラリ名とライブラリファイルのパスが分かる
  2. nmコマンドを用いるとライブラリファイルに組み込まれた関数を調べることができる

 

以上の方法で調べることが可能となります。

 

次回はライブラリファイルのソースを読む方法について見ていくことにしましょう。

オススメの記事

-プログラミング
-,