Affichage des articles dont le libellé est Mach-O. Afficher tous les articles
Affichage des articles dont le libellé est Mach-O. Afficher tous les articles

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.

mercredi 9 janvier 2008

Comparons le header Mach-O sous powerpc et x86

Le format d'exécutable sous Mac OS X est le format Mach-O.

La commande otool -h permet d'analyser le header d'un fichier au format Mach-O.

Je lis à la page 12 de "Mac OS X ABI Mach-O File Format Reference" que le header du format Mach-O a toujours la structure suivante:
struct mach_header
{
uint32_t magic;
cpu_type_t cputype;
cpu_subtype_t cpusubtype;
uint32_t filetype;
uint32_t ncmds;
uint32_t sizeofcmds;
uint32_t flags;
};

Voyons le résultat de otool -h sur un fichier Mach-O bien connu (/bin/ls), mais sur deux architectures différentes:

Mac OS X Leopard sur Intel (x86):
[pierre@albert] /Users/pierre>otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 7 3 0x00 2 14 1304 0x00000085

Mac OS X Tiger sur PowerPC (powerpc):
[pierre@blueandwhite] /Users/pierre>otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype filetype ncmds sizeofcmds flags
0xfeedface 18 0 2 11 1608 0x00000085
Regardez attentivement cputype: c'est lui qui nous indique sur quelle architecture nous sommes.

Voyez aussi la page man de la commande arch

En fait, le format Mach-O est directement hérité de NextStep, qui au long de son existence a été disponible pour plusieurs architectures: PowerPC, x86, PA-RISC et SPARC.

mardi 8 janvier 2008

"Magic number" dans les quatre premiers octets des fichiers au format Mach-O

Le format d'exécutable sous Mac OS X est le format Mach-O.

Ce format a un certain nombre d'avantages, notamment la possibilité d'avoir des "fat binaries", appelées "Universal Binaries" par Apple, d'ailleurs je vous en avais déjà parlé ici et ici.

La commande otool -h permet d'analyser le header d'un fichier au format Mach-O. Voyons le résultat sur un fichier Mach-O bien connu (/bin/ls), et un autre fichier Mach-O que j'ai compilé moi-même:
[pierre@albert] /Users/pierre>otool -h /bin/ls
/bin/ls:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 7 3 0x00 2 14 1304 0x00000085
[pierre@albert] /Users/pierre>otool -h Documents/source/hello
Documents/source/hello:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedface 7 3 0x00 2 11 936 0x00000085
Il est amusant de constater que le "magic number" dans le header est 0xfeedface.
En fait les quatre premiers octets de tout fichier au format Mach-O sont toujours 0xfeedface ou 0xcefaedfe si vous lisez un fichier petit-boutiste (little-endian) sur une machine grand-boutiste (big-endian), ou l'inverse...

Vous pouvez aussi consulter cette documentation officielle Apple sur la structure des exécutables Mach-O.