Mach-O
# Mach-O

Mach-O, für Mach Object, beschreibt das Standard-Binärformat ausführbarer Programme, Bibliotheken und von Speicherauszügen unter vielen MACH-basierten UNIX-Betriebssystemen wie beispielsweise OPENSTEP (ursprünglich NeXTStep), FreeBSD oder macOS (ursprünglich unter dem Namen Mac OS X).
Es wurde ab 1985 an der Carnegie Mellon University, kurz CMU, für das MACH-Betriebssystem entwickelt. Große Verbreitung hat es vor allem unter NeXTStep und dessen Weiterentwicklung macOS und darauf basierenden Apple-Systemen, wie iOS und iPadOS. Mit Universal Binaries, unter NeXTStep Multi-Architecture Binaries, wurde das Format zudem um Multi-Prozessorarchitektur-Fähigkeit erweitert.

## Aufbau

Eine Mach-O-Datei besteht im Wesentlichen aus drei Teilen:
* Kopfinformationen, englisch header
** Magic
** diverse Flags
** Anzahl und Größe der Load commands
* Load commands
** Metadaten
** Offset-Addressen der Segmente
* Segmente, segments
** bis zu 255 Sektionen, sections

### Header

Der Mach-Header ist ein 32 Bytes großer Bereich am Anfang einer 64-Bit-Mach-O-Binärdatei bzw. 28 Bytes bei 32-Bit-Mach-O. Der folgende Quelltext stammt aus osfmk/mach-o/loader.h von XNU, dem Kernel von macOS.
Ein Beispiel für einen Mach-Header aus einer beliebigen Programmdatei:
| Offset (hex) | Länge (dec) | Inhalt | Beispiel |
| 00 | 4 | mach magic number identifier | 0xCFFAEDFE → MH_CIGAM_64 |
| 04 | 4 | CPU type | 0x01000007 → CPU_TYPE_X86_64 = CPU_TYPE_I386 | CPU_ARCH_ABI64 |
| 08 | 4 | CPU subtype, machine specifier | 0x80000003 → CPU_SUBTYPE_X86_ALL | CPU_SUBTYPE_LIB64 |
| 12 | 4 | Dateityp | 0x00000002 → MH_EXECUTE |
| 16 | 4 | Anzahl der load commands | 0x00000010 |
| 20 | 4 | Größe aller load commands | 0x00000510 bytes |
| 24 | 4 | Flags | 0x00200085 → u. a. MH_DYLDLINK | MH_NOUNDEFS |
| 28 | 4 | reserviert (fehlt bei 32-Bit-Mach-O) | 0x00000000 |