Beim Ausführen einer 32-Bit-Binärdatei auf einem 64-Bit-System wird die Meldung "Nicht gefunden" angezeigt

70

Ich habe momentan ein seltsames Problem mit Debian (wheezy / amd64).

Ich habe eine Chroot erstellt, um einen Server zu installieren (ich kann dazu leider keine näheren Angaben machen). Nennen wir seinen Weg /chr_path/. Um die Sache zu vereinfachen, habe ich diese Chroot mit einem Debootstrap (auch wheezy / amd64) initialisiert.

Alles schien in der Chroot gut zu funktionieren, aber als ich das Installationsskript meines Servers startete, bekam ich: zsh: Not found /some_path/perl(das Installationsprogramm enthält aus verschiedenen Gründen eine Perl-Binärdatei)

Natürlich habe ich den /some_path/Speicherort überprüft und die Perl-Binärdatei gefunden. filein der Chroot-Umgebung gibt zurück:

/some_path/perl ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.2.5, not stripped

Die Datei existiert, scheint in Ordnung zu sein, hat die richtigen Rechte. Ich kann verwenden file, ls, vimauf, aber sobald ich versuche , ihn auszuführen - ./perlzum Beispiel - ich: zsh: Not found ./perl.

Diese Situation ist für mich durchaus verständlich. Außerdem :

  • Ich kann andere grundlegende Binärdateien (/ bin / ls, ...) in der Chroot ausführen, ohne Fehler zu bekommen
  • Ich habe die gleichen Probleme mit anderen Binärdateien, die mit dem Projekt geliefert wurden
  • Wenn ich versuche, die Binärdatei von der Hauptwurzel ( /chr_path/some_path/perl) auszuführen , funktioniert es.
  • Ich habe versucht, eine der Binärdateien mit einer Kopie von meinem zu platzieren ls. Ich habe überprüft, ob die Zugriffsrechte gleich sind, aber das hat nichts geändert (einer hat funktioniert, der andere nicht)
Elenaher
quelle
1
Dies ist das gleiche Problem wie "Keine solche Datei oder kein solches Verzeichnis" auf den von Optware installierten Binärdateien . Beachten Sie, dass Ihr Perl eine 32-Bit-Programmdatei ist. Ihnen fehlt das 32-Bit-Laufzeitsystem ( libc6-i386Paket oder ia32-libswenn Sie viele Bibliotheken benötigen).
Gilles
@ Gilles: Vielen Dank! Eine aptitude-Installation von ia32-libs hat das Problem gelöst !! Ich hatte gesehen, dass das Perl 32 Bit war, aber da es auf dem Hauptsystem (dieselbe Distribution) funktionierte, hatte ich gerade angenommen, dass es nicht verbunden war. Eigentlich muss ich irgendwann das 32-Bit-Laufzeitsystem auf dem Hauptsystem installiert haben.
Elenaher
1
@ Gilles: Ich denke, ich würde das als kurze Antwort hinzufügen, anstatt dies als doppelte Frage zu markieren. Die Umgebung ist so unterschiedlich, dass suchende Personen trotz des gleichen Problems eher das eine oder andere treffen.
Caleb
1
@Caleb Wir löschen keine Duplikate aus genau diesem Grund. Sucher, die diesen finden, folgen einfach dem doppelten Link zum anderen Beitrag. Wenn dies dasselbe Problem ist, sollte es wahrscheinlich einfach geschlossen werden
Michael Mrozek
@MichaelMrozek Ich habe meine Meinung zu dieser Frage geändert: Obwohl das zugrunde liegende Problem dasselbe ist, ist die konkrete Abhilfe etwas anders (in einem Fall werden keine ARM-ABIs gemischt, wodurch die 32-Bit-Unterstützung auf einer amd64-Linux-Distribution in der anderen aktiviert wird). . Ich denke also, diese Frage ist doch offen.
Gilles

Antworten:

72

Wenn Sie eine Datei, die von einem „Loader“ abhängt, nicht ausführen können, bezieht sich der Fehler möglicherweise auf den Loader und nicht auf die Datei, die Sie ausführen.

  • Das Ladeprogramm einer dynamisch verknüpften nativen ausführbaren Datei ist der Teil des Systems, der für das Laden dynamischer Bibliotheken verantwortlich ist. Es ist so etwas wie /lib/ld.sooder /lib/ld-linux.so.2und sollte eine ausführbare Datei sein.
  • Der Loader eines Skripts ist das in der shebang-Zeile erwähnte Programm, z. B. /bin/shfür ein Skript, das mit beginnt #!/bin/sh. (Bash und zsh geben in diesem Fall anstelle von "Befehl nicht gefunden" die Meldung "Schlechter Interpreter" aus.)

