Mach-O

From Wikipedia, the free encyclopedia
Jump to: navigation, search
Mach-O
Mac OS X Executable Binary icon
Filename extension none, .o, .dylib, .bundle
Uniform Type Identifier (UTI) com.apple.mach-o-binary
Developed by Carnegie Mellon University/Apple Inc.
Type of format Binary, executable, object, shared libraries, core dump
Container for ARM, SPARC, PA-RISC, PowerPC and x86 executable code, memory image dumps

Mach-O, short for Mach object file format, is a file format for executables, object code, shared libraries, dynamically-loaded code, and core dumps. A replacement for the a.out format, Mach-O offered more extensibility and faster access to information in the symbol table.

Mach-O was once used by most systems based on the Mach kernel.[citation needed] NeXTSTEP, OS X, and iOS are examples of systems that have used this format for native executables, libraries and object code.

Mach-O file layout[edit]

Each Mach-O file is made up of one Mach-O header, followed by a series of load commands, followed by one or more segments, each of which contains between 0 and 255 sections. Mach-O uses the REL relocation format to handle references to symbols. When looking up symbols Mach-O uses a two-level namespace that encodes each symbol into an 'object/symbol name' pair that is then linearly searched for by first the object and then the symbol name.[1]

The basic structure—a list of variable-length "load commands" that reference pages of data elsewhere in the file[2]—was also used in the executable file format for Accent.[citation needed] The Accent file format was in turn, based on an idea from Spice Lisp.[citation needed]

Multi-architecture binaries[edit]

Under NeXTSTEP, OPENSTEP, OS X, and iOS, multiple Mach-O files can be combined in a multi-architecture binary. This allows a single binary file to contain code to support multiple instruction set architectures. For example, a multi-architecture binary for iOS can have 6 instruction set architectures, namely ARMv6 (for iPhone, 3G and 1st / 2nd generation iPod touch), ARMv7 (for iPhone 3GS, 4, 4S, iPad, 2, 3rd generation and 3rd - 5th generation iPod touch), ARMv7s (for iPhone 5 and iPad (4th generation)), ARMv8 (for iPhone 5S), x86 (for iPhone simulator on 32-bit machines) and x86_64 (64-bit simulator)

Mach-O future[edit]

With the introduction of Apple's Mac OS X 10.6 platform the Mach-O file has undergone a significant modification that causes binaries compiled on a 10.6 computer to be by default only able to run on a 10.6 computer. The difference stems from load commands that Mac OS X's linker (dyld) can not understand on previous Mac OS X versions. Another significant change to the Mach-O format is the change in how the Link Edit tables (found in the __LINKEDIT section) function. In 10.6 these new Link Edit tables are compressed by removing unused and unneeded bits of information, however Mac OS X 10.5 and earlier cannot read this new Link Edit table format. To resolve this issue, the linker flag "-mmacosx-version-min=" is heavily used and depended on. Apple, current maintainer of the Mach-O format, recommends that all developers now use this flag along with the appropriate SDK headers when creating an application/binary.

Other implementations[edit]

Some versions of NetBSD have had Mach-O support added as part of an implementation of binary compatibility, which allowed some Mac OS 10.3 binaries to be executed.[3][4]

For Linux, a Mach-O loader was written by Shinichiro Hamaji[5] that can load 10.6 binaries. As a more extensive solution based on this loader, The Darling Project aims at providing a complete environment allowing to run OS X applications on Linux.

See also[edit]

References[edit]

  1. ^ "OS X ABI Mach-O File Format Reference". Apple Inc. 
  2. ^ Avadis Tevanian, Jr.; Richard F. Rashid; Michael W. Young; David B. Golub; Mary R. Thompson; William Bolosky; Richard Sanzi. A Unix Interface for Shared Memory and Memory Mapped Files Under Mach. p. 8. 
  3. ^ Emmanuel Dreyfus (June 20, 2006). "Mach and Darwin binary compatiblity for NetBSD/powerpc and NetBSD/i386.". Retrieved October 18, 2013. 
  4. ^ Emmanuel Dreyfus (September 2004), Mac OS X binary compatibility on NetBSD: challenges and implementation 
  5. ^ Shinichiro Hamaji, Mach-O loader for Linux - I wrote... 

External links[edit]