Saya tahu opsi ' -fPIC
' ada hubungannya dengan menyelesaikan alamat dan independensi antara modul individu, tapi saya tidak yakin apa artinya sebenarnya. Bisakah Anda menjelaskan?
Saya tahu opsi ' -fPIC
' ada hubungannya dengan menyelesaikan alamat dan independensi antara modul individu, tapi saya tidak yakin apa artinya sebenarnya. Bisakah Anda menjelaskan?
Jawaban:
PIC adalah singkatan dari Position Independent Code
dan mengutip man gcc
:
Jika didukung untuk mesin target, keluarkan kode yang tidak bergantung pada posisi, cocok untuk penautan dinamis dan hindari batasan apa pun pada ukuran tabel offset global. Pilihan ini membuat perbedaan pada m68k, PowerPC dan SPARC. Kode yang tidak bergantung posisi memerlukan dukungan khusus, dan oleh karena itu hanya berfungsi pada mesin tertentu.
gunakan ini saat membuat objek bersama (* .so) pada arsitektur yang disebutkan.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
jadi saya menambahkan fPIC dan itu dibangun.
Ini f
adalah awalan gcc untuk opsi yang "mengontrol konvensi antarmuka yang digunakan dalam pembuatan kode"
The PIC
singkatan "Kode Posisi Independen", itu adalah spesialisasi dari fpic
untuk m68k dan SPARC.
Edit: Setelah membaca halaman 11 dari dokumen yang direferensikan oleh 0x6adb015 , dan komentar oleh coryan, saya membuat beberapa perubahan:
Opsi ini hanya masuk akal untuk pustaka bersama dan Anda memberi tahu OS bahwa Anda menggunakan Tabel Offset Global, GOT. Ini berarti semua referensi alamat Anda relatif terhadap GOT, dan kode dapat dibagikan melalui banyak proses.
Jika tidak, tanpa opsi ini, pemuat harus mengubah semua offset itu sendiri.
Tak perlu dikatakan, kami hampir selalu menggunakan -fpic / PIC.
man gcc
mengatakan:
-fpic Hasilkan kode posisi-independen (PIC) yang cocok untuk digunakan dalam berbagi perpustakaan, jika didukung untuk mesin target. Kode tersebut mengakses semua alamat konstan melalui tabel offset global (GOT). Dinamika loader menyelesaikan entri GOT ketika program dimulai (dinamis loader bukan bagian dari GCC; itu adalah bagian dari sistem operasi). Jika ukuran GOT untuk executable yang ditautkan melebihi spesifik mesin ukuran maksimum, Anda mendapatkan pesan kesalahan dari linker yang menunjukkan bahwa -fpic tidak berfungsi; dalam hal ini, kompilasi ulang dengan -fPIC sebagai gantinya. (Maksimum ini adalah 8k pada SPARC dan 32k pada m68k dan RS / 6000. 386 tidak memiliki batasan seperti itu.) Kode posisi-independen memerlukan dukungan khusus, dan karenanya bekerja hanya pada mesin tertentu. Untuk 386, GCC mendukung PIC untuk Sistem V tetapi tidak untuk Sun 386i. Kode dibuat untuk IBM RS / 6000 selalu tidak bergantung pada posisi. -fPIC Jika didukung untuk mesin target, keluarkan kode posisi-independen, cocok untuk tautan dinamis dan menghindari batasan ukuran tabel offset global. Opsi ini membuat perbedaan pada m68k tersebut dan SPARC. Kode posisi-independen memerlukan dukungan khusus, dan karenanya bekerja hanya pada mesin tertentu.