Mach-O
Mach-O (pour Mach-object) est un format de fichier exécutable, sous Apple/Darwin, alias Mac OS X.
Extension |
none, .o, .dylib |
---|---|
PUID | |
Signatures | |
Développé par | |
Type de format |
Structure des fichiers Mach-O
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
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
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
Certaines versions de NetBSD ont un support Mach-O ajouté en tant qu'une partie d'implémentation de compatibilité d'exécutable, qui permet d'exécuter certain exécutable 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 macOS 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
- (en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Mach-O » (voir la liste des auteurs).
- « OS X ABI Mach-O File Format Reference » [archive du ], Apple Inc., (consulté le )
- 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 )
- « Mach and Darwin binary compatiblity for NetBSD/powerpc and NetBSD/i386. », sur hcpnet.free.fr (consulté le )
- (en) Emmanuel Dreyfus, « Mac OS X binary compatibility on NetBSD: challenges and implementation », 2004.eurobsdcon.org,‎ (lire en ligne [PDF])
- « Mach-O loader for Linux - I wrote... », sur shinh.skr.jp (consulté le )
- ruby-macho, Homebrew, (lire en ligne)