Mach-O, für , 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 , unter NeXTStep , wurde das Format zudem um Multi-Prozessorarchitektur-Fähigkeit erweitert.
Aufbau Eine Mach-O-Datei besteht im Wesentlichen aus drei Teilen:
Kopfinformationen,
diverse Flags Anzahl und Größe der
Metadaten Offset-Addressen der Segmente Segmente, bis zu 255 Sektionen,
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.
struct mach_header_64 { uint32_t magic; /* mach magic number identifier */ cpu_type_t cputype; /* cpu specifier */ cpu_subtype_t cpusubtype; /* machine specifier */ uint32_t filetype; /* type of file */ uint32_t ncmds; /* number of load commands */ uint32_t sizeofcmds; /* the size of all the load commands */ uint32_t flags; /* flags */ uint32_t reserved; /* reserved (64-Bit only) */
Ein Beispiel für einen Mach-Header aus einer beliebigen Programmdatei:How to read Mach-O header from object file? Offset(hex)Länge(dec)InhaltBeispiel0040xfeedfacf → MH_MAGIC_640440x01000007 → CPU_TYPE_X86_64 = CPU_TYPE_I386 | CPU_ARCH_ABI640840x80000003 → CPU_SUBTYPE_X86_ALL | CPU_SUBTYPE_LIB64124Dateityp0x00000002 → MH_EXECUTE164Anzahl der 0x00000010204Größe aller 0x00000510 bytes2440x00200085 → u. a. MH_DYLDLINK | MH_NOUNDEFS284reserviert (fehlt bei 32-Bit-Mach-O)0x00000000
Siehe auch Executable and Linking Format (ELF)
Weblinks
Einzelnachweise
Kategorie:Binärformat für ausführbare Programme, Bibliotheken und/oder Objektcode