技術共有

リンカーの仕組み、静的リンクと動的リンクの違い、ダイナミック リンク ライブラリの作成方法と使用方法

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

リンカはプログラム開発において重要な役割を果たし、複数のオブジェクト ファイルとライブラリ ファイルを実行可能ファイルに統合します。リンカーの仕組み、静的リンクと動的リンクの違い、ダイナミック リンク ライブラリの作成方法と使用方法について説明する前に、まずリンカーの基本機能の概要を説明します。

リンカーの仕組み

リンカ これは、1 つまたは複数のオブジェクト ファイルとライブラリ ファイルを実行可能ファイルに結合するツールです。その主な機能は次のとおりです。

  1. シンボルの解析 : プログラム内のすべてのシンボル (関数および変数の名前) を識別して処理し、各シンボルが一意の定義を持つようにします。参照されているが定義されていないシンボル (外部シンボル) の場合、リンカは提供されたライブラリまたは他のオブジェクト ファイルで定義を探します。

  2. リセット : 各モジュールのコードおよびデータ アドレスを最終的なメモリ アドレスに調整します。再配置には、コード内のアドレス修正と、すべての参照が正しいメモリ位置を指すようにするためのデータ セグメントの位置調整が含まれます。

  3. セグメントを結合する: 異なるターゲット ファイルからの同じタイプのセグメント (コード セグメント、データ セグメントなど) を 1 つの連続したセグメントにマージします。

  4. 処理ライブラリ : プログラムが必要とするライブラリコードをオブジェクトファイルにリンクします。リンカは、静的ライブラリと動的ライブラリの 2 種類のライブラリを処理できます。

  5. 実行可能ファイルを生成する: 最終出力は、オペレーティング システム上で実行できる実行可能ファイルです。

静的リンクと動的リンクの違い

静的リンク そしてダイナミックリンク これらはリンカーの 2 つの動作モードであり、それぞれに異なる特性と使用シナリオがあります。

静的リンク
  • コンセプト : 静的リンクでは、ライブラリ コードはコンパイル時にコピーされ、それを使用するすべての実行可能ファイルに埋め込まれます。このようにして、生成された実行可能ファイルには必要なコードがすべて含まれており、外部ライブラリ ファイルに依存しません。

  • アドバンテージ

    • 強い独立性: 生成された実行可能ファイルにはすべての依存関係が含まれており、実行時に追加のライブラリ ファイルは必要ありません。
    • 優れた互換性: ランタイムはシステムにインストールされているライブラリのバージョンに依存せず、「ライブラリ バージョンの競合」の問題が発生しません。
  • 欠点がある

    • ファイル サイズが大きい: 各実行可能ファイルには完全なライブラリ コードが含まれているため、ファイル サイズが大きくなります。
    • 更新の問題: ライブラリが更新されると、そのライブラリを使用するすべてのプログラムを再コンパイルする必要があります。
  • 静的ライブラリ拡張

    • ウィンドウズ: .lib
    • Linux: .a
ダイナミックリンク
  • コンセプト : 動的リンクでは、ライブラリ コードは実行時にロードされ、実行可能ファイルには埋め込まれません。実行可能ファイルにはライブラリへの参照のみが含まれており、ライブラリ コードは実行時にオペレーティング システムによってロードされます。

  • アドバンテージ

    • ファイル サイズが小さい: 実行可能ファイルにはライブラリ コードは含まれず、ライブラリへの参照のみが含まれます。
    • 更新が簡単: ライブラリを更新するにはプログラムを再コンパイルする必要はなく、ライブラリ ファイルを置き換えるだけです。
    • 高いメモリ効率: 複数のプログラムが同じライブラリ ファイルのメモリ インスタンスを共有できるため、メモリ使用量が削減されます。
  • 欠点がある

    • 強力な依存関係: 実行可能ファイルは、実行時に正しいバージョンのライブラリ ファイルを見つけてロードできる必要があります。
    • 互換性の問題: ライブラリ ファイルのバージョンが一致しないと、プログラムが失敗する可能性があります。
  • 動的ライブラリ拡張

    • ウィンドウズ: .dll(ダイナミックリンクライブラリ)
    • Linux: .so(共有オブジェクト)

ダイナミック リンク ライブラリを作成して使用する

ダイナミックリンクライブラリの作成

オペレーティング システムが異なると、ダイナミック リンク ライブラリの作成方法が若干異なります。一般的な手順とコマンドをいくつか示します。

Linux 上でダイナミック リンク ライブラリを作成する
  1. ライブラリコードを書く

    ダイナミック ライブラリに配置する関数を含む C ソース ファイルを作成します。

    // example.cpp
    #include