<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Common_Object_File_Format</id>
	<title>Common Object File Format - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Common_Object_File_Format"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Common_Object_File_Format&amp;action=history"/>
	<updated>2026-05-16T18:35:37Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Common_Object_File_Format&amp;diff=461245&amp;oldid=prev</id>
		<title>imported&gt;Siegbert v2: Archivversion oder alt. URL für Offline-Links / Artikel verknüpft / Kleinkram</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Common_Object_File_Format&amp;diff=461245&amp;oldid=prev"/>
		<updated>2025-11-02T04:08:53Z</updated>

		<summary type="html">&lt;p&gt;Archivversion oder alt. URL für Offline-Links / Artikel verknüpft / Kleinkram&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Das &amp;#039;&amp;#039;&amp;#039;Common Object File Format&amp;#039;&amp;#039;&amp;#039; (&amp;#039;&amp;#039;&amp;#039;COFF&amp;#039;&amp;#039;&amp;#039;; {{deS|„allgemeines Objektdateiformat“}}) ist ein [[Binärformat]] für Programme und Objektdateien. Es wurde von [[AT&amp;amp;T]] für das [[Betriebssystem]] [[Unix System V]] eingeführt&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.ti.com/lit/an/spraao8/spraao8.pdf |titel=Common Object File Format |werk=ti.com |hrsg=Texas Instruments |datum=2009-04 |format=PDF; 129&amp;amp;nbsp;kB |sprache=en |abruf=2014-03-08}}&amp;lt;/ref&amp;gt; und findet heutzutage vor allem im darauf aufbauenden Format PE für [[Microsoft Windows|Windows]] Verwendung (siehe [[Portable Executable]]). Für Dateiendungen wird, falls vorhanden und abgesehen von den für PE genutzten Endungen, oft „cof“, „obj“ oder „[[Lib (Dateierweiterung)|lib]]“ verwendet.&lt;br /&gt;
