What goes inside the compilation process?

A compiler converts a C program into an executable. There are four phases for a C program to become an executable: 

  1. Pre-processing
  2. Compilation
  3. Assembly
  4. Linking

By executing the below command, we get all intermediate files in the current directory along with the executable.

 $gcc -Wall -save-temps filename.c –o filename 

The following screenshot shows all generated intermediate files.

Intermediate Files

Let us one by one see what these intermediate files contain.

Compiling a C Program: Behind the Scenes

The compilation is the process of converting the source code of the C language into machine code. As C is a mid-level language, it needs a compiler to convert it into an executable code so that the program can be run on our machine.

The C program goes through the following phases during compilation:

Compilation Process in C

Similar Reads

How do we compile and run a C program?

We first need a compiler and a code editor to compile and run a C Program. The below example is of an Ubuntu machine with GCC compiler....

What goes inside the compilation process?

A compiler converts a C program into an executable. There are four phases for a C program to become an executable:...

1. Pre-processing

This is the first phase through which source code is passed. This phase includes:...

2. Compiling

The next step is to compile filename.i and produce an; intermediate compiled output file filename.s. This file is in assembly-level instructions. Let’s see through this file using $nano filename.s  terminal command....

3. Assembling

In this phase the filename.s is taken as input and turned into filename.o by the assembler. This file contains machine-level instructions. At this phase, only existing code is converted into machine language, and the function calls like printf() are not resolved. Let’s view this file using $vi filename.o...

4. Linking

This is the final phase in which all the linking of function calls with their definitions is done. Linker knows where all these functions are implemented. Linker does some extra work also, it adds some extra code to our program which is required when the program starts and ends. For example, there is a code that is required for setting up the environment like passing command line arguments. This task can be easily verified by using $size filename.o and $size filename. Through these commands, we know how the output file increases from an object file to an executable file. This is because of the extra code that Linker adds to our program....