1. ホーム
  2. c++

[解決済み] リンカーって何する人?

2022-04-22 02:12:22

質問

いつも不思議に思っていることがあります。コンパイラが書いたコードをバイナリに変換することは知っていますが、リンカは何をするのでしょうか?ずっと謎だったんだ。

リンク」が何であるかは、おおよそ理解しています。ライブラリやフレームワークへの参照がバイナリに追加されることです。それ以上のことはわかりません。私にとっては、それは単に動作するだけです。ダイナミックリンクの基本も理解していますが、それほど深い意味はありません。

どなたか用語の解説をお願いします。

解決方法は?

リンカーについて理解するためには、まず、ソースファイル(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の人たちは、大きな違いがあると教えてくれるでしょう)。

ご理解いただけると幸いです。