SO ファイル形式とは?
.so ファイルには、UnixおよびLinuxアプリケーション用の 動的にロードされる共有ライブラリ が含まれています。.so は、起動時に1つ以上のプログラムが使用できる共有コードやデータへのアクセスを提供するために使用されるバイナリファイルです。拡張子は «Shared Object»(共有オブジェクト)の略で、ライブラリがメモリにロードされると、そのオブジェクト(関数やデータ)に複数のプロセスが同時にアクセスできるという事実を反映しています。.so ファイルに登録されている MIME タイプは application/x-sharedlib です。
.so ライブラリは ELFオブジェクト(Executable and Linkable Formatの略)であり、Linuxや多くのUnix系システムで実行ファイル、コンパイル済みオブジェクト、共有ライブラリ、コアダンプに使用される標準的なバイナリ形式です。.so ファイルを含むすべての有効な ELF ファイルは、オフセット0にある4バイトのマジックナンバー \x7FELF で始まります。ファイル構造は以下で構成されています:
- ELFヘッダー - アーキテクチャ、エンディアン、ビット数(32ビットまたは64ビット)、およびセグメントとセクションテーブルのエントリ数を定義します。
- プログラムヘッダーテーブル - ロード時に使用されるメモリセグメントを記述します。
- セクションヘッダーテーブル - リンカーやデバッガーが使用する個々のセクションを記述します。
- これらのヘッダーによって参照されるデータ。
セグメントはプログラムの実行中に使用され、複数のセクションで構成される場合があります。セクションはリンク操作中に使用されます。.so ファイルは、コンパイル時にプログラムにリンクすることも、dlopen() を介して実行時にロードすることもできます。
.so のファイル名は、ライブラリ名の前に lib プレフィックスが付く という命名規則に従います。例えば、abc という名前のライブラリのファイル名は libabc.so となり、リンク時には -labc フラグが使用されます。.so サフィックスの後には、メジャーバージョン用の libabc.so.3 や、完全なバージョン管理がなされたビルド用の libabc.so.3.1.2 のようにバージョン番号が続くことがあります。実際には、libabc.so は実際のバージョン付きファイルへのシンボリックリンクである場合が多く、libabc.so.3 自体も最新の互換性のあるリリースへのシンボリックリンクである可能性があります。DT_SONAME 動的エントリに格納されているバージョンは、ランタイムリンカー ld.so が記録およびチェックするものです。ld.so 自体のような一部の低レベルシステムライブラリは、lib プレフィックスの規則に従いません。
Windowsにおける同等の概念は .DLL ファイルであり、macOSでは .dylib ファイルです。Linuxにおける静的な代替手段は .a ファイルにアーカイブされます。
セキュリティと安全性
リスク: MEDIUM.so は、それをロードするプロセス内で実行されるネイティブ実行コードであるため、悪意のある共有ライブラリはホストプログラムができることなら何でも実行できてしまいます。主なリスクは次の通りです:(1) ライブラリハイジャック - ローダーが最初に検索する場所に不正な .so を配置したり、LD_PRELOAD/LD_LIBRARY_PATH を悪用したりすることで、正当なプログラムにコードを注入できます。(2) エラーを修正するために、信頼できないウェブサイトから個別の .so ファイルをダウンロードすること - これらは悪意があるか、ABI の互換性がない可能性があり、システムを破壊したり侵害したりする恐れがあります。ライブラリは常にディストリビューションの署名済みパッケージリポジトリからインストールしてください。システム内の .so ファイル(/lib, /usr/lib 内)を削除すると、OSやアプリが起動しなくなる可能性があります。
形式の詳細
概要SO ファイルを開くプログラム
技術的詳細
詳細仕様| MIMEタイプ | application/x-sharedlib |
| マジックバイト | ファイルオフセット0に 7F 45 4C 46 ("\x7FELF") - すべての ELF ファイルと同一のマジック。e_type フィールドで共有オブジェクトを区別します |
| ELF e_type 値 | ET_DYN (0x0003) - 共有オブジェクトを実行ファイル (ET_EXEC = 0x0002) や再配置可能オブジェクト (ET_REL = 0x0001) と区別します |
| ビット数 | オフセット4の EI_CLASS バイト:1 = 32ビット (Elf32)、2 = 64ビット (Elf64)。Linuxでは両方のバリアントが広く展開されています |
| エンディアン | オフセット5の EI_DATA バイト:1 = リトルエンディアン (ELFDATA2LSB)、2 = ビッグエンディアン (ELFDATA2MSB)。アーキテクチャに依存します |
| 位置独立コード | プロセス間での再配置の競合なしにライブラリを任意の仮想アドレスにマップできるよう、-fPIC でコンパイルする必要があります |
| 動的シンボルテーブル | .dynsym セクションは実行時に表示されるシンボルをエクスポートおよびインポートし、.dynstr は対応する名前文字列を保持します |
| PLT / GOT | プロシージャリンクテーブル (PLT) とグローバルオフセットテーブル (GOT) により、ロード時の遅延(デフォルト)または即時 (-z now) シンボル解決が可能になります |
| soname (DT_SONAME) | ELF 動的セクションに埋め込まれた標準的なライブラリ名。ld.so はプログラムのリンク時にこの名前を記録し、ファイル名に依存しない ABI バージョンの追跡を可能にします |
| シンボルバージョニング | .gnu.version および .gnu.version_r セクションにより、1つのファイル内で複数のシンボルバージョンを許可し、後方互換性のある ABI の進化を可能にします |
| ランタイムリンカー | ld.so / ld-linux-x86-64.so.2 によってロードされます。検索パスは LD_LIBRARY_PATH、DT_RUNPATH、または /etc/ld.so.conf + ldconfig キャッシュによって制御されます |
| 命名規則 | lib<name>.so[.major[.minor.patch]]; libabc.so は通常、開発用のシンボリックリンク → libabc.so.3 → libabc.so.3.1.2 です |
| 埋め込み検索パス | DT_RPATH または DT_RUNPATH 動的エントリは、リンク時にライブラリ検索パスをファイルに焼き付けます。LD_LIBRARY_PATH で上書きできるため、DT_RUNPATH が推奨されます |
| 検査ツール | readelf -a, objdump -d, nm --dynamic (binutils); 依存関係リスト用の ldd; ELF タイプとアーキテクチャを識別する file コマンド |
| リリース日 | ELF format 1990s (System V Release 4); .so shared libraries are core to Linux/Unix |
| オープンスタンダード | はい · ロイヤリティフリー |
| 仕様書 | refspecs.linuxfoundation.org |
SO の変換
コミュニティ Q&A
ユーザーからの質問まだ質問はありません。SO ファイルについて最初の質問をしてみましょう。