Fact-checked by Grok 2 weeks ago

Universal binary

A universal binary is an executable file format developed by Apple Inc. for its macOS and iOS operating systems, containing multiple versions of compiled machine code targeted at different central processing unit (CPU) architectures within a single file, enabling native execution on diverse hardware without emulation for supported platforms. This format leverages the Mach-O executable structure with a "fat binary" header that encapsulates binaries for architectures such as PowerPC, Intel x86, and Apple Silicon ARM, allowing the operating system to automatically select and load the appropriate version at runtime. Apple introduced universal binaries in June 2005 during the announcement of its transition from PowerPC to processors, with the first implementation appearing in Mac OS X 10.4.4 () to facilitate compatibility and smooth software adoption across the architectural shift. The format was designed to simplify binary distribution by permitting a single application package to support both legacy and new hardware, complemented by the emulation layer for running unsupported binaries during the PowerPC-to- . In 2020, Apple revived and extended the universal binary approach—now termed Universal 2—for the shift from to its custom (ARM-based) processors, starting with , to ensure broad compatibility for apps on both -based and Macs. Universal binaries maintain the same file extensions and outward appearance as single-architecture executables, such as binaries or app bundles, but internally embed multiple architectures using tools like Xcode's lipo utility for merging during compilation. This approach has been pivotal in Apple's hardware transitions, reducing developer overhead, enhancing performance by prioritizing native code execution, and supporting features like Rosetta 2 for translating binaries on when no native version is available. Developers are encouraged to build universal binaries to maximize reach across Apple's ecosystem, with the format remaining a cornerstone of cross-architecture software deployment as of and later releases.

Fundamentals

Definition and purpose

A universal binary is a single executable file that encapsulates multiple Mach-O binaries, each compiled for distinct CPU architectures such as x86_64 for processors and arm64 for , enabling the operating system to automatically select and execute the appropriate variant at runtime based on the host hardware. The primary purpose of a universal binary is to streamline within Apple's by consolidating architecture-specific variants into one file, thereby eliminating the need for or users to manage separate builds or downloads for different platforms. Key benefits include enhanced , simplified application updates across diverse , and facilitated support during transitional periods, such as the shift from to processors. For instance, a universal binary allows a single macOS application package to run natively on both Intel-based Macs and Macs without requiring user intervention or emulation layers like .

Architecture compatibility

Universal binaries enable cross-architecture execution by encapsulating multiple architecture-specific executable images, known as "slices," within a single file container. This allows the same to run natively on different types without requiring separate distributions. Primarily, universal binaries support 64-bit (x86_64) for Intel-based systems and, historically, 32-bit () variants, ARM64 (arm64) for , and historically PowerPC (PPC and ) for older Macintosh hardware. Each slice is segmented by unique identifiers embedded in the 's header, ensuring precise mapping to the target CPU. At runtime on macOS and , the (dyld) examines the host system's CPU and parses the universal binary's header to select and load the appropriate slice. This occurs transparently during application launch, prioritizing the native for optimal performance. If no matching slice is found, dyld fails to load the binary, preventing execution. Universal binaries also accommodate thin binaries, which contain only a single slice, by treating them as a special case of the universal format with just one entry. Developers can wrap thin binaries in universal containers using tools like lipo for broader compatibility. During transitions, such as from to , fallback mechanisms like Rosetta 2 enable emulation of x86_64 code on ARM64 hardware, allowing universal binaries with Intel slices to run via translation when native ARM64 slices are unavailable. This ensures seamless operation across generations, though native execution remains preferred for efficiency.

Historical development

Origins in Mac OS X

