Solaris のリンカーはファイル単位 ― 2016年07月07日 15時28分18秒
さて、ここでのファイル単位とは、コンパイル毎のファイルに相当する。別の言い方をすれば、.o ファイル単位だ。元が、C 言語や Fortran でも大して変わらない。Solaris の .a のアーカイブファイルは .o ファイルを寄せ集めた物になる。動作的には tar に似ている。そのため、.a ファイルから一つの関数を探すことになっていても、全ての .o ファイルを取り込むわけではない。
少し具体例をあげるとする。main 関数が 関数 a を呼ぶとしよう。そして、そして、関数 a、関数 b、関数 c が一つの .c ファイルに実装されて、アーカイブファイルに取り込まれているとする。そうすると、このプログラムをリンクすると、プログラムは不要ではあるが、関数 b と関数 c の実装を取り込むことになる。
リンカーは基本的に全ての未解決シンボルを探そうとする。もし関数 b や関数 c が他の関数を呼んでいると、それらの実装も取り込むことになる。そして、この関数呼び出しの連鎖は終点まで続く。
そのため、Solaris 上では、実装を一つのファイルにあまりに無造作にかつ、大量に詰め込んでライブラリを作成すると、プログラムが肥大化する弊害が起きる。
コメント
トラックバック
このエントリのトラックバックURL: http://uyota.asablo.jp/blog/2016/07/07/8126972/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。