Die Fehlermeldung ist eher irreführend, da sie nicht darauf hinweist, dass der Loader das Problem ist. Dies zu beheben wäre leider schwierig, da die Kernel-Oberfläche nur Platz für die Meldung eines numerischen Fehlercodes bietet und nicht für die Angabe, dass der Fehler tatsächlich eine andere Datei betrifft. Einige Shells erledigen die Arbeit selbst für Skripte (Lesen der #!Zeile im Skript und erneutes Ausarbeiten der Fehlerbedingung), aber keine, die ich je gesehen habe, versucht habe, dasselbe für native Binärdateien zu tun.

lddfunktioniert auch nicht auf den Binärdateien, da einige spezielle Umgebungsvariablen festgelegt und das Programm dann ausgeführt werden, sodass der Loader die Arbeit erledigt. straceIch würde auch keine aussagekräftigen Informationen bereitstellen, da nicht mehr berichtet wird, als der Kernel meldet, und wie wir gesehen haben, kann der Kernel nicht alles berichten, was er weiß.

Diese Situation tritt häufig auf, wenn Sie versuchen, eine Binärdatei für das richtige System (oder die richtige Systemfamilie) und die Superarchitektur, aber die falsche Unterarchitektur auszuführen. Hier haben Sie ELF-Binärdateien auf einem System, das ELF-Binärdateien erwartet, sodass der Kernel sie problemlos lädt. Es handelt sich um i386-Binärdateien, die auf einem x86_64-Prozessor ausgeführt werden. Die Anweisungen sind also sinnvoll und bringen das Programm an den Punkt, an dem es nach seinem Loader suchen kann. Das Programm ist jedoch ein 32-Bit-Programm (wie die fileAusgabe anzeigt) und sucht nach dem 32-Bit-Loader /lib/ld-linux.so.2. Vermutlich haben Sie nur den 64-Bit-Loader /lib64/ld-linux-x86-64.so.2in der Chroot installiert .

Sie müssen das 32-Bit-Laufzeitsystem in der Chroot installieren: den Loader und alle Bibliotheken, die die Programme benötigen. Wenn Sie ab Debian Wheezy sowohl i386- als auch x86_64-Unterstützung wünschen, starten Sie mit einer amd64-Installation und aktivieren Sie die Multiarch- Unterstützung: Führen Sie dpkg --add-architecture i386dann apt-get updateund apt-get install libc6:i386 zlib1g:i386 …(wenn Sie eine Liste der Abhängigkeiten des Perl-Pakets von Debian generieren möchten, sehen Sie, welche Bibliotheken wahrscheinlich sind benötigt werden, können Sie verwenden aptitude search -F %p '~Rdepends:^perl$ ~ri386'). Sie können eine Sammlung allgemeiner Bibliotheken ia32-libsabrufen, indem Sie das Paket installieren (Sie müssen zuerst die Multiarch-Unterstützung aktivieren). Auf Debian amd64 bis hin zu Wheezy ist der 32-Bit-Loader im libc6-i386Paket enthalten. Durch die Installation können Sie einen größeren Satz von 32-Bit-Bibliotheken installieren ia32-libs.

Gilles
quelle
Ist dies das einzige, was die Fehlermeldung auslösen kann? Ich habe die 32-Bit-Bibliotheken installiert und hier ist die Ausgabe von,ldd aber ich bekomme immer noch den gleichen Fehler.
Nathan Osman
1
@ NathanOsman Wahrscheinlich unix.stackexchange.com/questions/76490/…
Gilles
Ich habe versucht zu installieren, lsb-coreaber das schien nicht zu helfen. Ich denke, ich öffne besser eine neue Frage dafür.
Nathan Osman
Vielen Dank dafür, Sie haben gerade zwei Tage mit dem Kopfkratzen geendet. Ich dachte, alles würde statisch kompiliert, aber das war es nicht!
Finn O'leary
5

Führen Sie ldd(1)Ihre perlBinärdatei aus. Oft liegt der scheinbar verwirrende Not foundFehler in einer Datei darin, dass eine der vom Programm verwendeten gemeinsam genutzten Bibliotheken nicht gefunden wird.

Daher ist Ihre Chroot möglicherweise unvollständig in Bezug auf die gemeinsam genutzten Bibliotheken, die Ihre Binärdateien benötigen.

camh
quelle
Eigentlich bekomme ich: perl is not a dynamic executablewenn ich in der Chroot bin und von außen die korrekte Liste der Abhängigkeiten bekomme. Ich überprüfe gerade, ob es etwas Seltsames gibt, aber ich habe einen Debootstrap verwendet, um diese Art von Mangel zu vermeiden, und habe bereits viele Libs (es gibt eine ausführbare Perl-Datei im Chroot-System, die gut läuft, aber es ist eine andere Version; vielleicht mache ich nur einige symbolischer Link?)
Elenaher
Um ehrlich zu sein, hätte ich erwartet, dass Debootstrap eine vollständige Chroot erzeugt, daher würde ich nicht erwarten, dass meine Antwort in dieser Hinsicht korrekt ist. Aber ich bin vorher auf die fehlende Bibliothek in Chroot gestoßen, also dachte ich, ich würde sehen, ob meine Antwort fliegt.
18.05.11
vgl. Kommentar zu Gilles am Hauptposting: Du hattest recht. Es fehlten einige Bibliotheken. Der Hauptvorteil von Debootstrap ist, dass ich das Problem mit einer einfachen Installation von Aptitude lösen kann :)
Elenaher