In 2005, Apple announced its transition from PowerPC to processors, creating the need for a that could support both architectures to facilitate a smooth migration for developers and users over a two-year period. The shift was driven by performance improvements and broader hardware compatibility, with Apple committing to begin shipping -based in 2006 and completing the transition by the end of 2007. Universal binaries were first implemented in the Mac OS X 10.4.4 update, released on January 10, 2006, as an evolution of the "fat binaries" concept originally developed for multi-architecture support in . 's fat binaries, first appearing in version 3.1 in 1993, allowed a single executable to contain code for multiple types, such as and x86, enabling seamless operation across hardware platforms. This heritage informed Apple's approach, adapting the file format to bundle PowerPC and code within one file for easier deployment during the switch. A pivotal moment came during ' keynote at the 2005 on June 6, where he revealed universal binaries as the key mechanism for running software compiled for on PowerPC systems and vice versa, ensuring compatibility throughout the transition. Jobs emphasized that "one binary works on both PowerPC and Intel architecture," highlighting how this format would allow developers to target both user bases without separate builds. Initially, universal binaries supported only PowerPC (PPC) and architectures, focusing on 32-bit code to address the immediate needs of the Intel shift. Developer tools like 2.1, released alongside the announcement, integrated universal binary creation directly into the build process, allowing developers to generate dual-architecture executables with minimal effort. This early implementation prioritized migration ease over broader multi-architecture expansion.

Introduction of universal applications

In Mac OS X 10.5 Leopard, released on October 26, 2007, universal binaries became the standard format for the operating system itself, marking the first time an OS X release shipped as a universal binary capable of on both PowerPC and Intel-based Macintosh computers from a single DVD. This rollout unified separate architecture-specific builds, streamlining distribution and supporting Apple's ongoing transition from PowerPC to processors that began in 2005. Apple actively encouraged third-party developers to adopt universal binaries to ensure broad compatibility across the user base, providing guidelines and tools to facilitate the process. Developers merged architecture-specific binaries using the lipo command-line tool, which combined executable files for PowerPC and into a single universal file without altering the underlying codebases. This approach minimized development overhead, allowing applications to run natively on either hardware by selecting the appropriate slice at . By late 2008, adoption was widespread, with Apple documenting over 7,500 universal applications available, reflecting strong compliance as the Intel transition progressed. The tool's integration into further simplified building universal binaries as the default for new projects. The introduction of universal binaries in had significant ecosystem benefits, enabling seamless software upgrades for users regardless of their hardware architecture and reducing fragmentation during the transition period. Apple's own software suites, such as '08 and '08 released alongside , were built as universal binaries, setting an example for compatibility in creative and productivity tools. This push facilitated a smooth , with applications performing optimally on both old and new systems without needing separate downloads or installations. By 2008, the majority of active macOS applications had transitioned to format, completing the practical shift away from PowerPC-specific development. PowerPC support was fully phased out with the release of Mac OS X 10.6 on August 28, 2009, which dropped compatibility for the entirely, focusing exclusively on processors.

Adoption in iOS

In iOS development, binaries have been used since the iPhone SDK 2.0 (2008) to include both slices for physical devices and x86_64 slices for the simulator on Intel-based Macs, enabling efficient testing workflows. This fat binary approach supported code reuse across development environments without recompilation. Note that " apps" in , introduced with in June 2010, refer to a single binary compatible with both and devices (sharing the same but with optimizations), distinct from multi-architecture binaries. A significant advancement for architecture support occurred with in 2013, introducing arm64 binaries for 64-bit devices, building on earlier 32-bit support. in September 2017 mandated 64-bit compatibility, dropping 32-bit apps from the and requiring arm64 binaries for all submissions. This ensured performance consistency across Apple's -based devices. Later, Mac Catalyst (introduced in 10.15, 2019) allowed iOS apps to run on macOS, with universal binaries facilitating cross-platform deployment by including both ARM and x86_64 slices. In Apple's shared ecosystem, universal binaries promote by allowing applications to be compiled once for various variants, supporting deployment across , , and compatible macOS environments under a unified architecture. For instance, developers can target multiple ARM-based devices with a single build process, reducing maintenance overhead while optimizing for hardware differences like cores or configurations. With the transition to , 12 (2020) introduced arm64 simulator support, allowing universal binaries to include arm64 device, arm64 simulator, and x86_64 simulator slices for comprehensive testing on both and development machines.

Evolution to Universal 2

