Mach-O

format de fichier

Mach-O (pour Mach-object) est un format de fichier exécutable, sous Apple/Darwin, alias Mac OS X.

Mach-O
Icône de terminal, semblable à celle du terminal de Mac OS X
Caractéristiques
Extension
none, .o, .dylib
PUID
Signatures
CF FA ED FE (hexa)
CE FA ED FE (hexa)
FE ED FA CE (hexa)
FE ED FA CF (hexa)Voir et modifier les données sur Wikidata
Développé par
Type de format

Structure des fichiers Mach-O

modifier

Chaque fichier Mach-O est constitué d'un entête, suivi d'une série de commandes de chargement, suivie d'un ou plusieurs segments qui contiennent jusqu'à 255 sections. Le format Mach-O utilise le format de réallocation REL pour gérer les références de symboles. Lors de la recherche de symboles, Mach-O utilise un espace de noms à deux niveaux qui encode chaque symbole dans une paire 'objet/nom du symbole' qui est ensuite recherchée linéairement, d'abord par l'objet, puis par le nom du symbole[1].

La structure basique des fichiers Mach-O est constitué d'une liste de "commandes de chargement" de longueur variable qui fait référence à des pages de données autre part dans le fichier[2], cette structure était aussi utilisée dans le format de fichier exécutable d'Accent, étant à son tour, basée sur une idée de Spice Lisp.

Exécutable Multi-Architecture

modifier

Plusieurs fichiers Mach-o peuvent être combiné dans un exécutable multi-achitecture, ceci permet à un seul fichier exécutable de contenir du code pouvant supporter plusieurs jeux d'instruction d'architectures. Par exemple: un exécutable multi-architecture pour Mac OS X peut contenir à la fois du code PowerPC 32-bit et 64-bit, ou contenir à la fois du code PowerPC 32-bit et x86, ou contenir du code PowerPC 32-bit, 64-bit, du code x86, et x86_64.

Le devenir de Mach-O

modifier

Avec l'introduction de la version 10.6 de Mac OS X (Snow Leopard), le format Mach-O a subi une importante modification, qui empêche les binaires compilés sous Mac OS X 10.6 d'être exécutés sur des versions plus anciennes du système. La différence vient de certaines commandes de chargement que l'éditeur de liens des anciennes versions de Mac OS X ne comprend pas. Autre changement significatif du format est le change de comment les tables d'édition de liens (trouvé dans la section "__LINKEDIT") fonctionne. Dans Mac OS X 10.6 ces nouvelles tables d'édition de lien sont compressées en suppriment les bits d'information non-utilisés et inutiles, Toutefois Mac OS X 10.5 et les versions précédentes ne peuvent pas lire ce nouveau format de tables. Pour résoudre ce problème de rétro-compatibilité de l'option d'éditeur de liens "-mmacosx-version-min=" peut être utilisé.

Autre implémentation

modifier

Certaines versions de NetBSD ont un support Mach-O ajouté en tant qu'une partie d'implémentation de compatibilité qui permet d'exécuter certains exécutables compilés pour Mac OS 10.3[3],[4].

Pour Linux, un exécuteur de fichier Mach-O pouvant exécuter des exécutables Mac OS 10.6 a été écrit par Shinichiro Hamaji[5]. Pour une solution complète basée sur cet exécuteur, le projet Darling vise à fournir un environnement complet permettent à une application Mac OS de s'exécuter sur Linux.

Pour le langage de programmation Ruby, la librairie "ruby-macho"[6] fournit une implémentation d'un éditeur et analyser Mach-O.

Notes et références

modifier
  1. « OS X ABI Mach-O File Format Reference » [archive du ], Apple Inc., (consulté le )
  2. Avadis Tevanian, Richard F. Rashid, Michael W. Young et David B. Golub, « A Unix Interface for Shared Memory and Memory Mapped Files Under Mach », In Proceedings of the Summer 1987 USENIX Conference,‎ , p. 53–67 (lire en ligne, consulté le )
  3. « Mach and Darwin binary compatiblity for NetBSD/powerpc and NetBSD/i386. », sur hcpnet.free.fr (consulté le )
  4. (en) Emmanuel Dreyfus, « Mac OS X binary compatibility on NetBSD: challenges and implementation », 2004.eurobsdcon.org,‎ (lire en ligne [PDF])
  5. « Mach-O loader for Linux - I wrote... », sur shinh.skr.jp (consulté le )
  6. ruby-macho, Homebrew, (lire en ligne)

Voir aussi

modifier

Articles connexes

modifier

Liens externes

modifier
  NODES
Note 2