Как получается, что программа с кодом 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, которые взаимодействуют со средой хоста.