minden, amit tudni akarsz a GCC-ről

vegye figyelembe az előre feldolgozott fájl fenti kimenetéből, hogy mivel programunk kérte az stdio-t.a H fejléc bekerül a forrásunkba, amely viszont egy csomó más fejlécfájlt kért.

Compilation

a következő lépés az, hogy az előre feldolgozott fájlt bemenetként fordítsuk le, és egy közbenső lefordított kimenetet hozzunk létre. Ennek a szakasznak a kimeneti fájlja összeszerelési kódot állít elő, amely gépfüggő.

segítségével” – S ” zászló gcc tudjuk alakítani az előre feldolgozott C forráskód assembly nyelv létrehozása nélkül egy objektum fájlt:

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

lefordított Fájl

bár nem vagyok sok az összeszerelési szintű programozásban, de egy gyors pillantás arra a következtetésre jut, hogy ez az összeszerelési szintű kimenet valamilyen utasítás formájában van, amelyet az összeszerelő megérthet és gépi szintű nyelvre konvertálhat.

Assembly

mint mindannyian tudjuk ,a gépek csak bináris nyelvet tudnak megérteni, ezért most szükségünk van egy ÖSSZESZERELŐRE, amely átalakítja az összeszerelési kódot a “HelloWorld.c ” fájl bináris kódba.

az ASSEMBLER volt az egyik első szoftvereszköz, amelyet a digitális számítógép feltalálása után fejlesztettek ki.

ha az assembly kódban külső függvényekre irányuló hívások vannak, az Assembler a külső függvények címeit nem határozza meg, amelyeket később a Linker tölt ki.

az összeszerelő az alábbiak szerint hívható meg. A” – c ” zászló használatával az ÖET – ben konvertálhatjuk az összeszerelési kódot gépi szintű kóddá:

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

HelloWorld.o

az egyetlen dolog, amit meg tudunk magyarázni a HelloWorld.o fájl a karakterláncról szól ELF az első sorban. Az ELF a futtatható és összekapcsolható formátum rövidítése.

egy objektumfájl és egy végrehajtható fájl többféle formátumban kapható, mint például az ELF (futtatható és összekapcsoló formátum) és a COFF (Common Object-File Format). Például az ELF-et Linux rendszereken, míg a COFF-ot Windows rendszereken használják.

ez egy viszonylag új formátum a gcc által előállított gépi szintű objektumfájlokhoz és végrehajtható fájlokhoz. Ezt megelőzően az A.out néven ismert formátumot használták. Az ELF állítólag kifinomultabb formátum, mint az A.out (lehet, hogy mélyebben belemélyedünk az ELF formátumba egy másik későbbi cikkben).

ha a kódot a kimeneti fájl nevének megadása nélkül fordítja le, akkor az előállított kimeneti fájl neve ‘A.out’, de a formátum most ELF-re változott. Csak az alapértelmezett futtatható fájl neve ugyanaz marad.

összekapcsolás

ez az utolsó szakasz, amelyben a függvényhívások összes összekapcsolása a definícióikkal történik. A Linker tudja, hol hajtják végre ezeket a funkciókat (az Assembler elhagyta az összes hívandó külső funkció címét). Amíg ebben a szakaszban GCC nem tud a funkció, mint a printf ().Az Assembler elhagyta volna a meghívandó függvények címét, és a Linker elvégzi a végső folyamatot, hogy kitöltse ezeket a címeket a tényleges definíciókkal. A linker néhány további feladatot is elvégez számunkra. Egyesíti a program néhány szabványos rutinok, amelyek szükségesek ahhoz, hogy a program fut. Tehát a végső végrehajtható méret sokkal több, mint a bemeneti fájl!

a teljes összekapcsolási folyamatot a gcc kezeli, és a következőképpen hívja meg:

$ gcc -o Output HelloWorld.c

a fenti parancs futtatja a fájlt ” HelloWorld.c”, és létrehozza a végső futtatható fájlt “Output”.

az összes fájl felsorolása ls-l

mint látható, a’ Output ‘ fájl alapértelmezés szerint egy futtatható fájl engedélyekkel-rwxrwxr-x ,ez csak azt jelenti,hogy végrehajtható engedéllyel rendelkezik minden felhasználó számára(tulajdonos, csoport és mások). Ha ezt a futtatható fájlt egyszerűen beírja’./ Output ‘ megkapja a programunk végső kimenetét !

a futtatható fájl kimenete

tehát most már tudjuk, hogy a C program Hogyan konvertálódik végrehajthatóvá . A következő cikkekben egy kicsit mélyebben belemerülünk a C programozásba. Addig is, boldog tanulás! 🙂

You might also like

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.