GNU/Linux >> LINUX-Kenntnisse >  >> Linux

„Keine solche Datei oder Verzeichnis“ liegt auf den von Optware installierten Binärdateien?

Ich verwende Optware seit einiger Zeit, um Pakete auf meinem ARM-basierten NAS zu installieren – die üblichen Sachen wie Transmission, Samba und andere. Allerdings hatte ich kurz nach dem Start Probleme damit, dass Transmission hängen blieb. Ich sah mich eine Weile nach einer Lösung um und stellte schließlich fest, dass der von mir verwendete Optware-Feed nicht der war, der für meine NAS-Box eingerichtet war. Ich habe die Feeds gewechselt und alle Pakete neu installiert, aber jetzt erhalte ich die folgende Fehlermeldung, wenn ich versuche, etwas auszuführen, das neu installiert wurde:

$ smbd
-bash: /opt/sbin/smbd: No such file or directory
$ transmission-daemon
-bash: /opt/bin/transmission-daemon: No such file or directory
$ unrar
-bash: /opt/bin/unrar: No such file or directory

Ich habe /opt/bin überprüft und /opt/sbin und die ausführbaren Dateien sind definitiv vorhanden – was ist also das eigentliche Problem?

$ ldd /opt/bin/transmission-daemon
/usr/bin/ldd: line 116: /opt/bin/transmission-daemon: No such file or directory

$ file /opt/bin/transmission-daemon
/opt/bin/transmission-daemon: ELF 32-bit LSB executable, ARM, version 1, dynamically linked (uses shared libs), stripped

$ readelf - l /opt/sbin/smbd
readelf: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory

$ cat /proc/$$/maps
…
40084000-4019e000 r-xp 00000000 09:01 112594 /lib/libc-2.7.so
…

Ich bin mir nicht sicher, was das alles bedeutet, aber es beweist, dass die Datei ist da, oder? Oder hat das etwas mit den Shared Libs zu tun?

Akzeptierte Antwort:

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

  • Der Lader 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.so oder /lib/ld-linux.so.2 , und sollte eine ausführbare Datei sein.
  • Der Lader eines Skripts ist das Programm, das in der Shebang-Zeile erwähnt wird, z. /bin/sh für ein Skript, das mit #!/bin/sh beginnt .

Die Fehlermeldung ist ziemlich irreführend, da sie nicht anzeigt, dass der Loader das Problem ist. Leider wäre es schwierig, dies zu beheben, da die Kernel-Schnittstelle nur Platz zum Melden eines numerischen Fehlercodes hat, nicht aber auch zum Anzeigen, dass der Fehler tatsächlich eine andere Datei betrifft. Einige Shells erledigen die Arbeit für Skripte selbst (Lesen der #! Zeile im Skript und Überarbeitung der Fehlerbedingung), aber keiner, den ich gesehen habe, hat versucht, dasselbe für native Binärdateien zu tun.

ldd arbeitet auch nicht an den Binärdateien, weil es funktioniert, indem es einige spezielle Umgebungsvariablen setzt und dann das Programm ausführt und den Loader die Arbeit erledigen lässt. strace würde auch keine aussagekräftigen Informationen liefern, da es nicht mehr melden würde, als der Kernel meldet, und wie wir gesehen haben, kann der Kernel nicht alles melden, was er weiß.

Hier Ihre neu installierten ausführbaren Dateien (smbd , transmission-daemon , usw.) fordern einen Loader an, der auf Ihrem System nicht vorhanden ist. Ihr neuer Feed ist also auch nicht für Ihr System geeignet.

Siehe auch:Linux – Lüfterdrehzahl per Fancontrol nach Festplattentemperatur (Hddtemp) anpassen?

Diese Situation tritt häufig auf, wenn Sie versuchen, eine Binärdatei für das richtige System (oder die richtige Systemfamilie) und Superarchitektur, aber die falsche Subarchitektur auszuführen. Hier haben Sie ELF-Binärdateien auf einem System, das ELF-Binärdateien erwartet, sodass der Kernel sie problemlos lädt. Sie sind ARM-Binärdateien, die auf einem ARM-Prozessor ausgeführt werden, daher sind die Anweisungen sinnvoll und bringen das Programm an den Punkt, an dem es nach seinem Ladeprogramm suchen kann. Aber es ist der falsche Lader.

Jetzt komme ich in Vermutungen, aber ich vermute, dass Ihr neuer Feed für den falschen ARM ABI ist. Die ABI ist die gemeinsame Sprache zum Durchführen von Aufrufen zwischen Prozeduren und insbesondere zum Aufrufen von Bibliotheksfunktionen. Bei einigen Prozessorarchitekturen gibt es mehrere mögliche ABI-Optionen, und Sie müssen eine auswählen und konsequent verwenden. Es gibt zwei ARM-ABIs mit Linux-Distributionen:das traditionelle arm-elf ABI und das neuere EABI (arm-eabi ). Sie können ABIs nicht auf demselben System mischen, daher müssen Sie eine Paketquelle für Ihre ABI finden (oder Ihr System für eine andere ABI neu installieren).


Linux
  1. Python – Keine solche Datei oder Verzeichnis, aber ich kann es sehen!?

  2. Mkdir:Verzeichnis kann nicht erstellt werden:Keine solche Datei oder Verzeichnis?

  3. Lassen Sie Ls Skripte von Binärdateien in der Ausgabe unterscheiden?

  4. Konfigurationsbefehl kann nicht ausgeführt werden:„keine solche Datei oder kein solches Verzeichnis“?

  5. Kann Datei auf Ntfs-Partition nicht entfernen, Ereignis als Root?

Ich versuche, den Move-Befehl (mv) zu verwenden, aber ich erhalte „keine solche Datei oder kein solches Verzeichnis“?

Eine Datei mit dem Namen „() –“ kann nicht „rm“ werden. Wegen „kein solches File oder Verzeichnis“?

Zeigen Sie tabellarische Dateien wie CSV über die Befehlszeile an

'SDL.h no such file or directory found' beim Kompilieren

Bash:Keine solche Datei oder Verzeichnis?

sys/types.h:Keine solche Datei oder Verzeichnis