alt hvad du vil vide om GCC

Bemærk fra ovenstående output fra den forbehandlede fil, at siden vores program har anmodet om stdio.h header inkluderes i vores kilde, som igen anmodede om en hel masse andre header-filer.

kompilering

det næste trin er at tage den forbehandlede fil som input, kompilere den og producere en mellemliggende kompileret output. Outputfilen til dette trin producerer Monteringskode, som er maskinafhængig.

ved at bruge” – s ” – flag med gcc kan vi konvertere den forbehandlede C-kildekode til samlingssprog uden at oprette en objektfil:

$ gcc -S HelloWorld.i -o HelloWorld.s

kompileret fil

selvom jeg ikke er meget i montage level programmering, men et hurtigt kig konkluderer, at denne montage level output er i en form for instruktioner, som assembler kan forstå og konvertere det til maskine niveau sprog.

samling

som vi alle ved ,kan maskiner kun forstå binært sprog, så nu kræver vi en ASSEMBLER, der konverterer samlingskode i “Hellorld.C ” fil til binær kode.

ASSEMBLER var et af de første programmelværktøjer, der blev udviklet efter opfindelsen af den digitale computer.

hvis der er opkald til eksterne funktioner i samlingskoden, forlader samleren adresserne på de eksterne funktioner udefineret og udfyldes senere af linkeren.

samleren kan påberåbes som vist nedenfor. Ved at bruge “-c” – flag i gcc kan vi konvertere samlingskoden til maskinniveaukode:

$ gcc -c HelloWorld.c -o HelloWorld.o

Hellorld.o

det eneste, vi kan forklare ved at se på Hellorld.o fil handler om strengen ELF i første linje. ELF står for eksekverbart og sammenkædeligt format.

en objektfil og en eksekverbar fil findes i flere formater som ELF (eksekverbart og Sammenkædningsformat) og COFF (fælles objekt-filformat). ELF bruges f.eks. på Elf-systemer, mens COFF bruges på vinduer.

dette er et relativt nyt format til maskinniveauobjektfiler og eksekverbare filer, der er produceret af gcc. Forud for dette, et format kendt som en.out blev brugt. ELF siges at være mere sofistikeret format end en.ud (Vi kan grave dybere ned i ELF-formatet i en anden fremtidig artikel).

hvis du kompilerer din kode uden at angive navnet på outputfilen, har den producerede outputfil navnet ‘A.out’, men formatet er nu ændret til ELF. Det er bare, at standard eksekverbare filnavn forbliver den samme.

Linking

dette er den sidste fase, hvor al sammenkædning af funktionsopkald med deres definitioner udføres. Linker ved, hvor alle disse funktioner er implementeret (Assembler har forladt adressen på alle de eksterne funktioner, der skal kaldes). Indtil dette stadium ved GCC ikke om funktionen som printf() .Assembler ville have forladt adressen på de funktioner, der skal kaldes, og Linker udfører den endelige proces med at udfylde disse adresser med de faktiske definitioner. Linkeren udfører også et par ekstra opgaver for os. Det kombinerer vores program med nogle standardrutiner, der er nødvendige for at få vores program til at køre. Så den endelige eksekverbare størrelse er langt mere end inputfilen!

hele sammenkædningsprocessen håndteres af gcc og påberåbes som følger:

$ gcc -o Output HelloWorld.c

ovenstående kommando kører filen ” Hellorld.C “og producerer den endelige eksekverbare fil “Output”.

notering af alle filerne ved hjælp af ls-l

som du kan se, er ‘Output’- filen som standard en eksekverbar fil med tilladelser-Det betyder bare ,at den har eksekverbar tilladelse til alle brugere(ejer,gruppe og andre). Hvis du kører denne eksekverbare fil ved blot at skrive ‘./ Output ‘ du får det endelige output af vores Program !

Output af den eksekverbare fil

så nu ved vi, hvordan et c-program bliver konverteret til en eksekverbar . Vi vil dykke lidt dybere ned i C-Programmering i de kommende artikler. Indtil da, glad læring! 🙂

You might also like

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.