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