Se você quiser apenas compilar programas que rodam sozinhos em um processador (sistema “bare-metal”), então tudo o que importa é ter um compilador que produza instruções para aquele processador em particular. “Para ARM” é quase suficiente informação, mas não completamente: você também precisaria especificar a versão do conjunto de instruções. Atualmente, a maioria dos processadores ARM são baseados na mesma versão (ARMv7), mas mesmo dentro há muitas complicações - alguns recursos (por exemplo, ponto flutuante, instruções vetoriais) são opcionais e você precisa especificar se deseja usá-los, e o ARMv7 tem dois conjuntos de instruções (“normal” ARM e Thumb). A maioria das distribuições do GCC para ARM target ARMv7 com recursos opcionais e Thumb habilitado pelas opções.
Se você quiser compilar programas que interajam com outros programas, todos os programas envolvidos precisarão se comunicar. Fazer chamadas de sistema e, mais ainda, fazer chamadas de biblioteca requer que o chamador e o receptor concordem com a representação binária de dados (por exemplo, endianness) e como passar dados (que se registra para usar argumentos de função, como as chamadas de função afetam a pilha, etc.). A especificação de como isso funciona é chamada de ABI (interface binária do aplicativo) .
A convenção geral de nomenclatura para compiladores cruzados do GCC é CPU-VENDOR-SYSTEM-gcc
(onde a parte antes de -gcc
corresponde ao tipo de sistema de configure
), mas há algum fuzz sobre a parte VENDOR-SYSTEM
. Os compiladores cruzados para o ARM geralmente são chamados de arm-VENDOR-OS-LIBC-ABI-gcc
com algumas das partes omitidas. Por exemplo, arm-acme-linux-gnu-gnueabi-gcc
seria o GCC para ARM (v7 por padrão), para a distribuição do Linux do ACME, definido para vincular-se ao Glibc, usando o ABI gnueabi. arm-linux-gnu-gcc
indica um conjunto de compiladores para se ligar ao Glibc no Linux, com uma ABI não especificada. arm-linux-gcc
não especifica qual libc é segmentada.