Shammer's Philosophy

My private adversaria

三つのリンク方式

C言語では、mainプログラム、というかmain function から実行される。通常のプログラムは、main のみで収まるサイズではないので、main 以外の関数に処理を小分けして、それを順番に呼び出すことで実行していく。しかし、その小分けされた関数でも数が多くなるとmainの定義されたファイルとは別のファイルに定義し、それを呼び出すことになる。当然、OSレベルのAPIもmainとは別のところに存在していて、それを呼び出すことになる。ここで、どのようにそれらを呼び出すというか、結合させるかという問題がある。これらはリンカと呼ばれるプログラムが実行しているが、この方式にもいくつかあるので、それを整理しておく。

静的リンク

コンパイル済みのコードを再利用できる形にまとめたもので拡張子は .a が使われる。しかし、コンパイルの時点でコードのコピーが実行ファイルに取り込まれるイメージなので、この拡張子を意識する機会はほとんどなく、実行ファイルが大きくなるというデメリットもある。万一、共有される側のファイルに問題が発生しても単体で動作するようになっているので動作に影響がない、というのがメリット。

動的リンク

共有ライブラリを実行ファイルに取り込むことはせず、プログラムが実行される直前に動的リンカによって結合される。一般的にはこの方式が使用される。

動的ローディング

動的リンクはプログラムの実行時にリンカによって共有ライブラリと結合するが、動的ローディングの場合は該当コードが実行される瞬間まで共有ライブラリがメモリにロードされていない。アプリケーション側でライブラリをロードする処理を書いておく必要がある。使い処としては、プラグインのような機能拡張を実現するための仕組みや、アプリケーションサーバのデプロイなどが考えられる。動的ローディングの実装例は別の機会に。