&lt;br /&gt;
== Geschichte ==&lt;br /&gt;
Ursprünglich wurde das Format [[a.out]] für ausführbare Dateien unter [[Unix]] verwendet. Dieses unterstützte jedoch moderne Entwicklungen wie eingebettete [[Debugging]]-Informationen oder [[dynamische Bibliothek]]en nicht. Deshalb entwickelte AT&amp;amp;T für Release 3 vom Unix System V das Common Object File Format.&amp;lt;ref&amp;gt;{{Internetquelle |url=http://h10025.www1.hp.com/ewfrf/wc/document?cc=de&amp;amp;lc=de&amp;amp;dlc=de&amp;amp;tmp_geoLoc=true&amp;amp;docname=c00346014 |titel=Product Description – SCO System V for Linux |werk=hp.com |sprache=en |archiv-url=https://web.archive.org/web/20140309023908/http://h10025.www1.hp.com/ewfrf/wc/document?cc=de&amp;amp;lc=de&amp;amp;dlc=de&amp;amp;tmp_geoLoc=true&amp;amp;docname=c00346014 |archiv-datum=2014-03-09 |abruf=2025-11-02}}&amp;lt;/ref&amp;gt; Da das originale COFF designtechnisch beschränkt war, entwickelten sich unterschiedliche Varianten unter den Unix-Herstellern (z.&amp;amp;nbsp;B. XCOFF von [[IBM]] für [[AIX]]&amp;lt;ref&amp;gt;{{Internetquelle |url=https://www.ibm.com/docs/en/aix/7.3.0?topic=formats-xcoff-object-file-format |titel=XCOFF Object File Format |werk=ibm.com |hrsg=IBM |datum=2025-07-11 |sprache=en |abruf=2013-03-08}}&amp;lt;/ref&amp;gt;, ECOFF von SGI und anderen). Mit dem Release 4 von System V im Jahre 1989 ersetzte AT&amp;amp;T COFF durch das neue, gemeinsam mit [[Sun Microsystems]] entwickelte Format [[Executable and Linking Format|ELF]] (Executable and Linking Format).&amp;lt;ref&amp;gt;{{Internetquelle |url=http://h41361.www4.hp.com/docs/base_doc/DOCUMENTATION/V50A_ACRO_SUP/OBJSPEC.PDF |titel=Object File / Symbol Table Format Specification |werk=hp.com |hrsg=Compaq/HP |datum=1999-07 |format=PDF; 1,7&amp;amp;nbsp;MB |sprache=en |archiv-url=https://web.archive.org/web/20160305114748/http://h41361.www4.hp.com/docs/base_doc/DOCUMENTATION/V50A_ACRO_SUP/OBJSPEC.PDF |archiv-datum=2016-03-05 |abruf=2014-03-08}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
Mit COFF wurde es möglich, Debugging-Informationen direkt in eine Binärdatei einzubetten. Bibliotheken können dynamisch gelinkt und als separate Dateien gehandhabt werden, brauchen also nicht zum unveränderlichen, unaustauschbaren Bestandteil einer Programmdatei zu werden. Dazu werden alle Adressen in den Relokationseinträgen relativ zur eigentlichen Adresse der Sektion in den virtuellen Speicher der Anwendung geladen. Dadurch braucht die Adresse der Sektion erst zur [[Übersetzungszeit]] festgelegt zu werden anstatt bereits bei der Programmierung. Nach COFF entwickelte Formate besitzen diese Fähigkeiten ebenfalls.&lt;br /&gt;
&lt;br /&gt;
== Verwendung ==&lt;br /&gt;
Moderne Unix- und [[Linux]]-Versionen unterstützen COFF nicht mehr, allerdings wird es für [[Eingebettete Systeme]] noch verwendet.&amp;lt;ref&amp;gt;{{Internetquelle |autor=Devyn C. Johnson |url=http://www.linux.org/threads/types-of-executables.4792/ |titel=Types of Executables |werk=linux.org |datum=2013-10-20 |sprache=en |archiv-url=https://web.archive.org/web/20140309023550/http://www.linux.org/threads/types-of-executables.4792/ |archiv-datum=2014-03-09 |abruf=2025-11-02}}&amp;lt;/ref&amp;gt; Unter [[Windows NT]] (und früher) ist die COFF-Variante [[Portable Executable]] (PE, manchmal auch PE/COFF) das Standarddateiformat für Bibliotheken und ausführbare Dateien, allerdings unterscheidet sich diese Variante geringfügig vom ursprünglichen COFF.&amp;lt;ref&amp;gt;{{Internetquelle |url=https://learn.microsoft.com/en-us/windows/win32/debug/pe-format |titel=PE and COFF Specification |werk=[[Microsoft Developer Network|MSDN]] |hrsg=Microsoft |sprache=en |abruf=2014-03-08}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
Eine COFF-Datei besteht aus mehreren Teilen. Sie beginnt mit dem &amp;#039;&amp;#039;File Header&amp;#039;&amp;#039; und einem &amp;#039;&amp;#039;Optional Header&amp;#039;&amp;#039;. Dann folgt eine Anzahl von &amp;#039;&amp;#039;Sektionen&amp;#039;&amp;#039;, bestehend aus Header, einer Datensektion sowie einem Bereich für Zeilennummerneinträge und einem Bereich für Relokationseinträge. Am Dateiende folgen eine [[Symboltabelle]] und eine [[Zeichenkette]]ntabelle.&lt;br /&gt;
&lt;br /&gt;
=== File Header ===&lt;br /&gt;
Der &amp;#039;&amp;#039;File Header&amp;#039;&amp;#039; steht am Anfang einer [[Datei]]. Dort sind Daten gespeichert, die den Aufbau der gesamten Datei beschreiben. Dazu gehört die [[Magische Zahl (Informatik)#Magische Zahlen zur Kennzeichnung von Dateitypen|Magische Zahl]], die für die unterschiedlichen Varianten (&amp;#039;&amp;#039;PE&amp;#039;&amp;#039;, &amp;#039;&amp;#039;XCOFF&amp;#039;&amp;#039; etc.) unterschiedlich ist, ein [[Unixzeit|Unix-Timestamp]] mit dem Zeitpunkt der Erstellung der Datei, sowie die Position und Größe anderer Sektionen. Zudem können mittels [[Flag (Informatik)|Flag]] verschiedene Eigenschaften der Datei definiert werden (z.&amp;amp;nbsp;B. ob sie ausführbar ist).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct filehdr {&lt;br /&gt;
    unsigned short  f_magic;        /* Magische Zahl */&lt;br /&gt;
    unsigned short  f_nscns;        /* Anzahl der Sektionen in der Datei */&lt;br /&gt;
    long            f_timdat;       /* Zeitstempel der Erstellung */&lt;br /&gt;
    long            f_symptr;       /* Zeiger zur Symboltabelle */&lt;br /&gt;
    long            f_nsyms;        /* Größe der Symboltabelle */&lt;br /&gt;
    unsigned short  f_opthdr;       /* Größe der &amp;quot;optional header&amp;quot; */&lt;br /&gt;
    unsigned short  f_flags;        /* Flags */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Optional Header ===&lt;br /&gt;
Der &amp;#039;&amp;#039;Optional Header&amp;#039;&amp;#039; enthält je nach COFF-Variante unterschiedliche Daten. Oft wird er für weitere zur Ausführung benötigte Informationen (z.&amp;amp;nbsp;B. die [[Einsprungpunkt|Einstiegsadresse]]) verwendet. Da er unterschiedlich lang sein kann, ist seine Größe im &amp;quot;File Header&amp;quot; gespeichert.&lt;br /&gt;
&lt;br /&gt;
=== Section Header ===&lt;br /&gt;
Der &amp;#039;&amp;#039;Section Header&amp;#039;&amp;#039; enthält Daten über eine Sektion, insbesondere wie groß diese ist und wohin sie in den [[Virtuelle Speicherverwaltung|virtuellen Speicher]] geladen werden sollte. Für ausführbare Dateien in der Regel der Anfang des Speichers, d.&amp;amp;nbsp;h. die erste Sektion wird an die Adresse 0 geladen, für gelinkte Daten kann dies anders sein. Zudem enthalten sie einen [[Zeiger (Informatik)|Zeiger]] auf und die Größe der Zeilennummerneinträge und der Relokationseinträge.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
struct sectionhdr {&lt;br /&gt;
    char           s_name[8];  /* Name der Sektion */&lt;br /&gt;
    unsigned long  s_paddr;    /* Speicheradresse, an die diese Sektion geladen werden soll*/&lt;br /&gt;
    unsigned long  s_vaddr;    /* virtuelle Adresse, an die diese Sektion geladen werden soll */&lt;br /&gt;
    unsigned long  s_size;     /* Größe der Sektion (inklusive Header)*/&lt;br /&gt;
    unsigned long  s_scnptr;   /* Zeiger zu den Daten dieser Sektion */&lt;br /&gt;
    unsigned long  s_relptr;   /* Zeiger zu den Relokationseinträgen dieser Sektion */&lt;br /&gt;
    unsigned long  s_lnnoptr;  /* Zeiger zu dem Zeilennummerneinträgen dieser Sektion */&lt;br /&gt;
    unsigned short s_nreloc;   /* Anzahl der Relokationseinträge */&lt;br /&gt;
    unsigned short s_nlnno;    /* Anzahl der Zeilennummerneinträge */&lt;br /&gt;
    unsigned long  s_flags;    /* Flags */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Datensektion ===&lt;br /&gt;
Die Datensektion kann unterschiedlich lang sein. Sie enthält die eigentlichen Daten in der Datei. Dies sind in der Regel Anweisungen in [[Maschinencode]], Platz für Variablen und Daten, die für die Ausführung benötigt werden – kurzum, das eigentliche Programm.&lt;br /&gt;
&lt;br /&gt;
=== Relokationseintrag ===&lt;br /&gt;
Ein Relokationseintrag definiert, wo die Symbole in der Datensektion gefunden werden können. Dies wird für jedes Symbol einzeln definiert.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct reloc{&lt;br /&gt;
    unsigned long  r_vaddr;   /* Adresse für die Relokation */&lt;br /&gt;
    unsigned long  r_symndx;  /* Symbol, für das die Relokation gilt */&lt;br /&gt;
    unsigned short r_type;    /* Type der Relokation*/&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Zeilennummerneintrag ===&lt;br /&gt;
Ein Zeilennummerneintrag definiert, welche Zeile im [[Quellcode]] welcher Anweisung im Maschinencode entspricht. Dies ist insbesondere zum [[Debugger|Debuggen]] von Anwendungen wichtig. Jede Sektion hat ihre eigene Tabelle mit Zeilennummern. Die Zeilen werden dabei für jede [[Funktion (Programmierung)|Funktion]] in der Sektion einzeln gezählt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct lineno{&lt;br /&gt;
    union l_addr{&lt;br /&gt;
        unsigned long l_symndx;  /* Index des Namens der Funktion */&lt;br /&gt;
        unsigned long l_paddr;   /* Adresse der Zeilennummer */&lt;br /&gt;
    };&lt;br /&gt;
    unsigned short l_lnno;  /* Zeilennummer */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Zeilennummern werden ab Anfang jeder Funktion ab 0 hochgezählt. Für eine Zeile, auf der eine Funktion beginnt, wird also ein Eintrag mit &amp;lt;code&amp;gt;l_lnno = 0&amp;lt;/code&amp;gt; und dem Symbol der Funktion als &amp;lt;code&amp;gt;l_symndx&amp;lt;/code&amp;gt; erstellt. Für jede weitere Zeile in der Funktion wird ein Eintrag mit der Anzahl an Zeilen seit dem Funktionsbeginn als &amp;lt;code&amp;gt;l_lnno&amp;lt;/code&amp;gt; erstellt und der Adresse der ersten Anweisung aus dieser Zeile als &amp;lt;code&amp;gt;l_paddr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Symboltabelle ===&lt;br /&gt;
Die Symboltabelle enthält Informationen über die in der Datei vorhandenen Symbole. Symbole sind z.&amp;amp;nbsp;B. Funktionen oder Variablen, die von anderen Programmen verwendet werden können. Die Größe und die Position der Symboltabelle wird im &amp;#039;&amp;#039;File Header&amp;#039;&amp;#039; festgelegt. Die Symboltabelle besteht aus Einträgen der Form&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct sysent{&lt;br /&gt;
  union e {&lt;br /&gt;
    char e_name[8];             /* Name des Symbols */&lt;br /&gt;
    struct e {&lt;br /&gt;
      unsigned long e_zeroes;   /* Falls 0, ist der Name des Symbols in der Zeichenkettentabelle angelegt*/&lt;br /&gt;
      unsigned long e_offset;   /* Position des Symbols in der Zeichenkettentabelle */&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
  unsigned long e_value;        /* Wert (in der Regel Adresse) des Symbols */&lt;br /&gt;
  short e_scnum;                /* Sektion */&lt;br /&gt;
  unsigned short e_type;        /* Datentyp */&lt;br /&gt;
  unsigned char e_sclass;       /* Speicherklasse */&lt;br /&gt;
  unsigned char e_numaux;       /* Anzahl zusätzlicher Einträge*/&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Der Name des Symbols wird in &amp;lt;code&amp;gt;e_name&amp;lt;/code&amp;gt; gespeichert, wenn er höchstens acht Zeichen lang ist. Ansonsten wird er in der Zeichenkettentabelle abgelegt, dann ist &amp;lt;code&amp;gt;e_zeros = 0&amp;lt;/code&amp;gt;, und &amp;lt;code&amp;gt;e_offset&amp;lt;/code&amp;gt; gibt die Position dieses Eintrags in der Zeichenkettentabelle an. Der „Wert“ des Symbols wird in &amp;lt;code&amp;gt;e_value&amp;lt;/code&amp;gt; gespeichert. Dies ist in der Regel die Adresse, an der dieses Symbol abgelegt ist, welche wiederum vom Datentyp und der Speicherklasse abhängt, die in &amp;lt;code&amp;gt;e_sclass&amp;lt;/code&amp;gt; abgelegt ist. &amp;lt;code&amp;gt;e_type&amp;lt;/code&amp;gt; definiert den Datentypen des Symbols. Dies kann entweder ein [[Datentyp#Elementare Datentypen|elementarer Typ]] (int, float etc.) oder ein [[Verbund (Datentyp)|zusammengesetzter Typ]] („struct“, „union“) sein. Zudem kann das Symbol einen Wert, einen Zeiger („pointer“), ein [[Array (Datentyp)|Feld]] („array“) oder eine Funktion, die diesen Wert zurückgibt, definieren. &amp;lt;code&amp;gt;e_class&amp;lt;/code&amp;gt; definiert die Speicherklasse, also wo und wie das Symbol abgelegt ist (z.&amp;amp;nbsp;B. kann es ein externes Symbol sein, ein Funktionsargument, eine globale oder statische Variable etc.). Abhängig von Typen des Symbols können zusätzliche Einträge folgen. Die Anzahl dieser Einträge ist mit &amp;lt;code&amp;gt;e_numaux&amp;lt;/code&amp;gt; angegeben.&lt;br /&gt;
&lt;br /&gt;
=== Zeichenkettentabelle ===&lt;br /&gt;
Die Zeichenkettentabelle folgt am Schluss der Datei. Sie beginnt mit einer [[Integer (Datentyp)|Ganzzahl]] („integer“), in der die Länge der Tabelle gespeichert ist. Danach folgen alle Zeichenketten hintereinander. Um eine Zeichenkette zu lesen, muss man deren Position kennen und kann an dieser Stelle mit dem Lesen beginnen. Die Zeichenketten sind [[Zeichenkette#Repräsentation mit Abschlusszeichen|nullterminiert]].&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* {{Internetquelle |url=http://delorie.com/djgpp/doc/coff/ |titel=DJGPP COFF Spec |sprache=en |abruf=2025-11-02 |abruf-verborgen=ja |kommentar=weitere Details zu einer COFF-Implementierung}}&lt;br /&gt;
* {{Internetquelle |url=http://www-scf.usc.edu/~csci402/ncode/coff_8h-source.html |titel=MIPS COFF als C-Datentypen |sprache=en |archiv-url=https://web.archive.org/web/20140723105157/http://www-scf.usc.edu/~csci402/ncode/coff_8h-source.html |archiv-datum=2014-07-23 |abruf=2025-11-02 |abruf-verborgen=ja}}&lt;br /&gt;
* {{Internetquelle |url=http://support.microsoft.com/?id=121460 |titel=Microsoft COFF Information |sprache=en |archiv-url=https://web.archive.org/web/20120716184514/http://support.microsoft.com/?id=121460 |archiv-datum=2012-07-16 |abruf=2025-11-02 |abruf-verborgen=ja}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=4356762-9}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Binärformat für ausführbare Programme, Bibliotheken und/oder Objektcode]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Siegbert v2</name></author>
	</entry>
</feed>