LDD memberi tahu saya bahwa aplikasi saya “tidak dapat dieksekusi secara dinamis”

17

Saya memiliki aplikasi 32-bit (disebut uclsyn) yang saya terima dari seorang profesor astronomi. Saya berhasil menjalankannya pada CentOS setahun yang lalu, tetapi sekarang ketika saya sedang menyiapkan CentOS VM baru, itu tidak akan berjalan dan saya tidak bisa mencari tahu mengapa. Itu terus datang kembali dengan "Dibunuh".

Ini adalah pertukaran pada baris perintah:

$ ./uclsyn_linux
Killed

$ ldd ./uclsyn_linux
not a dynamic executable

$ file ./uclsyn_linux
uclsyn_linux: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

Pada mesin yang dijalankan, "ldd ./uclsyn_linux" mengembalikan seluruh daftar dependensi. Saya telah menemukan paket-paket yang menyediakan pustaka bersama ini, dan semuanya tampaknya diinstal.

Paket diperlukan

  • libSM-1.1.0-7.1.el6.i686
  • libX11-1.3-2.el6.i686
  • libgcc-4.4.6-3.el6.i386
  • glibc-2.12-1.47.el6_2.9.i686
  • libuuid-2.17.2-12.4.el6.i686
  • libXau-1.0.5-1.el6.i686
  • Ada juga tumpukan perpustakaan lokal ke aplikasi yang telah saya periksa dan sudah diinstal.

Lingkungan saya

CentOS berjalan di bawah VirtualBox

uname -a: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP Kamis 21 Feb 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux

Carl
sumber
1
tebakan liar: Anda mencoba menjalankan biner 32-bit pada OS 64-bit tanpa pustaka 32-bit diinstal.
michas
Ini adalah biner 32-bit, tetapi OS yang saya instal adalah versi 32-bit dari CentOS. Setidaknya itu yang dikatakan perintah uname-a ya?
Carl
3
@Carl Karena penasaran, apa artinya strace ./uclsynkeluaran? Itu mungkin memberi kita petunjuk tentang apa yang hilang terlebih dahulu.
lgeorget
@lgeorget, Ia mengembalikan: execve ("./ uclsyn_linux", ["./uclsyn_linux"], [/ * 56 vars * /] <belum selesai ...> +++ dibunuh oleh SIGKILL +++
Carl
@ Carl Ok, jadi itu bahkan tidak pergi ke titik di mana ia mencoba memuat beberapa pustaka. Saya belum pernah mencoba sebelumnya ke straceprogram yang tidak terhubung dengan benar.
lgeorget

Jawaban:

13

Saya baru saja mengalami masalah dengan biner 32-bit, solusinya adalah:

apt-get install gcc-multilib

$ uname -a
Linux bla 2.6.32-028stab094.3 #1 SMP Thu Sep 22 12:47:37 MSD 2011 x86_64 GNU/Linux
lama12345
sumber
3
bagaimana Anda menemukan bahwa lib itu hilang?
yehudah
1
Solusi ini berhasil untuk saya. +1
FractalSpace
@ Yahhudahs Saya sudah menjalankan banyak aplikasi 32bit yang sudah dikompilasi di Linux untuk waktu yang cukup lama plus Rekayasa Baliknya, jadi saya mengumpulkan beberapa pengalaman pemecahan masalah. : D
lama12345
1
bagus ini bekerja untuk saya dan saya menggaruk-garuk kepala apa yang saya lakukan salah
Marvin Effing
1
Juga berfungsi untuk saya: ldd tidak menemukan sesuatu sedangkan ini berfungsi ^^
jy95
8

Kesalahan di sini adalah karena tidak memiliki cukup RAM pada VirtualMachine. Menjalankan strace ./programnamemenunjukkan bahwa program sedang dimatikan tepat ketika mulai berjalan, sebelum memuat salah satu perpustakaan. Meningkatkan jumlah RAM yang tersedia memastikan bahwa program dapat bekerja.

Respons yang berguna

Ada beberapa tanggapan yang bermanfaat dari yang lain yaitu @slm yang memberikan perintah yang berguna untuk memeriksa bahwa masing-masing perpustakaan ada, dan @lororget yang menyarankan mencoba straceperintah.

Carl
sumber
5

Bisakah Anda memposting beberapa perpustakaan yang terhubung (dari sistem asli)? Anda mungkin hanya perlu menginstal beberapa perpustakaan yang hilang.

Biasanya pada sistem CentOS itu hanya masalah menjalankan perintah yum seperti:

yum install <package name>

Anda dapat bekerja mundur dari sistem aslinya seperti:

$ ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fff519ff000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00000034e8e00000)
    librt.so.1 => /lib64/librt.so.1 (0x00000034e8a00000)
    libcap.so.2 => /lib64/libcap.so.2 (0x0000003d6fe00000)
    libacl.so.1 => /lib64/libacl.so.1 (0x00000034fae00000)
    libc.so.6 => /lib64/libc.so.6 (0x00000034e7200000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00000034e7a00000)
    /lib64/ld-linux-x86-64.so.2 (0x00000034e6e00000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00000034e7e00000)
    libattr.so.1 => /lib64/libattr.so.1 (0x00000034f7600000)

