เหตุใดจึงไม่ระบบ Unix / Linux ทราเวิร์ผ่านไดเรกทอรีจนกว่าพวกเขาจะพบรุ่นที่ต้องการของห้องสมุดที่เชื่อมโยง?


17

ฉันมีไบนารีปฏิบัติการที่ชื่อว่า "alpha" ที่ต้องการไลบรารีที่เชื่อมโยง (libz.so.1.2.7) ซึ่งวางไว้ที่ /home/username/myproduct/lib/libz.so.1.2.7

ฉันส่งออกไปยังอินสแตนซ์ของเทอร์มินัลของฉันก่อนที่จะวางไข่ไบนารีที่ปฏิบัติการได้ของฉันโดยดำเนินการคำสั่งต่อไปนี้

export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH

ตอนนี้เมื่อฉันวางไข่แอปพลิเคชั่น "ไชโย" อื่นที่ต้องใช้ไลบรารีเดียวกัน แต่เป็นเวอร์ชั่นที่แตกต่างกันคือ (libz.so.1.2.8) ซึ่งมีอยู่ใน /lib/x86_64-linux-gnu/libz.so.1.2.8ระบบระบบจะพ่นข้อผิดพลาดต่อไปนี้

version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)

หากฉันยกเลิกการตั้งค่าLD_LIBRARY_PATH"ไชโย" จะเริ่มต้นได้ดี ฉันเข้าใจว่าพฤติกรรมดังกล่าวเป็นเพราะLD_LIBRARY_PATHมีความสำคัญเหนือเส้นทางไดเรกทอรีที่กำหนดใน/etc/ld.so.confขณะที่ค้นหาห้องสมุดที่เชื่อมโยงและดังนั้นข้อผิดพลาดดังกล่าวเกิดขึ้น ฉันแค่อยากรู้ว่าทำไมนักพัฒนาของ UNIX / LINUX จึงไม่ได้ออกแบบระบบปฏิบัติการเพื่อค้นหาไลบรารี่ที่เชื่อมโยงในไดเรกทอรีอื่นตามลำดับชั้นหากอินสแตนซ์แรกของไลบรารี่เป็นเวอร์ชันที่แตกต่างกัน

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


ฉันไม่แน่ใจ แต่ฉันเดาว่าเพื่อความปลอดภัย โดยส่วนตัวแล้วฉันไม่ต้องกังวลกับ sym-link ที่ใดก็ได้บนเครื่องของฉัน
Joe

@Joe ห้องสมุดหลายแห่งมี symlink ที่ชี้ไปยังพวกเขา libz.so.1เป็น symlink ไปlibz.so.1.2.8
Nasir Riley

คำตอบ:


28

แต่ทำไมมันไม่ทำอย่างนั้นจนกว่ามันจะพบกับเวอร์ชั่นที่คาดหวังมากกว่าจะยอมรับอินสแตนซ์แรกของไลบรารี่โดยไม่คำนึงถึงเวอร์ชันของมัน?

มันเท่าที่มันรู้ zlib.so.1.2.7และzlib.so.1.2.8ทั้งสองมี soname ของzlib.so.1เพื่อให้คุณalphaและไบนารีกล่าวว่าพวกเขาต้องการbravo zlib.so.1โหลดเดอร์แบบไดนามิกโหลดไลบรารีที่ตรงกันแรกที่พบ ไม่ทราบว่าเวอร์ชั่น 1.2.8 มีสัญลักษณ์เพิ่มเติมที่bravoต้องการ (นี่คือสาเหตุที่การแจกแจงเจ็บปวดเพื่อระบุข้อมูลการพึ่งพาเพิ่มเติมเช่นzlib1g (>= 1.2.8)for bravo.)

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

ห้องสมุดบางแห่งมีข้อมูลรุ่นที่จัดเก็บไว้ในท้ายที่สุด.gnu.version_rพร้อมลิงก์ไปยังห้องสมุดจัดหาซึ่งจะช่วยได้ที่นี่ แต่libzไม่ใช่หนึ่งในนั้น

