Есть ли gcc для x86 и ARM
Что проверяют
Понимаете ли вы разницу между архитектурой, на которой собирают, и архитектурой, под которую собирают. Для QA это разговор про тестирование сборок под несколько платформ, и следом спрашивают, как вы проверяли ARM-сборку на x86-машине.
Как отвечать
Короткий ответ: да. GCC поддерживает десятки архитектур, среди них x86 (32 и 64 бита), 32-битный ARM, AArch64, RISC-V. Важная деталь: одна установленная сборка gcc генерирует код под одну целевую архитектуру. Для другой нужен кросс-компилятор с целевым триплетом в имени:
- нативный: на x86_64 Linux ставится
build-essentialв Debian и Ubuntu, на ARM-машине (Raspberry Pi, сервер на Graviton) тот жеgccсобирает под ARM; - кросс под Linux на ARM: пакеты
gcc-aarch64-linux-gnuдля 64 бит иgcc-arm-linux-gnueabihfдля 32 бит с аппаратной плавающей точкой, вызовaarch64-linux-gnu-gcc main.c -o app; - без ОС, микроконтроллеры:
arm-none-eabi-gcc; - Clang для сравнения: один бинарник умеет несколько целей через
--target. На macOS командаgccпо умолчанию вообще вызывает Apple Clang.
Что полезно сказать как тестировщику:
- проверка артефакта:
file appилиreadelf -h appпокажет, под какую архитектуру он собран; - запуск без железа: QEMU в user-mode (
qemu-aarch64) или Docker с--platform linux/arm64через binfmt; - где ждать отличий:
charна ARM Linux по умолчанию беззнаковый, на x86 знаковый; модель памяти ARM слабее, и гонки, скрытые на x86, начинают проявляться; выравнивание и неопределённое поведение, которое на одной платформе «работало».
Если с кросс-сборкой вы не сталкивались, так и скажите и опишите план: матрица сборок в CI и прогон тестов под эмуляцией.
Где спотыкаются
Думают, что один gcc соберёт под любую архитектуру флагом. -march выбирает поколение процессора внутри той же архитектуры, а не меняет x86 на ARM.
Путают gnueabi и gnueabihf. Бинарник с другим ABI плавающей точки не найдёт на плате свой загрузчик и библиотеки и не запустится.
Считают, что прогон под QEMU заменяет железо. Эмуляция медленнее и не повторяет тайминги и периферию, поэтому финальная проверка всё равно на устройстве.