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. file
in 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
, vim
auf, aber sobald ich versuche , ihn auszuführen - ./perl
zum 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)
quelle
libc6-i386
Paket oderia32-libs
wenn Sie viele Bibliotheken benötigen).Antworten:
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.
/lib/ld.so
oder/lib/ld-linux.so.2
und sollte eine ausführbare Datei sein./bin/sh
fü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.ldd
funktioniert auch nicht auf den Binärdateien, da einige spezielle Umgebungsvariablen festgelegt und das Programm dann ausgeführt werden, sodass der Loader die Arbeit erledigt.strace
Ich 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
file
Ausgabe 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.2
in 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 i386
dannapt-get update
undapt-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 verwendenaptitude search -F %p '~Rdepends:^perl$ ~ri386'
). Sie können eine Sammlung allgemeiner Bibliothekenia32-libs
abrufen, 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 imlibc6-i386
Paket enthalten. Durch die Installation können Sie einen größeren Satz von 32-Bit-Bibliotheken installierenia32-libs
.quelle
ldd
aber ich bekomme immer noch den gleichen Fehler.lsb-core
aber das schien nicht zu helfen. Ich denke, ich öffne besser eine neue Frage dafür.Führen Sie
ldd(1)
Ihreperl
Binärdatei aus. Oft liegt der scheinbar verwirrendeNot found
Fehler 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.
quelle
perl is not a dynamic executable
wenn 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?)