ความแตกต่างระหว่าง. so และ. dylib บน osx คืออะไร?


214

.dylib เป็นส่วนขยายไลบรารีแบบไดนามิกบน OSX แต่ไม่เคยชัดเจนสำหรับฉันเมื่อฉันไม่สามารถ / ไม่ควรใช้วัตถุที่ใช้ร่วมกัน unix .so แบบดั้งเดิม

บางคำถามที่ฉันมี:

  • ในระดับแนวคิดอะไรคือความแตกต่างที่สำคัญระหว่าง. so และ. dylib?
  • เมื่อใดที่ / ฉันควรใช้อันอื่น?
  • เทคนิคการรวบรวม & เคล็ดลับ (ตัวอย่างเช่นการแทนที่สำหรับ gcc -shared -fPIC เนื่องจากไม่ได้ทำงานบน osx)

คำตอบ:


206

รูปแบบไฟล์ออบเจ็กต์ Mach-O ที่ใช้โดย Mac OS X สำหรับไฟล์ที่เรียกใช้งานได้และไลบรารี่แยกระหว่างไลบรารีที่แชร์และโมดูลที่โหลดแบบไดนามิก ใช้เพื่อดูไฟล์ของotool -hv some_filesome_file

ไลบรารีที่แบ่งใช้ Mach-O มีประเภทไฟล์MH_DYLIBและมีนามสกุล. dylib พวกเขาสามารถเชื่อมโยงกับธงคง linker ปกติเช่น-lfoolibfoo.dylib สามารถสร้างได้โดยการส่ง-dynamiclibแฟล็กไปยังคอมไพเลอร์ ( -fPICเป็นค่าเริ่มต้นและไม่จำเป็นต้องระบุ)

โมดูลที่โหลดได้เรียกว่า "การรวมกลุ่ม" ใน Mach-O พูด MH_BUNDLEพวกเขามีประเภทของไฟล์ พวกเขาสามารถขยายใด ๆ .bundleApple แนะนำให้ใช้ส่วนขยายแต่ซอฟต์แวร์ที่พอร์ตส่วนใหญ่ใช้.soเพื่อความเข้ากันได้ โดยทั่วไปคุณจะใช้ชุดข้อมูลสำหรับปลั๊กอินที่ขยายแอปพลิเคชัน ในสถานการณ์เช่นนี้ชุดข้อมูลจะเชื่อมโยงกับไบนารีแอปพลิเคชันเพื่อเข้าถึง API ที่ส่งออกของแอปพลิเคชัน สามารถสร้างได้โดยการส่ง-bundleแฟล็กไปยังคอมไพเลอร์

ทั้งสอง dylibs และการรวมกลุ่มสามารถโหลดแบบไดนามิกโดยใช้dlAPIs (เช่นdlopen, dlclose) ไม่สามารถลิงก์กับบันเดิลเหมือนกับว่าเป็นไลบรารีที่แบ่งใช้ อย่างไรก็ตามเป็นไปได้ที่มัดเชื่อมโยงกับไลบรารีที่แชร์จริง จะถูกโหลดโดยอัตโนมัติเมื่อโหลดมัด

ความแตกต่างมีความสำคัญมากกว่า ใน Mac OS X 10.0 ไม่มีวิธีในการโหลดไลบรารีแบบไดนามิก ชุดของ API dyld (เช่นNSCreateObjectFileImageFromFile, NSLinkModule) ได้รับการแนะนำให้รู้จักกับ 10.1 ในการโหลดและยกเลิกการรวมกลุ่ม แต่พวกเขาไม่ได้ทำงานให้ dylibs dlopenห้องสมุดเข้ากันได้ที่ทำงานร่วมกับการรวมกลุ่มที่ถูกเพิ่มเข้ามาใน 10.3; ใน 10.4 dlopenมีการเขียนใหม่เพื่อเป็นส่วนดั้งเดิมของ dyld และเพิ่มการรองรับสำหรับการโหลด (แต่ไม่โหลด) dylibs ในที่สุด 10.5 เพิ่มการสนับสนุนสำหรับการใช้dlcloseกับ dylibs และเลิกใช้ API ของ dyld

ในระบบเอลฟ์เช่น Linux, ทั้งใช้รูปแบบไฟล์เดียวกัน ; รหัสที่ใช้ร่วมกันใด ๆ สามารถใช้เป็นห้องสมุดและสำหรับการโหลดแบบไดนามิก

ท้ายที่สุดโปรดทราบว่าใน Mac OS X "มัด" ยังสามารถอ้างถึงไดเรกทอรีที่มีโครงสร้างมาตรฐานที่เก็บรหัสที่ปฏิบัติการได้และทรัพยากรที่ใช้โดยรหัสนั้น มีแนวคิดทับซ้อนบางอย่าง (โดยเฉพาะกับ "ชุดรวมที่โหลดได้" เช่นปลั๊กอินซึ่งโดยทั่วไปจะมีรหัสที่ปฏิบัติการได้ในรูปแบบของชุดมัด Mach-O) แต่พวกเขาไม่ควรสับสนกับชุดรวม Mach-O ที่กล่าวถึงข้างต้น

