7 ví dụ về sử dụng lệnh ldd trong VPS Linux

Tác giả: VPS chính hãng 18 tháng 11, 2023

Ldd là một tiện ích dòng lệnh Linux được sử dụng trong trường hợp người dùng muốn biết các phần phụ thuộc của thư viện dùng chung của tệp thực thi. Bạn có thể nhận thấy nhiều tệp bắt đầu bằng lib* trong thư mục /lib và /usr/lib trên máy chủ Linux của bạn. Những tập tin này được gọi là thư viện. Thư viện là tập hợp các tài nguyên như chương trình con/hàm, lớp, giá trị hoặc thông số kỹ thuật. Hãy cùng VPS Chính hãng tìm hiểu về lệnh ldd qua 7 ví dụ dưới đây.

Các loại thư viện được dùng chung

Thư viện giúp chương trình có thể sử dụng các quy trình chung mà không cần tốn chi phí quản trị trong việc duy trì mã nguồn hoặc chi phí xử lý để biên dịch chúng mỗi khi chương trình được biên dịch.Có hai loại thư viện:

  • Thư viện tĩnh (Static libraries): thư viện tĩnh cho các chương trình hoàn chỉnh không phụ thuộc vào thư viện bên ngoài để chạy. Đặc điểm của các chương trình liên kết tĩnh là chúng hoạt động mà không cần cài đặt bất kỳ điều kiện tiên quyết nào. Thư viện tĩnh kết thúc bằng phần mở rộng *.a và các thư viện này được đưa vào các chương trình yêu cầu các chức năng của nó.
  • Thư viện động (Dynamic libraries): thư viện động cho các chương trình có kích thước nhỏ. Các thư viện này kết thúc bằng phần mở rộng .so, Một tính năng khác của việc sử dụng liên kết động khi nhiều chương trình đang chạy. Nó có thể chia sẻ một bản sao của thư viện thay vì chiếm bộ nhớ với nhiều bản sao của cùng một mã . Vì vậy các chương trình gần đây đều sử dụng liên kết động.

Lệnh ldd

Lệnh ldd in các phần phụ thuộc của đối tượng được chia sẻ. Cú pháp của lệnh là:

ldd [OPTIONS]... FILE...

Tùy chọn:

  • -v : in toàn bộ thông tin.
  • -d : xử lý di chuyển dữ liệu.
  • -r : xử lý dữ liệu và di chuyển chức năng.
  • -u : in các phần phụ thuộc trực tiếp không sử dụng.

Vui lòng lưu ý các điểm sau trước khi thực hiện lệnh:

  • File, ld-linux.so là trình liên kết hoặc trình tải động kiểm tra liên kết hoặc bộ đệm thư viện mong muốn cho chương trình được yêu cầu và tải nó.
  • File cache, /etc/ld.so.cache chứa danh sách các thư viện được tìm thấy trong các thư mục được chỉ định trong /etc/ld.so.conf. Điều này giúp cung cấp liên kết động nhanh hơn.
  • File /etc/ld.so.conf chỉ định các thư mục nơi tìm kiếm thư viện.
Lệnh ldd giúp quản lý các thư viện dùng chung

Lệnh ldd giúp quản lý các thư viện dùng chung

Cài đặt ldd

ldd được cài đặt theo mặc định trong hầu hết các bản phân phối Linux. Nếu bạn gặp lỗi không tìm thấy lệnh ldd, hãy cài đặt nó bằng cách sử dụng:

Ubuntu / Debian:

apt install libc-bin

Redhat / CentOS Stream:

yum install glibc-common

Fedora:

dnf install glibc-common

Arch:

pacman -S glibc

Cách sử dụng lệnh ldd

Trong bài viết này, chúng ta sẽ tìm hiểu các lệnh ldd được sử dụng để quản lý các thư viện dùng chung. Đi kèm với đó hãy mua VPS Linux để nâng cao hiệu quả hoạt động và lưu trữ. Bắt đầu với lệnh ldd qua 7 ví dụ sau:

1. Hiển thị các phụ thuộc của lệnh

Chúng ta sẽ hiển thị các phụ thuộc của lệnh cp.

ldd /bin/cp
  Output:
    linux-vdso.so.1 =>  (0x00007fffaf3ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)

2. Hiển thị chi tiết các phụ thuộc của lệnh

Chúng ta sẽ hiển thị các phần phụ thuộc của lệnh cp với nhiều chi tiết hơn bằng cách sử dụng tùy chọn -v.

