huomaa edellä olevasta esikäsitellyn tiedoston tulosteesta, että koska ohjelmamme on pyytänyt stdiota.h header sisällytetään meidän lähde, joka puolestaan pyysi koko joukko muita otsikkotiedostoja.
kooste
seuraava vaihe on ottaa esikäsitelty tiedosto syötteeksi, kääntää se ja tuottaa välituotos. Tämän vaiheen tulostiedosto tuottaa Kokoonpanokoodin, joka on koneriippuvainen.
käyttämällä” – S ” – lippua gcc: n kanssa voimme muuntaa esikäsitellyn C-lähdekoodin assembly-kieleksi luomatta oliotiedostoa:
$ gcc -S HelloWorld.i -o HelloWorld.s
vaikka en ole kovin innostunut kokoonpanotason ohjelmoinnista, mutta pikakatsauksen perusteella päätellään, että tämä kokoonpanotason ulostulo on jonkinlainen ohje, jonka assembler voi ymmärtää ja muuntaa konetason kieleksi.
Assembly
kuten kaikki tiedämme ,koneet voivat ymmärtää vain binäärikieltä, joten nyt tarvitaan ASSEMBLER, joka muuntaa assembly-koodin ”HelloWorld.C ” tiedosto binäärikoodiksi.
ASSEMBLER oli ensimmäisiä digitaalisen tietokoneen keksimisen jälkeen kehitettyjä ohjelmistotyökaluja.
jos kokoonpanokoodissa on kehotus ulkoisiin toimintoihin, kokoonpanija jättää ulkoisten funktioiden osoitteet määrittelemättä ja Linkittäjä täyttää ne myöhemmin.
Kokoonpanijaan voi vedota alla esitetyllä tavalla. Käyttämällä” – c ” – lippua gcc: ssä voimme muuntaa kokoonpanokoodin konetason koodiksi:
$ gcc -c HelloWorld.c -o HelloWorld.o
ainoa asia, jonka voimme selittää katsomalla Helloworldia.o-tiedosto on noin merkkijono haltia ensimmäisellä rivillä. ELF tarkoittaa suoritettavaa ja linkitettävää muotoa.
objektitiedosto ja suoritettava tiedosto tulevat useassa muodossa, kuten ELF (suoritettava ja linkittävä formaatti) ja COFF (yhteinen objekti-tiedostomuoto). Esimerkiksi Elfiä käytetään Linux-järjestelmissä, kun taas Coffia käytetään Windows-järjestelmissä.
tämä on suhteellisen uusi muoto GCC: n tuottamille konetason objektitiedostoille ja suoritettaville ohjelmille. Tätä ennen käytettiin muotoa a.out. Elfin sanotaan olevan kehittyneempi formaatti kuin a. out (saatamme kaivautua syvemmälle ELF-formaattiin jossakin muussa tulevassa artikkelissa).
jos kokoat koodin määrittelemättä tulostiedoston nimeä, tuotetun tulostiedoston nimi on ”a. out”, mutta muoto on nyt muuttunut Elfiksi. Se on vain, että suoritettavan tiedoston oletusnimi pysyy samana.
linkittäminen
tämä on viimeinen vaihe, jossa kaikki funktiokutsujen yhdistäminen niiden määritelmiin tehdään. Linker tietää, missä kaikki nämä toiminnot toteutetaan (Assembler on jättänyt kaikkien ulkoisten funktioiden osoitteen kutsuttavaksi). Tähän vaiheeseen asti GCC ei tiedä funktiosta kuten printf ().Assembler olisi jättänyt funktioiden osoitteen kutsuttavaksi ja Linker tekee lopullisen prosessin näiden osoitteiden täyttämiseksi varsinaisilla määritelmillä. Linkkeri tekee meille myös muutamia lisätehtäviä. Se yhdistää ohjelmamme joihinkin vakiorutiineihin, joita tarvitaan ohjelman pyörittämiseen. Joten lopullinen suoritettavan koko on paljon enemmän kuin syötetiedosto!
koko linkitysprosessi on gcc: n käsittelemä ja siihen vedotaan seuraavasti:
$ gcc -o Output HelloWorld.c
yllä oleva komento suorittaa tiedoston ” HelloWorld.c ”ja tuottaa lopullisen suoritettavan tiedoston”Output”.
kuten näet, ”Output” – tiedosto on oletusarvoisesti suoritettava tiedosto ,jolla on käyttöoikeudet-rwxrwxr-x,tämä tarkoittaa vain sitä, että sillä on suoritusoikeus kaikille käyttäjille(omistaja, ryhmä ja muut). Jos suoritat tämän suoritettavan tiedoston yksinkertaisesti kirjoittamalla’./ Output ’ saat ohjelmamme lopullisen tuotoksen !
joten nyt tiedämme, miten C-ohjelma muunnetaan suoritettavaksi . Sukellamme tulevissa artikkeleissa hieman syvemmälle C-ohjelmointiin. Siihen asti hyvää oppimista! 🙂