Mam 32-bitową aplikację (o nazwie uclsyn) otrzymaną od profesora astronomii. Udało mi się uruchomić go w CentOS rok temu, ale teraz, kiedy konfiguruję nową maszynę Wirtualną CentOS, nie będzie działać i nie wiem, dlaczego. Ciągle powraca z „Killed”.
Oto wymiana w wierszu poleceń:
$ ./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
Na komputerze, na którym działa, „ldd ./uclsyn_linux” zwraca całą listę zależności. Znalazłem pakiety, które udostępniają te współdzielone biblioteki i wszystkie wydają się być zainstalowane.
Wymagane pakiety
- 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
- Istnieje również mnóstwo bibliotek lokalnych dla aplikacji, które sprawdziłem i są już zainstalowane.
Moje środowisko
CentOS działa pod VirtualBox
uname -a
: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP czw. 21 lutego 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux
strace ./uclsyn
? To może dać nam podpowiedź na temat tego, czego najpierw brakuje.strace
program nie był poprawnie połączony.Odpowiedzi:
Właśnie miałem problem z 32-bitowym plikiem binarnym, rozwiązaniem było:
apt-get install gcc-multilib
źródło
Błąd tutaj wynikał z braku wystarczającej ilości pamięci RAM w VirtualMachine. Uruchomienie
strace ./programname
wskazywało, że program został zabity w momencie, gdy zaczął działać, przed załadowaniem dowolnej biblioteki. Zwiększenie ilości dostępnej pamięci RAM zapewniło działanie programu.Przydatne odpowiedzi
Odpowiedzi udzielili inni, a mianowicie @slm, który dostarczył przydatne polecenia, aby sprawdzić, czy każda z bibliotek istnieje, oraz @lgeorget, który sugeruje wypróbowanie
strace
polecenia.źródło
Czy możesz opublikować niektóre biblioteki, do których prowadzi łącze (z oryginalnego systemu)? Może być konieczne zainstalowanie niektórych brakujących bibliotek.
Zwykle w systemie CentOS wystarczy uruchomić polecenie yum, takie jak:
Możesz pracować wstecz od oryginalnego systemu w następujący sposób:
W tej produkcji można zobaczyć, gdzie moja kopia
/bin/ls
jest podniesienie współdzielone biblioteki .so na przykład powiedzmylibrt.so.1
, co dzieje się znaleźć tutaj:/lib64/librt.so.1
.Wiedząc o tym, w oryginalnym systemie, możesz uruchomić to polecenie, aby dowiedzieć się, jaki pakiet udostępnia tę bibliotekę:
Tak więc pakiet się nazywa
glibc-2.13-2.x86_64
. Aby go zainstalować, wykonaj następujące czynności:źródło
yum install <package>
te pakiety, o których wspomniałeś w swoim pytaniu?Odpowiedź jest na twoje pytanie: próbujesz uruchomić aplikację, która została skompilowana dla GNU / Linux rok temu i próbujesz uruchomić ją z nowymi bibliotekami, które mogą już nie być kompatybilne lub dostępne.
W tym momencie masz dwie możliwości. Jeśli możesz go ponownie skompilować (co wątpię, jeśli dobrze rozumiem twój przypadek), uruchomi się, ponieważ zostanie ponownie połączony z kompatybilnymi bibliotekami. W przeciwnym razie możesz spróbować zbudować rodzaj piaskownicy, maszyny wirtualnej działającej na przykład ze starą wersją bibliotek GNU, aby uruchomić aplikację.
źródło
file
. A takie komunikatyNo package xyz found
sugerują, że potrzebne biblioteki nie są już dostępne (przynajmniej nie tak, jak były w tych samych pakietach). Dlatego sugeruję przebudowanie programu, jeśli jest to możliwe, lub uruchomienie go w systemie, w którym działał, ze starymi bibliotekami.Spróbuj
readelf -l uclsyn_linux
Prośba o interpretację programu powie ci, czego brakuje.źródło
readelf -l <file>
plik o tym samymldd
zachowaniu (not a dynamic executable
), ale nie widzę niczego od razu wskazującego brakującą bibliotekę. WidzęElf file type is EXEC (Executable file)
,Entry point
,Program Headers
iSection to Segment mapping
. Czego dokładnie powinienem szukać w wynikach?W Arch Linux , jeśli plik jest 32-bitowym elfem, możesz zainstalować lib32-gcc-libs (z repozytorium multilib), aby rozwiązać problem.
źródło