4.12. Binärformate

Um zu verstehen, warum FreeBSD das Format elf(5) benutzt, müssen zunächst die drei gegenwärtig dominanten ausführbaren Formate für UNIX® beschrieben werden:

FreeBSD kommt aus dem klassischen Lager und verwendete traditionell das Format a.out(5), eine Technik, die bereits über viele BSD-Releases hinweg eingesetzt und geprüft worden ist. Obwohl es bereits seit einiger Zeit möglich war, auf einem FreeBSD-System auch Binaries (und Kernel) im ELF-Format zu erstellen und auszuführen, widersetzte FreeBSD sich anfangs dem Druck, auf ELF als Standardformat umzusteigen. Warum? Nun, als Linux die schmerzhafte Umstellung auf ELF durchführte, weil der unflexible, auf Sprungtabellen basierte Mechanismus für Shared-Libraries der die Konstruktion von Shared-Libraries für Hersteller und Entwickler kompliziert machte. Da die verfügbaren ELF-Werkzeuge eine Lösung für das Problem mit den Shared-Libraries anboten und generell als ein Schritt vorwärts angesehen wurden, wurde der Aufwand für die Umstellung als notwendig akzeptiert und die Umstellung wurde durchgeführt. Unter FreeBSD ist der Mechanismus von Shared-Libraries enger an den Stil des Shared-Library-Mechanismus von SunOS™ angelehnt und einfacher zu verwenden.

Ja, aber warum gibt es so viele unterschiedliche Formate? Damals zu Zeiten der PDP-11, als simple Hardware ein einfaches, kleines System unterstützte, war a.out absolut passend für die Aufgabe, Binaries darzustellen. Als UNIX® portiert wurde, wurde auch das a.out-Format beibehalten, weil es für die frühen Portierungen auf Architekturen wie den Motorola 68k oder die VAX ausreichte.

Dann dachte sich ein schlauer Hardware-Ingenieur, dass, wenn er Software zwingen könnte, einige Tricks anzustellen, es ihm möglich wäre, ein paar Gatter im Design zu sparen, und die CPU schneller zu machen. a.out war für diese neue Art von Hardware, bekannt als RISC, schlecht geeignet. Viele neue Formate wurden entwickelt, um eine bessere Leistung auf dieser Hardware zu erreichen, als mit dem begrenzten, simplen a.out-Format. COFF, ECOFF und einige andere wurden erdacht und ihre Grenzen untersucht, bevor man sich auf ELF festgelegt hat.

Hinzu kam, dass die Größe von Programmen gewaltig wurde und Festplatten sowie physikalischer Speicher immer noch relativ klein waren. Also wurde das Konzept von Shared-Libraries geboren. Die virtuelle Speicherverwaltung wurde auch immer fortgeschrittener. Obwohl bei jedem dieser Fortschritte das a.out-Format benutzt worden ist, wurde sein Nutzen mit jedem neuen Merkmal mehr gedehnt. Zusätzlich wollte man Dinge dynamisch zur Ausführungszeit laden, oder Teile eines Programms nach der Initialisierung wegwerfen, um Hauptspeicher oder Swap-Speicher zu sparen. Programmiersprachen wurden immer fortschrittlicher und man wollte, dass Code automatisch vor der main-Funktion aufgerufen wird. Das a.out-Format wurde oft überarbeitet, um alle diese Dinge zu ermöglichen und sie funktionierten auch für einige Zeit. a.out konnte diese Probleme nicht ohne ein ständiges Ansteigen eines Overheads im Code und in der Komplexität handhaben. Obwohl ELF viele dieser Probleme löste, wäre es sehr aufwändig, ein System umzustellen, das im Grunde genommen funktionierte. Also musste ELF warten, bis es aufwändiger war, bei a.out zu bleiben, als zu ELF überzugehen.

Im Laufe der Zeit haben sich die Erstellungswerkzeuge, von denen FreeBSD seine Erstellungswerkzeuge abgeleitet hat, speziell der Assembler und der Loader, in zwei parallele Zweige entwickelt. Im FreeBSD-Zweig wurden Shared-Libraries hinzugefügt und einige Fehler behoben. Das GNU-Team, das diese Programme ursprünglich geschrieben hat, hat sie umgeschrieben und eine simplere Unterstützung zur Erstellung von Cross-Compilern durch beliebiges Einschalten verschiedener Formate hinzugefügt. Viele Leute wollten Cross-Compiler für FreeBSD erstellen, aber sie hatten kein Glück, denn FreeBSD's ältere Sourcen für as und ld waren hierzu nicht geeignet. Die neuen GNU-Werkzeuge (binutils) unterstützen Cross-Compilierung, ELF, Shared-Libraries und C++-Erweiterungen. Weiterhin geben viele Hersteller ELF-Binaries heraus und FreeBSD sollte in der Lage sein, diese ausführen.

ELF ist ausdrucksfähiger als a.out und gestattet eine bessere Erweiterbarkeit des Basissystems. Die ELF-Werkzeuge werden besser gewartet und bieten Unterstützung für Cross-Compilierung. ELF mag etwas langsamer sein, als a.out, aber zu versuchen, das zu messen, könnte schwierig werden. Es gibt unzählige Details, in denen sich die beiden Formate unterscheiden, wie sie Pages abbilden, oder Initialisierungscode handhaben. Irgendwann wird die Unterstützung für Programme im a.out-Format aus dem GENERIC-Kernel entfernt werden. Wenn es dann keinen oder kaum noch Bedarf für die Unterstützung dieses Formates gibt, werden die entsprechenden Routinen ganz entfernt werden.

Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an <de-bsd-questions@de.FreeBSD.org>.

Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an <de-bsd-translators@de.FreeBSD.org>.