Привет, мир кросс-скомпилированный для ARM работает как на x86_64, так и на ARM - PullRequest
1 голос
/ 01 мая 2020

Я готовил демонстрацию пользовательского режима Qemu (пакет qemu-user) qemu-arm. Для этого я использовал простую программу hello world C hello.c:

#include <stdio.h>

int main()
{
        printf("Oi, Qemu!\nPrograma C aqui!\n");
}

Для кросс-компиляции (статически связанная) я использовал кросс-цепочку инструментов из gcc-arm-linux-gnueabihf:

$ arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (Ubuntu 9.3.0-10ubuntu1) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ arm-linux-gnueabihf-gcc hello.c -o hello_c_static -static

Выход работает как на qemu-arm, Beaglebone Black , так и на P C.

Как это возможно?!

РЕДАКТИРОВАТЬ

О скомпилированном исполняемом файле:

file hello_c_static 
hello_c_static: ELF 32-bit LSB executable, ARM, EABI5 version 1
(GNU/Linux), statically linked,
BuildID[sha1]=6a33aaa5abb9a14fbc0ca4f2e7b432d6fa5d7067, for GNU/Linux 3.2.0,
not stripped

1 Ответ

4 голосов
/ 01 мая 2020

Проверьте ls -l /proc/sys/fs/binfmt_misc/, чтобы увидеть, настроена ли ваша система x86 для прозрачного запуска qemu для двоичных файлов ARM, точно так же, как это может быть для запуска WIINE на Windows исполняемых файлах или любых других, использующих Linux binfmt_mis c , https://en.wikipedia.org/wiki/Binfmt_misc

Руководство администратора https://www.kernel.org/doc/Documentation/admin-guide/binfmt-misc.rst


Программа установки для пакета qemu-user могла зарегистрировать исполняемые форматы, которые он поддерживает.

Без регистров binfmts, у вас просто будут register и status «файлы». В моей системе загрузочные скрипты WINE и Mono имеют зарегистрированные обработчики, поэтому я также вижу файлы CLR и DOSWin. например,

$ cat /proc/sys/fs/binfmt_misc/DOSWin 
enabled
interpreter /usr/bin/wine
flags: 
offset 0
magic 4d5a

Если есть какой-то другой механизм, попробуйте использовать strace ./some_arm_program, чтобы увидеть, какие системные вызовы происходят при его выполнении.

Возможно, также приостановить его во время его работы ( control-z) и посмотрите на /proc/$(pidof some_arm_program)/maps и другие файлы.

(Этот последний раздел был написан после того, как OP прокомментировал, что они видели только файлы register и status, но не qemu-arm, но они с тех пор меняю свой комментарий. Похоже, что binfmt-support - это ответ.)

...