コンパイラだけじゃダメなの?
コンパイラは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カーネルのようにオブジェクトファイルが数万個あるプロジェクトでは、リンカの速度が開発効率に直結するよ