ทำไม /lib/libc.so.6 หายไป?


20
find | grep libc.so.6

แสดงให้เห็นว่ามันมีอยู่ใน/lib/i386-linux-gnu/libc.so.6แต่สคริปต์ที่ฉันเรียกใช้มันคาดว่าจะอยู่ภายใต้โดยตรง/libดังนั้นทำไมไม่มีอย่างน้อย symlink?

ฉันจะเสี่ยงทำลายสิ่งใดหรือไม่ถ้าฉันวาง symlink ที่นั่น

คำตอบ:


22

libc.soถูกย้ายไปเป็นส่วนหนึ่งของmultiarch work ใน Ubuntu 11.04 เหตุผลที่ไม่สามารถมี symlink ได้นั่นคือจุดประสงค์ของ multiarch คือเพื่อให้สามารถติดตั้งทั้งสองi386และamd64รุ่นlibcในเวลาเดียวกันเพื่อให้คุณสามารถเรียกใช้ไบนารีแบบ 32 บิตได้ง่ายขึ้นบนระบบ 64 บิตและ ในทางกลับกัน (และสถานการณ์อื่นที่คล้ายคลึงกัน) หากlibc6แพ็กเกจมี symlink ไปยังตำแหน่งใหม่เวอร์ชันของแพ็กเกจนั้นสำหรับสถาปัตยกรรมที่แตกต่างกันจะไม่สามารถติดตั้งได้ทั้งสองในเวลาเดียวกัน (เวอร์ชันของ symlink ใดที่จะdpkgเลือก?) เอาชนะจุดทั้งการฝึก

ทุกสิ่งที่ฮาร์ดโค้ดพา ธlibc.soต้องได้รับการอัปเดตเพื่อให้ทำงานได้อย่างถูกต้องจาก Ubuntu 11.04 เป็นต้นไป หากสคริปต์ที่คุณพูดถึงเป็นส่วนหนึ่งของ Ubuntu โปรดรายงานข้อผิดพลาดและเพิ่มmultiarchแท็ก


1
คำตอบที่ดีเรียนรู้สิ่งใหม่วันนี้ (อีกครั้ง) :)
Lekensteyn

1
โปรเซสเซอร์ที่ฉันใช้ไม่ได้รองรับคำแนะนำ 64 บิต คุณจะบอกว่ามีความเสี่ยงใด ๆ ที่เกี่ยวข้องกับการเพิ่ม symlink ด้วยตนเอง? ไม่แน่ใจว่าฉันต้องทำอย่างนั้น แต่ถ้า อย่างไรก็ตามนี่เป็นคำตอบที่ถูกต้อง ขอบคุณ
Erik B

@Erik B: อะไรนะ คุณกำลังบอกฉันว่าคุณกำลังพยายามใช้แอพ 64 ตัวประมวลผล 32 บิต? แน่นอนว่ามันจะไม่ทำงาน แอป 32 บิตทำงานได้ดีบนโปรเซสเซอร์ 64 บิต แต่ไม่ตรงกันข้าม
Lekensteyn

@ Lekensteyn นั่นไม่ใช่สิ่งที่ฉันพูด สิ่งที่ฉันพูดคือฉันไม่ได้ใช้ไลบรารี 64 บิต ดังนั้นในระบบของฉันโดยเฉพาะจะไม่มีความสับสนเกี่ยวกับว่า/lib/libc.so.6เป็นห้องสมุด 32 หรือ 64 บิต
Erik B

3
หากคุณไม่เคยใช้แพ็คเกจ 64 บิตฉันสงสัยว่ามีความเสี่ยงที่สำคัญในการเพิ่ม symlink ไม่ใช่
โคลินวัตสัน

10

ไลบรารีแบบไดนามิกถูกโหลดโดยเคอร์เนลพา ธ ไม่ได้ฮาร์ดโค้ดในโปรแกรม โปรแกรมเพิ่งบอกว่า "ฉันต้องการ libc.so.6" จากนั้นระบบจะค้นหาในเส้นทางห้องสมุดตามที่กำหนดไว้/etc/ld.so.confรวมถึง/usr/libและเป็น/libค่าเริ่มต้น /etc/ld.so.conf.dไฟล์นี้จะมีแฟ้มการกำหนดค่าเพิ่มเติมใน

บนระบบ 64 บิตของฉัน libc.so.6สามารถพบได้/lib/x86_64-linux-gnu/libc.so.6เพราะเส้นทางที่กำหนดไว้ใน/etc/ld.so.conf.d/x86_64-linux-gnu.conf:

# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu

หากต้องการทราบว่าโปรแกรมใดที่ห้องสมุดโหลดโดยใช้lddในldd /bin/bash:

    linux-vdso.so.1 =>  (0x00007ffff1dff000)
    libncurses.so.5 => /lib/libncurses.so.5 (0x00007f9d8b3b8000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9d8b1b4000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f9d8ae1f000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9d8b61c000)

การวาง symlink จะไม่ทำให้อะไรเสียหาย

ในการรับรายการไดเรกทอรีที่ค้นหาให้เรียกใช้:

ldconfig -v -N | grep '^/'

-vทำให้รายการของไฟล์ + ไดเรกทอรีถูกแสดง-Nป้องกันแคช ( /etc/ld.so.cache) ไม่ให้ถูกสร้างขึ้นใหม่


การวาง symlink จะไม่ทำลายอะไรเลย แต่มันจะไม่ทำอะไรที่ดีเช่นกันใช่มั้ย
Erik B

@Erik B: คุณอ้างถึงโปรแกรม / สคริปต์ใด ฉันสามารถเข้าใจได้ว่าสคริปต์ทำให้เกิดความสับสนเนื่องจากเส้นทางนั้นเป็นฮาร์ดโค้ด แต่โปรแกรมไม่จำเป็นต้องรู้เส้นทาง
Lekensteyn

มันเป็นวิธีการทำงานอย่างไร ฉันดูเหมือนจะมีปัญหาบางครั้งที่โปรแกรมไม่สามารถค้นหาไล/usr/local/libบรารี่ที่ติดตั้งแต่มันทำงานได้ดีถ้าฉันสร้าง symlink /usr/libอะไรเป็นสาเหตุของพฤติกรรมนี้
crazy2be

@ crazy2be: คุณสามารถโพสต์เอาท์พุทของldconfig -v -N | grep '^/'?
Lekensteyn

@Lekensteyn: Sure: pastebin.com/dtfnw2Tv มันเกิดขึ้นกับบางโปรแกรมในเกือบทุกระบบที่ฉันเคยใช้ดังนั้นฉันคิดว่ามันไม่เกี่ยวข้องกับการกำหนดค่าระบบ
crazy2be

5

เพียงเพิ่ม symlink ไปยังไฟล์ libc.so.6 ดังต่อไปนี้:

sudo ln -s /lib/i386-linux-gnu/libc.so.6 /lib/libc.so.6

เช่นเดียวกันสำหรับไฟล์ที่หายไปอื่น ๆ ที่ยังอยู่ในระบบในกรณีของฉัน Matlab หายไปไฟล์ปัญหาหายไปแล้ว

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