GNU/Linux >> Belajar Linux >  >> Linux

8 Contoh Perintah LDD di Linux

Ldd adalah utilitas baris perintah Linux yang digunakan jika pengguna ingin mengetahui dependensi perpustakaan bersama dari executable atau bahkan perpustakaan bersama. Anda mungkin telah memperhatikan banyak file yang dimulai dengan lib* di direktori /lib dan /usr/lib pada mesin Linux Anda. File-file ini disebut perpustakaan. Pustaka adalah kumpulan sumber daya seperti subrutin/fungsi, kelas, nilai, atau spesifikasi tipe.

Pustaka memungkinkan program untuk menggunakan rutinitas umum tanpa biaya administratif untuk memelihara kode sumbernya, atau biaya pemrosesan untuk mengompilasinya setiap kali program dikompilasi.

Ada dua jenis perpustakaan:

Perpustakaan statis: perpustakaan statis untuk program lengkap yang tidak bergantung pada perpustakaan eksternal untuk dijalankan. Fitur dari program yang ditautkan secara statis adalah bahwa mereka bekerja tanpa menginstal prasyarat apa pun. Pustaka statis diakhiri dengan *.a ekstensi dan pustaka ini disertakan (salinan terpisah) ke dalam program yang memerlukan fungsinya.

Perpustakaan dinamis: pustaka dinamis untuk program berukuran kecil, Pustaka ini diakhiri dengan .so ekstensi, Fitur lain menggunakan tautan dinamis ketika banyak program sedang berjalan, Ini dapat berbagi satu salinan perpustakaan daripada menempati memori dengan banyak salinan kode yang sama. Jadi program terbaru menggunakan tautan dinamis. Pada artikel ini, kita akan melalui perintah ldd yang digunakan untuk mengelola perpustakaan bersama.

Pustaka bersama

Ketika kita membuat sebuah program, kita membutuhkan banyak potongan kode yang telah ditulis orang lain untuk menjalankan fungsi rutin atau khusus untuk kita. Potongan kode ini disimpan di perpustakaan bersama. Untuk menggunakannya, kami menautkannya dengan kode kami, baik saat membuat program atau saat menjalankan program.

Sintaks &Opsi Perintah LDD

Perintah ldd mencetak dependensi objek bersama. Sintaks perintahnya adalah:

ldd [OPTION]... FILE...

Kita dapat menggunakan sakelar perintah ldd yang dapat dimasukkan ke dalam
[OPTION] tempat di perintah di atas:

  • -v :Cetak semua informasi.
  • -d :memproses relokasi data.
  • -r :memproses data dan relokasi fungsi.
  • -u :mencetak dependensi langsung yang tidak digunakan.

Harap perhatikan poin-poin berikut sebelum menjalankan perintah:

- File, ld-linux.so adalah linker atau loader dinamis yang memeriksa link atau cache library yang diinginkan untuk program yang diminta dan memuatnya.

- File cache, /etc/ld.so.cache berisi daftar pustaka yang ditemukan di direktori yang ditentukan di /etc/ld.so.conf. Ini membantu menyediakan penautan dinamis yang lebih cepat.

- File /etc/ld.so.conf menentukan direktori tempat mencari perpustakaan

1) Menampilkan dependensi perintah

Kami akan menampilkan dependensi perintah 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) Menampilkan dependensi perintah dengan detail

Kami akan menampilkan dependensi cp perintah dengan lebih detail menggunakan -v pilihan.

$ 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) Menampilkan dependensi langsung yang tidak digunakan dari perintah

Kami dapat menampilkan dependensi langsung yang tidak digunakan dari cp perintah menggunakan -u pilihan.

$ 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) Tampilan ldd hanya berfungsi pada executable dinamis

Kami akan menampilkan ldd hanya bekerja pada executable dinamis menggunakan -r pilihan.

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

Outputnya menampilkan pesan yang jelas menyatakan bahwa file yang disediakan bukan executable dinamis.

5) ldd dengan baris perintah standar yang dapat dieksekusi

