allt du vill veta om GCC

notera från ovanstående utdata från den förbehandlade filen som sedan vårt program har begärt stdio.h header inkluderas i vår källa som i sin tur begärde en hel massa andra rubrikfiler.

kompilering

nästa steg är att ta den förbehandlade filen som inmatning, kompilera den och producera en mellanliggande kompilerad utgång. Utdatafilen för detta steg producerar Monteringskod som är maskinberoende.

genom att använda ”-S” – flaggan med gcc kan vi konvertera den förbehandlade C-källkoden till monteringsspråk utan att skapa en objektfil:

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

kompilerad fil

även om jag inte är mycket i monteringsnivåprogrammering men en snabb titt drar slutsatsen att denna monteringsnivåutgång är i någon form av instruktioner som assembler kan förstå och konvertera den till maskinnivåspråk.

montering

som vi alla vet kan maskiner bara förstå binärt språk ,så nu behöver vi en ASSEMBLER som konverterar monteringskod i ”HelloWorld.c ” fil i binär kod.

ASSEMBLER var ett av de första mjukvaruverktygen som utvecklades efter uppfinningen av den digitala datorn.

om det finns några samtal till externa funktioner i monteringskoden lämnar Assembler adresserna till de externa funktionerna odefinierade, som ska fyllas i senare av länkaren.

monteraren kan åberopas enligt nedan. Genom att använda” – c ” – flaggan i gcc kan vi konvertera monteringskoden till maskinnivåkod:

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

HelloWorld.o

det enda vi kan förklara genom att titta på HelloWorld.o fil handlar om strängälven i första raden. ELF står för körbart och länkbart format.

en objektfil och en körbar fil finns i flera format som ELF (körbart och länkande Format) och COFF (Common Object-File Format). Till exempel används ELF på Linux-system, medan COFF används på Windows-system.

Detta är ett relativt nytt format för objektfiler på maskinnivå och körbara filer som produceras av gcc. Före detta, ett format som kallas A.out användes. ELF sägs vara mer sofistikerat format än A.out (vi kan gräva djupare i ELF-formatet i någon annan framtida artikel).

om du kompilerar din kod utan att ange namnet på utdatafilen har den producerade utdatafilen namnet ’a.out’ men formatet har nu ändrats till ELF. Det är bara att det körbara filnamnet förblir detsamma.

länkning

Detta är den sista fasen där all länkning av funktionsanrop med deras definitioner görs. Linker vet var alla dessa funktioner implementeras (Assembler har lämnat adressen till alla externa funktioner som ska anropas). Till detta steg vet GCC inte om funktionen som printf() .Assembler skulle ha lämnat adressen till de funktioner som ska anropas och Linker gör den slutliga processen att fylla i dessa adresser med de faktiska definitionerna. Länkaren gör också några ytterligare uppgifter för oss. Det kombinerar vårt program med några standardrutiner som behövs för att vårt program ska köras. Så den slutliga körbara storleken är mycket mer än inmatningsfilen!

hela länkningsprocessen hanteras av gcc och åberopas enligt följande:

$ gcc -o Output HelloWorld.c

ovanstående kommando kör filen ” HelloWorld.c ”och producerar den slutliga körbara filen”Output”.

lista alla filer med ls-l

som du kan se är ’Output’- filen som standard en körbar fil med behörigheter-rwxrwxr-x, det betyder bara att den har körbar behörighet för alla användare(ägare ,grupp och andra). Om du kör den här körbara filen genom att helt enkelt skriva ’./ Output ’ du får den slutliga produktionen av vårt Program !

utmatning av den körbara filen

så nu vet vi hur ett C-program konverteras till en körbar . Vi kommer att dyka lite djupare in i C-programmering i de kommande artiklarna. Tills dess, lyckligt lärande! 🙂

You might also like

Lämna ett svar

Din e-postadress kommer inte publiceras.