Universal Binary

aus Wikipedia, der freien Enzyklopädie
Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 11. Januar 2016 um 22:36 Uhr durch Aka (Diskussion | Beiträge) (→‎Technisches: Link korrigiert | ♥). Sie kann sich erheblich von der aktuellen Version unterscheiden.
Zur Navigation springen Zur Suche springen
Apples Universal Binary-Logo

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, also eine Form des Fat Binary Konzepts. Es ist auch möglich, den Code für 32-Bit- und 64-Bit-Systeme auf diese Weise zu integrieren. Eine Universal Binary enthält somit bis zu vier 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) – ggf. sogar jeweils in der 32-Bit- und der 64-Bit-Variante.

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.

Technisches

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 lipo[1] aus Xcode und objdump[2] aus den GNU Binutils kann man die Binärcodes eines Universal Binaries auslesen. Auch file[3] gibt einen Überblick über die enthaltenen Architekturen.

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 (sofern man nicht doppelt herunterladen möchte) bereits beim Herunterladen 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

Ohne zusätzliche Programme lässt sich der Binärcode mit dem Befehl file auslesen, also für das obige Beispiel Safari: file /Applications/Safari.app/Contents/MacOS/Safari.

Hintergrund

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.

Weblinks

Einzelnachweise

  1. lipo.1 manpage im Quelltext (englisch), abgerufen am 21. Juli 2015
  2. objdump(1) manpage (englisch), abgerufen am 21. Juli 2015
  3. file(1) manpage (englisch), abgerufen am 21. Juli 2015