Update to r42604:
Remove the no-longer-relevant section on binary formats.
This commit is contained in:
parent
9f1fd7d856
commit
6457f53b95
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=47715
1 changed files with 1 additions and 178 deletions
|
@ -5,7 +5,7 @@
|
|||
|
||||
$FreeBSD$
|
||||
$FreeBSDde$
|
||||
basiert auf: r42014
|
||||
basiert auf: r42604
|
||||
-->
|
||||
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="basics">
|
||||
<info><title>Grundlagen des UNIX Betriebssystems</title>
|
||||
|
@ -60,9 +60,6 @@
|
|||
<listitem>
|
||||
<para>Geräte und Gerätedateien,</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Binärformate unter &os; und</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>wie Sie in den Manualpages nach weiteren Informationen
|
||||
suchen können.</para>
|
||||
|
@ -2441,180 +2438,6 @@ Swap: 256M Total, 38M Used, 217M Free, 15% Inuse
|
|||
zugegriffen.</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="binary-formats">
|
||||
<title>Binärformate</title>
|
||||
|
||||
<para>Wenn ein Kommando an die Shell übergeben wird, dann wird die
|
||||
Shell die ausführbare Datei in den Speicher laden und einen
|
||||
neuen Prozess erstellen. Ausführbare Dateien sind entweder
|
||||
Binärdateien (die meist vom Linker während der Übersetzung
|
||||
eines Programms erzeugt werden), oder ein Shell-Skript (eine
|
||||
Textdatei, welche von einer Binärdatei, wie &man.sh.1; oder
|
||||
&man.perl.1; interpretiert wird). Das Kommando &man.file.1;
|
||||
kann für gewöhnlich bestimmen, von welchem Typ eine Datei
|
||||
ist.</para>
|
||||
|
||||
<para>Binärdateien benötigen ein klar definiertes Format, damit
|
||||
das System in der Lage ist, sie richtig zu verwenden. Ein Teil
|
||||
der Datei enthält den ausführbaren Maschinencode (Anweisungen
|
||||
die der CPU sagen, was zu tun ist), ein anderer Teil enthält
|
||||
Daten mit vordefinierten Werten, ein weiterer wiederum Daten
|
||||
ohne vordefinierte Werte. Im Laufe der Zeit wurden verschiedene
|
||||
binäre Dateiformate entwickelt.</para>
|
||||
|
||||
<para>Um zu verstehen, warum &os; das Format &man.elf.5; benutzt,
|
||||
müssen zunächst die drei gegenwärtig <quote>dominanten</quote>
|
||||
ausführbaren Formate für &unix; beschrieben werden:</para>
|
||||
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>&man.a.out.5;</para>
|
||||
|
||||
<para>Das älteste und <quote>klassische</quote>
|
||||
Objektformat von &unix; Systemen. Es benutzt einen kurzen,
|
||||
kompakten Header mit einer
|
||||
<foreignphrase>&man.magic.5; number</foreignphrase> am
|
||||
Anfang, die oft benutzt wird, um das Format zu
|
||||
charakterisieren. Es enthält drei geladene Segmente: .text,
|
||||
.data und .bss, sowie eine Symboltabelle und eine
|
||||
Stringtabelle.</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para><acronym>COFF</acronym></para>
|
||||
|
||||
<para>Das Objektformat von SVR3. Der Header
|
||||
enthält eine <quote>Sectiontable</quote>, die mehr enthalten
|
||||
kann als nur .text, .data und .bss Sektionen..</para>
|
||||
</listitem>
|
||||
|
||||
<listitem>
|
||||
<para>&man.elf.5;</para>
|
||||
|
||||
<para>Der Nachfolger von <acronym>COFF</acronym>.
|
||||
Kennzeichnend sind mehrere Sections und mögliche
|
||||
32-Bit- oder 64-Bit-Werte. Ein wesentlicher Nachteil ist,
|
||||
dass <acronym>ELF</acronym> unter der Annahme entworfen
|
||||
wurde, dass es nur eine ABI (Application Binary Interface)
|
||||
pro Systemarchitektur geben wird. Tatsächlich ist diese
|
||||
Annahme falsch, denn nicht einmal für die kommerzielle
|
||||
SYSV-Welt (in der es mindestens drei ABIs gibt: SVR4,
|
||||
Solaris, SCO) trifft sie zu.</para>
|
||||
|
||||
<para>&os; versucht dieses Problem zu umgehen, indem
|
||||
ein Werkzeug bereitgestellt wird, um ausführbare
|
||||
Dateien im <acronym>ELF</acronym>-Format mit
|
||||
Informationen über die ABI zu versehen, zu der
|
||||
sie passen. Weitere Informationen finden Sie in
|
||||
&man.brandelf.1;.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
||||
<para>&os; kommt aus dem <quote>klassischen</quote> Lager
|
||||
und verwendete traditionell das Format &man.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
|
||||
&os;-System auch Binaries (und Kernel) im
|
||||
<acronym>ELF</acronym>-Format zu erstellen und
|
||||
auszuführen, widersetzte &os; sich anfangs dem
|
||||
<quote>Druck</quote>, auf <acronym>ELF</acronym> als
|
||||
Standardformat umzusteigen. Warum? Nun, als
|
||||
Linux die schmerzhafte Umstellung auf
|
||||
<acronym>ELF</acronym> durchführte, weil der
|
||||
unflexible, auf Sprungtabellen basierte Mechanismus
|
||||
für <quote>Shared-Libraries</quote> der die Konstruktion von
|
||||
Shared-Libraries für Hersteller und Entwickler kompliziert
|
||||
machte. Da die verfügbaren <acronym>ELF</acronym>-Werkzeuge
|
||||
eine Lösung für das Problem mit den Shared-Libraries
|
||||
anboten und generell als <quote>ein Schritt
|
||||
vorwärts</quote> angesehen wurden, wurde der Aufwand
|
||||
für die Umstellung als notwendig akzeptiert und die
|
||||
Umstellung wurde durchgeführt. Unter &os; ist der
|
||||
Mechanismus von Shared-Libraries enger an den Stil des
|
||||
Shared-Library-Mechanismus von &sunos;
|
||||
angelehnt und einfacher zu verwenden.</para>
|
||||
|
||||
<para>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 <filename>a.out</filename>
|
||||
absolut passend für die Aufgabe, Binaries darzustellen. Als
|
||||
&unix; portiert wurde, wurde auch das
|
||||
<filename>a.out</filename>-Format beibehalten, weil es für die
|
||||
frühen Portierungen auf Architekturen wie den Motorola 68k oder
|
||||
die VAX ausreichte.</para>
|
||||
|
||||
<para>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. <filename>a.out</filename> war für diese
|
||||
neue Art von Hardware, bekannt als <acronym>RISC</acronym>,
|
||||
schlecht geeignet. Viele neue Formate wurden entwickelt, um
|
||||
eine bessere Leistung auf dieser Hardware zu erreichen, als mit
|
||||
dem begrenzten, simplen <filename>a.out</filename>-Format.
|
||||
<acronym>COFF</acronym>, <acronym>ECOFF</acronym> und
|
||||
einige andere wurden erdacht und ihre Grenzen
|
||||
untersucht, bevor man sich auf <acronym>ELF</acronym>
|
||||
festgelegt hat.</para>
|
||||
|
||||
<para>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
|
||||
<filename>a.out</filename>-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 <filename>a.out</filename>-Format wurde oft
|
||||
überarbeitet, um alle diese Dinge zu ermöglichen
|
||||
und sie funktionierten auch für einige Zeit.
|
||||
<filename>a.out</filename> konnte diese Probleme nicht
|
||||
ohne ein ständiges Ansteigen eines Overheads im Code
|
||||
und in der Komplexität handhaben. Obwohl
|
||||
<acronym>ELF</acronym> viele dieser Probleme löste,
|
||||
wäre es sehr aufwändig, ein System umzustellen, das
|
||||
im Grunde genommen funktionierte. Also musste
|
||||
<acronym>ELF</acronym> warten, bis es aufwändiger war, bei
|
||||
<filename>a.out</filename> zu bleiben, als zu
|
||||
<acronym>ELF</acronym> überzugehen.</para>
|
||||
|
||||
<para>Im Laufe der Zeit haben sich die Erstellungswerkzeuge,
|
||||
von denen &os; seine Erstellungswerkzeuge abgeleitet
|
||||
hat, speziell der Assembler und der Loader, in zwei
|
||||
parallele Zweige entwickelt. Im &os;-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 &os; erstellen, aber sie hatten
|
||||
kein Glück, denn &os;'s ältere Sourcen für &man.as.1; und
|
||||
&man.ld.1; waren hierzu nicht geeignet. Die neuen
|
||||
GNU-Werkzeuge (<application>binutils</application>) unterstützen
|
||||
Cross-Compilierung, <acronym>ELF</acronym>, Shared-Libraries und
|
||||
C++-Erweiterungen. Weiterhin geben viele
|
||||
Hersteller <acronym>ELF</acronym>-Binaries heraus und &os;
|
||||
sollte in der Lage sein, diese ausführen.</para>
|
||||
|
||||
<para><acronym>ELF</acronym> ist ausdrucksfähiger als
|
||||
<filename>a.out</filename> und gestattet eine bessere Erweiterbarkeit
|
||||
des Basissystems. Die <acronym>ELF</acronym>-Werkzeuge werden
|
||||
besser gewartet und bieten Unterstützung für Cross-Compilierung.
|
||||
<acronym>ELF</acronym> mag etwas langsamer sein, als
|
||||
<filename>a.out</filename>, 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.</para>
|
||||
</sect1>
|
||||
|
||||
<sect1 xml:id="basics-more-information">
|
||||
<title>Weitere Informationen</title>
|
||||
|
||||
|
|
Loading…
Reference in a new issue