Objektfil - Object file
En objektfil er en computerfil, der indeholder objektkode , det vil sige maskinkodeoutput fra en assembler eller compiler . Objektkoden kan normalt flyttes og normalt ikke direkte eksekverbar . Der er forskellige formater til objektfiler, og den samme maskinkode kan pakkes i forskellige objektfilformater. En objektfil kan også fungere som et delt bibliotek .
Ud over objektet selve koden, kan objekt filer indeholder metadata bruges til at forbinde eller debugging, herunder: information til at løse symbolske krydshenvisninger mellem forskellige moduler, flytning oplysninger, stak afvikling information, kommentarer , program symboler , debugging eller profilering oplysninger. Andre metadata kan omfatte dato og klokkeslæt for kompilering, kompilatorens navn og version og andre identificerende oplysninger.
Udtrykket "objektprogram" stammer fra mindst 1950'erne:
Et udtryk i automatisk programmering af maskinsprogsprogrammet, der produceres af maskinen ved at oversætte et kildeprogram, der er skrevet af programmøren på et sprog, der ligner algebraisk notation.
En computerprogrammerer genererer objektkode med en compiler eller assembler . For eksempel under Linux vil GNU Compiler Collection -kompilatoren generere filer med en .o -udvidelse, der bruger ELF -formatet. Kompilering på Windows genererer filer med en .obj -udvidelse, der bruger COFF -formatet. En linker bruges derefter til at kombinere objektkoden til et eksekverbart program eller bibliotek, der trækker i forudkompilerede systembiblioteker efter behov. JavaScript -programmer fortolkes, mens Python- og Java -programmer kompileres til bytecode -filer.
Objektfilformater
Der er mange forskellige objektfilformater; oprindeligt havde hver type computer sit eget unikke format, men med fremkomsten af Unix og andre bærbare operativsystemer er nogle formater, såsom ELF og COFF , blevet defineret og brugt på forskellige slags systemer. Det er muligt for det samme format at blive brugt både som linker -input og output, og dermed som biblioteket og det eksekverbare filformat. Nogle formater kan indeholde maskinkode til forskellige processorer, hvor den korrekte vælges af operativsystemet, når programmet indlæses.
Nogle systemer skelner mellem formater, der er direkte eksekverbare, og formater, der kræver behandling af linkeren. For eksempel kalder OS/360 og efterfølgere det første format for et indlæsningsmodul og det andet et objektmodul . I dette tilfælde har filerne helt forskellige formater.
Design og/eller valg af et objektfilformat er en vigtig del af det overordnede systemdesign. Det påvirker linkerens ydeevne og dermed programmørens vending, mens et program udvikles. Hvis formatet bruges til eksekverbare filer, påvirker designet også den tid, programmer tager at begynde at køre , og dermed reaktionsevnen for brugerne.
Absolutte objektfiler
Mange tidlige computere eller små mikrocomputere understøtter kun et absolut objektformat. Programmer kan ikke flyttes; de skal samles eller kompileres for at udføre på bestemte, foruddefinerede adresser. Filen indeholder ingen oplysninger om flytning eller sammenkædning. Disse filer kan indlæses i læse/skrive hukommelse eller gemmes i skrivebeskyttet hukommelse . For eksempel indeholder Motorola 6800 MIKBUG -skærmen en rutine for at læse en absolut objektfil ( SREC -format ) fra papirbånd . DOS COM -filer er et nyere eksempel på absolutte objektfiler.
Segmentering
De fleste objektfilformater er struktureret som separate sektioner af data, hver sektion indeholder en bestemt type data. Disse sektioner er kendt som "segmenter" på grund af udtrykket " hukommelsessegment ", som tidligere var en almindelig form for hukommelsesstyring . Når et program indlæses i hukommelsen af en loader , allokerer læsseren forskellige hukommelsesområder til programmet. Nogle af disse regioner svarer til segmenter af objektfilen og er derfor normalt kendt under de samme navne. Andre, f.eks. Stakken, eksisterer kun i løbetid. I nogle tilfælde foretages flytning af læsseren (eller linkeren) for at angive de faktiske hukommelsesadresser. For mange programmer eller arkitekturer er flytning imidlertid ikke nødvendig på grund af håndteringen af hukommelsesstyringsenheden eller af positionsuafhængig kode . På nogle systemer kan segmentfilerne i objektfilen derefter kopieres (sides) til hukommelsen og eksekveres, uden at der er behov for yderligere behandling. På disse systemer kan dette gøres dovent , det vil sige kun, når der refereres til segmenterne under udførelse, f.eks. Via en hukommelseskortet fil, der bakkes af objektfilen.
Datatyper, der understøttes af typiske objektfilformater:
- Overskrift (beskrivende og kontroloplysninger)
- Kodesegment ("tekstsegment", eksekverbar kode)
- Datasegment (initialiserede statiske variabler )
- Skrivebeskyttet datasegment ( rodata , initialiserede statiske konstanter )
- BSS -segment (uinitialiserede statiske data, både variabler og konstanter)
- Eksterne definitioner og referencer til sammenkædning
- Relocation oplysninger
- Dynamisk linking oplysninger
- debugging information
Segmenter i forskellige objektfiler kan kombineres af linkeren i henhold til regler, der er angivet, når segmenterne er defineret. Der findes konventioner for segmenter, der deles mellem objektfiler; for eksempel i DOS er der forskellige hukommelsesmodeller, der angiver navnene på specielle segmenter, og om de må kombineres eller ej.
Fejlsøgningsoplysninger kan enten være en integreret del af objektfilformatet, som i COFF , eller et semi-uafhængigt format, der kan bruges med flere objektformater, såsom stikninger eller DWARF .
Den GNU-projektet 's Binary File Descriptor bibliotek (BFD bibliotek) giver en fælles API for manipulering af objekt filer i forskellige formater.
Referencer
Yderligere læsning
- Levine, John R. (2000). Linkers & Loaders . Morgan Kaufmann Forlag. s. 256. ISBN 1-55860-496-0.