Я использую контейнер Docker (thewtex/cross-compiler-linux-armv7
), чтобы перекрестно скомпилировать простую программу «Hello World» для Linux пользователя C в системе Fedora 23 x86_64
. Целевая система - это встроенная система ARMv7 (в частности, E-Reader Kobo Aura HD с встроенной прошивкой).ARM Linux исполняемый загадочно работает на x86_64
Исходный код программы (hello_world.c
) заключается в следующем
#include <stdio.h>
int main(int argc, char *argv[]) {
printf("Hello World!\n");
return 0;
}
я вызвать компилятор, используя следующий набор команд
docker run thewtex/cross-compiler-linux-armv7 > ./dockcross.sh
chmod +x dockcross.sh
По некоторым причинам сгенерированный сценарий оболочки багги, я вручную должен заменить /cross-compiler-base/cross-compiler-linux-armv7/
и /:build/:build:z/
в dockcross.sh
. Теперь я бегу
./dockcross.sh arm-linux-gnueabihf-cc hello_world.c -static -o hello
file
возвращает следующую информацию о полученной hello
исполняемому
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
Неожиданно оказалось, что я могу выполнить полученный исполняемый файл на хост-системе:
[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!
, а также на целевом устройстве
[[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!
Есть ли какие-либо объяснения для этого?
Возможно, кто-то сконфигурировал [binfmt_misc] (https://en.m.wikipedia.org/wiki/Binfmt_misc) для вас и установил его так, чтобы исполняемые файлы выполняли qemu. –
Спасибо, binfmt_misc действительно механизм, который позволяет эту магию. Я отвечу на этот вопрос. –