[解決済み] リンカーって何する人?
質問
いつも不思議に思っていることがあります。コンパイラが書いたコードをバイナリに変換することは知っていますが、リンカは何をするのでしょうか?ずっと謎だったんだ。
リンク」が何であるかは、おおよそ理解しています。ライブラリやフレームワークへの参照がバイナリに追加されることです。それ以上のことはわかりません。私にとっては、それは単に動作するだけです。ダイナミックリンクの基本も理解していますが、それほど深い意味はありません。
どなたか用語の解説をお願いします。
解決方法は?
リンカーについて理解するためには、まず、ソースファイル(C や C++ファイルなど)を実行可能ファイル(実行可能ファイルとは、自分のマシンまたは同じマシンアーキテクチャを実行している他のマシン上で実行できるファイル)に変換するときに、" under hood" で何が起こるのかを理解するのに役立ちます。
プログラムをコンパイルする際、コンパイラはソースファイルをオブジェクトのバイトコードに変換します。このバイトコード(オブジェクトコードと呼ばれることもあります)は、あなたのコンピュータアーキテクチャーのみが理解できるニモニック命令です。伝統的に、これらのファイルには.OBJという拡張子がついています。
オブジェクトファイルが作成されると、リンカーの出番となる。何か役に立つことをする実際のプログラムでは、他のファイルを参照する必要があることが多くなります。例えば、C言語では、自分の名前を画面に表示する簡単なプログラムは、次のような構成になります。
printf("Hello Kristina!\n");
コンパイラがあなたのプログラムを obj ファイルにコンパイルするとき、単純に
printf
関数を使用します。リンカはこの参照を解決します。ほとんどのプログラミング言語には、その言語で期待される基本的なものをカバーするルーチンの標準ライブラリがあります。リンカーは、OBJファイルをこの標準ライブラリとリンクします。リンカは、OBJ ファイルを他の OBJ ファイルとリンクさせることもできます。他のOBJファイルから呼び出される関数を持つ他のOBJファイルを作成することができます。リンカーは、ほとんどワープロのコピー&ペーストのように動作します。プログラムが参照する必要な関数をすべてコピー&ペーストして、1つの実行ファイルを作成します。時には、コピーされた他のライブラリが、さらに他のOBJファイルやライブラリファイルに依存していることがあります。リンカーが仕事をするためには、かなり再帰的にならなければならないことがあります。
すべてのオペレーティングシステムが単一の実行ファイルを作成するわけではないことに注意してください。例えばWindowsでは、これらの機能を1つのファイルにまとめておくDLLを使用しています。これは実行ファイルのサイズを小さくしますが、実行ファイルをこれらの特定のDLLに依存させることになります。DOSでは、かつてオーバーレイ(.OVLファイル)と呼ばれるものを使用していました。これには多くの目的がありましたが、1つはよく使う関数を1つのファイルにまとめておくことでした(念のため、もう1つの目的は、大きなプログラムをメモリに収めることができるようにすることでした。DOSではメモリに制限があり、オーバーレイをメモリから"unload"して、その上に他のオーバーレイを"load"できるため、オーバーレイという名前になっています)。Linuxには共有ライブラリがあり、これは基本的にDLLと同じ考え方です(私の知っているハードコアなLinuxの人たちは、大きな違いがあると教えてくれるでしょう)。
ご理解いただけると幸いです。
関連
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み] explicit キーワードの意味は?
-
[解決済み] ルール・オブ・スリーとは?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み] to_string は std のメンバーではない、と g++ が言っている (mingw)
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み] gccやldで位置非依存の実行ファイルを作成するための-fPIEオプションとは何ですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] CPUバウンド」「I/Oバウンド」とは、どのような意味ですか?
-
[解決済み】オペレーティングシステムなしでプログラムを実行するには?