ホームページ >バックエンド開発 >C++ >C リンクはどのように機能しますか: オブジェクト ファイルから実行可能ファイルまで?

C リンクはどのように機能しますか: オブジェクト ファイルから実行可能ファイルまで?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-05 18:48:11976ブラウズ

How Does C   Linking Work: From Object Files to Executable?

C のリンクは実際にどのように機能しますか?

C では、リンクは複数のオブジェクト ファイル (.o ファイル) とライブラリ (.a または .so ファイル) を単一の実行可能ファイル (.exe または .out) にまとめます。リンカーはオブジェクト ファイルとライブラリ間の外部参照を解決し、シンボル テーブルと実行可能ファイルの実行に必要なその他の情報を作成します。

リンクはどのように行われますか?

  1. コンパイル: ソース コードがオブジェクト ファイルにコンパイルされます。各オブジェクト ファイルには、特定の関数またはモジュールのコンパイル済みコードと、そのモジュール内で定義および参照されるシンボル (変数、関数、クラス) に関する情報が含まれています。
  2. 再配置:リンクの際、リンカは再配置を実行します。これは、オブジェクト ファイル内のシンボルのアドレスを、実行可能ファイル内の最終アドレスと一致するように変更するプロセスです。これは、複数のオブジェクト ファイルが 1 つの実行可能ファイルに結合されるときにシンボルのアドレスが変わる可能性があるため必要です。
  3. シンボル解決: リンカーは、オブジェクト ファイルとライブラリ間の外部参照を解決します。シンボルが 1 つのオブジェクト ファイルで参照されているが、別のオブジェクト ファイルで定義されている場合、リンカはその定義を見つけてそれらの間にリンクを作成します。これにより、実行可能ファイルは、実行時に必要なすべてのシンボルに確実にアクセスできるようになります。
  4. 出力生成: すべての外部参照が解決されると、リンカーは、すべての外部参照を含む実行可能ファイルを作成します。オブジェクト ファイルとライブラリからのコードとデータ。これで、実行可能ファイルを実行する準備が整います。

実際の再配置

再配置のプロセスを説明するために、次の例を考えてみましょう。

// a.cpp
int a = 10;
int main() {
  return a;
}
// b.cpp
int b = 20;

a.cpp と b.cpp をコンパイルすると、2 つのオブジェクト ファイルが得られます: a.oそして、 a.o ファイルには変数 a の定義が含まれ、b.o には変数 b の定義が含まれます。

a.o と b.o をリンクするとき、リンカーは、ファイル内の a と b への参照が確実に行われるようにする必要があります。最終的な実行可能ファイルは正しいアドレスを指します。これは、再配置を実行することによって行われます。

再配置中、リンカーは、メモリ内の最終アドレスと一致するように、実行可能ファイル内の a と b のアドレスを変更します。たとえば、a がアドレス 0x1000 に割り当てられ、b がアドレス 0x2000 に割り当てられている場合、リンカは実行可能ファイル内の a へのすべての参照を 0x1000 を指すように変更し、b へのすべての参照を 0x2000 を指すように変更します。

このプロセスにより、実行可能ファイルが実行時に変数 a と b に正しくアクセスできることが保証されます。

以上がC リンクはどのように機能しますか: オブジェクト ファイルから実行可能ファイルまで?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。