พารามิเตอร์ gcc "-fpic" และ "-fPIC" ต่างกันอย่างไร


100

ฉันอ่านgccmanpage แล้ว แต่ยังไม่เข้าใจความแตกต่างระหว่าง-fpicและ-fPIC. ใครช่วยอธิบายด้วยวิธีที่ง่ายและชัดเจน


คำถามที่เกี่ยวข้อง:


1
ใช่คำตอบไม่ได้อยู่ในman gccแต่info gccมีเอกสารประกอบเพิ่มเติม
user2284570

คำตอบ:


116

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

ใช้-fPICหรือ-fpicเพื่อสร้างรหัสอิสระของตำแหน่ง จะใช้-fPICหรือ-fpicสร้างรหัสอิสระตำแหน่งขึ้นอยู่กับเป้าหมาย -fPICเลือกที่เคยทำงาน แต่อาจผลิตรหัสขนาดใหญ่กว่า-fpic(mnenomic จะจำนี้ก็คือว่า PIC คือในกรณีที่มีขนาดใหญ่ดังนั้นจึงอาจผลิตจำนวนขนาดใหญ่ของรหัส) การใช้-fpicตัวเลือกมักจะสร้างโค้ดที่เล็กกว่าและเร็วกว่า แต่จะมีข้อ จำกัด ที่ขึ้นกับแพลตฟอร์มเช่นจำนวนสัญลักษณ์ที่มองเห็นได้ทั่วโลกหรือขนาดของโค้ด ตัวเชื่อมโยงจะบอกคุณว่าเหมาะสมหรือไม่เมื่อคุณสร้างไลบรารีที่ใช้ร่วมกัน เมื่อมีข้อสงสัยฉันเลือก-fPICเพราะมันได้ผลเสมอ


35
มีอะไรเพิ่มเติม: ฉันได้ทำการทดลองเล็กน้อยที่นี่ (บนแพลตฟอร์ม x86_64) -fPICและ-fpicดูเหมือนว่าจะสร้างรหัสเดียวกัน ดูเหมือนว่าพวกเขาสร้างรหัสที่แตกต่างกันเฉพาะบน m68k, PowerPC และ SPARC
Denilson Sá Maia

4
การทดลองเดียวกับ gcc เวอร์ชันเดียวที่คอมไพล์ด้วยวิธีเดียวสำหรับบางเป้าหมาย รับผลลัพธ์นั้นด้วยเกลือเม็ดคาดว่าผลลัพธ์จะเปลี่ยนแปลงตลอดเวลาโดยเฉพาะด้วยเครื่องมือเช่น GCC
old_timer

ฉันขอถามสักคำได้ไหม; สิ่งที่ไม่สัญลักษณ์ที่มองเห็นได้ทั่วโลกหมายความว่าอย่างไร
КонстантинВан

18

จากหน้าคู่มือ Gcc :

เมื่อสร้างโค้ดสำหรับไลบรารีที่ใช้ร่วมกัน -fpic แสดงถึง -msmall-data และ -fPIC หมายถึง -mlarge-data

ที่ไหน:

 -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.

1
หน้าคู่มือที่เชื่อมโยงได้รับการอัปเดตอย่าลืมตรวจสอบ
youfu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.