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
- ↑ Common Object File Format Texas Instruments, adgang til 8. marts 2014
- ↑ 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
- ^ XCOFF Object File Format IBM, adgang til 8. marts 2013
- ↑ Objektfil / symboltabelformatspecifikation Compaq / HP, adgang til 8. marts 2014
- ↑ 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
- ↑ PE og COFF-specifikation , Microsoft Developer Network, adgang til 8. marts 2014
Weblinks
- DJGPP COFF Spec - flere detaljer om en COFF-implementering
- MIPS COFF som C-datatyper
- Microsoft COFF-oplysninger