はじめに:arコマンドで理解する静的ライブラリの仕組み
C/C++プロジェクトのビルドプロセスにおいて、複数のオブジェクトファイル(.o)を1つに束ねた静的ライブラリ(.a)の扱いは基本かつ不可欠な知識です。本稿では、GNU binutilsに含まれるarコマンドを取り上げ、アーカイブ生成やメンバーの抽出、シンボル索引(ranlib連携)の挙動、そして開発現場で直面しやすい留意事項までを体系的に整理します。
開発環境のセットアップと検証用オブジェクトファイル(.o)の準備
アーカイブ操作に必要なar(binutilsパッケージ)と、ソースコードのビルドを受け持つgccコンパイラをシステムに導入するため、apt-get update -qq && apt-get install -y binutils gccを実行します。

動作確認を独立した環境で行うため、専用の作業ディレクトリを用意してカレントパスを切り替えるmkdir -p /tmp/ar_demo && cd /tmp/ar_demoを実行します。

ライブラリに組み込む加算ロジックの実装ファイルを作成するため、echo 'int add(int a, int b) { return a + b; }' > math_add.cを実行します。

同様に、減算処理を担当するソースファイルを用意するため、echo 'int sub(int a, int b) { return a - b; }' > math_sub.cを実行します。

作成した2つのソースコードを-cオプションでコンパイルし、リンク前のオブジェクトファイル(.o)を生成するため、gcc -c math_add.c math_sub.cを実行します。

コンパイル処理の結果としてmath_add.oおよびmath_sub.oが正常に出力されたか確かめるため、ls -l *.oを実行します。

静的ライブラリ(.a)の新規作成とファイルの結合(ar rcs)
アーカイブ作成作業を行うため、先ほど準備した検証ディレクトリへ移動するcd /tmp/ar_demoを実行します。

生成済みのオブジェクト群を単一の静的ライブラリ(libmath.a)へまとめ上げ、シンボルテーブルを同時に構築するため、ar rcs libmath.a math_add.o math_sub.oを実行します。
ここで指定したフラグのうち、rはメンバーの追加または既存ファイルの置換、cはアーカイブが存在しない場合の新規生成、sはシンボルインデックスの即時生成・更新を意味します。

仕上がった静的ライブラリの容量やパーミッションを読みやすい形式で確認するため、ls -lh libmath.aを実行します。

アーカイブ内部の構造確認とシンボル情報の抽出(ar t, nm)
アーカイブの検証作業を継続するため、対象ディレクトリへ移動するcd /tmp/ar_demoを実行します。

libmath.aに内包されている全モジュールのファイル名、アクセス権限、所有者、サイズ、更新日時といった詳細メタデータを一覧表示するため、ar tv libmath.aを実行します。tフラグは格納メンバーの一覧を出力し、vを付与することで詳細情報(verbose)を表示します。

ライブラリ内部のシンボル情報および関数シンボルの配置状況を把握するため、nm -s libmath.aを実行します。nmコマンドはバイナリ内のシンボルを可視化するユーティリティであり、-sオプションを付けることで、リンカが参照するアーカイブ索引(シンボルマップ)が正常に機能しているか検証できます。

オブジェクトファイルの個別抽出と削除(ar x, ar d)
アーカイブからメンバーを取り出すための作業ディレクトリを作成するため、cd /tmp/ar_demo && mkdir -p extractedを実行します。

展開先ディレクトリへ移り、libmath.aからmath_add.oのみを指定して取り出し、正常に抽出されたか一覧を確認するため、cd extracted && ar x ../libmath.a math_add.o && ls -lを実行します。xコマンドは、アーカイブ内の特定メンバーをカレントディレクトリに展開します。

次の検証手順へ進むため、元の作業ディレクトリに戻るcd /tmp/ar_demoを実行します。

ライブラリの構成を見直し、不要となったmath_sub.oをアーカイブ本体から切り離すため、ar d libmath.a math_sub.oを実行します。dコマンドは、アーカイブから指定した特定モジュールを完全に除去します。

削除操作が意図通り完了し、math_add.oだけが残存しているか確かめるため、ar t libmath.aを実行します。

実務での要点:シンボル索引の不整合対策と ranlib の活用
ライブラリの更新とインデックス再生成を検証するため、作業ディレクトリへ移動するcd /tmp/ar_demoを実行します。

あえてsフラグを指定せずにmath_sub.oをアーカイブへ再登録するため、ar r libmath.a math_sub.oを実行します。
インデックス生成を伴わずにアーカイブ内容を変更すると、内部のシンボル索引テーブルが同期されず、リンク段階で「未定義シンボル(undefined reference)」エラーを誘発するリスクがあります。

不整合が生じた、あるいは更新が漏れたシンボルインデックスを明示的に再構築するため、ranlib libmath.aを実行します。ranlibコマンドはアーカイブのヘッダーに最新のシンボル索引を書き込み、リンカが各オブジェクト内の関数や変数を迅速に解決できるように保証します。

ranlibによる修復後、インデックスが正常に整ったか確認するため、nm -s libmath.aを実行します。
表示されたインデックス情報から、追加されたモジュールの関数シンボルが漏れなく網羅されていることを確認できます。

本記事では、Linux環境におけるarコマンドの基本構文から、トラブルを防ぐためのシンボルインデックス管理までを幅広く解説しました。
ビルドツールの内部で実行されている仕組みを理解しておくことで、静的リンクに起因する不具合の早期解決に役立ててください。