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

C リンクでは、オブジェクト ファイルとライブラリを実行可能ファイルにどのように結合しますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-06 00:39:12340ブラウズ

How Does C   Linking Combine Object Files and Libraries into an Executable?

実際の C リンクの仕組み

概要

C リンクは、複数のオブジェクト ファイル (.o) とライブラリを結合するプロセスです(.a) を 1 つの実行可能ファイルに分割します。ソース コードをオブジェクト ファイルに変換するコンパイルとは異なり、リンクは未解決のシンボルを解決し、アドレスを再配置し、最終的な実行可能ファイルを実行できる状態にします。

アドレス再配置

の重要な機能の 1 つリンクとはアドレスの移転のことです。各オブジェクト ファイルには、他のファイルで宣言された関数やデータなどの外部シンボルへの参照が含まれています。リンク中に、リンカはこれらのシンボルの最終アドレスを計算し、それに応じてオブジェクト ファイルのコード セクションとデータ セクションを調整します。

再配置情報

オブジェクト ファイルは、リンカに再配置情報を提供します。各再配置エントリには、再配置する必要があるオブジェクト ファイル内のアドレスとターゲット シンボルが含まれます。

リンカの役割

リンカは、すべてのオブジェクト ファイルおよびライブラリから再配置エントリを読み取ります。他の入力ファイルまたはライブラリで未解決のシンボルの定義を検索することで、未解決のシンボルを解決します。次に、すべてのシンボルの最終アドレスを計算し、再配置エントリを更新します。

実行可能ファイル

すべてのシンボルが解決され、アドレスが再配置されると、リンカは個々のオブジェクト ファイルを結合して、単一の実行可能ファイル。この実行可能ファイルには、ターゲット プラットフォームでプログラムを実行するために必要なコードとデータが含まれています。

次の C プログラムについて考えてみましょう。

// main.cpp
#include <iostream>

int main() {
  std::cout << "Hello, world!" << std::endl;
  return 0;
}

このプログラムがコンパイルすると、main.o と cout.o という 2 つのオブジェクト ファイルが生成されます。オブジェクト ファイル main.o には main 関数のコードが含まれ、cout.o には << の実装が含まれます。 std::cout.

の演算子 リンク中に、リンカーは両方のオブジェクト ファイルから再配置エントリを読み取ります。 cout.o でその定義を見つけて、std::cout への参照を解決します。また、リンカーは、main.o 内のアドレス参照を更新して、実行可能ファイル内の std::cout の正しいアドレスを指すようにします。

a.out という名前の最終的な実行可能ファイルには、両方のオブジェクト ファイルから結合されたコードが含まれています。そして実行の準備が整いました。

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

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