Almindeligt objektfilformat

Den fælles Object File Format ( COFF ; tysk  generelle objekt filformat ) er en binært format til programmer og objekt filer. Det blev introduceret af AT&T til Unix System V- operativsystemet og bruges nu hovedsageligt i PE-format til Windows baseret på det (se Portable Executable ). For filtypenavne bruges ofte "cof", "obj" eller " lib " , hvis de er tilgængelige og bortset fra de udvidelser, der bruges til PE .

historie

A.out- formatet blev oprindeligt brugt til eksekverbare filer på Unix . Dette understøttede imidlertid ikke moderne udvikling såsom indlejret fejlretningsinformation eller dynamiske biblioteker . Derfor udviklede AT&T Common Object File Format til frigivelse 3 af Unix System V. Da den oprindelige COFF var begrænset med hensyn til design, udviklede forskellige varianter blandt Unix-producenterne (fx XCOFF fra IBM til AIX , ECOFF fra SGI og andre). Med frigivelse 4 af System V i 1989 erstattede AT&T COFF med det nye format ELF (Executable and Linking Format) udviklet sammen med Sun Microsystems .

egenskaber

COFF gjorde det muligt at integrere fejlretningsoplysninger direkte i en binær fil. Biblioteker kan linkes dynamisk og håndteres som separate filer, så de ikke behøver at blive en uforanderlig, ikke-udskiftelig del af en programfil. Til dette formål indlæses alle adresser i omplaceringsposterne i applikationens virtuelle hukommelse i forhold til sektionens faktiske adresse. Denne adresse behøver kun i afsnittet for at kompileringstid kan indstilles allerede på plads i programmeringen. Formater udviklet i henhold til COFF har også disse muligheder.

brug

Moderne Unix- og Linux- versioner understøtter ikke længere COFF, men det bruges stadig til indlejrede systemer . Under Windows NT (og tidligere) er COFF-varianten Portable Executable (PE, undertiden også PE / COFF) standardfilformatet for biblioteker og eksekverbare filer, men denne variant adskiller sig lidt fra den originale COFF.

struktur

En COFF-fil består af flere dele. Det begynder med filoverskriften og en valgfri overskrift . Dette efterfølges af et antal sektioner, der består af en overskrift, et datasektion og et område til linjenummerindgange og et område til omplaceringsindgange. En symboltabel og en tegnstrengstabel følger i slutningen af ​​filen .

Filhoved

Den filens header er i begyndelsen af en fil. Der gemmes data der beskriver strukturen i hele filen. Dette inkluderer det magiske nummer , som er forskelligt for de forskellige varianter ( PE , XCOFF osv.), Et Unix-tidsstempel med det tidspunkt, filen blev oprettet, og placeringen og størrelsen af ​​andre sektioner. Ud over at bruge Flag forskellige egenskaber for den fil, der skal defineres (f.eks. Om den er eksekverbar).

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 */
};

Valgfri header

Den valgfri overskrift indeholder forskellige data afhængigt af COFF-varianten. Det bruges ofte til andre oplysninger, der kræves til udførelse (f.eks. Postadressen). Da den kan have forskellige længder, gemmes dens størrelse i "File Header".

Sektionens overskrift

Den afsnitsoverskrift indeholder data om et afsnit, især hvor stor den er, og hvor det skal indlæses i virtuel hukommelse . For eksekverbare filer, normalt begyndelsen på hukommelsen, dvs. H. den første sektion indlæses til adresse 0; dette kan være anderledes for sammenkædede data. De indeholder også en markør til og størrelsen på linjenummerindgange og flytningsposter.

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 */
};

Datasektion

Datasektionen kan have forskellige længder. Den indeholder de faktiske data i filen. Disse er normalt instruktioner i maskinkode , plads til variabler og data, der kræves til udførelse - kort sagt det faktiske program.

Flyttepost

En flytningspost definerer, hvor symbolerne kan findes i datasektionen. Dette defineres individuelt for hvert 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*/
};

Indtastning af linjenummer

En linjenummerindgang definerer, hvilken linje i kildekoden svarer til hvilken instruktion i maskinkoden. Dette er især vigtigt for fejlfindingsprogrammer . Hver sektion har sin egen tabel med linjenumre. Linjerne tælles individuelt for hver funktion i sektionen.

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 */
};

Linjenumre tælles op fra begyndelsen af ​​hver funktion fra 0. For en linje, hvor en funktion begynder, oprettes en post med l_lnno = 0og symbolet for funktionen, som den er l_symndx. For hver yderligere linje i funktionen oprettes en post med antallet af linjer siden funktionens start som l_lnnoog adressen på den første sætning fra denne linje som l_paddr.

Symboltabel

Symboltabellen indeholder information om symbolerne i filen. Symboler er f.eks. B. Funktioner eller variabler, der kan bruges af andre programmer. Størrelsen og placeringen af ​​symboltabellen er angivet i filoverskriften . Symboltabellen består af poster i formularen

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*/
};

Navnet på symbolet e_namegemmes i, hvis det er otte tegn eller mindre. Ellers er det gemt i tegnstrengstabellen, så er det e_zeros = 0og e_offsetangiver placeringen af ​​denne post i tegnstrengstabellen. Symbolets "værdi" e_valuegemmes i. Dette er normalt den adresse, hvor dette symbol er gemt, hvilket igen afhænger af datatypen og lagringsklassen, der er e_sclassgemt i. e_typedefinerer datatypen for symbolet. Dette kan enten være en elementær type (int, float osv.) Eller en sammensat type (struct, union). Derudover kan symbolet definere en værdi, en markør, et felt ("array") eller en funktion, der returnerer denne værdi. e_classdefinerer lagringsklassen, dvs. hvor og hvordan symbolet lagres (f.eks. kan det være et eksternt symbol, et funktionsargument, en global eller statisk variabel osv.). Yderligere poster kan følge afhængigt af typen af ​​symbol. Antallet af disse poster er også e_numauxangivet.

Strengbord

Strengtabellen følger filen i slutningen. Det begynder med et heltal, hvor længden af ​​tabellen er gemt. Så følger alle strengene hinanden. For at læse en tegnstreng skal du kende dens position, og du kan begynde at læse på dette tidspunkt. Strengene er nul-afsluttet .

Individuelle beviser

  1. Common Object File Format Texas Instruments, adgang til 8. marts 2014
  2. Oversigt løbet SCO System V version 3 ( Memento af den originale fra 9 marts 2014 i Internet Archive ) Info: Den arkivet link automatisk blev indsat og endnu ikke kontrolleret. Kontroller original- og arkivlinket i henhold til instruktionerne, og fjern derefter denne meddelelse. HP, adgang til 8. marts 2014  @ 1@ 2Skabelon: Webachiv / IABot / h10025.www1.hp.com
  3. ^ XCOFF Object File Format IBM, adgang til 8. marts 2013
  4. Objektfil / symboltabelformatspecifikation Compaq / HP, adgang til 8. marts 2014
  5. Typer af Executable ( Memento af den originale fra 9 marts 2014 i Internet Archive ) Info: Den arkiv link blev indsat automatisk, og er endnu ikke blevet kontrolleret. Kontroller original- og arkivlinket i henhold til instruktionerne, og fjern derefter denne meddelelse. Linux.org, adgang til 8. marts 2014 @ 1@ 2Skabelon: Webachiv / IABot / www.linux.org
  6. PE og COFF-specifikation , Microsoft Developer Network, adgang til 8. marts 2014

Weblinks