ใช้คำสั่ง ldd เพื่อแสดง Shared Library ที่โปรแกรมใดโปรแกรมหนึ่งต้องการ ldd มีประโยชน์สำหรับการหา Dependency ที่หายไป คำสั่งยังแสดง Function และ Object ที่ขาดหายไป
ไวยากรณ์คำสั่ง ldd
ปฏิบัติตามไวยากรณ์ที่ถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาด:
ldd [OPTION]... FILE...
ใช้สวิตช์ใดสวิตช์หนึ่งของ ldd แทนที่ [OPTION] ในคำสั่งข้างต้น:
--help: แสดงคำช่วยเหลือและออก--version: แสดงข้อมูลเวอร์ชันและออก-d, --data-relocs: ประมวลผล Data Relocations-r, --function-relocs: ประมวลผล Data และ Function Relocations-u, --unused: แสดง Direct Dependencies ที่ไม่ได้ใช้-v, --verbose: แสดงข้อมูลทั้งหมด
วิธีใช้คำสั่ง ldd
รันคำสั่งต่อไปนี้เพื่อดูข้อมูลเพิ่มเติมของโปรแกรม:
ldd -v /path/to/program/executable
ผลลัพธ์จะแสดงข้อมูลเวอร์ชัน พร้อม Path และ Address ของ Shared Libraries ตัวอย่าง:
libshared.so linux-vdso.so.1 => (0x00007fff26ac8000) libc.so.6 => /lib/libc.so.6 0x00007ff1df55a000) /lib64/ld-linux-x86-64.so.2 (0x00007ff1dfafe000)
ถ้าไฟล์ SO ไม่มีอยู่จริง สามารถหา Library ที่หายไปได้ด้วย:
ldd -d path/to/program
ผลลัพธ์จะคล้ายกับ:
linux-vdso.so.1 (0x00007ffc2936b000) /home/gary/demo/garylib.so => not found libc.so.6 => usr/lib/libc.so.6 (0x00007fd0c6259000) /lib64/ld-linux-x86-64.so.2 (0x00007fd0c65fd000)
คำเตือน: อย่ารัน ldd กับโปรแกรมที่ไม่น่าเชื่อถือ เพราะ ldd อาจ Execute โปรแกรมนั้น ให้ใช้ทางเลือกที่ปลอดภัยกว่านี้ แสดง Direct Dependencies เท่านั้น ไม่ใช่ Dependency Tree ทั้งหมด:
objdump -p /path/to/program | grep NEEDED
วิธีหา Path ของ Application
คุณต้องระบุ Full Path ของ Application เพื่อหา Dependencies ด้วย ldd มีหลายวิธี
ตัวอย่างหา Path ของ Firefox:
find / -name firefox
ปัญหาของ find คือรายการ Executable และทุกที่ที่ Firefox อยู่ มากเกินไป และอาจต้องใช้ sudo ไม่งั้นจะได้ Permission denied มาก
วิธีง่ายกว่า ใช้คำสั่ง whereis:
whereis firefox
ผลลัพธ์จะกระชับกว่า:
/usr/bin/firefox /etc/firefox /usr/lib/firefox
จากนั้นหา Shared Libraries ของ Firefox ด้วย:
ldd /usr/bin/firefox
ผลลัพธ์จะประมาณนี้:
linux-vdso.so.1 (0x00007ffff8364000) libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007feb9917a000) libdl.so.2 => /usr/lib/libdl.so.2 (0x00007feb98f76000) libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007feb98bf4000) libm.so.6 => /usr/lib/libm.so.6 (0x00007feb988f6000) libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007feb986e0000) libc.so.6 => /usr/lib/libc.so.6 (0x00007feb9833c000) /lib64/ld-linux-x86-64.so.2 (0x00007feb99397000)
linux-vdso.so.1 คือชื่อ Library และตัวเลข Hex คือ Address ที่ Library โหลดในหน่วยความจำ
บนหลายบรรทัด สัญลักษณ์ => ตามด้วย Path นี่คือ Path ไปยัง Binary จริง ตัวเลข Hex คือ Address ที่ Library โหลด