.soファイル【shared object file】
概要

プログラムは様々な機能を必要とするが、そのすべてを一つの実行ファイルに組み込むと、ファイルサイズが肥大化し、メモリの無駄も生じる。.soファイルは多くのプログラムに共通する処理を切り出したファイルで、複数のプログラムが同じコードを再利用できる仕組みを実現している。
共有ライブラリは実行時に実行プログラムに「動的リンク」(dynamic link)される仕組みであり、プログラム本体には関数や変数の参照情報のみが含まれる。実行時には動的リンカやローダが.soファイルを読み込み、必要なシンボル解決を行ってアドレスを割り当てる。これにより複数のプロセスが同一コード領域を共有でき、ディスク容量やメモリ使用量の削減が図られる。Linuxではld.soやld-linuxといったローダがこの処理を担う。
Linuxでは「libm.so」(数学関数)や「libc.so」(C言語標準関数)など、システムが提供する基本的な.soファイルが多数存在し、多くのアプリケーションがこれらを読み込んで動作している。実行時の.soファイルの探索は標準ディレクトリのほか、LD_LIBRARY_PATH環境変数や、ビルド時のリンカのrpathオプションなどに基づいて行われる。ファイル配置や権限の管理も動作に影響を与えることがある。
.soファイルはWindowsにおける「.dllファイル」と形式は異なるが役割はよく似ている。.soファイルは動的ライブラリのファイル形式だが、Linuxではプログラムのコンパイルおよびビルド時に静的リンクする静的ライブラリの形式として「.aファイル」(“archive” の略とされる)が用意されている。これは開発時に実行ファイルに連結され、その状態で配布される。
ファイル名には慣例として「lib」という接頭辞が付き、「lib機能名.so.バージョン番号」という形式が一般的である。バージョン番号を含む命名規則により、新旧のライブラリを並存させることが可能となっており、異なるバージョンのライブラリを必要とする複数のプログラムを同一システム上で動作させることができる。