Mach-O is an
code object file format just like
PEF,
xcoff,
a.out,
EXE and others.
Mach-O can be of the following types:
MH_EXECUTE - an
executable object file MH_FVMLIB - a fixed
vm shared library file
MH_OBJECT - a
relocatable object file MH_PRELOAD - a
preloaded executable fileMH_CORE - a
core fileMH as you might have
presumed, stands for a
Mach
Header.
The first 4 bytes (
magic) of the Mach-O file are 0xfeedface :-)) I guess that beats the 'joy!'
magic of the
PEF format. This is followed by an indentifier for a
CPU architecture (say, for example
x86), which is followed by an identifier for the exact
CPU type (such as
486). Next comes the before-mentioned object type.
Next comes a
concept that makes
Mach-O superior to other object
file formats. We get two 4-byte integers that indicate the number of
load commands followed by their overall size.
The number of
load commands varies from file to file, still it is a small program for
Mach microkernel and
dyld that instructs them on how to
assemble the object file. The format goes into a great complexity here, but for starters, here is a list of supported commands with a short description (taken from mach-o/loader.h):
#define LC_SEGMENT 0x1 /* file segment to be mapped */
#define LC_SYMTAB 0x2 /* link-edit stab symbol table info
(obsolete) */
#define LC_SYMSEG 0x3 /* link-edit gdb symbol table info */
#define LC_THREAD 0x4 /* thread */
#define LC_UNIXTHREAD 0x5 /* UNIX thread (includes a stack) */
#define LC_LOADFVMLIB 0x6 /* load a fixed VM shared library */
#define LC_IDFVMLIB 0x7 /* fixed VM shared library id */
#define LC_IDENT 0x8 /* object identification information
(obsolete) */
#define LC_FVMFILE 0x9 /* fixed VM file inclusion */
LC stands for
Load
Command.