ความแตกต่างระหว่างไฟล์ไลบรารี. so, .la และ. a คืออะไร


230

ฉันรู้ว่า.soไฟล์เป็นไลบรารีแบบไดนามิก (หลายเธรดสามารถแชร์ไลบรารีดังกล่าวได้ดังนั้นจึงไม่จำเป็นต้องมีมากกว่าหนึ่งสำเนาในหน่วยความจำ) แต่อะไรคือความแตกต่างระหว่าง.aและ.la? ไลบรารีสแตติกเหล่านี้ทั้งหมดหรือไม่

หาก libs แบบไดนามิกมีข้อได้เปรียบใหญ่กว่าแบบคงที่ทำไมทำไมยังคงมีห้องสมุดแบบคงที่มากมาย?

ฉันต้องการทราบกลไกพื้นฐานในการโหลดไลบรารี่ (ทั้งสองชนิด) และวิธีการเรียกใช้โค้ดใน lib เมื่อมันถูกนำไปใช้ที่ไหนสักแห่ง ฉันควรศึกษาส่วนใดของเคอร์เนล และฉันควรรู้คำสั่ง / ยูทิลิตี้ที่เกี่ยวข้องกับ Linux เพื่อที่จะรู้ว่ากระบวนการทำงานอย่างไร? (ตอนนี้ฉันรู้เพียงldคำสั่งเท่านั้น)

เมื่อฉันควรพยายามที่จะสร้างรหัสลง.soหรือ.a? อันไหนดีกว่า?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so

คำตอบ:


306

.soไฟล์เป็นห้องสมุดแบบไดนามิก คำต่อท้ายย่อมาจาก "shared object" เนื่องจากแอปพลิเคชันทั้งหมดที่เชื่อมโยงกับไลบรารีใช้ไฟล์เดียวกันแทนที่จะทำสำเนาในไฟล์เรียกทำงานที่เป็นผลลัพธ์

.aไฟล์เป็นห้องสมุดแบบคงที่ คำต่อท้ายย่อมาจาก "เก็บถาวร" เพราะจริง ๆ แล้วเป็นเพียงไฟล์เก็บถาวร (สร้างด้วยarคำสั่ง - ซึ่งก่อนหน้าtarนี้ใช้เพื่อสร้างไลบรารี) ของไฟล์ออบเจ็กต์. o ดั้งเดิม

.laไฟล์เป็นไฟล์ข้อความที่ใช้โดยแพ็คเกจ GNU "libtools"เพื่ออธิบายไฟล์ที่ประกอบขึ้นเป็นไลบรารีที่เกี่ยวข้อง คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับพวกเขาได้ในคำถามนี้: ไฟล์. la ของ libtool คืออะไร

ห้องสมุดแบบคงที่และแบบไดนามิกแต่ละคนมีข้อดีและข้อเสีย

Static pro: ผู้ใช้จะใช้เวอร์ชันของไลบรารี่ที่คุณได้ทำการทดสอบกับแอพพลิเคชั่นของคุณเสมอดังนั้นจึงไม่น่าจะมีปัญหาเรื่องความเข้ากันได้

ข้อผิดพลาดคงที่: หากปัญหาได้รับการแก้ไขในไลบรารีคุณจะต้องกระจายแอปพลิเคชันของคุณใหม่เพื่อใช้ประโยชน์จากมัน อย่างไรก็ตามหากเป็นห้องสมุดที่ผู้ใช้มีแนวโน้มที่จะอัปเดตด้วยตนเองคุณอาจต้องดำเนินการนี้ต่อไป

Dynamic pro: footprint หน่วยความจำของกระบวนการของคุณมีขนาดเล็กลงเนื่องจากหน่วยความจำที่ใช้สำหรับไลบรารีจะถูกตัดจำหน่ายในทุกกระบวนการที่ใช้ไลบรารี

Dynamic pro: สามารถโหลดไลบรารีตามต้องการได้ในขณะใช้งาน นี่เป็นสิ่งที่ดีสำหรับปลั๊กอินดังนั้นคุณไม่จำเป็นต้องเลือกปลั๊กอินที่จะใช้เมื่อรวบรวมและติดตั้งซอฟต์แวร์ ปลั๊กอินใหม่สามารถเพิ่มได้ทันที

ข้อผิดพลาดแบบไดนามิก: ไลบรารีอาจไม่มีอยู่ในระบบที่มีคนพยายามติดตั้งแอปพลิเคชันหรืออาจมีรุ่นที่ไม่เข้ากันกับแอปพลิเคชัน ในการลดขนาดนี้แอปพลิเคชันแพคเกจอาจต้องรวมสำเนาของไลบรารีเพื่อให้สามารถติดตั้งได้หากจำเป็น สิ่งนี้มักถูกลดทอนลงโดยผู้จัดการแพ็คเกจซึ่งสามารถดาวน์โหลดและติดตั้งการพึ่งพาที่จำเป็นใด ๆ

libcห้องสมุดแบบไดนามิกที่มีประโยชน์อย่างยิ่งสำหรับระบบห้องสมุดเช่น ไลบรารีเหล่านี้มักจะต้องมีรหัสที่ขึ้นอยู่กับระบบปฏิบัติการและรุ่นที่เฉพาะเจาะจงเนื่องจากส่วนต่อประสานเคอร์เนลมีการเปลี่ยนแปลง หากคุณเชื่อมโยงโปรแกรมกับไลบรารีระบบแบบสแตติกระบบจะรันเฉพาะกับเวอร์ชันของระบบปฏิบัติการที่เวอร์ชันไลบรารีนี้เขียนขึ้นเท่านั้น แต่ถ้าคุณใช้ไลบรารีแบบไดนามิกมันจะรับไลบรารีที่ติดตั้งบนระบบที่คุณรันโดยอัตโนมัติ


1
@Barmar คุณกำลังบอกว่าข้อดีของไลบรารีคงที่นั้นมากกว่าข้อดีของไลบรารีแบบไดนามิกหรือไม่
Pacerier

4
@Pierier ฉันไม่ทราบว่าคุณได้รับจากที่ใด
Barmar

13
นั่นเป็นคำถามที่ไร้ความหมาย น้ำหนักของข้อดีข้อเสียขึ้นอยู่กับสถานการณ์ไม่มีคำตอบสากล ดูเหมือนว่าคุณจะมีวาระการประชุมและคุณกำลังพยายามล่อลวงฉัน
Barmar

3
@Barmar, Nop ฉันไร้เดียงสา เพียงแค่อยากรู้อยากเห็น
Pacerier

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