Suppose we write a C program as two ﬁles p1.c and p2.c.
We can then compile this code on an IA32 machine using a Unix command line:
unix> gcc -O1 -o p p1.c p2.c
Your compiler actually invokes a sequence of programs to turn your source code into your executable.
1. C preprocess expands the source code to include any files specified with the #include command and to expand any macros specific with #define declarations.
2. The compiler generates assembly- code versions of the two source ﬁles having names p1.s and p2.s
3. The assembler converts the assembly code into binary object-code ﬁles p1.o and p2.o. Object code is one form of machine code—it contains binary representations of all of the instructions, but the addresses of global values are not yet ﬁlled in.
4. Finally, the linker merges these two object – code ﬁles along with code implementing library functions(e.g., printf) and generates the ﬁnal executable codeﬁle p.