Dalam hasil tersebut, Anda dapat melihat di mana salinan saya /bin/lsmengambil pustaka .so misalnya librt.so.1, yang kebetulan berada di sini:/lib64/librt.so.1 .

Mengetahui hal ini, pada sistem asli, Anda dapat menjalankan perintah ini untuk mencari tahu paket apa yang menyediakan pustaka ini:

$ rpm -qf /lib64/librt.so.1
glibc-2.13-2.x86_64

Jadi paketnya disebut glibc-2.13-2.x86_64. Jadi untuk menginstalnya Anda akan melakukan ini:

$ sudo yum install glibc-2.13-2.x86_64
slm
sumber
Terima kasih banyak atas bantuannya. Saya semakin maju. Telah memperbarui pertanyaan saya dengan lebih banyak info sekarang, jika Anda ingin memperbarui respons Anda dengan hal yang sama, itu akan sangat dihargai. :)
Carl
Apakah Anda yum install <package>paket-paket yang Anda rujuk dalam pertanyaan Anda?
slm
Ya saya lakukan. Mereka semua terinstal kecuali untuk libuuid.i686 yang sekarang, tapi saya masih memiliki masalah yang sama.
Carl
2

Jawabannya ada di pertanyaan Anda: Anda mencoba menjalankan aplikasi yang dikompilasi untuk GNU / Linux satu tahun yang lalu dan Anda mencoba menjalankannya dengan perpustakaan baru, yang mungkin tidak kompatibel atau tidak tersedia lagi.

Pada titik ini, Anda memiliki dua pilihan. Jika Anda dapat mengkompilasi ulang (yang saya ragu, jika saya memahami dengan baik kasus Anda), itu akan berjalan karena akan dihubungkan kembali dengan perpustakaan yang kompatibel. Kalau tidak, Anda bisa mencoba membangun semacam kotak pasir, sebuah VM yang berjalan dengan versi lama pustaka GNU misalnya, untuk menjalankan aplikasi.

lororget
sumber
1
Ini tidak benar. Program ini terhubung secara statis, tidak ada perpustakaan di sistem host yang akan dirujuk. Walaupun ABI mungkin masih menyebabkan ketidakcocokan, kemungkinan kecil antara kernel Linux minor (dengan asumsi arsitektur yang sama).
ckhan
1
Ini tidak terhubung secara statis, lihat output dari file. Dan pesan-pesan seperti No package xyz foundmenyarankan bahwa perpustakaan yang dibutuhkan tidak lagi tersedia (setidaknya, tidak seperti itu, dalam paket yang sama). Itu sebabnya saya menyarankan untuk membangun kembali program, jika mungkin, atau menjalankannya dalam sistem yang dikenal berfungsi, dengan perpustakaan lama.
lgeorget
Sayangnya kompilasi ulang bukan pilihan di sini. Saya menjalankannya di sistem lain dengan cara yang sama dengan yang saya coba di sini, tetapi untuk beberapa alasan, kali ini tidak menyukainya.
Carl
Ini salah. Mengganti alamat tidak masalah sama sekali. Fungsi dihapus atau jeda ABI lainnya terjadi di revisi utama perpustakaan (yang jarang terjadi), dalam hal ini, Anda akan mendapatkan kesalahan memuat libfoo2 jika Anda tidak menginstal libfoo2, baik Anda menginstal libfoo2 atau tidak.
psusi
Baiklah senang mengetahuinya. Saya pikir setiap perubahan di perpustakaan dapat memutus tautan. Saya saat ini menjalankan gentoo dan saya sering harus mengkompilasi ulang dependensi terbalik ketika saya memutakhirkan perpustakaan, jadi saya tidak berpikir menautkan itu sangat tahan terhadap perubahan perpustakaan.
lgeorget
0

coba readelf -l uclsyn_linux Meminta juru bahasa program akan memberi tahu Anda apa yang Anda lewatkan.

netawater
sumber
1
Saya berlari readelf -l <file>melawan file dengan lddperilaku yang sama ( not a dynamic executable), tapi saya tidak melihat apa-apa segera menunjukkan pustaka yang hilang. Saya melihat Elf file type is EXEC (Executable file), Entry point, Program Headersdan Section to Segment mapping. Apa sebenarnya yang harus saya cari dalam output?
StockB
0

Di Arch Linux , jika file tersebut berukuran 32-bit elf, Anda dapat menginstal lib32-gcc-libs (dari repositori multilib) untuk menyelesaikan masalah.

Seekor hiu
sumber