"Keine solche Datei oder kein solches Verzeichnis" beim Ausführen eines crosskompilierten Programms auf einem Raspberry Pi

8

Ich habe kürzlich einen Raspberry Pi gekauft. Ich habe es bereits konfiguriert und installiere einen Cross-Compiler für Arm auf meinem Desktop (amd64). Ich habe ein einfaches "Hallo Welt" -Programm kompiliert und kopiere es dann von meinem Desktop auf meinen Pi mit scp ./hello [email protected]:~/hello. Nachdem ich mich in meinem Pi angemeldet habe, laufe ls -l helloich und erhalte eine normale Antwort:

-rwxr-xr-x 1 david david 6774 Nov 16 18:08 hello

Aber wenn ich versuche, es auszuführen, erhalte ich Folgendes:

david@raspberry-pi:~$ ./hello
-bash: ./hello: No such file or directory

david@raspberry-pi:~$ file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x6a926b4968b3e1a2118eeb6e656db3d21c73cf10, not stripped
david@raspberry-pi:~$ ldd hello 
    not a dynamic executable
David Martínez
quelle
Versuchen Sie file hellound veröffentlichen Sie ldd hellodie Ausgabe.
Goldlöckchen
Es ist das gleiche Problem wie "Keine solche Datei oder kein solches Verzeichnis" liegt auf den von Optware installierten Binärdateien - falsches ABI.
Gilles 'SO - hör auf böse zu sein'
Sie haben den falschen Cross-Compiler ausgewählt. Denken Sie daran, nur am Pi selbst zu arbeiten?
Thorbjørn Ravn Andersen

Antworten:

5

Wenn lddes sich um keine dynamische ausführbare Datei handelt, wurde sie für das falsche Ziel kompiliert.

Offensichtlich haben Sie es crosskompiliert, da filees sich um eine ausführbare 32-Bit-ARM-Datei handelt. Es gibt jedoch mehr als eine "ARM" -Architektur, sodass Ihre Toolchain möglicherweise falsch konfiguriert wurde.

Wenn Sie Crosstool-NG verwenden, überprüfen Sie .configden Wert von CT_ARCH_ARCH. Für den Himbeer-Pi sollte es "armv6j" 1 sein - oder zumindest funktioniert das für mich. Es gibt andere Besonderheiten, aber ich denke , das sollte ausreichen. Wenn es falsch ist, müssen Sie jetzt leider neu erstellen.

IMO kann es mühsam und frustrierend sein, eine Cross-Compiler-Toolchain zum Laufen zu bringen. Vorausgesetzt, der Host ist kein wesentlicher Faktor (sollte es nicht sein), kann dies in diesem Fall durchgeführt werden. Crosstool-ng verwendet einen TLI-Konfigurator. Wenn Sie also mehrere Builds ausprobieren müssen, notieren Sie sich jedes Mal Ihre Auswahl, damit Sie wissen, was funktioniert hat.

1 Ich glaube, armv7 ist ein viel häufigerer Bogen (viele Telefone und dergleichen). Wenn Sie also nur etwas verwenden, von dem Sie glauben, dass es ein generischer ARM-Cross-Compiler ist, ist dies wahrscheinlich das Problem. Diese Zahlen sind verwirrend, da z. B. der Prozessor des Pi ein ARM11 ist , aber (gemäß dieser Seite) die ARM11-Prozessorfamilie die ARMv6-Architektur verwendet - dh ARM11 ist eine Implementierung von ARMv6.

Goldlöckchen
quelle
1

Kompilieren Sie zuerst Ihr Programm mit --staticOption und testen Sie es dann. Wenn es als statisch funktioniert, dann auf Himbeer-Pi

cat "programname" | grep "lib*"
/lib/ld-linux.so.3
libc6.so 

Überprüfen Sie dann alle Bibliotheken, ob sie vorhanden sind

Ich habe so gelöst. Ich habe /lib/ld-linux-armhf-so.3aber /lib/ld-linux.so.3 dann nicht ln -szwischendurch für mich gearbeitet

hamza kılıç
quelle
1

Wie kann man das Problem identifizieren?

file cross_compiled_executable

Enthält so etwas wie:

interpreter /lib/ld-uClibc.so.0

und das Problem ist, dass diese Datei nicht auf dem Ziel vorhanden ist.

Wie löse ich das Problem?

Verwenden Sie entweder einen geeigneten Compiler:

  • Die Person, die das Disk-Image erstellt hat, muss Ihnen den Cross-Compiler zur Verfügung stellen oder Ihnen genau sagen, wie Sie es erstellen sollen, z. B. mit Crosstool-ng . Wie man es für RPI erhält, wurde hier gefragt .
  • Kompilieren Sie Ihr eigenes Image und Ihren Cross-Compiler, z . B. mit Buildroot . Hier ist ein allgemeines QEMU-Beispiel . Buildroot bietet RPI-Unterstützung .
  • Verwenden Sie einen nativen Compiler für das Ziel. Im Allgemeinen sind Ziele jedoch viel langsamer als Ihr Host und der Speicherplatz ist begrenzt. Daher möchten Sie dies wahrscheinlich nicht tun.

    Möglicherweise können Sie auch einen funktionalen Emulator wie QEMU zum Erstellen verwenden und die Programme dann nur auf einer langsameren Plattform ausführen, z. B. gem5 oder einem langsamen Board.

Es interpreterreicht möglicherweise nicht aus, nur das zu hacken , insbesondere müssen Sie die Binärkompatibilität zwischen dem Programm und der Zielbibliothek oder den Programm- und Kernel-Schnittstellen (Syscalls /procusw.) sicherstellen, wenn Sie versuchen, diese zu verwenden -static(der Zielkern ist möglicherweise zu alt und) nicht die erforderlichen Schnittstellen enthalten). Die einzige robuste Lösung ist die Verwendung der richtigen Toolchain.

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
quelle
0

Die Bibliotheken auf dem Zielsystem unterscheiden sich von denen des Hostsystems, auf dem Ihre ausführbare Datei kompiliert wurde.

Sie sollten die Option --static in Ihre CFLAGS und LDGLAGS aufnehmen, wenn Sie make verwenden. Wenn Sie gerade gcc verwenden, verwenden Sie die Option --static, damit die ausführbare Datei portabel ist.

Kevin Parker
quelle