ค้นหาว่าห้องสมุดอยู่ในเส้นทางหรือไม่


15

สมมติว่าฉันต้องการทดสอบว่ามีการติดตั้งไลบรารีและใช้งานได้โดยโปรแกรมหรือไม่ ฉันสามารถใช้ldconfig -p | grep mylibเพื่อดูว่ามีการติดตั้งในระบบหรือไม่ แต่ถ้าห้องสมุดเป็นที่รู้จักกันเพียงผ่านการตั้งค่าLD_LIBRARY_PATH?

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

ฉันจะเพิ่มว่าฉันกำลังมองหาวิธีการแก้ปัญหาที่จะทำงานแม้ว่าฉันจะไม่ได้มีโปรแกรมที่อยู่ในมือ (เช่นโปรแกรมยังไม่ได้รวบรวม) ฉันแค่อยากจะรู้ว่ามีห้องสมุดอยู่ในld' เส้นทางของ


2
คุณสามารถใช้ldd <binary>เพื่อตรวจสอบว่าไลบรารีทั้งหมดที่เชื่อมโยงอยู่ในพา ธ หรือไม่ อาจจะมีวิธีที่สง่างามกว่านี้
โทมัส

@Thomas ฉันคิดว่าคุณควรตอบความคิดเห็นของคุณ lddทำหน้าที่ตรงตามวัตถุประสงค์นี้
lgeorget

1
@Thomas - แต่ถ้าฉันไม่ได้รวบรวมโปรแกรมและห้องสมุดที่จำเป็นสำหรับการรวบรวม?
nbubis

@Igeorget - ดูการแก้ไข / ความคิดเห็นของฉัน
nbubis

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

คำตอบ:


15

ldconfig สามารถแสดงรายการไลบรารีทั้งหมดที่มีการเข้าถึง ไลบรารีเหล่านี้จะถูกเก็บไว้ในแคชด้วย

/sbin/ldconfig -v -Nจะรวบรวมข้อมูลเส้นทางไลบรารีทั้งหมดตามปกติแสดงรายการไลบรารีทั้งหมดที่มีอยู่โดยไม่ต้องสร้างแคชใหม่ (ซึ่งเป็นไปไม่ได้หากคุณไม่ใช่ผู้ใช้รูท) ไม่คำนึงถึงไลบรารีบัญชีใน LD_LIBRARY_PATH (ตรงกันข้ามกับสิ่งที่โพสต์นี้พูดก่อนแก้ไข) แต่คุณสามารถส่งไลบรารี่เพิ่มเติมไปที่บรรทัดคำสั่งโดยใช้บรรทัดด้านล่าง:

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

ldconfig เป็นเครื่องมือจากปี 1980 ที่ได้รับในปี 1990 ด้วยเหตุนี้ldconfigจึงไม่สามารถพกพาได้เนื่องจากใช้เฉพาะกับการใช้งานที่อิงกับa.outตัวเชื่อมโยงไดนามิกของ SunOS-4.0 ตั้งแต่ปี 1987
Schily

วิธีนี้ช่วยในการแสดงรายการ libs ซึ่งมีเฉพาะใน LD_LIBRARY_PATH เท่านั้น ฉันเดาว่าฉันสามารถเขียนสคริปต์เพื่อวิเคราะห์คำนั้นแล้วอ่านมันผ่าน ldconfig แต่ดูเหมือนว่าจะเหมือนการฆ่ามากกว่า
nbubis

1
@nbubis คุณสามารถส่งผ่านไลบรารีใน LD_LIBRARY_PATH ไปยัง ldconfig ได้ตลอดเวลา /sbin/ldconfig -N -v $(sed 's/:/ /' <<< $LD_LIBRARY_PATH)ไม่ชอบมากไปเกินความชอบของฉัน
lgeorget

@schily จริงเหรอ? มันทำงานได้ดีกับห้องสมุด ELF เท่าที่ฉันจะบอกได้ และมันยังคงใช้อยู่ ld.so ต้องใช้แคชที่สร้างโดย ldconfig
lgeorget

คน Linux แฮ็คซอร์สโค้ดของ Sun linker เก่าเพื่อสนับสนุน ELF การใช้งานเอลฟ์ใหม่จากซันได้ลบldconfigข้อตกลงกับ AT&T เนื่องจากตัวแคชลิงเกอร์มีความไวต่อข้อผิดพลาดมากเกินไป อาทิตย์ต่อมาเพิ่มthe tree stooges: moe, lariและcrleโปรแกรมผู้ช่วยสำหรับการจัดการเอลฟ์
schily

2

ทดแทน (ช่องว่าง) ทั่วโลก:ด้วย LD_LIBRARY_PATH

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

2

คุณสามารถรวบรวมโปรแกรมทดสอบอย่างง่ายด้วย gcc และเชื่อมโยงไลบรารีของคุณ จากนั้นคุณสามารถตรวจสอบไลบรารีที่ใช้ด้วย ldd ฉันใช้สิ่งนี้:

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed ป้องกันลิงเกอร์จากการทิ้งไลบรารีเนื่องจากไม่มีสัญลักษณ์จากไลบรารีที่ใช้

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