At the 2020 (WWDC), Apple announced Universal 2 binaries as part of the transition to for Macs, debuting with (version 11.0) and 12. These binaries support both x86_64 () and arm64 () architectures within a single file, enabling developers to create applications that run natively across all modern Mac hardware without modification. Universal 2 enhances performance by allowing native execution on , leveraging the unified memory architecture and optimized frameworks like Metal for faster launches and better efficiency compared to translated code. For legacy applications, 2 provides , enabling unmodified x86_64 apps—including those with plug-ins—to run seamlessly on Macs with near-native performance. This dual-support model addresses the original universal binary format's limitations by incorporating metadata in the Info.plist file, such as the LSArchitecturePriority key to specify preferred s and LSRequiresNativeExecution to enforce native runs, which improves architecture detection at launch. Additionally, Universal 2 binaries offer enhanced simulator support, including both x86_64 and arm64 slices for testing and macOS apps natively on development machines. Apple outlined a two-year transition period beginning with the first Mac shipments at the end of 2020, aiming for full ecosystem compatibility by the end of 2022, coinciding with macOS Ventura's release. By this point, all new Mac hardware was -based, and 2 became the standard for cross-architecture distribution in the , where only one binary per app is permitted, necessitating universal formats for broad compatibility. Adoption accelerated rapidly, with the majority of top apps supporting 2 by 2023, driven by developer tools in that simplify building and testing multi-architecture binaries. This evolution built on iOS's long-standing arm64 focus, enabling seamless app portability across Apple's ARM-based platforms.

Technical implementation

File format structure

A universal binary, also known as a fat binary, encapsulates multiple architecture-specific binaries within a single file using a wrapper structure that begins with a fat header. This fat header is defined by the struct fat_header in the format, consisting of two 32-bit unsigned integer fields: magic, which holds the value 0xcafebabe in big-endian byte order to identify the file as a universal binary (validated against the constant FAT_MAGIC), and nfat_arch, indicating the number of architecture slices contained within the file. Following the fat header is an array of fat_arch structures (or fat_arch_64 for files exceeding 4 GB per slice or offsets beyond 4 GB), one for each architecture slice. Each fat_arch structure includes five 32-bit fields in big-endian order: cputype (specifying the CPU type, such as CPU_TYPE_X86_64 for 64-bit Intel processors), cpusubtype (a machine-specific subtype), offset (the byte offset from the start of the file to the beginning of the corresponding thin binary), size (the byte length of the thin binary), and align (the alignment requirement as a power of 2, ensuring proper memory placement). The location of a specific architecture slice is determined by its offset value relative to the file base (typically 0), allowing the loader to jump directly to the embedded binary. The embedding mechanism concatenates the individual thin Mach-O binaries sequentially after the header array, ordered as specified by the fat_arch entries, without any compression or additional encoding. This results in a straightforward where the total file size is the sum of the header overhead plus the sizes of all embedded slices, enabling efficient extraction of the appropriate at based on the host . The file size overhead introduced by wrapper is minimal, typically less than % for binaries of practical , as the fat header adds 8 bytes and each fat_arch entry adds 20 bytes (or 32 bytes for 64-bit variants), regardless of the number of architectures beyond the first. Tools such as otool are required to inspect and disassemble these structures, with commands like otool -f displaying the fat header and architecture details to verify the embedded slices.

Integration with Mach-O

