ฉันรู้ว่า-fPIC
ตัวเลือก '' เกี่ยวข้องกับการแก้ไขที่อยู่และความเป็นอิสระระหว่างแต่ละโมดูล แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร คุณสามารถอธิบาย?
ฉันรู้ว่า-fPIC
ตัวเลือก '' เกี่ยวข้องกับการแก้ไขที่อยู่และความเป็นอิสระระหว่างแต่ละโมดูล แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร คุณสามารถอธิบาย?
คำตอบ:
PIC ย่อมาจาก Position Independent Code
และอ้างถึงman gcc
:
หากได้รับการสนับสนุนสำหรับเครื่องเป้าหมายให้ปล่อยรหัสที่ไม่ขึ้นกับตำแหน่งเหมาะสำหรับการเชื่อมโยงแบบไดนามิกและหลีกเลี่ยงการ จำกัด ขนาดของตารางออฟเซ็ตส่วนกลาง ตัวเลือกนี้สร้างความแตกต่างใน m68k, PowerPC และ SPARC รหัสที่ไม่ขึ้นกับตำแหน่งต้องการการสนับสนุนพิเศษดังนั้นจึงใช้ได้กับเครื่องบางเครื่องเท่านั้น
ใช้สิ่งนี้เมื่อสร้างวัตถุที่แชร์ (* .so) บนสถาปัตยกรรมที่กล่าวถึง
/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
จึงได้เพิ่ม fPIC และสร้างขึ้น
f
เป็นคำนำหน้า GCC สำหรับตัวเลือกที่ว่า "การควบคุมการประชุมอินเตอร์เฟซที่ใช้ในการสร้างรหัส"
PIC
ย่อมาจาก "ตำแหน่งรหัสอิสระ" มันเป็นความเชี่ยวชาญของfpic
สำหรับ m68K และ SPARC
แก้ไข: หลังจากอ่านหน้า 11 ของเอกสารที่อ้างถึงโดย 0x6adb015และความคิดเห็นโดย coryan ฉันได้ทำการเปลี่ยนแปลงเล็กน้อย:
ตัวเลือกนี้เหมาะสมสำหรับไลบรารีที่แชร์เท่านั้นและคุณกำลังบอกระบบปฏิบัติการว่าคุณกำลังใช้ Global Offset Table, GOT ซึ่งหมายความว่าการอ้างอิงที่อยู่ทั้งหมดของคุณสัมพันธ์กับ GOT และรหัสสามารถใช้ร่วมกันในหลายกระบวนการ
มิฉะนั้นหากไม่มีตัวเลือกนี้ตัวโหลดจะต้องแก้ไขการชดเชยทั้งหมดเอง
ไม่จำเป็นต้องพูดเรามักจะใช้ -fpic / PIC
man gcc
พูดว่า:
-fpic สร้างรหัสที่ไม่ขึ้นกับตำแหน่ง (PIC) ที่เหมาะสำหรับใช้ในการแชร์ ไลบรารีหากได้รับการสนับสนุนสำหรับเครื่องเป้าหมาย รหัสดังกล่าวเข้าถึงทั้งหมด ที่อยู่คงที่ผ่านตารางออฟเซ็ตส่วนกลาง (GOT) ไดนามิก ตัวโหลดแก้ไขรายการ GOT เมื่อโปรแกรมเริ่มทำงาน (ไดนามิก ตัวโหลดไม่ได้เป็นส่วนหนึ่งของ GCC เป็นส่วนหนึ่งของระบบปฏิบัติการ) ถ้า ขนาด GOT สำหรับไฟล์ปฏิบัติการที่เชื่อมโยงเกินเฉพาะเครื่อง ขนาดสูงสุดคุณได้รับข้อความแสดงข้อผิดพลาดจากตัวเชื่อมโยงที่ระบุ -fpic นั้นไม่ทำงาน ในกรณีนั้นให้คอมไพล์ใหม่ด้วย -fPIC แทน (ค่าสูงสุดเหล่านี้คือ 8k ใน SPARC และ 32k บน m68k และ RS / 6000 386 ไม่มีขีด จำกัด ดังกล่าว) รหัสที่ไม่ขึ้นกับตำแหน่งต้องการการสนับสนุนพิเศษดังนั้น ใช้งานได้กับบางเครื่องเท่านั้น สำหรับ 386 GCC รองรับ PIC สำหรับ ระบบ V แต่ไม่ใช่สำหรับ Sun 386i รหัสที่สร้างขึ้นสำหรับ IBM RS / 6000 ไม่ขึ้นกับตำแหน่งเสมอ -fPIC หากได้รับการสนับสนุนสำหรับเครื่องเป้าหมายให้ปล่อยรหัสที่ไม่ขึ้นกับตำแหน่ง เหมาะสำหรับการเชื่อมโยงแบบไดนามิกและหลีกเลี่ยงการ จำกัด ขนาดของไฟล์ ตารางชดเชยส่วนกลาง ตัวเลือกนี้สร้างความแตกต่างใน m68k และ SPARC รหัสที่ไม่ขึ้นกับตำแหน่งต้องการการสนับสนุนพิเศษดังนั้น ใช้งานได้กับบางเครื่องเท่านั้น