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
[Bearbeiten | Quelltext bearbeiten]Eine Mach-O-Datei besteht im Wesentlichen aus drei Teilen:[1]
- Kopfinformationen, englisch header
- Load commands
- Metadaten
- Offset-Addressen der Segmente
- Segmente, segments
- bis zu 255 Sektionen, sections
Header
[Bearbeiten | Quelltext bearbeiten]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.[2]
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:[3]
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
|
Siehe auch
[Bearbeiten | Quelltext bearbeiten]Weblinks
[Bearbeiten | Quelltext bearbeiten]- Harry Moulton: Mach-O File Format: Introduction. 3. Januar 2020 (englisch).
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ William Woodruff: Mach-O Internals. (PDF; 307 KB) 10. Februar 2016, S. 10 (englisch).
- ↑ Apple, Inc.: XNU Kernel Source. Abgerufen am 22. November 2021 (englisch).
- ↑ https://stackoverflow.com/questions/27669766/how-to-read-mach-o-header-from-object-file