การอ้างอิงเพิ่มเติม:


1
ขอบคุณสำหรับความคิดเห็นที่กว้างขวางนี้ :) ฉันเข้าใจถูกต้องไหมว่าถ้าฉันโหลดมัดหนึ่งจากบันเดิลอื่น (เช่นพา ธ คือแอป -> บันเดิล A -> บันเดิล B) จากนั้นชุด B จะไม่สามารถมองเห็นได้ สัญลักษณ์ในชุด A? และถ้าใช่มีวิธีใดบ้างที่จะแก้ปัญหานี้? ฉันเพิ่งจะตีฉันคิดว่า: stackoverflow.com/questions/4193539/…
มิคาอิล Edoshin

4
@noloader: -dynamiclibเป็นธง GCC มันทำให้คอมไพเลอร์ส่งผ่าน-dylibไปยัง ld
ไมล์

อัปเดต URL สำหรับหน้าคนสำหรับ ld บน Mac OSX: manpages.info/macosx/ld.1.html
netpoetica

18

ไฟล์. so ไม่ใช่ไฟล์นามสกุล UNIX สำหรับ shared library

มันเพิ่งเกิดขึ้นที่จะเป็นคนธรรมดา

ตรวจสอบบรรทัด 3b ที่หน้า ArnaudRecipes sharedlib

โดยพื้นฐาน. dylib เป็นนามสกุลไฟล์ mac ที่ใช้เพื่อระบุ lib ที่ใช้ร่วมกัน


9
@ninefingers แก้ไข. แต่เครื่องมือบางอย่างจะใช้ค่าเริ่มต้นยกเว้นบางสิ่งที่ชัดเจนมาก เช่นคอมไพเลอร์จะใช้ส่วนขยายบรรณารักษ์เฉพาะแพลตฟอร์มที่นั่นเมื่อใช้แฟล็ก -l <lib> (ธงจริงอาจข้ามคอมไพเลอร์มาก)
มาร์ตินยอร์

14

ความแตกต่างระหว่าง. dylib และ. so บน mac os x คือวิธีการรวบรวม สำหรับไฟล์. so ที่คุณใช้ -shared และ. dylib คุณใช้ -dynamiclib ทั้ง. so และ. dylib สามารถใช้แทนกันได้เป็นไฟล์ไลบรารีแบบไดนามิกและอาจมีชนิดเป็น DYLIB หรือ BUNDLE นี่คือการอ่านข้อมูลสำหรับไฟล์ต่างๆที่แสดงสิ่งนี้

libtriangle.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1368   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS



libtriangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00       DYLIB    17       1256   NOUNDEFS DYLDLINK TWOLEVEL NO_REEXPORTED_DYLIBS

triangle.so:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
MH_MAGIC_64  X86_64        ALL  0x00      BUNDLE    16       1696   NOUNDEFS DYLDLINK TWOLEVEL

เหตุผลที่ทั้งสองมีความเท่าเทียมกันใน Mac OS X สำหรับความเข้ากันได้ย้อนหลังกับโปรแกรมอื่น ๆ ของ UNIX OS ที่คอมไพล์ไฟล์ประเภท. so

หมายเหตุการรวบรวม: ไม่ว่าคุณจะรวบรวมไฟล์. so หรือไฟล์. dylib คุณต้องแทรกเส้นทางที่ถูกต้องลงในไลบรารีแบบไดนามิกในระหว่างขั้นตอนการเชื่อมโยง คุณทำได้โดยการเพิ่ม -install_name และพา ธ ไฟล์ไปยังคำสั่งการลิงก์ ถ้าคุณไม่ทำเช่นนี้คุณจะทำงานเป็นปัญหาที่เห็นในโพสต์นี้: Mac ห้องสมุด Dynamic บ้า (อาจจะ Fortran เท่านั้น)


ฉัน./configureจะสร้าง.dylibไฟล์เพื่อสร้างแทนที่จะเป็นไฟล์บันเดิลได้.soอย่างไร ./configure --enable-sharedไม่ทำงานนี้
Admia

จากประสบการณ์ของฉันไฟล์กำหนดค่าส่วนใหญ่บน mac จะสร้างไฟล์. so หรือไฟล์ไลบรารีแบบสแตติกเนื่องจากไฟล์คอนฟิกูเรชันกำลังใช้ชื่อไฟล์ unix / linux มาตรฐาน
Zachary Kraus

4

แค่การสังเกตที่ฉันเพิ่งทำในขณะที่สร้างโค้ดที่ไร้เดียงสาบน OSX ด้วย cmake:

cmake ... -DBUILD_SHARED_LIBS=OFF ...

สร้างไฟล์. so

ในขณะที่

cmake ... -DBUILD_SHARED_LIBS=ON ...

สร้างไฟล์. dynlib

บางทีนี่อาจช่วยใครก็ได้

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