コンピュータの起動において次に起こる出来事は、init
プロセスがロード
され実行されるということである。しかし、init
は、他のほとんどのプロ
グラムと同様にライブラリの関数を利用している。
以下のような C プログラムの例題をみたことがあるかもしれない。
main() { printf("Hello World!\n"); }
このプログラムでは、printf
が定義されていないが、その定義はどこ
から来るのか?それは標準 C ライブラリから、すなわち GNU/Linux システム上で
あれば glibc
から来る。
もし Visual C++ でコンパイルしたなら、同じ標準関数を持った Microsoft の実装か
ら来る。このような標準関数は、計算、文字列、日付、メモリアロケーションなど
様々な領域で、無数に存在している。Linux を含む Unix の全ては、C 言語で書かれ
たものと、なんとかして C で書かれたように見せかけようとするもののいずれかで出
来ているので、すべてがそうした関数を使用する。
Linux システムの /lib
を見れば、libxxx.so
や libxxx.a
といったファイルがたくさんあるのが分かるだろう。それらは、こうした関数
のライブラリである。glibc
は、こうした関数についての GNU の実装であ
る。
ライブラリ関数を使う方法には二種類ある。静的(statically) にプログラムにリンク
すれば、そうした関数はできあがった実行ファイルにコピーされて、組み込まれる。
動的(dynamically) にプログラムにリンクすれば(これが普通であるが)、プログラム
が実行されてそのライブラリコードが必要になったときに、libxxx.so
から
呼び出される。
特定のプログラムにどのライブラリが必要なのか調べたいときは、ldd
コマンドが役に立つ。たとえば、以下は bash
が使うライブラリである。
[greg@Curry power2bash]$ ldd /bin/bash libtermcap.so.2 => /lib/libtermcap.so.2 (0x40019000) libc.so.6 => /lib/libc.so.6 (0x4001d000) /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
ライブラリにある関数のいくつかは、あなたがどこに住んでいるかに依存している。
たとえば、オーストラリアなら、日付は 日/月/年と表記するが、アメリカでは、
月/日/年と表記する。glibc
が配布されるときには localedef
と呼ばれるプログラムが付属し、それによってこうしたことの設定ができるように
なっている。
あなたの好きなプログラムがどんなライブラリを使っているのかを ldd
で調べてみること。
init
がどんなライブラリを使うのか、ldd
で調べること。
ひとつかふたつだけの関数が入ったおもちゃのライブラリを作ること。それを作るに
は、ar
というプログラムを使う。ar
の man ページは、作り方を
調べる出発点になる。そして、そのライブラリを使うプログラムを書いて、コンパイ
ルして、リンクすること。