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.cLa commande file nous indique bien qu'il y a trois exécutables dans ce fichier Mach-O:
[pierre@albert] /Users/pierre/Documents/source>file helloLa commande otool -f nous est aussi utile, elle nous indique le "magic number" des "fat binaries":
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
[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 helloEh 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.
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)
... 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:
Enregistrer un commentaire