Ik lees over bibliotheken in C, maar ik heb nog geen uitleg gevonden over wat een objectbestand is. Wat is het echte verschil tussen een ander gecompileerd bestand en een objectbestand?
Ik zou blij zijn als iemand het in mensentaal zou kunnen uitleggen.
Antwoord 1, autoriteit 100%
Een objectbestand is de echte uitvoer van de compilatiefase. Het is meestal machinecode, maar heeft informatie waarmee een linker kan zien welke symbolen erin staan, evenals symbolen die nodig zijn om te werken. (Ter referentie, “symbolen” zijn in feite namen van globale objecten, functies, enz.)
Een linker neemt al deze objectbestanden en combineert ze tot één uitvoerbaar bestand (ervan uitgaande dat het kan, dat wil zeggen: dat er geen dubbele of ongedefinieerde symbolen zijn). Veel compilers zullen dit voor je doen (lees: ze voeren de linker zelf uit) als je ze niet vertelt om “gewoon te compileren” met behulp van opdrachtregelopties. (-c
is een veelgebruikte optie “gewoon compileren; niet linken”.)
Antwoord 2, autoriteit 46%
-
Een Object-bestand is het gecompileerde bestand zelf. Er is geen verschil tussen de twee.
-
Een uitvoerbaar bestand wordt gevormd door de Object-bestanden te koppelen.
-
Objectbestand bevat instructies op laag niveau die door de CPU kunnen worden begrepen. Daarom wordt het ook wel machinecode genoemd.
-
Deze machinecode op laag niveau is de binaire weergave van de instructies die u ook rechtstreeks kunt schrijven met behulp van assembleertaal en vervolgens de assembleertaalcode (weergegeven in het Engels) kunt verwerken in machinetaal (weergegeven in Hex) met behulp van een assembler .
Dit is een typische stroom op hoog niveau voor dit proces voor code in taal op hoog niveau, zoals C
–> gaat door pre-processor
–> om geoptimaliseerde code te geven, nog steeds in C
–> gaat door compiler
– & GT; om montagecode
te geven
– & GT; gaat door een assembler
– & GT; om code in de machinetaal te geven die wordt opgeslagen in objectbestanden
– & GT; gaat door linker
– & GT; om een uitvoerbaar bestand te krijgen.
Deze stroom kan enkele variaties hebben, bijvoorbeeld de meeste compilers kunnen direct de machinetaalcode genereren, zonder door een assembler te gaan. Evenzo kunnen ze de pre-verwerking voor u doen. Toch is het leuk om de bestanddelen te verbreken voor een beter begrip.
Antwoord 3, Autoriteit 23%
Er zijn 3 soort objectbestanden.
Relocatable Object-bestanden
Machinecode bevatten in een formulier dat bij Link Time kan worden gecombineerd met andere relocatable objectbestanden, om een uitvoerbaar objectbestand te vormen.
Als u een a.c
Bronbestand heeft om het objectbestand met GCC te maken, moet u uitvoeren:
gcc a.c -c
Het volledige proces zou zijn: preprocessor (CPP) zou over A.C. De uitvoer (nog steeds bron) zal in de compiler (CC1) voeden. De uitvoer (montage) voedt zich in de assembler (AS), die de relocatable object file
produceert. Dat bestand bevat objectcode en koppeling (en debuggen als -g
werd gebruikt) metadata en is niet direct uitvoerbaar.
Gedeelde objectbestanden
Speciaal type relocatable objectbestand dat dynamisch kan worden geladen, hetzij bij laadtijd of op looptijd. Gedeelde bibliotheken zijn een voorbeeld van dit soort objecten.
Uitvoerbare objectbestanden
Machinecode bevatten die rechtstreeks in het geheugen kan worden geladen (door de lader, bijv. execve ) en vervolgens uitgevoerd.
Het resultaat van het uitvoeren van de linker over meerdere relocatable object files
is een executable object file
. De linker voegt alle invoerobjectbestanden vanaf de opdrachtregel samen, van links naar rechts, door alle invoersecties van hetzelfde type (bijv. .data
) samen te voegen met de uitvoersectie van hetzelfde type. Het gebruikt symbol resolution
en relocation
.
Bonus gelezen:
Bij het koppelen met een static library
worden de functies waarnaar wordt verwezen in de invoerobjecten gekopieerd naar het uiteindelijke uitvoerbare bestand.
Met dynamic libraries
wordt in plaats daarvan een symbooltabel gemaakt die een dynamische koppeling met de functies/globalen van de bibliotheek mogelijk maakt. Het resultaat is dus een gedeeltelijk uitvoerbaar objectbestand, omdat dit afhankelijk is van de bibliotheek. Als de bibliotheek niet bestaat, kan het bestand niet langer worden uitgevoerd).
Het koppelingsproces kan als volgt worden gedaan:
ld a.o -o myexecutable
Het commando: gcc a.c -o myexecutable
roept alle commando’s op die genoemd zijn bij punt 1 en bij punt 3 (cpp -> cc1 -> as -> ld1< /sup>)
1: is eigenlijk collect2, wat een wrapper over ld is.
Antwoord 4, autoriteit 7%
Een objectbestand is precies wat je krijgt als je één (of meerdere) bronbestand(en) compileert.
Het kan een volledig voltooid uitvoerbaar bestand of bibliotheek zijn, of tussenliggende bestanden.
De objectbestanden bevatten doorgaans native code, linkerinformatie, foutopsporingssymbolen, enzovoort.
Antwoord 5
Objectbestanden zijn codes die afhankelijk zijn van functies, symbolen en tekst om het programma uit te voeren. Net als oude telexmachines, waarvoor teletyping nodig was om signalen naar andere telexmachines te sturen.
Op dezelfde manier waarop processors binaire code nodig hebben om te draaien, zijn objectbestanden als binaire code, maar niet gekoppeld. Door te koppelen ontstaan extra bestanden zodat de gebruiker niet zelf de C-taal hoeft te compileren. Gebruikers kunnen het exe-bestand direct openen zodra het objectbestand is gekoppeld aan een compiler zoals c language of vb enz.