jeudi 17 janvier 2008

Les fat binaries sous Mac OS X: la commande lipo

Dans un post précédent je vous expliquais comment créer des "fat binaries" sous Mac OS X.

Je pars de mon petit programme hello.c. Il suffit en bref d'exécuter gcc avec certains paramètres:
[pierre@albert] /Users/pierre/Documents/source>gcc -arch i386 -arch ppc -arch ppc64 -o hello hello.c
La commande file nous indique bien qu'il y a trois exécutables dans ce fichier Mach-O:
[pierre@albert] /Users/pierre/Documents/source>file hello
hello: Mach-O universal binary with 3 architectures
hello (for architecture i386): Mach-O executable i386
hello (for architecture ppc7400): Mach-O executable ppc
hello (for architecture ppc64): Mach-O 64-bit executable ppc64
La commande otool -f nous est aussi utile, elle nous indique le "magic number" des "fat binaries":
[pierre@albert] 18:56 /Users/pierre/Documents/source>otool -f hello
Fat headers
fat_magic 0xcafebabe
nfat_arch 3
architecture 0
cputype 7
cpusubtype 3
capabilities 0x0
offset 4096
size 12588
align 2^12 (4096)
architecture 1
cputype 18
cpusubtype 10
capabilities 0x0
offset 20480
size 8508
align 2^12 (4096)
architecture 2
cputype 16777234
cpusubtype 0
capabilities 0x80
offset 32768
size 8552
align 2^12 (4096)

Voici maintenant le résultat de la commande lipo:
[pierre@albert] /Users/pierre/Documents/source>lipo -detailed_info hello
Fat header in: hello
fat_magic 0xcafebabe
nfat_arch 3
architecture i386
cputype CPU_TYPE_I386
cpusubtype CPU_SUBTYPE_I386_ALL
offset 4096
size 12588
align 2^12 (4096)
architecture ppc7400
cputype CPU_TYPE_POWERPC
cpusubtype CPU_SUBTYPE_POWERPC_7400
offset 20480
size 8508
align 2^12 (4096)
architecture ppc64
cputype CPU_TYPE_POWERPC64
cpusubtype CPU_SUBTYPE_POWERPC_ALL
offset 32768
size 8552
align 2^12 (4096)
Eh bien, c'est intéressant, je vois de manière détaillée que ce fichier hello contient trois exécutables, et j'obtiens l'offset de chacun.

... il est amusant de constater que le "magic number" pour les "fat binaries" est 0xcafebabe. C'est en fait le même "magic number" que celui du Java bytecode, c'est à dire des fichiers .class en Java. Souvenons-nous que le nom "Java" a été choisi car son créateur, James Gosling, est un grand consommateur de café, sans quoi Java se serait appelé Oak.

... au fait, pourquoi cette commande s'appelle-t-elle lipo ? Peut être une jeu de mot sur les "fat binaries" et la liposuccion ("liposuction" en anglais) ?

Vous pouvez aussi consulter ce document officiel Apple sur la structure des exécutables Mach-O.

Aucun commentaire: