What happens when you type gcc main.c ?

Alexis Oreiro
2 min readSep 17, 2020


Gcc is the GNU Compiler Collection which is a compiler system. It is used in many different languages including C, C++, Java, Objective C and many others. main.c is the file name that we want to compile that has the C extension. But what exactly does that mean?

Three main steps happen when we compile code:
1. Reads the source file
2. Processes it
3. Links it with a runtime library

A compiler has multiple modules: preprocessor, compiler, assembler and linker.

When we write the file main.c, the preprocessor generates some intermediate file, that file is given to the compiler. The role of the compiler is that it compiles files generated by the preprocessor as input, and that generates assembly code, so it can convert our C program file into the assembly language. Computers can only generate binary code, which is why assembly language is the format it needs to be in.

Though, assembler code is still not understood by the machine — it needs to be converted into machine code. The converter that does this job: the assembler. The assembler module will convert the assembly code into the object code.

Lastly, the linker, the last module, links the object code (created by the assembler) with library functions code that we use (when we write our code). From that linkage, txt files are generated.

Let’s go in depth about each module.

The preprocessor does 3 tasks: removes comments from the code, includes the header file (standard in C files) into the generated file itself, and if any macros were used, will replace the macro name with code.

The compiler will take the file (created by the preprocessor) code and create the assembly code. The assembly code are comprised of mnemonics, instructions defined by english words.

The assembler converts the assemble code into the object code.

Then, the linker can play one of two roles:
1. Can merge multiple C files by compiling them, into one executable file.
2. Links our code (generated from the binary code of the assembler output) with the library function code.

There are two types of linking: static and dynamic. The linker decides what type of linking it will use.

The linker will pack all the code into a single file, which is known as the .exe file.



Alexis Oreiro

Working to succeed in Cyber Security.