(ให้ sonames ฉันคาดหวังว่าalphaไบนารีของคุณจะทำงานได้ดีzlib.so.1.2.8)


และสิ่งหนึ่งที่ควรทราบเช่นกันว่าการกำหนดเวอร์ชันไลบรารีของ GNU นั้นแตกต่างจากการกำหนดเวอร์ชันแบบ semantic (--ish) ที่เราคุ้นเคยมากที่สุด เนื่องจากพวกเขามีหมายเลข "ปัจจุบัน" เหมือนกัน 1, zlib.so.1.2.8 ไม่ควรให้คุณสมบัติใด ๆ ที่ zlib.so.1.2.7 ไม่มีดังนั้นจึงไม่ควรมีความสำคัญ (จากมุมมอง ABI) พบ ว่ามันไม่สำคัญควรพิจารณาข้อบกพร่อง
John Bollinger

4
@ John no รับประกันได้เพียงว่าห้องสมุดที่มีชื่อเดียวกันนั้นสามารถใช้งานได้แบบย้อนหลัง ไลบรารีที่ใหม่กว่าสามารถเพิ่มฟีเจอร์ต่าง ๆ พวกมันไม่สามารถลบหรือเปลี่ยนแปลงใด ๆ ในรูปแบบที่เข้ากันไม่ได้ กล่าวคือไบนารีที่สร้างขึ้นเทียบกับ zlib 1.2.7 จะทำงานร่วมกับ zlib 1 หรือใหม่กว่า 1; แต่ไบนารีที่สร้างขึ้นเทียบกับ zlib 1.2.8 ไม่จำเป็นต้องทำงานกับ zlib รุ่นเก่า 1 (และการกำหนดเวอร์ชันแบบ semantic อนุญาตให้ทำได้; แต่การจัดการ soname ไม่ใช่การกำหนดเวอร์ชันแบบ semantic)
Stephen Kitt

1
ฉันกำลังพูดถึงการประชุม GNU โดยเฉพาะอย่างที่ฉันพูดและฉันคาดเดาเกี่ยวกับlibtool เป็นพิเศษ ไม่ใช่ทุก ๆ โครงการที่เป็นไปตามอนุสัญญานั้นดังนั้นบางทีมันแรงเกินกว่าที่จะเรียกว่า zlib มีข้อบกพร่อง แต่ในทางกลับกันแม้การตีความหมายเชิงความหมายของหมายเลขเวอร์ชันไลบรารีที่เกี่ยวข้องจะมาถึงข้อสรุปเดียวกัน ความเข้ากันได้แบบส่งต่อ (ไบนารี) ในกรณีเช่นนี้ไม่ใช่สัญญาที่มีอยู่ในตัวเครื่อง แต่เป็นความคาดหวังที่สมเหตุสมผลในกรณีนี้
John Bollinger

1
ใช่ฉันดีเข้าใจความสัมพันธ์ระหว่างตัวเลขด้ายและ SOVERSION ซึ่งกลับมารอบไปยังจุดเดิมของฉัน: สถานการณ์อธิบายโดย OP ที่ดูเหมือนว่าจะไม่สอดคล้องกับการใช้งานที่ถูกต้องของโครงการด้าย หลีกเลี่ยงปัญหาเช่น OP เป็นหนึ่งในวัตถุประสงค์หลักของโครงการ หาก zlib เพิ่มส่วนต่อประสานไบนารี (เวอร์ชั่นใหม่) จำนวนที่อยู่ในนั้นควรเพิ่มขึ้น การชนเช่นนี้อาจนำไปสู่การกระทบกระเทือนอย่างรุนแรงและเป็นรอง
John Bollinger

2
@ John ถูกต้องฉันสงสัยว่าเรากำลังทำข้อตกลงที่รุนแรงและเข้าใจผิดว่าคุณกำลังทำอะไรอยู่ zlibไม่ได้ใช้libtoolยกเว้นในกรณีที่ดาร์วินอยู่ที่ไหนar;-)
Stephen Kitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.