Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Linux

การใช้คำสั่ง ldd ใน Linux: ตรวจสอบ Shared Library ของโปรแกรม

ใช้คำสั่ง 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 โหลด