Oui c'est possible, mais peu utile. Avant d'en arriver pourquoi, voici comment créer un:
Prenez ce fichier C:
#ifdef __LP64__
int main(void)
#else
int derp(void)
#endif
{
return 123;
}
Compile comme un exécutable 64 bits et une bibliothèque partagée 32 bits:
gcc -o t t.c -Wall
gcc -m32 -o t.dylib -Wall t.c -shared
Et les écraser ensemble:
lipo -create -output t.fat t t.dylib
maintenant, pourquoi est-ce censé ne pas être utile? Parce que vous êtes limité à un binaire par architecture et que vous n'avez que peu ou pas de contrôle sur la tranche utilisée.
En théorie, vous pouvez avoir des tranches pour toutes ces architectures dans le même binaire gras:
- i386
- x86_64
- x86_64h
- ARMv6
- armv6m
- ARMv7
- armv7s
- armv7k
- armv7m
- arm64
Vous pourrait briser un exécutable, un dylib, un agent de liaison et une extension du noyau en un binaire gras, mais vous auriez du mal à obtenir quelque chose d'utile en sortir .
Le plus gros problème est que l'OS choisit quelle tranche charger. Pour les exécutables, ce sera toujours la correspondance la plus proche pour le processeur que vous utilisez. Pour les dylibs, dylinkers et kexts, il sera d'abord déterminé si le processus dans lequel ils vont être chargés est de 32 ou 64 bits, mais une fois cette distinction faite, là aussi vous obtiendrez la tranche la plus proche de celle de votre CPU. capacités.
J'imagine que sur Mac OS X 10.5, vous auriez pu avoir un binaire 64 bits avec un kext 32 bits qu'il pourrait essayer de charger. Cependant, en dehors de cela, je ne peux pas penser à un cas d'utilisation pour cela.