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
strace ./uclsyn
keluaran? Itu mungkin memberi kita petunjuk tentang apa yang hilang terlebih dahulu.strace
program yang tidak terhubung dengan benar.Jawaban:
Saya baru saja mengalami masalah dengan biner 32-bit, solusinya adalah:
apt-get install gcc-multilib
sumber
Kesalahan di sini adalah karena tidak memiliki cukup RAM pada VirtualMachine. Menjalankan
strace ./programname
menunjukkan 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
strace
perintah.sumber
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:
Anda dapat bekerja mundur dari sistem aslinya seperti:
Dalam hasil tersebut, Anda dapat melihat di mana salinan saya
/bin/ls
mengambil pustaka .so misalnyalibrt.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:
Jadi paketnya disebut
glibc-2.13-2.x86_64
. Jadi untuk menginstalnya Anda akan melakukan ini:sumber
yum install <package>
paket-paket yang Anda rujuk dalam pertanyaan Anda?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.
sumber
file
. Dan pesan-pesan sepertiNo package xyz found
menyarankan 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.coba
readelf -l uclsyn_linux
Meminta juru bahasa program akan memberi tahu Anda apa yang Anda lewatkan.sumber
readelf -l <file>
melawan file denganldd
perilaku yang sama (not a dynamic executable
), tapi saya tidak melihat apa-apa segera menunjukkan pustaka yang hilang. Saya melihatElf file type is EXEC (Executable file)
,Entry point
,Program Headers
danSection to Segment mapping
. Apa sebenarnya yang harus saya cari dalam output?Di Arch Linux , jika file tersebut berukuran 32-bit elf, Anda dapat menginstal lib32-gcc-libs (dari repositori multilib) untuk menyelesaikan masalah.
sumber