Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah C Linker Mengendalikan Penempatan Semula Alamat Semasa Proses Pautan?

Bagaimanakah C Linker Mengendalikan Penempatan Semula Alamat Semasa Proses Pautan?

Patricia Arquette
Patricia Arquetteasal
2024-12-06 10:25:12715semak imbas

How Does the C   Linker Handle Address Relocation During the Linking Process?

Bagaimanakah pemautan C berfungsi dalam amalan?

Pemautan dalam C melibatkan penggabungan berbilang fail objek (fail.o) untuk mencipta pustaka boleh laku atau dikongsi. Proses ini melibatkan pelbagai langkah, termasuk penempatan semula alamat dan penyelesaian simbol.

Penempatan Semula Alamat

Satu fungsi penting pemautan ialah _penempatan semula alamat_. Apabila pengkompil menyusun setiap fail sumber ke dalam fail objek, ia menjana kod yang mengandungi rujukan kepada simbol (fungsi, pembolehubah, dll.) yang ditakrifkan dalam fail sumber lain. Walau bagaimanapun, ia tidak mengetahui alamat akhir simbol ini sehingga semua fail objek dipautkan bersama.

Semasa memaut, pemaut membaca bahagian penempatan semula dalam fail objek. Bahagian ini mengandungi maklumat tentang alamat yang perlu diubah suai dalam bahagian .text dan .data untuk menunjuk ke lokasi yang betul untuk simbol. Pemaut kemudian melaraskan alamat ini berdasarkan lokasi akhir simbol.

Contoh

Pertimbangkan contoh berikut untuk menggambarkan penempatan semula alamat:

; 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

Apabila fail .o ini disusun, pengkompil memasukkan a nilai pemegang tempat (cth., 0) untuk alamat "Hello world!" rentetan. Pemaut membaca bahagian .rela.text dalam fail ini:

Offset          Info           Type           Sym. Value    Sym. Name + Addend
00000000000c  000200000001 R_X86_64_64       0000000000000000 .data + 0

Entri ini memberitahu pemaut bahawa pada offset 0x0c (di dalam mov rsi, arahan hello_world), ia perlu mengubah suai nilai 64-bit untuk menunjuk ke bahagian .data.

Apabila pemaut menggabungkan semua fail objek, ia melaraskan nilai pada offset 0x0c untuk menunjuk ke alamat rentetan yang betul dalam boleh laku akhir.

Atas ialah kandungan terperinci Bagaimanakah C Linker Mengendalikan Penempatan Semula Alamat Semasa Proses Pautan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn