ARM, x86 et PowerPC dans une même app’ ?

En lisant un forum, je suis tombé sur un sujet qui demandait s’il était possible de générer un binaire universel compatible avec les puces Intel (x86), les PowerPC et les puces ARM. La réponse est oui, et il est même possible d’avoir bien plus que ça.

Le principe est assez ancien, il date de NeXTSTEP, et si Apple a mis le concept en avant lors de la transition du PowerPC vers le x86, il y avait déjà des binaires universels dans l’OS nettement avant. C’était notamment nécessaire pour la prise en charge correcte des Power Mac G5, par exemple, avec des binaires spécifiques pour le code 64 bits. L’application Echecs sous Leopard, par exemple, contient des binaires pour quatre architectures : x86 (32 bits), x86 (64 bits), PowerPC (32 bits) et PowerPC (64 bits).

Cette page sur le site de TenFourFox donne une liste possible d’architectures, et il en manque plusieurs. Il n’y a pas ppc, pour les Power PC 32 bits génériques, et ppc64 pour le 64 bits générique) ni les ARM64.

On a donc : ppc (32 bits), ppc750 (le G3), ppc7400 et ppc7450 (G4), ppc970 (G5), i386 (x86 32 bits), x86_64 (x86 64 bits), x86_64h (à partir d’Haswell, pour certaines instructions). Dans les architectures ARM possibles, il y a armv4t et armv5 (honnêtement, je ne sais pas à quoi ils correspondent, même le premier iPhone est ARMv6), armv6 et armv6m (notamment pour l’ARM11 du premier iPhone), armv7, armv7em, armv7k, armv7s et armv7m (en gros, les puces des iPhone jusqu’à l’A6), arm64 et arm64e (pour les Apple Silicon). Vu l’héritage de macOS, on peut aussi probablement créer des binaires pour les 680×0, les PA-RISC, les SPARC, l’i960 et même les Motorola 88000, mais ça va être un peu plus compliqué à tester.

En l’état, on peut trouver assez facilement des applications universelles qui fonctionnent sur trois ou quatre architectures. XLD, par exemple, est compatible x86 (32 bits), x86 (64 bits), PowerPC (32 bits) et ARM (64 bits). Et il y a un projet d’une application sur GitHub qui contient les binaires pour huit architectures (PowerPC 7400 et 7450, x86 32 bits, x86 64 bits et Haswell, ARMv7 (iOS) et ARM64. Le programme doit être lancé manuellement (j’ai dû le rendre exécutable et je n’ai pas pu le lancer sur mon Mac mini M1) et affiche juste « Hello from… une architecture », c’est vraiment juste de la démonstration.

XLD gère quatre architectures


Beaucoup d’architectures

En pratique, le choix de XLD semble le plus pragmatique : il permet de couvrir tous les PowerPC (le 64 bits est quand même largement inutile sur les Mac de cette génération), les premiers Intel, les derniers Intel et les Mac Apple Silicon.