Universal binaries integrate seamlessly with the Mach-O executable format by encapsulating multiple independent files, known as slices, within a single fat binary wrapper. Each slice constitutes a complete, self-contained file customized for a specific , including its own mach_header (or mach_header_64 for 64-bit), load commands, segments, sections, and symbol tables. This structure allows the binary to maintain architecture-specific optimizations, such as instruction sets and alignment requirements, while sharing common elements like the fat header for multi-architecture identification. The parsing process begins with the , dyld, which examines the fat header—identified by the magic number 0xCAFEBABE—to determine the number of slices and their offsets, sizes, and alignments via fat_arch structures. Dyld then selects the slice matching the host CPU type and subtype, skipping to its offset where it encounters the header's magic number, such as 0xfeedface for 32-bit big-endian, 0xcefaedfe for 32-bit little-endian, 0xfeedfacf for 64-bit big-endian, and 0xcffaedfe for 64-bit little-endian. From there, dyld interprets the load commands, such as LC_SEGMENT or LC_SEGMENT_64, to map s into ; for instance, the __TEXT (read-only, containing in the __text and constants in __const) is loaded with execute permissions, while the __DATA (read-write, holding initialized data in __data and uninitialized in __bss) receives write permissions, enabling sharing across processes. Support for cross-architecture linking in universal binaries extends to dynamic shared libraries (.dylib files), where each slice preserves its own symbol and relocation information in the __LINKEDIT segment. During runtime, dyld resolves undefined symbols from the executable's slice against the corresponding architecture-specific slice in the library, using two-level namespace resolution (library name plus symbol name) to avoid conflicts and enable architecture-tailored optimizations, such as vector instructions unique to PowerPC or x86. This per-slice resolution ensures compatibility and performance without requiring separate library builds per architecture. The fat binary extension of the format builds directly on the original design from , where multi-architecture support was rudimentary, and was significantly enhanced in 2005 to accommodate Apple's shift from PowerPC to processors through new load commands and fat header mechanisms that simplified the transition for developers and users alike.

Multi-architecture support mechanisms

Universal binaries employ runtime mechanisms to automatically select and execute the appropriate architecture-specific code slice based on the host system's CPU. During process execution, the macOS parses the fat header of the universal binary and identifies the slice that matches the current CPU type and subtype most closely, loading only that Mach-O executable into memory while ignoring others. If no compatible slice is found, the system typically terminates the launch with an error such as "bad CPU type in executable," resulting in a crash; however, on Apple Silicon Macs, if an arm64 slice is absent but an x86_64 slice exists, the invokes 2 for dynamic to enable execution. User-space applications can query the host architecture using system calls like sysctlbyname("hw.machine") or the function to adapt behavior dynamically, though this is distinct from the kernel's automatic slice selection. For integration with the format, the dyld further processes the loaded slice, handling dependencies and relocations specific to the selected architecture. In environments like , conditional compilation directives enable architecture-specific code paths within a single source base. and support #if arch directives, such as #if arch(arm64) or #if arch(x86_64), allowing developers to include or exclude code blocks during compilation for each target architecture, ensuring optimal performance and compatibility without runtime checks. Builds for simulators versus physical devices often incorporate universal slices to accommodate varying host architectures; for instance, iOS framework builds combine arm64 device slices with arm64 or x86_64 simulator slices, facilitating testing across development machines. Optimization techniques in universal binary creation include per-architecture , where the compiler removes unused functions and data during separate builds for each slice, minimizing the overall file size compared to monolithic binaries. This approach also supports hybrid applications that integrate native code slices with translated execution via , allowing seamless fallback on mismatched hardware without full recompilation. In Universal 2 binaries, which support both x86_64 and arm64 architectures, additional mechanisms enhance security through arm64e slices that incorporate pointer authentication codes (PACs) to protect against pointer manipulation attacks, ensuring authenticated execution across compatible systems.

Creation and usage tools

Building universal binaries

Developers create universal binaries using Apple's integrated development environment, which automates the compilation and linking process for multiple architectures. In 12 and later versions, released in , the tool defaults to building Universal 2 binaries for release configurations by including both x86_64 and arm64 architectures in the standard ARCHS build setting for macOS projects. This default behavior ensures that archived apps for distribution are universal without additional configuration, while debug builds target only the host machine's architecture to speed up iteration. issues warnings for projects that produce non-universal binaries when targeting macOS, prompting developers to enable multi-architecture support. To configure a project for universal output, developers set the Architectures build setting to include multiple targets, such as ARCHS = "x86_64 arm64", either through the project editor or by modifying the build configuration files. For automated universal binaries, archiving the project via Product > Archive in merges the architecture-specific binaries during the export process, producing a single fat binary suitable for both Intel-based and Macs. This process compiles source files separately for each architecture—once for x86_64 and once for arm64—before linking them into the final executable. As of November 2025, Apple announced that macOS 27 will discontinue support for processors, meaning future universal binaries may only need to target arm64 for native execution on . For manual creation or when working outside , such as with custom build scripts, the lipo command-line tool merges thin binaries into a universal one. The primary syntax is lipo -create -output universal_binary thin_x86_64_binary thin_arm64_binary, where thin binaries are architecture-specific executables or libraries built individually using compiler flags like -arch x86_64 or -arch arm64. For example, developers might compile separate binaries with clang -arch x86_64 -o app_x86_64 source.c and [clang](/page/Clang) -arch arm64 -o app_arm64 source.c, then combine them via lipo. Best practices emphasize thorough testing on diverse hardware to ensure compatibility, including running the app on both Intel Macs (using Rosetta 2 for arm64 code) and devices to identify architecture-specific issues. For code that varies by , use conditional directives in files, such as #if arch(arm64) in or #if TARGET_CPU_ARM64 in , to include platform-specific implementations without relying solely on build flags. Additionally, when building for or multi-platform frameworks, leverage XCFramework bundles created with xcodebuild -create-xcframework to package binaries for both device (arm64) and simulator (x86_64 or arm64) architectures, ensuring seamless integration across deployment targets.

