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 hello
ich 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
compiling
executable
raspberry-pi
arm
David Martínez
quelle
quelle
file hello
und veröffentlichen Sieldd hello
die Ausgabe.Antworten:
Wenn
ldd
es sich um keine dynamische ausführbare Datei handelt, wurde sie für das falsche Ziel kompiliert.Offensichtlich haben Sie es crosskompiliert, da
file
es 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
.config
den Wert vonCT_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.
quelle
Kompilieren Sie zuerst Ihr Programm mit
--static
Option und testen Sie es dann. Wenn es als statisch funktioniert, dann auf Himbeer-PiÜberprüfen Sie dann alle Bibliotheken, ob sie vorhanden sind
Ich habe so gelöst. Ich habe
/lib/ld-linux-armhf-so.3
aber/lib/ld-linux.so.3
dann nichtln -s
zwischendurch für mich gearbeitetquelle
Wie kann man das Problem identifizieren?
Enthält so etwas wie:
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:
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
interpreter
reicht 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/proc
usw.) 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.quelle
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.
quelle