gnu ldの-lオプションの動作

仕事で久しぶりにgccを触っててハマったのでメモ。
正確にはダウンロードしたソフトをmakeしていてだけど。


"-l"オプション(小文字のエル)はライブラリを指定するオプション。
つまり、gccが直接関与するのではなくldに最終的に渡されるはず。

$ gcc hoge.c -lfuga

とすると、libfuga.aやlibfuga.soファイルを指定されたディレクトリから探します。
"-L"オプションで指定されたパスも探す。


有名な"-lm"という呪文は、当然libm.aかlibm.soになります。

$ ls -F /usr/lib/libm.*
/usr/lib/libm.a  /usr/lib/libm.so@

このライブラリにC言語の標準関数の内math.h系が入っている。
それ以外はlibcに纏めているはず。
なぜmath.hだけ別になっているかというと、math系は重いから別にしていたと聞きました。
で、今は歴史的理由により分離されていると。正直、面倒くさい。


/usr/lib/以下にシンボリックリンクがいっぱいあるのもこの辺が理由。
ファイルはシンボリックリンクにしておいて実体はバージョン番号付きとかにしておいたりする。
こうするとバージョン違いのライブラリを置いてシンボリックリンクの張替えだけで対応ができるという仕組み。


まあ、基本的にはmanにも書いてあるんだけど、ちょっとマニアックな部分なので忘れていた。