Inspecting and analyzing binaries

Inspecting universal binaries involves using command-line utilities provided by Apple to examine their structure, verify s, and ensure integrity, particularly after compilation or for purposes. These tools allow s to confirm the presence of multiple slices within a single file, inspect headers, symbols, and debug information, and validate signatures without needing to extract or run the . The file command offers a quick way to detect architectures in Mach-O binaries, including universal ones. Running file <binary> outputs details such as "Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64:Mach-O 64-bit executable arm64]", identifying if the file is thin (single architecture) or universal (multi-architecture). For more detailed architecture listing, the lipo utility's -info option enumerates supported architectures in a universal binary. The command lipo -info <binary> produces output like "Architectures in the fat file: are: x86_64 arm64", helping to verify that all intended slices are present and correctly merged. The otool command provides in-depth inspection of the fat header and contents. Using otool -f <binary> displays the fat header structure, including the magic number (0xcafebabe for universal binaries), number of architectures, and offsets/sizes for each slice, such as "fat_arch: cputype CPU_TYPE_X86_64 (6), cpusubtype CPU_SUBTYPE_X86_64_ALL (3), filetype OBJTYPE_EXECUTABLE (1)". This reveals the binary's multi-architecture layout at a low level. To analyze symbols across slices, the [nm](/page/Nm) utility inspects the symbol table for each architecture. For universal binaries, specify the architecture with nm -arch x86_64 <binary> or nm -arch arm64 <binary> to list undefined, defined, and common symbols, such as function names and their types (e.g., 'T' for text section), enabling per-slice symbol comparison without extraction. Disassembly workflows utilize otool -tv for code review, which disassembles the text section into assembly instructions. In universal binaries, append -arch <architecture> (e.g., otool -tv -arch arm64 <binary>) to target a specific slice, producing output like ARM64 instructions for functions, facilitating architecture-specific code verification and optimization checks. Debugging often involves dwarfdump to examine debug information, distinguishing thin from universal binaries by parsing sections across slices. The command dwarfdump --arch=all <binary> outputs debug entries for all architectures if universal, or a single set if thin, revealing compilation units, variables, and line numbers; this helps identify inconsistencies in debug data between slices. For signed universal applications, Apple's pkgutil and codesign tools extend inspection to ensure integrity. pkgutil --check-signature <package> verifies signatures on installer packages containing universal binaries, flagging issues like expired certificates across components. Similarly, codesign -dv <binary> displays verbose details on the code signature, confirming that all slices are uniformly signed and untampered, with output including the signing authority and hash algorithms used. Common analysis workflows combine these tools: start with lipo -info to list architectures, use otool -f for header details, then otool -tv -arch <arch> or nm -arch <arch> for code and symbol review per slice. During validation, mismatched slices—such as an executable supporting arm64 but a library only x86_64—can cause rejection; developers mitigate this by running lipo -info on all bundle binaries to ensure architectural consistency before submission.

