Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah C Linker Mengendalikan Penempatan Semula Alamat Semasa Proses Pautan?
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.
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.
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!