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

  1. Common Object File Format Texas Instruments, přístup 8. března 2014
  2. 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  @ 1@ 2Šablona: Webachiv / IABot / h10025.www1.hp.com
  3. ^ XCOFF Object File Format IBM, přístup 8. března 2013
  4. Specifikace formátu souboru objektu / tabulky symbolů Compaq / HP, zpřístupněno 8. března 2014
  5. 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 @ 1@ 2Šablona: Webachiv / IABot / www.linux.org
  6. Specifikace PE a COFF , Microsoft Developer Network, zpřístupněno 8. března 2014

webové odkazy