Saat kami mencoba ldd pada baris perintah standar yang dapat dieksekusi seperti ls , Kami membutuhkan path lengkap ke executable dinamis.

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

Kami melihat bahwa ldd menyatakan bahwa ia tidak dapat menemukan 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)

Tetapi dengan jalur absolut, ldd bekerja dengan baik.

6) Mengetahui bahwa daemon yang dapat dieksekusi mendukung TCP Wrapper

Untuk menentukan apakah daemon yang dapat dieksekusi mendukung TCP Wrapper atau tidak, jalankan perintah berikut.

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

Outputnya menunjukkan bahwa daemon OpenSSH (sshd) mendukung TCP Wrapper.

7) ldd dengan ketergantungan yang hilang

Kita dapat menggunakan ldd perintah ketika executable gagal karena ketergantungan yang hilang. Setelah kami menemukan ketergantungan yang hilang, kami dapat menginstalnya atau memperbarui cache dengan ldconfig perintah.

$ 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)

Kami akan melakukan relokasi dan melaporkan objek yang hilang (khusus ELF) dengan mengetikkan perintah di bawah ini.

$ sudo ldd -d path/to/executable_file

Kami akan melakukan relokasi untuk objek dan fungsi data, dan melaporkan objek atau fungsi yang hilang (khusus ELF) dengan mengetikkan perintah di bawah ini.

$ sudo ldd -r path/to/executable_file

Kesalahan terkait perpustakaan bersama yang umum

1) Kesalahan perpustakaan tidak ada

Anda mungkin mengalami kesalahan pustaka yang hilang meskipun pustaka yang disebutkan tersedia di jalur instalasi baru “/opt/newinstall/lib”. Ini karena sistem tidak mengetahui direktori ini untuk memeriksa perpustakaan. Ini dapat diperbaiki dengan salah satu dari dua cara.

sebuah. Jalankan perintah berikut,

$ ldconfig -n /opt/newinstall/lib

b. Anda dapat melihat baris include berikut di file /etc/ld.so.conf:

sertakan ld.so.conf.d/*.conf

Jadi, buat file di folder /etc/ld.so.sonf.d, katakan newinstall.conf dengan konten berikut.

/opt/newinstall/lib

Kemudian, jalankan:

$ ldconfig

2) Kesalahan tautan dinamis, tidak dapat memetakan file cache

Ini mungkin karena file cache yang rusak. Ini dapat diatasi dengan membangun kembali file cache menggunakan ldconfig.

$ ldconfig

Perintah ldconfig

ldconfig membuat tautan dan cache yang diperlukan (untuk digunakan oleh run-time linker, ld.so) ke pustaka bersama terbaru yang ditemukan di direktori yang ditentukan pada baris perintah, di file/etc/ld.so.conf, dan di direktori terpercaya (/usr/lib dan /lib).

Misalnya:

Jalankan perintah berikut untuk menyiapkan tautan yang benar untuk binari bersama dan membangun kembali cache.

$ ldconfig –v

Jalankan perintah berikut setelah penginstalan pustaka bersama yang baru akan memperbarui tautan simbolik pustaka bersama dengan benar di /lib.

$ ldconfig -n /lib

Perintah berikut akan mencetak cache saat ini.

$ ldconfig -p

Kesimpulan

Dalam tutorial ini kita belajar cara menggunakan perintah ldd dan cara menggunakannya di baris perintah linux. Semoga Anda menikmati membaca tutorial ini dan mohon saran jika Anda memiliki saran.

Baca Juga:

  • 8 Perintah Tee Linux dengan Contoh
  • Cara Menggunakan Perintah Tr Linux dengan Contoh

Linux
  1. 7 Contoh Perintah Linux df

  2. Contoh Perintah rm di Linux

  3. Contoh Perintah ps di Linux

  1. sa Contoh Perintah di Linux

  2. w Contoh Perintah di Linux

  3. Contoh Perintah ac di Linux

  1. Perintah JQ di Linux dengan Contoh

  2. Contoh Perintah df di Linux

  3. du Contoh Perintah di Linux