2016-07-10 25 views
1

Ich mache nur meine ersten Schritte mit Buildroot und Raspberry Pi (mit Raspbian). Aber irgendwie scheint ich mit der Cross-Compilation etwas falsch zu machen. Die Anwendung ist ein einfachste Hallo Welt Programm in C geschrieben Dies ist, was ich getan habe:Cross-kompilierte Anwendung läuft nicht auf Raspberry Pi

  1. heruntergeladen und installiert buildroot
  2. make raspberrypi2_defconfig
  3. make toolchain

Dann habe ich die kleine Anwendung geschrieben und das folgende Makefile:

CROSS_BIN := /home/me/raspi/buildroot-2016.05/output/host/usr/bin 
SYSROOT := /home/me/raspi/buildroot-2016.05/output/host/usr/arm-buildroot-linux-uclibcgnueabihf/sysroot 
PATH := $(CROSS_BIN):$(PATH) 

CC := arm-linux-gcc 
CFLAGS := --sysroot=$(SYSROOT) 

app: app.c 
    $(CC) $(CFLAGS) -o [email protected] $< 

kompiliert die App und kopierte es auf die Himbeere. Als ich versuchte, es auszuführen, beschwert sich RPI, dass es die Datei nicht finden kann (obwohl es dort und ausführbare Datei sicher ist). Die binäre Art scheint mir in Ordnung und sollte an die CPU passen:

[email protected]:~ $ ./app 
-bash: ./app: No such file or directory 

[email protected]:~ $ ls -l app 
-rwxr-xr-x 1 pi pi 4916 Jul 10 11:07 app 

[email protected]:~ $ file app 
app: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, not stripped 

[email protected]:~ $ lscpu 
Architecture:   armv7l 
Byte Order:   Little Endian 
CPU(s):    4 
On-line CPU(s) list: 0-3 
Thread(s) per core: 1 
Core(s) per socket: 4 
Socket(s):    1 
Model name:   ARMv7 Processor rev 5 (v7l) 
CPU max MHz:   900.0000 
CPU min MHz:   600.0000 

Kann mir jemand sagen, was ich falsch mache? Wenn ich die App nativ kompiliere und auf dem Entwicklungshost ausführe, läuft sie problemlos.

+1

Probieren Sie 'ldd./App' und' readelf -l ./app | grep interpreter' aus und überprüfen Sie, ob der erforderliche Programminterpreter auf Ihrem Ri OS vorhanden ist. – osgx

+0

Sehr nützliche Befehle, danke für den Hinweis. Wie Ishay vermutete, fehlt uClibc: '[Requesting interpreter: /lib/ld-uClibc.so.0]' –

+0

Danke @sawdust. Das war die Lösung, es funktioniert gut mit 'glibc'. Nach all den anderen Hinweisen habe ich das selbst herausgefunden - nur noch nicht gepostet. –

Antwort

1

Als ich versuchte, es zu laufen, klagt RPI, dass es die Datei nicht finden kann (obwohl es da ist und ausführbare Datei für sicher).

Die Schale beschwert, dass es nicht um eine Datei, um das Programm auszuführen, nicht finden, nicht, dass es nicht die Dateien finden können.
Wenn es installiert ist, verwenden Sie den Befehl strace, um festzustellen, welche Datei nicht gefunden werden kann.
Höchstwahrscheinlich haben Sie eine dynamische Bibliotheksproblem, z. Sie haben mit einer uClibc-Toolchain gebaut, aber Ihr Rootfilesystem hat glibc.

Zwei gemeinsame Lösungen:

(A) bauen Ihr Programm mit statischen Linken (so dass sie nicht mehr von den installierten Bibliotheken des Zielsystems).

(B) Erstellen Sie die Buildroot-Toolchain neu, damit sie der Bibliothek entspricht, die bereits auf Ihrem RPi installiert ist. d.h.Erstellen Sie statt einer uClibc-Toolchain eine Glibc-Toolchain mit passender Versionsnummer.

4

Mein Geld ist auf /lib/ld-uClibc.so.0 fehlt von Ihrem Rasperry Pi. Habe ich recht?

Okay, diese Bibliothek ist Ihr dynamischer Loader, sie ist verantwortlich für das Laden Ihrer dynamischen Bibliotheken zur Laufzeit. Es lädt die erforderlichen gemeinsam genutzten Bibliotheken in den Prozessadressraum und legt die entsprechenden Berechtigungen für den Speicher fest (schreibgeschützt, schreibgeschützt und ausführbar).

Ihr Cross-Compiler benötigt einen Loader, der nicht existiert, wahrscheinlich aufgrund eines Fehlers zwischen dem installierten Image auf dem RPi und der Cross-Compilierungs-Umgebung (sysroot).

Es gibt mehrere Möglichkeiten, um es zu beheben, beginnen wir mit der Untersuchung einer funktionierenden Binärdatei, versuchen Sie file /bin/ls und veröffentlichen Sie den dynamischen Lader hier.

Zum Beispiel:

$ file /bin/ls 
/bin/ls: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=5e052e8de057d379ab51d4af510ad9318fe77b46, stripped 
+0

100% richtig, vielen Dank. Nun, was ist die "beste Vorgehensweise" bei der Installation dieser Bibliothek? Ich fand es kompiliert in output/build/uclibc-1.0.14/lib und ich könnte einfach alle Dateien, die scheinbar benötigt werden, auf die Platine kopieren. Aber ich denke, es gibt einen besseren Weg? Bietet Buildroot etwas? –

+0

Kopieren Sie nichts, das Problem ist der falsche Lader, ich führe Sie durch –

+0

Danke für Ihre Mühe. Wie in einem anderen Kommentar geschrieben, habe ich es funktioniert, indem ich "uClibc" in "glibc" geändert habe. –