Společný formát souboru objektu
Common Object File Format ( COFF , německý generál objekt formát souboru ) je binární formát pro programy a objektových souborů. To bylo představeno od AT & T pro Unix System V operačním systému a nyní se používá převážně ve formátu PE pro Windows založený na ní (viz Portable Executable ). „Cof“, „obj“ nebo „ lib “ se často používají pro přípony souborů, pokud jsou k dispozici, a kromě přípon používaných pro PE .
příběh
Formát a.out byl původně použit pro spustitelné soubory v systému Unix . To však nepodporovalo moderní vývoj, jako jsou vložené informace o ladění nebo dynamické knihovny . Proto společnost AT&T vyvinula společný formát souborů objektů pro vydání 3 systému Unix System V. Protože původní COFF byl designově omezený, vyvinuly se mezi unixovými výrobci různé varianty (např.XCOFF od IBM pro AIX , ECOFF od SGI a další). S vydáním 4 systému V v roce 1989 AT&T nahradil COFF novým formátem ELF (Executable and Linking Format) vyvinutým společně se Sun Microsystems .
charakteristiky
COFF umožnil vložit ladicí informace přímo do binárního souboru. Knihovny lze dynamicky propojovat a zpracovávat jako samostatné soubory, takže se nemusí stát nezměnitelnou, nevyměnitelnou součástí programového souboru. Za tímto účelem jsou všechny adresy v položkách přemístění načteny do virtuální paměti aplikace ve vztahu ke skutečné adrese sekce. Tato adresa potřebuje část pouze pro to, aby byl čas kompilace nastaven již na místě v programování. Tyto funkce mají také formáty vyvinuté podle COFF.
použití
Moderní verze Unix a Linux již nepodporují COFF, ale stále se používají pro vestavěné systémy . V systému Windows NT (a dřívějších) je varianta COFF Portable Executable (PE, někdy také PE / COFF) standardní formát souboru pro knihovny a spustitelné soubory, ale tato varianta se od původního COFF mírně liší.
struktura
Soubor COFF se skládá z několika částí. Začíná to záhlaví souboru a volitelným záhlaví . Poté následuje řada sekcí , skládajících se z hlavičky, datové sekce a oblasti pro položky čísla řádku a oblasti pro položky přemístění. Na konci souboru následuje tabulka symbolů a tabulka řetězců znaků .
Záhlaví souboru
Záhlaví souboru je na začátku souboru. Jsou zde uložena data, která popisují strukturu celého souboru. To zahrnuje magické číslo , které se liší pro různé varianty ( PE , XCOFF atd.), Časové razítko Unixu s časem vytvoření souboru a umístění a velikost dalších sekcí. Kromě použití příznaku různé vlastnosti souboru, které mají být definovány (např. Jako, zda je spustitelný).
struct filehdr {
unsigned short f_magic; /* Magische Zahl */
unsigned short f_nscns; /* Anzahl der Sektionen in der Datei */
long f_timdat; /* Zeitstempel der Erstellung */
long f_symptr; /* Zeiger zur Symboltabelle */
long f_nsyms; /* Größe der Symboltabelle */
unsigned short f_opthdr; /* Größe der "optional header" */
unsigned short f_flags; /* Flags */
};
Volitelná hlavička
Volitelně záhlaví obsahuje různá data v závislosti na variantě COFF. Často se používá pro další informace potřebné k provedení (např. Vstupní adresa). Vzhledem k tomu, že může mít různé délky, je jeho velikost uložena v záhlaví souboru.
Záhlaví sekce
Záhlaví část obsahuje údaje o úsek, a to zejména, jak je velký a kdy by měly být vkládány do virtuální paměti . U spustitelných souborů obvykle začátek paměti, tj. H. první část je načtena na adresu 0; u propojených dat se to může lišit. Obsahují také ukazatel a velikost položek čísla řádku a záznamů o přemístění.
struct sectionhdr {
char s_name[8]; /* Name der Sektion */
unsigned long s_paddr; /* Speicheradresse, an die diese Sektion geladen werden soll*/
unsigned long s_vaddr; /* virtuelle Adresse, an die diese Sektion geladen werden soll */
unsigned long s_size; /* Größe der Sektion (inklusive Header)*/
unsigned long s_scnptr; /* Zeiger zu den Daten dieser Sektion */
unsigned long s_relptr; /* Zeiger zu den Relokationseinträgen dieser Sektion */
unsigned long s_lnnoptr; /* Zeiger zu dem Zeilennummerneinträgen dieser Sektion */
unsigned short s_nreloc; /* Anzahl der Relokationseinträge */
unsigned short s_nlnno; /* Anzahl der Zeilennummerneinträge */
unsigned long s_flags; /* Flags */
};
Datová sekce
Datová sekce může mít různé délky. Obsahuje skutečná data v souboru. Obvykle se jedná o instrukce ve strojovém kódu , prostor pro proměnné a data, která jsou nutná k provedení - zkrátka skutečný program.
Přemístění
Položka přemístění definuje, kde lze symboly najít v datové sekci. To je definováno samostatně pro každý symbol.
typedef struct reloc{
unsigned long r_vaddr; /* Adresse für die Relokation */
unsigned long r_symndx; /* Symbol, für das die Relokation gilt */
unsigned short r_type; /* Type der Relokation*/
};
Zadání čísla řádku
Zadání čísla řádku definuje, který řádek ve zdrojovém kódu odpovídá které instrukci ve strojovém kódu. To je zvláště důležité pro ladění aplikací. Každá sekce má vlastní tabulku čísel řádků. Řádky se počítají jednotlivě pro každou funkci v sekci.
typedef struct lineno{
union l_addr{
unsigned long l_symndx; /* Index des Namens der Funktion */
unsigned long l_paddr; /* Adresse der Zeilennummer */
};
unsigned short l_lnno; /* Zeilennummer */
};
Čísla řádků se zvyšují od 0 na začátku každé funkce. U řádku, na kterém funkce začíná, je vytvořen záznam s l_lnno = 0a symbol funkce tak, jak je l_symndx. Pro každý další řádek ve funkci je vytvořen záznam s počtem řádků od začátku funkce jako l_lnnoa adresou prvního příkazu z tohoto řádku jako l_paddr.
Tabulka symbolů
Tabulka symbolů obsahuje informace o symbolech v souboru. Symboly jsou např. B. Funkce nebo proměnné, které lze použít v jiných programech. Velikost a poloha tabulky symbolů je uvedena v záhlaví souboru . Tabulka symbolů se skládá ze záznamů formuláře
typedef struct sysent{
union e {
char e_name[8]; /* Name des Symbols */
struct e {
unsigned long e_zeroes; /* Falls 0, ist der Name des Symbols in der Zeichenkettentabelle angelegt*/
unsigned long e_offset; /* Position des Symbols in der Zeichenkettentabelle */
};
};
unsigned long e_value; /* Wert (in der Regel Adresse) des Symbols */
short e_scnum; /* Sektion */
unsigned short e_type; /* Datentyp */
unsigned char e_sclass; /* Speicherklasse */
unsigned char e_numaux; /* Anzahl zusätzlicher Einträge*/
};
Název symbolu je e_nameuložen, pokud má osm znaků nebo méně. Jinak je uložen v tabulce řetězců znaků, pak je e_zeros = 0, a e_offsetoznačuje pozici této položky v tabulce řetězců znaků. „Hodnota“ symbolu je e_valueuložena do. To je obvykle adresa, na které je tento symbol uložen, což zase závisí na datovém typu a třídě úložiště, ve které je e_sclassuložen. e_typedefinuje datový typ symbolu. Může to být buď elementární typ (int, float atd.), Nebo složený typ (struct, union). Symbol může navíc definovat hodnotu, ukazatel, pole („pole“) nebo funkci, která vrací tuto hodnotu. e_classdefinuje třídu úložiště, tj. kde a jak je symbol uložen (např. může to být externí symbol, argument funkce, globální nebo statická proměnná atd.). V závislosti na typu symbolu mohou následovat další záznamy. Počet těchto záznamů je také e_numauxuveden.
Řetězcový stůl
Řetězcová tabulka následuje za souborem na konci. Začíná se na celé číslo, ve kterém je uložena délka tabulky. Pak všechny řetězce následují jeden po druhém. Chcete-li přečíst řetězec znaků, musíte znát jeho pozici a v tomto bodě můžete začít číst. Řetězce jsou zakončeny nulou .
Individuální důkazy
- ↑ Common Object File Format Texas Instruments, přístup 8. března 2014
- ↑ Přehled nad SCO System V Release 3 ( Memento na originálu z 9. března 2014 v Internet Archive ) Info: archiv odkaz se automaticky vloží a dosud nebyl zkontrolován. Zkontrolujte prosím původní a archivovaný odkaz podle pokynů a poté toto oznámení odstraňte. HP, přístup 8. března 2014
- ^ XCOFF Object File Format IBM, přístup 8. března 2013
- ↑ Specifikace formátu souboru objektu / tabulky symbolů Compaq / HP, zpřístupněno 8. března 2014
- ↑ Typer spustitelných ( Memento na originálu z 9. března 2014 v Internet Archive ) Info: archiv odkaz se automaticky vloží a dosud nebyl zkontrolován. Zkontrolujte prosím původní a archivovaný odkaz podle pokynů a poté toto oznámení odstraňte. Linux.org, zpřístupněno 8. března 2014
- ↑ Specifikace PE a COFF , Microsoft Developer Network, zpřístupněno 8. března 2014
webové odkazy
- DJGPP COFF Spec - další podrobnosti o implementaci COFF
- MIPS COFF jako datové typy C.
- Informace o Microsoft COFF