Может ли один компилятор компилировать под несколько архитектур
Что проверяют
Понимаете ли вы, что такое целевая архитектура и кросс-компиляция, и видите ли, как это касается тестирования. Для QA вопрос обычно продолжается так: чем сборка под arm64 может отличаться от сборки под x86_64 и как это проверить.
Как отвечать
Может, но у разных инструментов это устроено по-разному:
- Clang/LLVM: кросс-компилятор по устройству. Один бинарник
clangгенерирует код под все бэкенды, с которыми собран, цель задаётся флагом--target=aarch64-linux-gnu. Для полной сборки ещё нужны библиотеки и линкер под цель; - GCC: одна установка обычно собирает под одну архитектуру, для ARM ставят отдельный тулчейн вроде
aarch64-linux-gnu-gcc. Флаг-marchвыбирает поколение процессора внутри архитектуры, например-march=x86-64-v3, и не переключает x86 на ARM; - Go и Rust:
GOOS=linux GOARCH=arm64 go buildиcargo build --target aarch64-unknown-linux-gnu; - JVM и .NET: компилируют в байт-код, машинный код под процессор делает JIT на месте;
- мультиархитектурные артефакты: universal binary на macOS,
.soпод несколько ABI в Android-приложении, образ изdocker buildx build --platform linux/amd64,linux/arm64.
Для тестировщика главное: один исходник на разных архитектурах ведёт себя не всегда одинаково.
- память: у ARM более слабая модель упорядочивания, и гонки, незаметные на x86, начинают проявляться;
- типы:
charна ARM под Linux беззнаковый, на x86 знаковый; - эмуляция: Rosetta на Mac или QEMU в Docker прячут часть проблем и искажают замеры производительности.
Поэтому в матрицу включают реальное железо под каждую архитектуру, а архитектуру артефакта проверяют командой file или docker image inspect.
Где спотыкаются
Повторяют, что GCC переключается на ARM флагом -march. Это ошибка, и её замечают сразу.
Путают кросс-компиляцию с переносимостью. Компилятор соберёт бинарник под ARM, но код с ассемблерными вставками или зависимостью от порядка байтов может работать неправильно.
Тестируют только под эмуляцией и переносят выводы на реальное устройство. Заодно стоит узнавать в лицо exec format error: так падает запуск образа не той архитектуры.