Universal Binaries (auf deutsch in etwa universelle Binärdatei) sind im Apple-Jargon ausführbare Dateien (d. h. Programme), die nativ sowohl auf einem PowerPC-basierten Apple Computer als auch auf einem x86 (Intel)-basierenden Apple Computer lauffähig sind. Eine Universal Binary enthält somit zwei verschiedene Arten des ausführbaren Codes einer Anwendung; zum einen enthält sie den ausführbaren Code für PowerPC-Prozessoren und zum anderen den ausführbaren Code für Intel-Prozessoren (in derselben Programmdatei).
Eine Universal Binary wird beim Ausführen vom Betriebssystem als solche an ihrem Header erkannt, wodurch das Betriebssystem anschließend anhand der vorhandenen Architektur den jeweiligen ausführbaren Code abarbeiten kann.
Dieser Vorgang ermöglicht es nun, eine Anwendung sowohl auf einem Apple Computer mit PowerPC-Architektur als auch auf einem Apple Computer mit Intel-Architektur ohne Geschwindigkeitsverlust auszuführen.
Die Universal Binary wurde auf der Worldwide Developers Conference (WWDC) 2005 eingeführt, um den Übergang zwischen der bestehenden PowerPC-Architektur zu Intel-basierenden Systemen zu erleichtern. Der Ursprung der Universal Binaries geht aber auf das Mach-O-Fat-Format zurück, das bereits in NextStep und OpenStep verwendet wurde, da diese Betriebssysteme für unterschiedliche Architekturen portiert wurden. Noch heute enthalten OpenSource-Bestandteile von Mac OS X Hinweise auf M68k, SPARC und weitere CPUs.
Realisiert werden Universal Binaries über das Binärformat Mach-O, das im Gegensatz zum ELF-Format, welches unter Linux und anderen unixähnlichen Betriebssystemen verbreitet ist, Binärcode für mehrere Architekturen enthalten kann. Mit dem Tool objdump
aus den GNU Binutils kann man die Binärcodes eines Universal Binaries auslesen.
Das universale Safari enthält sowohl Code für Intel (i386
) als auch für PowerPC (powerpc:common
). „mach-o-le
“ und „mach-o-be
“ stehen für die Byte-Reihenfolgen Little Endian und Big Endian.
$ objdump -f /Applications/Safari.app/Contents/MacOS/Safari In archive /Applications/Safari.app/Contents/MacOS/Safari: /Applications/Safari.app/Contents/MacOS/Safari: file format mach-o-le architecture: i386, flags 0x000001ff: HAS_RELOC, EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, DYNAMIC, WP_TEXT, D_PAGED start address 0x0000000000000000 /Applications/Safari.app/Contents/MacOS/Safari: file format mach-o-be architecture: powerpc:common, flags 0x000001ff: HAS_RELOC, EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, DYNAMIC, WP_TEXT, D_PAGED start address 0x0000000000061830
Es gibt auch Programme die in zwei getrennten Versionen (Intel-Binary und PPC-Binary) angeboten werden, hier muss man sich bereits beim Download für die richtige Datei entscheiden, was jedoch den Vorteil kleinerer Dateien hat.
Bei Programmen für nur eine Architektur wird entsprechend nur ein Binärcode angezeigt:
$ objdump -f /Applications/VLC.app/Contents/MacOS/VLC /Applications/VLC.app/Contents/MacOS/VLC: file format mach-o-le architecture: i386, flags 0x000001ff: HAS_RELOC, EXEC_P, HAS_LINENO, HAS_DEBUG, HAS_SYMS, HAS_LOCALS, DYNAMIC, WP_TEXT, D_PAGED start address 0x0000000000000000
Schon beim Wechsel von der Motorola-68k- auf die PowerPC-Prozessorarchitektur verwendete Apple das Konzept, in derselben Datei Code für mehrere Prozessoren unterzubringen. Damals wurde der Begriff Fat Binary verwendet. Realisiert wurde es jedoch nicht als Mach-O-Datei, sondern als das eigentlich modernere PEF-Dateiformat (Preferred Executable Format). Dabei lag der 68k-Code in der resource fork und der PPC-Code in der data fork.