3

リンカがどのように機能するかについて、私はいつも混乱しており、検索するのが難しいテーマです。

私の質問を実証し、回答の枠組みを提供するために、これまでに知っている (または知っていると思う) ことを書き留めておきます。私は非常に間違っているかもしれません。:)

まず、各 .cpp ファイルが中間ファイルに組み込まれます (Posix/ELF の場合は .o、Win/PE の場合は .obj だと思います)。この中間ファイルには、ビルド元の .cpp によって定義されたすべてのシンボルが含まれており、適切に解決する必要がある外部リンクについての指示が含まれています。これの拡張として、Posix システムでは .o ファイルを .a ファイルに結合できます (これは結合以上のことをしていないように見えますが、これはどのコマンドですか?)。.lib は Posix .a ファイルに相当する Win/PE ですか?

次に、中間ファイルがリンクされ、外部依存関係が解決され、実行可能ファイルが作成されます。手順がありませんか?

ありがとう!

4

1 に答える 1

1

パズルのピースの一部を次に示します。

  • ar(1) は、.a ファイルを作成するために使用されます。これらは tar(1) または zip ファイルに似ています (オブジェクト ファイルをシンボル名で検索するためのインデックスが含まれている可能性があります)。
  • リンカーは、オブジェクト ファイルのセクション (テキスト、データ、bss) をまとめてコピーします。GNU ld の場合、セクションの正確なコピーはリンカー スクリプトで制御できます (たとえば、名前に「テキスト」を含む .o ファイルからすべてのセクションを単一のテキスト セクションにコピーします)。
  • リンカは再配置も行います。シンボルの値が判明したら、それぞれのターゲット アドレスを使用して命令 (ジャンプとデータ ロード) をパッチします。場合によっては、リンク時にこれを行うことができないため、リンカーは再配置レコードを .o ファイルから最終的な実行可能ファイルにコピー/調整します。
  • Windows .lib には 2 つの目的があります。スタティック ライブラリ (.lib) は .a ライブラリに似ています。インポート ライブラリ (.lib) には、実際のコードは含まれず、シンボル リストのみが含まれます。リンカーは、インポート ライブラリからシンボルを解決できますが、対応する .dll への参照を実行可能ファイルに配置する必要があることを認識しています。Unix/ELF では、.so ファイルにコードとシンボル テーブルの両方が含まれています。
于 2008-12-03T16:40:41.997 に答える