【りんか】

リンカ とは?

最終更新:
💡 コンパイル済みのパーツを「繋ぎ合わせて」実行ファイルにする

オブジェクトファイルやライブラリを組み合わせ、シンボルの参照や配置を調整するプログラム。実行ファイルや共有ライブラリなどを作る。

📌 このページのポイント
別々のコードの部品を結び付けるmain.outil.o部品リンカ参照・配置を調整出力実行ファイル等ライブラリも入力例:main.oのadd()参照とutil.oの定義を結ぶ動的リンクでは実行時に残る解決もある
オブジェクトファイルやライブラリの参照を結び、配置を調整する例。共有ライブラリや、後でさらにリンクするオブジェクトも出力できます。
ひよこ ひよこ
コンパイラだけでは実行ファイルを作れないの?
ペンギン先生 ペンギン先生
CやC++では、各ソースをコンパイル・アセンブルしてオブジェクトファイルにし、最後にリンクする流れがよく使われるよ。コンパイラのコマンドが内部でリンカまで呼ぶこともある。リンカはmain.oからutil.oのadd()を呼ぶような、別々の部品の参照を結び付けるんだ
ひよこ ひよこ
静的リンクと動的リンクはどう違う?
ペンギン先生 ペンギン先生
静的リンクでは必要なライブラリのコードを出力へ取り込む。動的リンクでは共有ライブラリを参照する情報を残し、実行時の読み込みやシンボル解決にもつなげるよ。実際の依存関係は構成によるので、静的リンクならどの環境でも必ず単体で動くとは言えないんだ
ひよこ ひよこ
undefined referenceというエラーは何?
ペンギン先生 ペンギン先生
必要なシンボルの定義を、リンクの際に解決できなかったということだよ。オブジェクトファイルやライブラリを渡し忘れた、名前が一致しない、ライブラリを指定する順番が合わない、といった原因がある。コンパイルが通っても、リンクで失敗することはあるんだ
ひよこ ひよこ
リンカは呼び出し先のアドレスを全部決める?
ペンギン先生 ペンギン先生
配置やアドレスの調整をするけれど、動的リンクでは実行時まで残る処理もあるよ。GNU ldは実行ファイルのほか、共有ライブラリや、後でさらにリンクするオブジェクトファイルも作れる。リンカの仕事を、すべてのアドレスを固定した実行ファイルだけを作ること、と限定しないで理解しよう
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「リンカ」って出てきたら「コンパイル結果を繋げて実行ファイルを作るプログラム」と思えればだいたいOK!
📖 おまけ:英語の意味
「Linker」 = 結合プログラム
💬 Linkはつなぐ、という意味だよ。別々に作られたコードの部品を組み合わせ、参照関係を整えるプログラムなんだ

参考資料

← 用語集にもどる