Apa perbedaan antara parameter gcc `-fpic` dan` -fPIC`?

96

Saya sudah membaca halaman gccmanual, tetapi saya masih tidak dapat memahami perbedaan antara -fpicdan -fPIC. Adakah yang bisa menjelaskannya, dengan cara yang sangat sederhana dan jelas?


Pertanyaan-pertanyaan Terkait:

Denilson Sá Maia
sumber
1
Ya, jawabannya bukan di, man gcctetapi dalam info gcc, yang memiliki lebih banyak dokumentasi.
pengguna2284570

Jawaban:

110

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

Gunakan -fPICatau -fpicuntuk menghasilkan kode independen posisi. Apakah akan menggunakan -fPICatau -fpicmenghasilkan kode independen posisi bergantung pada target. The -fPICpilihan selalu bekerja, tapi dapat menghasilkan kode yang lebih besar dari -fpic(mnenomic mengingat ini adalah bahwa PIC adalah dalam kasus yang lebih besar, sehingga dapat menghasilkan jumlah yang lebih besar dari code). Menggunakan -fpicopsi biasanya menghasilkan kode yang lebih kecil dan lebih cepat, tetapi akan memiliki batasan yang bergantung pada platform, seperti jumlah simbol yang terlihat secara global atau ukuran kode. Linker akan memberi tahu Anda apakah itu cocok saat Anda membuat perpustakaan bersama. Jika ragu, saya memilih -fPIC, karena selalu berhasil.

Anycorn
sumber
33
Terlebih lagi: Saya melakukan sedikit percobaan di sini (pada platform x86_64), -fPICdan -fpictampaknya telah menghasilkan kode yang sama. Sepertinya mereka menghasilkan kode yang berbeda hanya pada m68k, PowerPC dan SPARC.
Denilson Sá Maia
4
Eksperimen tunggal dengan satu versi gcc yang dikompilasi dengan satu cara untuk beberapa target. Ambil hasil itu dengan sedikit garam, perkirakan hasil itu berubah seiring waktu khusus dengan alat seperti GCC.
old_timer
Bolehkah saya mengajukan pertanyaan; apa arti simbol yang terlihat secara global ?
Константин Ван
17

Dari halaman manual Gcc :

Saat membuat kode untuk pustaka bersama, -fpic menyiratkan -msmall-data dan -fPIC menyiratkan -mlarge-data.

Dimana:

 -msmall-data
 -mlarge-data
       When -mexplicit-relocs is in effect, static data is accessed via
       gp-relative relocations.  When -msmall-data is used, objects 8
       bytes long or smaller are placed in a small data area (the
       ".sdata" and ".sbss" sections) and are accessed via 16-bit
       relocations off of the $gp register.  This limits the size of the
       small data area to 64KB, but allows the variables to be directly
       accessed via a single instruction.

       The default is -mlarge-data.  With this option the data area is
       limited to just below 2GB.  Programs that require more than 2GB
       of data must use "malloc" or "mmap" to allocate the data in the
       heap instead of in the program's data segment.

       When generating code for shared libraries, -fpic implies
       -msmall-data and -fPIC implies -mlarge-data.
Alexandro de Oliveira
sumber
1
Halaman manual yang ditautkan telah diperbarui, jangan lupa untuk memeriksa.
tahu