Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Linux

Sử dụng lệnh ldd trong Linux

Dùng lệnh ldd để hiển thị các thư viện chung (shared libraries) mà một chương trình bất kỳ yêu cầu. Lệnh ldd hữu ích để xác định khi thiếu phụ thuộc (dependency). Lệnh cũng liệt kê các hàm và đối tượng bị thiếu.

Cú pháp lệnh ldd

Tuân thủ cú pháp đúng để tránh lỗi:

ldd [OPTION]... FILE...

Sử dụng một hoặc nhiều công tắc ldd có sẵn, chèn vào vị trí [OPTION] trong lệnh trên:

  • --help: In trợ giúp và thoát.
  • --version: In thông tin phiên bản và thoát.
  • -d, --data-relocs: Xử lý relocations dữ liệu.
  • -r, --function-relocs: Xử lý relocations dữ liệu và hàm.
  • -u, --unused: In các phụ thuộc trực tiếp không sử dụng.
  • -v, --verbose: In tất cả thông tin.

Cách dùng lệnh ldd

Thực thi lệnh sau để lấy thêm thông tin về một chương trình:

ldd -v /path/to/program/executable

Đầu ra hiển thị thông tin phiên bản cũng như đường dẫn và địa chỉ của các thư viện chung, ví dụ:

libshared.so
linux-vdso.so.1 => (0x00007fff26ac8000)
libc.so.6 => /lib/libc.so.6 0x00007ff1df55a000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff1dfafe000)

Nếu file SO không tồn tại, bạn có thể tìm thư viện bị thiếu bằng lệnh:

ldd -d path/to/program

Đầu ra tương tự như sau:

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)

Cảnh báo bảo mật: Không bao giờ chạy lệnh ldd trên chương trình không tin cậy vì ldd có thể thực thi nó. Thay vào đó, hãy dùng phương án an toàn hơn chỉ hiển thị phụ thuộc trực tiếp chứ không phải toàn bộ cây phụ thuộc:

objdump -p /path/to/program | grep NEEDED

Cách tìm đường dẫn đến ứng dụng

Bạn phải cung cấp đường dẫn đầy đủ đến ứng dụng nếu muốn tìm phụ thuộc của nó bằng ldd, có thể làm theo nhiều cách.

Ví dụ, đây là cách tìm đường dẫn đến Firefox:

find / -name firefox

Vấn đề với lệnh find là nó liệt kê cả file thực thi và mọi nơi Firefox nằm, ví dụ:

/etc/skel/.mozilla/firefox
/home//cache/mozilla/firefox
/home//.mozilla/firefox
/usr/bin/Firefox
/usr/lib/Firefox
/usr/lib/Firefox/Firefox

Cách này hơi quá sức và bạn có thể cần dùng sudo để nâng quyền,否则 dễ gặp lỗi permission-denied.

Thay vào đó, dễ dàng hơn là dùng lệnh whereis để tìm đường dẫn ứng dụng:

whereis firefox

Lần này đầu ra có thể trông như sau:

/usr/bin/firefox
/etc/firefox
/usr/lib/firefox

Sau đó, để tìm thư viện chung cho Firefox, nhập lệnh:

ldd /usr/bin/firefox

Đầu ra từ lệnh sẽ giống như sau:

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 là tên thư viện và số hex là địa chỉ nơi thư viện được nạp vào bộ nhớ.

Trên nhiều dòng, ký hiệu => được theo sau bởi một đường dẫn. Đó là đường dẫn đến file nhị phân vật lý. Số hex là địa chỉ nơi thư viện được nạp.