คำถามติดแท็ก shared-library

2
เหตุใดบางไลบรารีที่ทำงานร่วมกันจึงสามารถเรียกใช้งานได้ราวกับว่าเป็นไฟล์ที่เรียกใช้งานได้หรือไม่
บนระบบ Linux แบบ 32 บิตให้เรียกใช้สิ่งนี้ $ /lib/libc.so.6 และในระบบ 64 บิตนี้ $ /lib/x86_64-linux-gnu/libc.so.6 ในเชลล์จัดเตรียมเอาต์พุตเช่นนี้: GNU C Library stable release version 2.10.1, by Roland McGrath et al. Copyright (C) 2009 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY …

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

3
ทำไม nm ไม่แสดงสัญลักษณ์สำหรับ /lib/i386-linux-gnu/libc.so.6
ผมคาดว่าจะเห็นจำนวนของสัญลักษณ์ในlibc.so.6ไฟล์รวมทั้งprintf ฉันใช้เครื่องมือnmเพื่อค้นหาพวกเขา แต่มันบอกว่าไม่มีสัญลักษณ์ใน libc.so.6

5
การเรียกระบบใดที่ใช้เพื่อโหลดไลบรารีใน Linux
ในstraceเอาต์พุตพา ธ ไปยังไลบรารีที่เรียกใช้งานการเรียกใช้อยู่ในการเรียกopen()ใช้ นี่เป็นการเรียกระบบที่ใช้โดยโปรแกรมที่เชื่อมโยงแบบไดนามิกหรือไม่? เกี่ยวกับdlopen()อะไร open()ไม่ใช่สายที่ฉันเดาได้ว่าจะมีบทบาทในการทำงานของโปรแกรม

1
เหตุใดจึงไม่ระบบ Unix / Linux ทราเวิร์ผ่านไดเรกทอรีจนกว่าพวกเขาจะพบรุ่นที่ต้องการของห้องสมุดที่เชื่อมโยง?
ฉันมีไบนารีปฏิบัติการที่ชื่อว่า "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 จะผ่านกลุ่มของไดเรกทอรีต่างๆจนกว่าจะพบไลบรารีที่ต้องการ แต่ทำไมมันไม่ทำอย่างนั้นจนกว่ามันจะพบกับเวอร์ชั่นที่คาดหวังมากกว่าจะยอมรับอินสแตนซ์แรกของไลบรารี่โดยไม่คำนึงถึงเวอร์ชันของมัน?

3
จะตรวจสอบว่ามีการติดตั้งไลบรารี่ที่แชร์ได้อย่างไร?
คำถามของฉันมาจากปัญหาของฉันในการเริ่ม ffmpeg ฉันติดตั้ง ffmpeg แล้วและมันจะแสดงขึ้นเมื่อติดตั้ง: whereis ffmpeg ffmpeg: /usr/bin/ffmpeg /usr/bin/X11/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz ต่อมาฉันก็พบว่าบางโปรแกรมขึ้นอยู่กับไลบรารีที่ไม่ได้มาพร้อมกับการติดตั้งเองดังนั้นฉันจึงตรวจสอบด้วยคำสั่ง ldd ว่ามีอะไรหายไปบ้าง: # ldd /usr/bin/ffmpeg linux-vdso.so.1 => (0x00007fff71fe9000) libavfilter.so.0 => not found libpostproc.so.51 => not found libswscale.so.0 => not found libavdevice.so.52 => not found libavformat.so.52 => not found libavcodec.so.52 => not found libavutil.so.49 => not found libm.so.6 …

2
ตัวเชื่อมโยง / ตัวโหลดเดอร์แบบไดนามิกสามารถลิงก์แบบไดนามิกตามที่รายงานโดย `ไฟล์ 'ได้อย่างไร
พิจารณาการพึ่งพาวัตถุที่ใช้ร่วมกัน/bin/bashซึ่งรวมถึง/lib64/ld-linux-x86-64.so.2(dynamic linker / loader): ldd /bin/bash linux-vdso.so.1 (0x00007fffd0887000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000) /lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000) การตรวจสอบ/lib64/ld-linux-x86-64.so.2แสดงให้เห็นว่ามันเป็น symlink ไปที่/lib/x86_64-linux-gnu/ld-2.28.so: ls -la /lib64/ld-linux-x86-64.so.2 lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so นอกจากนี้fileรายงานของ/lib/x86_64-linux-gnu/ld-2.28.soตัวเองยังเชื่อมโยงแบบไดนามิก: file -L /lib64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, …

2
ฉันจะค้นหาหมายเลขรุ่นของไลบรารีที่ติดตั้งได้อย่างไร
คำถามที่เกี่ยวข้องกับ RedHat / CentOS ฉันสับสนเล็กน้อยระหว่างแพ็คเกจและไลบรารีและวิธีการตรึงให้เป็นรุ่นคงที่ มีข้อบกพร่อง X11 แบบโรลโอเวอร์ในเวอร์ชันล่าสุดของ libxcb ที่มีผลต่อโปรแกรม C ของฉัน libxcb-1.5-1 ไม่มีข้อผิดพลาดนั้น ดังนั้นฉันจึง: # yum remove libxcb-devel # rpm -Uvh --oldpackage libxcb-1.5-1.el6.i686.rpm และตอนนี้ข้อผิดพลาดได้หายไปและซอฟต์แวร์ของฉันทำงานได้ดี กรอไปข้างหน้าอย่างรวดเร็วไม่กี่สัปดาห์และข้อผิดพลาดจะกลับมา # yum info libxcb-devel Loaded plugins: refresh-packagekit, security Available Packages Name : libxcb-devel Arch : i686 Version : 1.9.1 Release : 2.el6 Size : …

2
ทำไมฉันถึงติดตั้งไลบรารี่ที่แชร์หลายเวอร์ชันไม่ได้?
มีหลายครั้งที่โปรแกรมบางโปรแกรมจะขึ้นอยู่กับไลบรารี่รุ่น xy และอีกอันบน xz แต่เท่าที่ฉันทราบไม่มีตัวจัดการแพ็กเกจจะอนุญาตให้ฉันติดตั้งทั้ง xy และ xz บางครั้งพวกเขาจะอนุญาตทั้งสองเวอร์ชันหลัก (เช่น qt4 และ qt5 ซึ่งสามารถติดตั้งได้ในเวลาเดียวกัน) แต่ (ดูเหมือน) จะไม่มีรุ่นรอง ทำไมนี้ ในขณะที่ปัจจัย จำกัด ที่ป้องกันไม่ให้มันคืออะไร? ฉันคิดว่าจะต้องมีเหตุผลที่ดีที่จะไม่อนุญาตฟังก์ชันที่มีประโยชน์นี้ เช่นไม่มีฟิลด์ที่จะระบุว่ารุ่นใดที่จะโหลดเมื่อโหลดวัตถุที่ใช้ร่วมกันและทำให้ไม่มีวิธีใดที่ Linux จะรู้วิธีการตัดสินใจว่าจะโหลดหรือไม่ หรือไม่มีเหตุผลจริงๆหรือ เช่นเดียวกับรุ่นรองทั้งหมดที่ควรจะเข้ากันได้หรืออะไร?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.