Как получается, что программа с кодом arm-none-eabi-gcc работает на машине x86?

Многие вопросы на этом форуме начинаются с "почему мой код не запускается..." Для разнообразия этот вопрос: "почему мой код запускается..."

Я разрабатываю Ubuntu 18.04 как виртуальную машину на ноутбуке (windows x86). Следующая программа, скомпилированная и связанная с gcc, работает нормально и отображает 64-битный адрес.

char *s = "Hello\n"; printf ("Hello at address: %p\n", s);

Я предполагаю, что arm-none-eabi нацелен на голый металл системы. Конечно, я не пытаюсь запустить вышеуказанную программу на "голом железе". Но я пытаюсь понять, как работает кросс-компиляция.

Та же программа, скомпилированная и связанная с arm-none-eabi-gcc (установленная из Ubuntu), указывает на множество отсутствующих ссылок (_exit ... и т. Д.) - нормально. Созданный код - это язык ассемблера ARM, я проверил его с помощью arm-none-eabi-objdump.

Добавление параметра --specs=nosys.specs во время загрузки устраняет недостающие ссылки - как и ожидалось. Когда я запускаю его в Ubuntu, QEMU вызывается автоматически и имеет ошибку сегментации. Я не удивлен ошибкой сегментации, но автоматический запуск QEMU оказался неожиданным.

Изменение параметра на --spec=rdimon.specs также устраняет недостающие ссылки - как и ожидалось. Но несмотря на то, что созданный код сборки - это arm, он работает на Ubuntu (x86). Отображаемый адрес составляет 32 бита.

Я знаю, что rdimon.specs относится к полу-хостингу, но я думал, что это активируется только тогда, когда программа работает на целевом компьютере (процессоре руки) и взаимодействует с хостом, на котором запущен gdb. Видимо я ошибаюсь.

Извините за эту длинную преамбулу... простой вопрос: как получилось, что мой код руки работает на x86?

1 ответ

Это результат работы механизма binfmt. Когда qemu установлен, он регистрируется для запуска неродных исполняемых файлов и прозрачно вызывается при выполнении неродного ELF. Когда полухостинг включен с использованием спецификаций rdimon, он связывает подходящий набор заглушек libc, которые взаимодействуют со средой хоста.

Другие вопросы по тегам