-fPIC หมายถึงอะไรเมื่อสร้างไลบรารีที่ใช้ร่วมกัน


109

ฉันรู้ว่า-fPICตัวเลือก '' เกี่ยวข้องกับการแก้ไขที่อยู่และความเป็นอิสระระหว่างแต่ละโมดูล แต่ฉันไม่แน่ใจว่ามันหมายถึงอะไร คุณสามารถอธิบาย?


1
ในกรณีที่คุณต้องการทราบรายละเอียดเพิ่มเติมมีบทความดีๆที่นี่ ( akkadia.org/drepper/dsohowto.pdf )
MJ

คำตอบ:


61

PIC ย่อมาจาก Position Independent Code

และอ้างถึงman gcc:

หากได้รับการสนับสนุนสำหรับเครื่องเป้าหมายให้ปล่อยรหัสที่ไม่ขึ้นกับตำแหน่งเหมาะสำหรับการเชื่อมโยงแบบไดนามิกและหลีกเลี่ยงการ จำกัด ขนาดของตารางออฟเซ็ตส่วนกลาง ตัวเลือกนี้สร้างความแตกต่างใน m68k, PowerPC และ SPARC รหัสที่ไม่ขึ้นกับตำแหน่งต้องการการสนับสนุนพิเศษดังนั้นจึงใช้ได้กับเครื่องบางเครื่องเท่านั้น

ใช้สิ่งนี้เมื่อสร้างวัตถุที่แชร์ (* .so) บนสถาปัตยกรรมที่กล่าวถึง


1
f ไม่ได้มีความหมายอะไรเลยมันเป็นแค่ส่วนหนึ่งของชื่อตัวเลือก
Zifre

17
มีความแตกต่างระหว่าง fpic และ fPIC ทั้งคู่ทำสิ่งเดียวกัน แต่ fpic ใช้การชดเชยสัมพัทธ์ที่สั้นกว่าหากมี ดังนั้นการคอมไพล์ด้วย fpic อาจทำให้ไฟล์มีขนาดเล็กลง น่าเสียดายที่มันไม่ทำงานตามที่คาดไว้เสมอไปดังนั้นให้ใช้ fPIC นอกจากนี้โปรดทราบว่าโปรเซสเซอร์บางตัวไม่รองรับการชดเชยที่สั้นกว่าดังนั้นจึงอาจไม่สร้างความแตกต่าง
Martin York

2
'f' เป็นอาการเมาค้างจากวิธีที่ gcc จัดการอาร์กิวเมนต์บรรทัดคำสั่ง (นี่คือสองสามปีที่ผ่านมาและพวกเขาได้เปลี่ยนส่วนนี้ของโค้ดที่ฉันไม่ได้ดูเมื่อเร็ว ๆ นี้) แต่ในขณะนั้นอนุญาตให้ใช้ตัวอักษรหรือชุดค่าผสมบางตัวเท่านั้นภายใต้เงื่อนไขที่แตกต่างกัน (มีภาษาที่ซับซ้อนมากสำหรับการกำหนดอาร์กิวเมนต์บรรทัดคำสั่ง) ด้วยเหตุนี้จึงใช้ 'f' เพื่อให้ง่ายต่อการกำหนดเป็นอาร์กิวเมนต์บรรทัดคำสั่ง
Martin York

2
จะเกิดอะไรขึ้นถ้าสร้าง * .so โดยไม่มี fPIC
Isa A

2
@IsaA ฉันกำลังรวบรวมฟังก์ชัน c-api mysql จากซอร์สในวันนี้และมันจะไม่สร้างฉัน/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 และสร้างขึ้น
ChiliNUT

32

fเป็นคำนำหน้า GCC สำหรับตัวเลือกที่ว่า "การควบคุมการประชุมอินเตอร์เฟซที่ใช้ในการสร้างรหัส"

PICย่อมาจาก "ตำแหน่งรหัสอิสระ" มันเป็นความเชี่ยวชาญของfpicสำหรับ m68K และ SPARC

แก้ไข: หลังจากอ่านหน้า 11 ของเอกสารที่อ้างถึงโดย 0x6adb015และความคิดเห็นโดย coryan ฉันได้ทำการเปลี่ยนแปลงเล็กน้อย:

ตัวเลือกนี้เหมาะสมสำหรับไลบรารีที่แชร์เท่านั้นและคุณกำลังบอกระบบปฏิบัติการว่าคุณกำลังใช้ Global Offset Table, GOT ซึ่งหมายความว่าการอ้างอิงที่อยู่ทั้งหมดของคุณสัมพันธ์กับ GOT และรหัสสามารถใช้ร่วมกันในหลายกระบวนการ

มิฉะนั้นหากไม่มีตัวเลือกนี้ตัวโหลดจะต้องแก้ไขการชดเชยทั้งหมดเอง

ไม่จำเป็นต้องพูดเรามักจะใช้ -fpic / PIC


1
ฉันคิดว่าระบบปฏิบัติการมีอิสระในการโหลดไลบรารีในที่อยู่เสมือนใด ๆ แต่หากไม่มีรูป / PIC ตัวโหลดจะต้องแก้ไขโค้ดและปรับการกระโดดแบบสัมบูรณ์ + การกำหนดทิศทางทั้งหมดไปยังตำแหน่งจริงของรูทีน / ไลบรารี ด้วย pic / PIC โค้ดจะไม่ถูกแก้ไขดังนั้นจึงมีการแชร์ในหลาย ๆ กระบวนการ
coryan

กระบวนการหลายอย่างเกิดขึ้นโดยบังเอิญโดยส่วนใหญ่ประเด็นสำคัญคือสามารถโหลดโค้ดได้ที่ที่อยู่เสมือนใด ๆ ที่มีการแก้ไขที่อยู่ขั้นต่ำที่แน่นอน
Jonathan Leffler

16

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

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