Sammanställningen är processen att konvertera källkoden för C-språket till maskinkod. Eftersom C är ett mellannivåspråk behöver det en kompilator för att konvertera det till en körbar kod så att programmet kan köras på vår maskin.
C-programmet går igenom följande faser under sammanställningen:

Sammanställningsprocessen i C
Hur kompilerar och kör vi ett C-program?
Vi behöver först en kompilator och en kodredigerare för att kompilera och köra ett C-program. Exemplet nedan är en Ubuntu-maskin med GCC-kompilator.
Steg 1: Skapa en C-källfil
Vi skapar först ett C-program med hjälp av en editor och sparar filen som filnamn.c
mysql unik nyckel
$ vi filename.c>
Vi kan skriva ett enkelt hej världen-program och spara det.
Steg 2: Kompilera med GCC-kompilator
Vi använder följande kommando i terminalen för att kompilera vår källfil filename.c
$ gcc filename.c –o filename>
Vi kan skicka många instruktioner till GCC-kompilatorn till olika uppgifter som:
linux filsystem
- Alternativet -Wall aktiverar alla kompilatorns varningsmeddelanden. Det här alternativet rekommenderas för att generera bättre kod.
- Alternativet -o används för att specificera utdatafilens namn. Om vi inte använder det här alternativet genereras en utdatafil med namnet a.out.
Om det inte finns några fel i vårt C-program kommer den körbara filen för C-programmet att genereras.
Steg 3: Kör programmet
Efter kompileringen genereras körbar fil och vi kör den genererade körbara med kommandot nedan.
$ ./filename>
Programmet kommer att köras och utgången kommer att visas i terminalen.
Vad händer i kompileringsprocessen?
En kompilator konverterar ett C-program till en körbar fil. Det finns fyra faser för att ett C-program ska bli en körbar fil:
- Förbearbetning av sammanställningssammansättning
Genom att utföra kommandot nedan får vi alla mellanliggande filer i den aktuella katalogen tillsammans med den körbara filen.
skillnaden mellan program och script
$gcc -Wall -save-temps filename.c –o filename>
Följande skärmdump visar alla genererade mellanfiler.
Mellanliggande filer
Låt oss en efter en se vad dessa mellanfiler innehåller.
1. Förbearbetning
Detta är den första fasen genom vilken källkoden skickas. Denna fas inkluderar:
- Borttagning av kommentarer
- Utvidgning av makron
- Utökning av de inkluderade filerna.
- Villkorlig sammanställning
Den förbearbetade utdata lagras i filnamn.i . Låt oss se vad som finns inuti filename.i: använder $vi filnamn.i
I ovanstående utdata är källfilen fylld med massor av information, men i slutändan är vår kod bevarad.
java len av array
- printf innehåller nu a + b istället för add(a, b) det beror på att makron har expanderat.
- Kommentarer tas bort. #include saknas istället ser vi massor av kod. Så header-filer har utökats och inkluderats i vår källfil.
2. Sammanställning
Nästa steg är att kompilera filnamn.i och producera en; mellanliggande kompilerad utdatafil filnamn.s . Den här filen finns i instruktioner på monteringsnivå. Låt oss se igenom den här filen med hjälp av $nano filnamn.s terminalkommando.
Monteringskodfil
Ögonblicksbilden visar att den är på assemblerspråk, vilket assemblern kan förstå.
3. Montering
I denna fas tas filnamnet.s som indata och omvandlas till filnamn.o av montören. Den här filen innehåller instruktioner på maskinnivå. I denna fas konverteras endast befintlig kod till maskinspråk och funktionsanrop som printf() löses inte. Låt oss se den här filen med $vi filnamn.o
git status
Binär kod
4. Länka
Detta är den sista fasen där all länkning av funktionsanrop med deras definitioner görs. Linker vet var alla dessa funktioner är implementerade. Linker gör en del extra arbete också, den lägger till lite extra kod till vårt program som krävs när programmet startar och slutar. Till exempel finns det en kod som krävs för att ställa in miljön som att skicka kommandoradsargument. Denna uppgift kan enkelt verifieras genom att använda $size filnamn.o och $size filnamn . Genom dessa kommandon vet vi hur utdatafilen ökar från en objektfil till en körbar fil. Detta beror på den extra koden som Linker lägger till i vårt program.
Notera: GCC gör som standard dynamisk länkning, så printf() är dynamiskt länkad i ovanstående program. Se detta, detta och detta för mer information om statisk och dynamisk länkning.