ldd -v /bin/cp
  Output:
     linux-vdso.so.1 =>  (0x00007fff473ff000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
        librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
        libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
        libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
        libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
        libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)

        Version information:
        /bin/cp:
                librt.so.1 (GLIBC_2.2.5) => /lib64/librt.so.1
                libattr.so.1 (ATTR_1.1) => /lib64/libattr.so.1
                libacl.so.1 (ACL_1.2) => /lib64/libacl.so.1
                libacl.so.1 (ACL_1.0) => /lib64/libacl.so.1
                libc.so.6 (GLIBC_2.6) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libselinux.so.1:
                libdl.so.2 (GLIBC_2.2.5) => /lib64/libdl.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.8) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/librt.so.1:
                libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
                libpthread.so.0 (GLIBC_PRIVATE) => /lib64/libpthread.so.0
                libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
                libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
        /lib64/libacl.so.1:
                libattr.so.1 (ATTR_1.0) => /lib64/libattr.so.1
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libattr.so.1:
                libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libc.so.6:
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
        /lib64/libdl.so.2:
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
                libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
        /lib64/libpthread.so.0:
                ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
                ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
                libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
                libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
                libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6

3. Hiển thị các phần phụ thuộc trực tiếp chưa được sử dụng của lệnh

Chúng ta có thể hiển thị các phần phụ thuộc trực tiếp không được sử dụng của lệnh cp bằng tùy chọn -u.

ldd -u /bin/cp
    Output:
     Unused direct dependencies:

        /lib64/libselinux.so.1
        /lib64/librt.so.1
        /lib64/libacl.so.1
        /lib64/libattr.so.1

4. Display ldd chỉ hoạt động trên các tệp thực thi động

Chúng tôi sẽ hiển thị ldd chỉ hoạt động trên các tệp thực thi động bằng tùy chọn -r.

ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
   Output:
     not a dynamic executable

Đầu ra hiển thị trạng thái thông báo rõ ràng rằng tệp được cung cấp không phải là tệp thực thi động.

=>> Sử dụng lệnh getent để tìm nạp dữ liệu trên VPS Linux

5. ldd với dòng lệnh thực thi tiêu chuẩn

Khi thử ldd trên một tệp thực thi dòng lệnh tiêu chuẩn như ls, cần đường dẫn đầy đủ đến tệp thực thi động.

ldd ls
    Output:
    ldd: ./ls: No such file or directory

Chúng ta thấy rằng ldd không thể tìm thấy ls.

ldd /bin/ls
   Output:
    linux-vdso.so.1 =>  (0x00007fff5cbea000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003a07600000)
    libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
    libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)

Nhưng với đường dẫn tuyệt đối, ldd hoạt động tốt.

6. Biết một daemon thực thi nhất định có hỗ trợ TCP Wrapper

Để xác định xem một daemon thực thi nhất định có hỗ trợ TCP Wrapper hay không, hãy chạy lệnh sau.

sudo ldd /usr/sbin/sshd | grep libwrap
  Output:
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)

Đầu ra chỉ ra rằng daemon OpenSSH (sshd) hỗ trợ TCP Wrapper.

7. ldd thiếu phần phụ thuộc

Chúng ta có thể sử dụng lệnh ldd khi một tệp thực thi bị lỗi do thiếu phần phụ thuộc. Khi tìm thấy phần phụ thuộc bị thiếu, chúng ta có thể cài đặt nó hoặc cập nhật bộ đệm bằng lệnh ldconfig.

sudo ldd /bin/mv
libacl.so.1 => /lib/libacl.so.1 (0×40016000)
libc.so.6 => /lib/libc.so.6 (0x4001c000)
libattr.so.1 => /lib/libattr.so.1 (0×40141000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)

Chúng ta sẽ thực hiện di chuyển và báo cáo mọi đối tượng bị thiếu (chỉ ELF) bằng cách gõ lệnh.

sudo ldd -d path/to/executable_file

Chúng ta sẽ thực hiện di dời cho cả đối tượng dữ liệu và hàm, đồng thời báo cáo mọi đối tượng hoặc hàm bị thiếu (chỉ ELF) bằng cách nhập lệnh sau.

sudo ldd -r path/to/executable_file

Với 7 ví dụ trên về cách sử dụng lệnh ldd cho mục đích quản lý các thư viện dùng chung các bạn có thể hoàn thiện quy trình quản lý và sử dụng dữ liệu trên VPS Linux của mình. Truy cập vpschinhhang.com ngay hôm nay để biết thêm nhiều thông tin thú vị về VPS cũng như đăng ký các gói dịch vụ lưu trữ chất lượng cao tại đây. Cảm ơn đã theo dõi bài viết!