2016-06-19 2 views
4

Я использую контейнер 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! 

Есть ли какие-либо объяснения для этого?

+3

Возможно, кто-то сконфигурировал [binfmt_misc] (https://en.m.wikipedia.org/wiki/Binfmt_misc) для вас и установил его так, чтобы исполняемые файлы выполняли qemu. –

+0

Спасибо, binfmt_misc действительно механизм, который позволяет эту магию. Я отвечу на этот вопрос. –

ответ

8

В ядре Linux есть механизм с именем binfmt_misc, который позволяет связывать произвольные интерпретаторы с исполняемыми файлами с использованием последовательности байтов магии или определенного расширения файла. Интерпретаторы регистрируются с использованием интерфейса файловой системы /proc/sys/fs/binfmt_misc/.

На Fedora служба регистрации переводчика несет ответственность за услугу systemd-binfmt. Он считывает набор файлов конфигурации из каталога /usr/lib/binfmt.d и выполняет необходимые записи в sysfs. В контексте вышеуказанного вопроса установка комплекта эмуляторов qemu поместит соответствующие файлы регистрации в этот каталог. В случае архитектуры ARM, этот файл называется qemu-arm и имеет следующее содержание:

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

Это позволяет прозрачно выполнять статически ARM исполняемых файлов на Linux. Спасибо Марку Плотнику за указание этого механизма.

Смежные вопросы