Ich habe eine 32-Bit-Anwendung (Uclsyn), die ich von einem Astronomieprofessor erhalten habe. Ich habe es vor einem Jahr geschafft, es auf CentOS zum Laufen zu bringen, aber jetzt, wenn ich eine neue CentOS-VM einrichte, läuft es nicht und ich kann nicht herausfinden, warum. Es kommt immer wieder mit "Killed".
Dies ist der Austausch in der Befehlszeile:
$ ./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
Auf dem Computer, auf dem ausgeführt wird, gibt "ldd ./uclsyn_linux" eine ganze Liste von Abhängigkeiten zurück. Ich habe die Pakete gefunden, die diese gemeinsam genutzten Bibliotheken enthalten, und alle scheinen installiert zu sein.
Pakete erforderlich
- 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
- Es gibt auch einen Haufen lokaler Bibliotheken für die Anwendung, die ich überprüft habe und die bereits installiert sind.
Meine Umgebung
CentOS läuft unter VirtualBox
uname -a
: Linux localhost.localdomain 2.6.32-358.el6.i686 # 1 SMP Do 21. Februar 12:50:49 UTC 2013 i686 i686 i386 GNU / Linux
strace ./uclsyn
Ausgabe? Das kann uns einen Hinweis darauf geben, was zuerst fehlt.strace
ein Programm nicht richtig verknüpft.Antworten:
Ich hatte gerade das Problem mit einer 32-Bit-Binärdatei. Die Lösung war:
apt-get install gcc-multilib
quelle
Der Fehler war darauf zurückzuführen, dass nicht genügend RAM auf der VirtualMachine vorhanden war. Wird ausgeführt
strace ./programname
bedeutet, dass das Programm gerade beendet wurde, als es gestartet wurde, bevor eine der Bibliotheken geladen wurde. Durch Erhöhen des verfügbaren Arbeitsspeichers konnte sichergestellt werden, dass das Programm funktioniert.Nützliche Antworten
Es gab einige nützliche Antworten von anderen, nämlich von @slm, der nützliche Befehle zur Überprüfung der Existenz der einzelnen Bibliotheken zur Verfügung stellte, und von @lgeorget, der den Versuch des
strace
Befehls vorschlug .quelle
Können Sie einige der Bibliotheken veröffentlichen, auf die der Link verweist (vom ursprünglichen System)? Möglicherweise müssen Sie nur einige fehlende Bibliotheken installieren.
In der Regel muss auf einem CentOS-System nur ein yum-Befehl wie folgt ausgeführt werden:
Sie können vom ursprünglichen System aus wie folgt rückwärts arbeiten:
In diesem Ausgang können Sie sehen , wo meine Kopie
/bin/ls
wird die gemeinsamen .so Bibliotheken für beispielsweise, Aufnehmenlibrt.so.1
, die hier angesiedelt werden , geschieht:/lib64/librt.so.1
.Wenn Sie dies wissen, können Sie auf dem ursprünglichen System diesen Befehl ausführen, um herauszufinden, welches Paket diese Bibliothek enthält:
Also heißt das Paket
glibc-2.13-2.x86_64
. Um es zu installieren, machen Sie folgendes:quelle
yum install <package>
die Pakete, auf die Sie in Ihrer Frage verwiesen haben?Die Antwort liegt in Ihrer Frage: Sie versuchen, eine Anwendung auszuführen, die vor einem Jahr für GNU / Linux kompiliert wurde, und Sie versuchen, sie mit neuen Bibliotheken auszuführen, die möglicherweise nicht kompatibel oder nicht mehr verfügbar sind.
Zu diesem Zeitpunkt haben Sie zwei Möglichkeiten. Wenn Sie es erneut kompilieren können (was ich bezweifle, wenn ich Ihren Fall gut verstehe), wird es ausgeführt, da es mit kompatiblen Bibliotheken neu verknüpft wird. Andernfalls könnten Sie versuchen, eine Art Sandbox zu erstellen, z. B. eine VM, die mit einer alten Version der GNU-Bibliotheken ausgeführt wird, um die Anwendung auszuführen.
quelle
file
. Und Meldungen wieNo package xyz found
deuten darauf hin, dass die benötigten Bibliotheken nicht mehr verfügbar sind (zumindest nicht so, wie sie waren, in denselben Paketen). Aus diesem Grund empfehle ich, das Programm neu zu erstellen, falls dies möglich ist, oder es in einem System mit alten Bibliotheken auszuführen, von dem bekannt war, dass es funktioniert.versuchen ,
readelf -l uclsyn_linux
Programm - Interpreter anfordern wird Ihnen sagen , was Sie fehlt.quelle
readelf -l <file>
eine Datei mit dem gleichenldd
Verhalten gestoßen (not a dynamic executable
), sehe aber nichts, was auf eine fehlende Bibliothek hinweist. Ich seheElf file type is EXEC (Executable file)
,Entry point
,Program Headers
undSection to Segment mapping
. Worauf sollte ich bei der Ausgabe genau achten?Wenn die Datei in Arch Linux 32-Bit-Elf ist, können Sie lib32-gcc-libs (aus dem Multilib-Repository) installieren , um das Problem zu beheben.
quelle