References

  1. [1]
    Glossary - Apple Developer
    Aug 8, 2013 · universal binaries. Executable files containing object code for more than one machine architecture. UPL (universal page list). A data ...
  2. [2]
    Building a universal macOS binary | Apple Developer Documentation
    A universal binary runs natively on both Apple silicon and Intel-based Mac computers, because it contains executable code for both architectures.
  3. [3]
    Apple's Intel switch: Jobs' keynote transcript - CNET
    CNET News staff. June 15, 2005 10:54 a.m. PT. 27 min read. Apple Computer CEO Steve Jobs ... * Xcode 2.1 to generate universal binaries * A universal binary ...
  4. [4]
    Apple and Intel: What you need to know - Macworld
    Jun 7, 2005 · Because of Apple's new “Universal Binary” approach, developers can deliver a single program that contains within it both Intel and PowerPC ...
  5. [5]
    Apple Announces Switch to Intel Chips - BetaNews
    Apple has created a "universal binary" structure that works on both PowerPC and x86 to additionally make things easier for developers. The universal binaries ...
  6. [6]
    Porting your macOS apps to Apple silicon
    A universal binary looks no different than a regular app, but its executable file contains two versions of your compiled code.
  7. [7]
    What Is a Universal Binary on Mac? - How-To Geek
    Aug 8, 2022 · Apple created two solutions to bridge compatibility between older Intel-based Macs and newer Apple Silicon-based Macs, which began with the M1 ...
  8. [8]
    An Apple Library Primer | Apple Developer Forums
    A universal binary is a file that contains multiple architectures for the same platform. Universal binaries always use the universal binary format. Use the file ...
  9. [9]
    About the Rosetta translation environment - Apple Developer
    On Apple silicon, a universal binary may run either natively or as a translated binary. The system runs the native version whenever possible, but the user might ...Missing: definition | Show results with:definition
  10. [10]
    [PDF] Mach-O Programming Topics
    Nov 28, 2006 · The Code Fragment Manager is documented in Mac OS Runtime Architectures, available from the. Apple Developer Connection website. 7. 2006-11-28 | ...<|control11|><|separator|>
  11. [11]
    Apple to Use Intel Microprocessors Beginning in 2006
    PRESS RELEASE June 6, 2005. Apple to Use ... by this time next year, and to transition all of its Macs to using Intel microprocessors by the end of 2007.
  12. [12]
    Ryan Gordon Halts FatELF Project - OSnews
    Nov 5, 2009 · Fat-binaries ala legacy MacOS have always been part of NeXT's multi architecture strategy, applications that shipped with support for NextStep ...Missing: origins | Show results with:origins
  13. [13]
    WWDC 2005 Keynote Live Update - Macworld
    Jun 5, 2005 · When Jobs greets developers at next year's show, he said, he suspects many of them will already be shipping universal binaries, and Apple will ...
  14. [14]
    Mac OS X 10.5.x Special Report: Making a universal Leopard boot ...
    Nov 29, 2007 · Leopard is the first Mac OS X system that comes on a Universal Binary DVD. The very same DVD can be used to install Leopard either on a ...
  15. [15]
    A developer's-eye view of Leopard | InfoWorld
    Jun 25, 2007 · Apple's Universal Binary executable format folds multiple native architecture types into a single application file with one installer. You can ...
  16. [16]
    Universal binary - Wikipedia
    The universal binary format is a format for executable files that run natively either on both PowerPC-based and x86-based Macs or on both Intel 64-based and ...Motivation · History · Universal applications · Universal 2
  17. [17]
    Snow Leopard Doesn't Mean the End of the Road for PowerPC Macs
    Aug 18, 2009 · 2009 – Low End Mac colleague Simon Royal says he didn't believe the rumors last year that Mac OS X 10.6 Snow Leopard would be Intel only.Missing: phased | Show results with:phased
  18. [18]
    Universal apps or iPad HD
    Apr 6, 2010 · Apple is recommending developers switch to the Universal app format that supports both iPhone/iPod and iPad devices.
  19. [19]
    Apple Previews iPhone OS 4
    Apr 8, 2010 · The iPhone OS 4 beta release includes an updated Software Development Kit (SDK) with over 1,500 new Application Programming Interfaces (APIs) ...Missing: universal binaries
  20. [20]
    Apple announces Mac transition to Apple silicon
    Jun 22, 2020 · Apple Developer Program members can start moving their apps to Apple silicon today by applying for the Universal App Quick Start Program.
  21. [21]
    Creating a multiplatform binary framework bundle | Apple Developer Documentation
    ### Summary: Building Universal Binaries and XCFrameworks
  22. [22]
    Compiling for iOS on Apple M1 | Mercari Engineering
    Nov 30, 2021 · The arm64-simulator architecture being used only on the new M1 CPU and later. That means that an Intel CPU computer will keep compiling and ...<|separator|>
  23. [23]
    fat_header | Apple Developer Documentation
    An integer containing the value 0xCAFEBABE in big-endian byte order format. On a big-endian host CPU, this can be validated using the constant FAT_MAGIC.
  24. [24]
    fat_arch | Apple Developer Documentation
    An array of fat_arch data structures appears directly after the fat_header data structure of a binary that contains object files for multiple architectures.
  25. [25]
    Mach-O File Format 4GB Limit - Jonas Devlieghere
    Feb 6, 2025 · Due to the use of 32-bit offsets, Universal Mach-O files cannot contain a slice that starts beyond the 4GB boundary. For example, if you have ...Missing: overhead | Show results with:overhead
  26. [26]
    A deep dive on macOS universal binaries
    Jul 23, 2021 · Universal binaries, internally referred to as fat binaries, are not Mach-O objects. Instead, Apple defines fat binaries as simple archives ...
  27. [27]
    Mach-O Universal / Fat Binaries - Symbol Crash
    Feb 26, 2019 · The Fat / Universal binary format acts as a wrapper for multiple Mach-O binaries of different architectures and CPU types.
  28. [28]
    Introduction to iOS Binary Patching (Part 1) - Zdziarski
    Apr 28, 2013 · Use the otool -f command to display the universal binary header. This will give you the file offsets for each of the architectures present in ...
  29. [29]
    Mirror of OS X ABI Mach-O File Format Reference - GitHub
    You can group multiple Mach-O files (one for each architecture you want to support) in one binary using the format described in Universal Binaries and 32-bit/64 ...
  30. [30]
    Apple Gets an 'F' for Slicing Apples - Objective-See's Blog
    Feb 22, 2024 · As shown in the above image, there is one fat_arch structure for each embedded Mach-O (slice). The fat_arch structure describes the CPU type ...<|separator|>
  31. [31]
    How am I running x86_64 programs without arch on Apple Silicon?
    Jul 11, 2021 · With the Mach-O format and the standard loader code in macOS, the OS will run the first valid version of a program in a universal binary that ...
  32. [32]
    Preparing your app to work with pointer authentication
    Overview. The arm64e architecture introduces pointer authentication codes (PACs) to detect and guard against unexpected changes to pointers in memory.Missing: Universal | Show results with:Universal
  33. [33]
  34. [34]
    What command shows the architecture of a binary file on Mac?
    Aug 25, 2010 · Use the built-in file command. For example: file -b pydevd_cython.cpython-310-darwin.so` Note: the -b or --brief option prevents the output from echoing the ...
  35. [35]
    Magic, lipo and testing for Universal binaries
    Jul 24, 2020 · ... Binaries. They originated with Multi-Architecture Binaries on NeXTStep, and the Fat Apps and Binaries during the Mac's first transition from ...Missing: origins | Show results with:origins
  36. [36]
    Code Signing Tasks - Apple Developer
    Sep 13, 2016 · See the man page for csreq for more information on that command. ... Note: To see which libraries an app references, use the command otool -L ...
  37. [37]
    Reversing 'pkgutil' to Verify PKGs | Jamf Protect
    Jan 22, 2019 · One can use the built-in pkgutil to verify a package (.pkg). This is accomplished via the --check-signature commandline flag.
  38. [38]
    Mac App Store Binary Rejection Question - Stack Overflow
    Apr 16, 2011 · Mac App Store Binary Rejection Question · 4. Run lipo -info against your binary(ies) to see for which architectures it's (they've) been compiled.Invalid Binary while submitting the app on app store - Stack OverflowHow to know on app store if an app is universal or has 2 binariesMore results from stackoverflow.com