ELFおよびPEの基本的なリンクプロセスの仕組み
-
22-07-2019 - |
質問
私は常にリンカがどのように機能するかについて混乱しており、検索するのが難しい主題です。
私の質問を実証し、答えの枠組みを提供するために、これまでに知っていること(または知っていると思うこと)を書き留めます。私は非常に間違っているかもしれません。 :)
まず、各.cppファイルは中間ファイル(Posix / ELFの場合は.o、Win / PEの場合は.obj)に組み込まれます。この中間ファイルには、作成元の.cppで定義されたすべてのシンボルが含まれ、適切に解決する必要がある外部リンクの指示が含まれています。これを拡張するものとして、Posixシステムでは.oファイルを.aファイルに結合できます(結合する以外のことは何もしないようですか?これはどのコマンドですか?)。 .libはPosix .aファイルに相当するWin / PEですか?
次に、中間ファイルがリンクされ、外部依存関係が解決され、実行可能ファイルが作成されます。手順がありませんか?
ありがとう!
解決
パズルのいくつかのピースを次に示します。
- ar(1)は、.aファイルの作成に使用されます。これらは、tar(1)またはzipファイルに似ています(おそらく シンボル名でオブジェクトファイルを検索するインデックス付き)
- リンカは、オブジェクトファイルのセクション(テキスト、データ、bss)を一緒にコピーします。 GNU ldの場合、セクションの正確なコピーはリンカースクリプトで制御できます(たとえば、名前に「text」を含む.oファイルからすべてのセクションを単一のテキストセクションにコピーします)
- リンカは再配置も行います。シンボルの値がわかったら、それぞれのターゲットアドレスで命令(ジャンプおよびデータロード)をパッチします。場合によっては、リンク時にこれを行うことができないため、リンカーは再配置レコードを.oファイルから最終的な実行可能ファイルにコピー/調整します。
- windows .libには2つの目的があります。静的ライブラリ(.lib)は.aライブラリに似ています。インポートライブラリ(.lib)には実際のコードは含まれず、シンボルリストのみが含まれます。リンカはインポートライブラリのシンボルを解決できますが、対応する.dllへの参照を実行可能ファイルに入れる必要があることを認識しています。 Unix / ELFでは、.soファイルにコードとシンボルテーブルの両方が含まれています。
所属していません StackOverflow