Unterschied zwischen Universal und Fat Binaries
ml, den 20. August 2007Seit Apples Umstieg auf Intel-Prozessoren kommen einem die Begriffe Universal und Fat Binaries immer wieder unter. Doch was versteckt sich dahinter? Wir wollen es erklären.
Mit Universal Binaries bezeichnet Apple Programme, die sowohl Programmcode für PowerPC- als auch Intel-Macs enthalten. Daher müssen solche Anwendungen nicht auf den Intel-Macs von Rosetta emuliert werden, sondern können direkt ausgeführt werden.
Binärformate
Ausführbare Programme werden in einem bestimmten Binärformat gespeichert. Dieses enthält einen Header, der z. B. Informationen enthält, welche Bibliotheken geladen werden müssen und an welcher Stelle die Ausführung des Programms beginnen soll. Diese Informationen sind nötig, damit der Programmstarter die richtige Ausführungsumgebung für ein Programm herstellen kann. Das „Executable and Linking“-Format (kurz ELF) ist quasi Standard bei Unix-basierten Betriebssystemen.
Mach-O-Binärformat
Apple verwendet bei Mac OS X allerdings ein anderes Format, das Mach-O heißt. Dieses Format wurde bereits bei NextStep verwendet. Das Mach-O-Format kann im Gegensatz zum ELF-Format Binärcode für mehrere Architekturen enthalten. Damit ist es möglich die Programmvarianten für unterschiedliche Architekturen in eine ausführbare Datei zu packen. Der Programmstarter lädt dann anhand der Header-Informationen den richtigen Binärcode und startet das Programm.
Dieses Konzept ist nicht neu und bei Apple gibt es gewissermaßen ein Tradition damit. Bereits beim Umstieg von Motorola 68k-Prozessoren auf PowerPC kamen die damals „Fat Binaries“ genannten Binärdateien zum Einsatz. Darin war sowohl der Code für die 68k- als auch die PowerPC-Prozessoren enthalten. Mit dem Umstieg auf Intel-Prozessoren wurde dieses Konzept neu belebt und Universal Binary getauft. Gemeint ist damit, dass in dieser Mach-O-Datei der Programmcode für PowerPC- und Intel-Prozessoren enthalten ist. Inzwischen ist noch der Binärcode für die 64-Bit-Varianten beider Architekturen hinzugekommen. Insgesamt kann es also bis zu vier Varianten in einer Binärdatei geben.
Technik
Mit dem Kommandozeilenprogramm objdump
kann man die einzelnen Architekturen innerhalb einer Binärdatei sichtbar machen. Das Programm ist Bestandteil der „GNU binutils“. Analysiert man z. B. das beliebte FTP-Programm Transmit, erhält man im Terminal folgende Ausgabe:
ml $ objdump -f Transmit.app/Contents/MacOS/Transmit In archive Transmit.app/Contents/MacOS/Transmit: Transmit.app/Contents/MacOS/Transmit: 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 0x00002bd0 Transmit.app/Contents/MacOS/Transmit: 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 0x00000000
Man kann erkennen, dass Transmit Binärcode für die PowerPC- und die i386-Architektur (Intel) enthält. Das Format mach-o-be
gibt an, dass es sich hier um Daten im Big-Endian-Format handelt – mach-o-le
steht analog für Little-Endian-Daten; die Startadressen für beide Architekturen sind unterschiedlich.
Vor- und Nachteile
Der Vorteil Binärcode unterschiedlicher Architekturen in einer ausführbaren Datei zu kombinieren ist, dass nicht zahllose Varianten der gleichen Applikation angeboten werden müssen. Man lädt einfach das Programm herunter und kann sicher sein, dass es den richtigen Code für die eigene Architektur enthält. Für Softwareanbieter erleichtert sich damit der Vertrieb. Die Auswahl des richtigen Binärcodes übernimmt der Programmstarter des Betriebssystems. Eine andere Möglichkeit wäre alle nötigen Varianten in einem Installationspaket zu verpacken und den Installer die richtige Variante auswählen zu lassen. Das ist allerdings nicht so bequem für den Anwender.
Der Nachteil ist, dass die Größe von Programmen anwächst, da sie Binärcode für unterschiedliche Architekturen enthalten. Allerdings ist dieser Nachteil angesichts heutiger Festplattengrößen verschmerzbar. Die Ausführungsgeschwindigkeit solcher Anwendungen leidet nicht darunter, da der Programmstarter nur den für die Architektur benötigten Code lädt.
Ballast abwerfen
Wer dennoch den unnötigen Ballast der zweiten Architektur von seinem Mac zu verbannen möchte, kann zu Programmen wie z. B. Xslimmer greifen. Damit kann man den nicht benötigten Binärcode entfernen. Allerdings kann man dann die so auf Diät gesetzte Anwendung nicht mehr beliebig auf einen anderen Mac übertragen.