2016-06-19 17 views
4

Ich benutze einen Docker-Container (thewtex/cross-compiler-linux-armv7), um eine einfache "Hello World" Linux-User-Space-C-Programm auf einem Fedora 23 x86_64 System zu kompilieren. Das Zielsystem ist ein ARMv7-Embedded-System (insbesondere ein Kobo Aura HD E-Reader mit Bestandsfirmware).ARM Linux ausführbare Datei läuft auf x86_64

Der Quellcode des Programms (hello_world.c) ist wie

#include <stdio.h> 

int main(int argc, char *argv[]) { 
    printf("Hello World!\n"); 
    return 0; 
} 

folgt I den Compiler mit dem folgenden Satz von Befehlen

docker run thewtex/cross-compiler-linux-armv7 > ./dockcross.sh 
chmod +x dockcross.sh 

aus irgendeinem Grund die erzeugte Shell-Skript ist aufzurufen Buggy, muss ich manuell /cross-compiler-base/cross-compiler-linux-armv7/ und /:build/:build:z/ in dockcross.sh ersetzen. Jetzt laufe ich

./dockcross.sh arm-linux-gnueabihf-cc hello_world.c -static -o hello 

file gibt die folgenden Informationen über die resultierenden hello ausführbare

hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=317a9ea164931f614b24e98dec743050e2d7f900, not stripped 

Unerwarteterweise kann ich die ausführbare Datei auf dem Host-System ausführen:

[email protected]:~/tmp/test$ uname -a && ./hello 
Linux andreas-pc 4.5.5-201.fc23.x86_64 #1 SMP Sat May 21 15:29:49 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux 
Hello World! 

sowie auf dem Zielgerät

[[email protected](none) onboard]# uname -a && ./hello 
Linux (none) 2.6.35.3-850-gbc67621+ #1038 PREEMPT Thu Apr 25 15:48:22 CST 2013 armv7l GNU/Linux 
Hello World! 

Gibt es eine Erklärung dafür?

+3

Möglicherweise jemand konfiguriert [binfmt_misc] (https://en.m.wikipedia.org/wiki/Binfmt_misc) für Sie und legte es so fest, dass arm ausführbare Programme qemu ausführen. –

+0

Danke, binfmt_misc ist in der Tat der Mechanismus, der diese Magie ermöglicht. Ich werde eine Antwort auf diese Frage schreiben. –

Antwort

8

Im Linux-Kernel gibt es einen Mechanismus namens binfmt_misc, der es erlaubt, beliebigen Executables beliebige Interpreter zuzuordnen, die eine magische Bytefolge oder eine bestimmte Dateierweiterung verwenden. Interpreter werden über die Dateisystemschnittstelle /proc/sys/fs/binfmt_misc/ registriert.

Auf Fedora ist der Dienst systemd-binfmt für die Interpreterregistrierung zuständig. Es liest eine Reihe von Konfigurationsdateien aus dem Verzeichnis /usr/lib/binfmt.d und führt die erforderlichen Schreibvorgänge für die sysfs aus. Im Zusammenhang mit der obigen Frage wird die Installation der Emulator-Suite qemu die entsprechenden Registrierungsdateien in diesem Verzeichnis ablegen. Im Fall der ARM-Architektur wird diese Datei qemu-arm und hat folgenden Inhalt genannt:

enabled 
interpreter /usr/bin/qemu-arm 
flags: 
offset 0 
magic 7f454c4601010100000000000000000002002800 
mask ffffffffffffff00fffffffffffffffffeffffff 

Dies ermöglicht transparent statisch gelinkte ARM ausführbare Dateien unter Linux auszuführen. Danke an Mark Plotnick, dass er diesen Mechanismus gezeigt hat.

Verwandte Themen