Jump to content

Mach-O

From Wikipedia, the free encyclopedia

This is an old revision of this page, as edited by 116.0.166.34 (talk) at 06:00, 27 November 2016 (External links). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

Mach-O
Mac OS X Executable Binary icon
Filename extension
none, .o, .dylib, .bundle
Uniform Type Identifier (UTI)com.apple.mach-o-binary
Developed byCarnegie Mellon University Apple Inc.
Type of formatBinary, executable, object, shared libraries, core dump
Container forARM, 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 offers more extensibility and faster access to information in the symbol table.

Mach-O is used by most systems based on the Mach kernel. NeXTSTEP, macOS, and iOS are examples of systems that have used this format for native executables, libraries and object code.

Mach-O file layout

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

Under NeXTSTEP, OPENSTEP, macOS, 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).[citation needed]

Minimum OS version

With the introduction of Mac OS X 10.6 platform the Mach-O file underwent a significant modification that causes binaries compiled on a computer running 10.6 or later to be (by default) executable only on computers running Mac OS X 10.6 or later. The difference stems from load commands that the dynamic linker, in previous Mac OS X versions, does not understand. 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 make backwards-compatible executables, the linker flag "-mmacosx-version-min=" can be used.

Other implementations

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

References

  1. ^ "OS X ABI Mach-O File Format Reference". Apple Inc. February 4, 2009. Retrieved April 27, 2016.
  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": 8. {{cite journal}}: Cite journal requires |journal= (help)
  3. ^ Emmanuel Dreyfus (June 20, 2006). "Mach and Darwin binary compatiblity [sic] 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 (PDF)
  5. ^ Shinichiro Hamaji, Mach-O loader for Linux - I wrote...