Apakah file yang dilaporkan sebagai "tidak dapat dijalankan secara dinamis" oleh 'ldd' tergantung pada perpustakaan lain?

9

Hanya memastikan saya sudah benar - saya menelepon

ldd /path/to/executable

dan mengembalikan "bukan eksekusi dinamis". Ini berarti bahwa itu tidak bergantung pada perpustakaan lain, benar? Jika demikian, apakah ini berarti bahwa itu dapat ditransfer ke kotak Ubuntu lain tanpa khawatir tentang ketergantungan?

Jason
sumber

Jawaban:

3

Benar, tetapi ada sesuatu yang harus diperhitungkan.

Dari halaman lddmanual:

ldd tidak bekerja di pustaka bersama a.out.

ldd tidak bekerja dengan beberapa program a.out yang sangat tua yang dibangun sebelum dukungan ldd ditambahkan ke rilis kompiler. Jika Anda menggunakan ldd pada salah satu dari program ini, program akan mencoba berjalan dengan argc = 0 dan hasilnya tidak dapat diprediksi.

Eric Carvalho
sumber
3
Alasan lain bisa jadi biner dibangun untuk sistem 32-bit tetapi Anda memeriksanya pada sistem 64-bit.
Ferdinand Prantl
@FerdinandPrantl Jika dibangun untuk 32 bit, lddmasih mencetak dependensi 32bit.
Calmarius
@Calmarius itu tidak benar, ketika Anda tidak memiliki libgcc1 dasar 32-bit. Baru saja diverifikasi pada instalasi Ubuntu Server yang baru: Anda perlu menginstal libgcc1: i386 untuk membuat ldd senang untuk binari 32-bit.
Falstaff
1

@Calmarius benar, ini terjadi jika Anda mempertimbangkan exe 32bit, bahkan tanpa perpustakaan 32bit dasar.

Saya mencoba untuk memutakhirkan sistem saya (instalasi baru Ubuntu 16.04, dari 12.04), saya harus menginstal layanan 32bit lama yang menguntungkan avserver,, yang memerlukan ia32-libs(tidak lagi tersedia). Ini berarti keduanya dpkgdan apt-gettidak bahagia (apa pun yang saya lakukan, itu meminta saya untuk apt-get -f install, dan jika saya menjalankannya, itu menegaskan saya menghapus paket layanan), dan layanan saya tidak akan mulai.

Untuk membuktikan bahwa ini adalah hilangnya 32bit libraries, saya telah menginstal sistem lama saya (Ubuntu 12.04, with ia32-libsdan 32bit libraries) /sda2. Memastikan /opt(berisi biner 32bit saya) sudah terpasang /sda2/opt, saya bisa chroot /sda2dan lddkemudian berjalan sebagaimana dimaksud.

Untuk memperbaikinya, saya bisa menginstal semua paket pustaka dependen secara manual dengan: i386 (arch). Namun saya memutuskan daripada mencoba mencari tahu apa dependensi saya, saya memasang anggur (yang sebagian besar 32bit, dan menginstal perpustakaan dasar dan memuat lebih banyak yang tidak saya perlukan, tapi saya setuju dengan itu).

Untuk memperbaiki dpkgdan apt-get, saya mengedit /var/lib/dpkg/status, menemukan paket untuk layanan saya, dan menghapus ia32-libs. Sekarang dpkgdan apt-getbahagia

Itu dilakukan, ldddengan senang hati melaporkan: - root@withnail:/opt/<service path># ldd avserver linux-gate.so.1 => (0xf77a6000) libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf778f000) libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7772000) libuuid.so.1 => /lib/i386-linux-gnu/libuuid.so.1 (0xf776b000) libresolv.so.2 => /lib/i386-linux-gnu/libresolv.so.2 (0xf7752000) libcrypt.so.1 => /lib/i386-linux-gnu/libcrypt.so.1 (0xf7720000) libktssl.so.1.0.0 => /opt/<service path>/libktssl.so.1.0.0 (0xf76cb000) libktcrypto.so.1.0.0 => /opt/<service path>/libktcrypto.so.1.0.0 (0xf756b000) libktz.so.1 => /opt/<service path>/libktz.so.1 (0xf7558000) librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xf754f000) libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xf73d8000) libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7383000) libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7366000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71af000) /lib/ld-linux.so.2 (0x565b1000)

sibaz
sumber
Memasang anggur adalah trik yang sangat cerdik untuk mendapatkan semua perpustakaan 32 bit yang Anda butuhkan !!
psitae