Vše, co chcete vědět o GCC

Poznámka z výše uvedeného výstupu z předzpracovaných souborů, které od našeho programu požádala stdio.h záhlaví být zahrnuty do našeho zdroje, který zase požadoval spoustu dalších hlavičkových souborů.

kompilace

dalším krokem je převzít Předzpracovaný soubor jako vstup, zkompilovat jej a vytvořit mezilehlý kompilovaný výstup. Výstupní soubor pro tuto fázi vytváří montážní kód, který je závislý na stroji.

pomocí „-S“ vlajkou s gcc můžeme převést předzpracovány zdrojového kódu C do assembleru bez vytvoření souboru objektu:

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

Zkompilovaný Soubor

I Když nejsem moc na úrovni sestavy programování, ale rychlý pohled dochází k závěru, že tato sestava úroveň výstup je v nějaké formě instrukcí, které assembler může pochopit a převést jej do strojového jazyka na úrovni.

sestava

jak všichni víme ,stroje mohou rozumět pouze binárnímu jazyku, takže nyní požadujeme ASSEMBLER, který převádí kód sestavy v “ HelloWorld.c “ soubor do binárního kódu.

ASSEMBLER byl jedním z prvních softwarových nástrojů vyvinutých po vynálezu digitálního počítače.

pokud jsou v kódu sestavy nějaké volání na externí funkce, Assembler ponechá adresy externích funkcí nedefinované, aby je později vyplnil Linker.

Assembler lze vyvolat, jak je uvedeno níže. Pomocí „c“, vlajky v gcc můžeme převést do assembleru do strojového kódu na úrovni:

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

HelloWorld.o

jediná věc, kterou můžeme vysvětlit pohledem na HelloWorld.o soubor je o řetězci ELF v prvním řádku. ELF je zkratka pro spustitelný a propojitelný formát.

objekt souboru a spustitelný soubor přicházejí v několika formátech, jako jsou ELF (Executable and Linking Format) a COFF (Common Object-File Format). Například ELF se používá v systémech Linux, zatímco COFF se používá v systémech Windows.

Jedná se o relativně nový formát pro soubory objektů na úrovni stroje a spustitelné soubory, které jsou produkovány gcc. Předtím byl použit formát známý jako A.out. ELF je řekl, aby byl sofistikovanější formát než. out (můžeme kopat hlouběji do formátu ELF v nějakém jiném budoucím článku).

Pokud budete kompilovat váš kód určující název výstupního souboru, výstupní soubor produkoval má jméno ‚.’ale formát nyní změnily na ELF. Je to jen to, že výchozí název spustitelného souboru zůstává stejný.

propojení

Toto je poslední fáze, ve které se provádí veškeré propojení volání funkcí s jejich definicemi. Linker ví, kde jsou všechny tyto funkce implementovány (Assembler nechal adresu všech externích funkcí, které mají být volány). Až do této fáze GCC neví o funkci jako printf() .Assembler by nechal adresu funkcí, které mají být volány, a Linker provede konečný proces vyplnění těchto adres skutečnými definicemi. Linker pro nás také dělá několik dalších úkolů. Kombinuje náš program s některými standardními rutinami, které jsou potřebné k tomu, aby náš program běžel. Takže konečná velikost spustitelného souboru je mnohem větší než vstupní soubor!

celý proces propojení je zpracován gcc a vyvolán následovně:

$ gcc -o Output HelloWorld.c

výše uvedený příkaz spustí soubor “ HelloWorld.c „a vytvoří konečný spustitelný soubor „výstup“.

výpis všechny soubory pomocí ls-l

Jak můžete vidět , „Výstup“ soubor je ve výchozím nastavení spustitelný soubor s oprávnění-rwxrwxr-x ,to prostě znamená, že to má spustitelné oprávnění pro všechny uživatele(vlastníka,skupinu a ostatní). Pokud spustíte tento spustitelný soubor jednoduše zadáním ‚./ Výstup ‚ dostanete konečný výstup našeho programu !

Výstup spustitelný soubor

Tak teď víme, jak program v jazyce C se převede do spustitelného souboru . V následujících článcích se ponoříme trochu hlouběji do programování C. Do té doby, šťastné učení! 🙂

You might also like

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.