【りんか】

リンカ とは?

💡 コンパイル済みのパーツを「繋ぎ合わせて」実行ファイルにする
📌 このページのポイント
コンパイルからリンクまでのフロー main.c util.c ソースファイル コンパイラ 機械語に変換 main.o util.o オブジェクト リンカ 結合・アドレス解決 ライブラリも統合 実行 ファイル 静的リンク ライブラリをファイルに 埋め込む 動的リンク 実行時にライブラリを 読み込む(.dll/.so) シンボル解決 関数名と実際の アドレスを紐付け
リンカのイメージ
ひよこ ひよこ

コンパイラだけじゃダメなの?

ペンギン先生 ペンギン先生

コンパイラは1つのソースファイルを1つのオブジェクトファイルに変換する。でもプログラムは複数のソースファイルとライブラリで構成されている。リンカがこれらを全部集めて、関数呼び出しのアドレスを解決し、1つの実行可能ファイルにまとめるんだ。main.oがutils.oのadd()を呼ぶなら、リンカがアドレスを確定するよ

ひよこ ひよこ

静的リンクと動的リンクの違いは?

ペンギン先生 ペンギン先生

静的リンクはライブラリのコードを実行ファイルに埋め込む。ファイルサイズは大きくなるけど単体で動く。動的リンクは.dll(Windows)や.so(Linux)を実行時に読み込む。ファイルが小さくなりメモリも共有できるけど、ライブラリがない環境では動かない。Goは静的リンクがデフォルトで配布が楽なんだよ

ひよこ ひよこ

リンクエラーって何?

ペンギン先生 ペンギン先生

よくあるのは「undefined reference(未定義参照)」。関数を呼んでいるのに、その関数の実体がどのオブジェクトファイルにもない状態。原因は①ライブラリのリンク忘れ(-lmathなど)、②関数名のスペルミス、③C++の名前マングリングによるシンボル不一致。コンパイルは通るのにリンクで失敗するパターンだよ

ひよこ ひよこ

最近のリンカ事情は?

ペンギン先生 ペンギン先生

リンクは大規模プロジェクトのビルド時間のボトルネックになることがある。GoogleのMold(Rui Ueyama作)は従来のリンカの数倍〜数十倍高速。LLD(LLVM Linker)もGNU ldより大幅に速い。ChromiumやLinuxカーネルのようにオブジェクトファイルが数万個あるプロジェクトでは、リンカの速度が開発効率に直結するよ

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「リンカ」って出てきたら「コンパイル結果を繋げて実行ファイルを作るプログラム」と思えればだいたいOK!
📖 おまけ:英語の意味
「Linker」 = 結合プログラム
💬 Link(繋ぐ)するプログラム。バラバラのパーツを1つに繋ぐ最終工程だよ
← 用語集にもどる