คุณจะระบุตำแหน่งของไลบรารีไปยังไบนารีได้อย่างไร? (Linux)


34

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

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

ldd หายไฟบางอย่างเกี่ยวกับปัญหา:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

อย่างไรก็ตามมีการติดตั้ง Corona:

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

ฉันจะบอกไบนารีที่จะค้นหาไลบรารี่ "ที่หายไป" ได้อย่างไร

คำตอบ:


43

สำหรับการปิดครั้งเดียวให้ตั้งค่าตัวแปรLD_LIBRARY_PATHเป็นรายการไดเร็กทอรีที่คั่นด้วยโคลอนเพื่อค้นหา สิ่งนี้คล้ายกับPATHสำหรับไฟล์เรียกทำงานยกเว้นว่าไดเร็กทอรีระบบมาตรฐานถูกค้นหาเพิ่มเติมหลังจากที่ระบุผ่านสภาวะแวดล้อม

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

หากคุณมีโปรแกรมที่ช่วยให้ห้องสมุดอยู่ในตำแหน่งที่ไม่ได้มาตรฐานและไม่สามารถค้นหาได้ด้วยตนเองคุณสามารถเขียนสคริปต์ wrapper:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"

/etc/ld.so.confรายชื่อของไดเรกทอรีระบบมาตรฐานจะถูกเก็บไว้ใน ระบบล่าสุดอนุญาตให้ไฟล์นี้รวมไฟล์อื่น ๆ หากคุณมีสิ่งที่ชอบinclude /etc/ld.so.conf.d/*.confให้สร้างไฟล์ใหม่ชื่อ/etc/ld.so.conf.d/mala.confที่มีไดเรกทอรีที่คุณต้องการเพิ่ม หลังจากที่คุณเปลี่ยน/etc/ld.so.confหรือรวมไฟล์แล้วให้เรียกใช้/sbin/ldconfigเพื่อให้การเปลี่ยนแปลงของคุณมีผล (นี่เป็นการปรับปรุงแคช)

( LD_LIBRARY_PATHยังใช้กับ Unices อื่น ๆ อีกมากมายรวมถึง FreeBSD, NetBSD, OpenBSD, Solaris และ Tru64 HP-UX มีSHLIB_PATHและ Mac OS X มีDYLD_LIBRARY_PATH. /etc/ld.so.confมี analogs ที่ unices ส่วนใหญ่ แต่ตำแหน่งและไวยากรณ์แตกต่างกันมากขึ้น)


1
เยี่ยมมากขอบคุณมาก ฉันไม่รู้เกี่ยวกับ /etc/ld.so.conf และมันจะมีประโยชน์มากสำหรับฉันในอนาคต
Mala

15

หากคุณต้องการหลีกเลี่ยง LD_LIBRARY_PATH คุณสามารถทำได้ในระหว่างการเชื่อมโยง:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

-Wl, ... ใช้เพื่อส่งคำสั่งพิเศษไปยังตัวเชื่อมโยงและในกรณีนี้ด้วย -R คุณจะบอกตัวเชื่อมโยงเพื่อเก็บเส้นทางนี้เป็น "เส้นทางการค้นหาเริ่มต้น" สำหรับ. so

ฉันเก็บบันทึกเคล็ดลับเล็ก ๆ มากมายเช่นนี้ที่เว็บไซต์ของฉัน:

https://www.thanassis.space/tricks.html


แต่ถ้าห้องสมุดที่เป็นปัญหานั้นมีไลบรารีที่ใช้ร่วมกันเพื่อค้นหา rpath ที่เก็บไว้ในไบนารีจะไม่ถูกนำไปใช้ซ้ำกับการค้นหาไลบรารีย่อย ผมยังไม่ได้พบวิธีอื่น ๆ รอบนี้กว่าการตั้งค่า LD_LIBRARY_PATH ในสภาพแวดล้อมที่แล้วไม่ได้นำไปใช้กับการค้นหา recursive ...
อีธาน

@Ethan: จริง แต่สิ่งที่เป็นความจริงก็คือสถานการณ์ตามปกติที่คุณต้องการ "แชร์" ไลบรารีที่ใช้ร่วมกันสำหรับไบนารีบางตัวเป็นสิ่งที่คุณวางไว้ด้วยกัน เช่น/opt/mypackage/bin/someBinaryจะต้องมี libs ที่คุณเก็บ/opt/mypackage/lib/ไว้ ค่อนข้างมากทุกกรรมสิทธิ์ SW ที่ติดตั้งภายใต้ / opt ตามกฎนี้ - ซึ่งหมายความว่าวิธีที่แสดงข้างต้นจะครอบคลุมการติดตั้งดังกล่าวทั้งหมด พวกเขามักจะเพิ่ม symlink ภายใต้ / usr / bin ที่ชี้ไปยังไบนารีภายใต้ / opt - รู้ว่า "เส้นทางการค้นหาเริ่มต้น" จะค้นหา.sos ภายใต้/opt/.../libโฟลเดอร์ที่เหมาะสม
ttsiodras

ใช่ในกรณีของฉันฉันต้องการทดสอบแพคเกจโดยการเชื่อมโยงกับไดเรกทอรีการสร้างแทนที่จะติดตั้ง ... (แต่แพคเกจมีหลายภายใน. ดังนั้นมีการพึ่งพาระหว่างกัน ... การแก้ปัญหาต่าง ๆ แต่น่ารำคาญ)
อีธาน

0

สิ่งนี้บ่งชี้ว่า libcorona ไม่ได้ถูกติดตั้งในพา ธ ที่ถูกต้อง ย้ายไดเรกทอรี libcorona ไปยังเส้นทางที่ถูกต้องปัญหาจะได้รับการแก้ไข ..


ดีกว่าคำตอบอื่น ๆ อย่างไร
โตโต้

@ แตกต่างจากคำตอบอื่น ๆ โดยทั่วไปคุณติดตั้งไฟล์ด้วยตนเอง ... แม้ว่าจะไม่ได้หมายความว่าคำตอบนี้จะดีกว่า แต่ก็เป็นตัวเลือกที่ควรพิจารณา (ผู้คนทำสิ่งนี้ใน Windows ด้วยการคัดลอกไลบรารีไปที่ system32 / sysWOW64 เมื่อแอพไม่พบพวกเขา) ไม่แนะนำให้ใช้เพราะมันเป็นกำลังใจอย่างยิ่ง
Tcll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.