C でのリンクには、複数のオブジェクト ファイル (.o ファイル) を結合して、実行可能ファイルまたは共有ライブラリを作成することが含まれます。このプロセスには、アドレス再配置やシンボル解決などのさまざまな手順が含まれます。
リンクの重要な機能の 1 つは、_アドレス再配置_です。コンパイラは、各ソース ファイルをオブジェクト ファイルにコンパイルするときに、他のソース ファイルで定義されているシンボル (関数、変数など) への参照を含むコードを生成します。ただし、すべてのオブジェクト ファイルがリンクされるまで、これらのシンボルの最終アドレスはわかりません。
リンク中に、リンカはオブジェクト ファイル内の再配置セクションを読み取ります。これらのセクションには、シンボルの正しい位置を指すように、.text セクションと .data セクションでどのアドレスを変更する必要があるかに関する情報が含まれています。次に、リンカはシンボルの最終的な位置に基づいてこれらのアドレスを調整します。
アドレスの再配置を説明するために、次の例を考えてみましょう。
; object file hello_world.o .data hello_world db "Hello world!", 10 .text .global _start _start: mov rax, 1 ; sys_write mov rdi, 1 ; stdout mov rsi, hello_world ; placeholder for string address mov rdx, 13 ; number of characters to write syscall
この .o ファイルがコンパイルされると、コンパイラーはプレースホルダー値 (例: 0) 「Hello world!」のアドレス弦。リンカーは、このファイルの .rela.text セクションを読み取ります。
Offset Info Type Sym. Value Sym. Name + Addend 00000000000c 000200000001 R_X86_64_64 0000000000000000 .data + 0
このエントリは、オフセット 0x0c (mov rsi、hello_world 命令内) で 64 ビット値を変更する必要があることをリンカーに伝えます。
リンカがすべてのオブジェクト ファイルを結合するとき、オフセットの値を調整します。 0x0c は、最終的な実行可能ファイル内の文字列の正しいアドレスを指します。
以上がC リンカはリンク プロセス中にアドレスの再配置をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。