Solaris のリンカーはファイル単位2016年07月07日 15時28分18秒

Solaris のリンカーがアーカイブファイルからオブジェクトファイルを取得するのはファイル単位だ。ar 等を見ても、静的ライブラリのシンボルを並び替えることはしない。また、複数の関数が一つのファイルに定義されていると、ファイルにある全ての関数が実行形式のファイルに取り込まれる。

さて、ここでのファイル単位とは、コンパイル毎のファイルに相当する。別の言い方をすれば、.o ファイル単位だ。元が、C 言語や Fortran でも大して変わらない。Solaris の .a のアーカイブファイルは .o ファイルを寄せ集めた物になる。動作的には tar に似ている。そのため、.a ファイルから一つの関数を探すことになっていても、全ての .o ファイルを取り込むわけではない。

少し具体例をあげるとする。main 関数が 関数 a を呼ぶとしよう。そして、そして、関数 a、関数 b、関数 c が一つの .c ファイルに実装されて、アーカイブファイルに取り込まれているとする。そうすると、このプログラムをリンクすると、プログラムは不要ではあるが、関数 b と関数 c の実装を取り込むことになる。

リンカーは基本的に全ての未解決シンボルを探そうとする。もし関数 b や関数 c が他の関数を呼んでいると、それらの実装も取り込むことになる。そして、この関数呼び出しの連鎖は終点まで続く。

そのため、Solaris 上では、実装を一つのファイルにあまりに無造作にかつ、大量に詰め込んでライブラリを作成すると、プログラムが肥大化する弊害が起きる。