Tipicamente lo stesso compilatore eseguito su piattaforme diverse (es. ARM e Intel) compila codice nativo per il processore su cui gira (nell'esempio ARM e Intel), perchè quando viene portato lo si predispone così.
I compilatori usualmente supportano (compilano) per default per la versione X di una certa famiglia di processori, lo stesso su cui girano; usando switch a riga di comando si può far sì che il codice sia eseguibile su CPU con determinate estensioni (64 bit, multimedia, oggi crittografia etc).
Per quanto ne so il compilatore più "jolly" è il mitico Gnu-C (gcc) che è stato portato su (praticamente) qualsiasi cosa, spesso in associazione con Linux e i suoi vari cugini (Unix, Aix e così via).
Nulla vieta (ma sono più rari,cross compiler) di far predisporre da un processore Intel un codice oggetto per ARM (si usano principalmente per preparare programmi per sistemi embedded).
Nel mondo desktop oggi esistono relativamente poche famiglie di CPU, con al primissimo posto Intel x86 ed evoluzioni, ARM e poche altre (IBM Power, qualche vestigia MIPS, qualche Itanium, ma sono ormai quasi spariti).