gcc是一个c编译器,可以将源代码转换为可执行程序。编译过程包括了预处理、编译、汇编和链接这四个阶段。
-
预处理(Preprocessing):在预处理阶段,源代码会经过预处理器的处理,包括展开宏定义、包含头文件、条件编译等操作。预处理器会生成一个经过预处理的中间文件。
-
编译(Compilation):编译阶段将预处理后的源代码翻译成特定目标平台的汇编语言。编译器会将高级语言代码翻译成汇编代码,生成一个汇编代码文件。
-
汇编(Assembly):汇编阶段将汇编代码转换成目标平台的机器码或可重定位的目标文件。汇编器会将汇编代码转换为目标文件,通常以
.o
或.obj
扩展名结尾。 -
链接(Linking):链接阶段将目标文件与所需的库文件链接在一起,解析符号引用并生成可执行文件。链接器会解析符号引用,并将它们解析为实际的内存地址,最终生成可执行文件。
gcc -E -o hello. i hello.c #预处理过程
gcc -s -o hello.s hello.i #编译过程
gcc -c -o hello. o hello.s #汇编过程
gcc -o hello hello.o #链接过程
执行“gcc -o hello hello.c -v”时,可以查看到这些步骤:(这个命令是用于编译名为 hello.c
的 C 语言源代码文件并生成可执行文件 hello
。选项 -o
用于指定输出文件的名称,-v
选项用于显示详细的编译过程信息。)
cc1 main.c -o /tmp/ccXCx1YG.s
as -o /tmp/ccZfdaDo.o /tmp/ccXCx1YG.s
cc1 sub.c -o /tmp/ccXCx1YG.s
as -o /tmp/ccn8Cjq6.o /tmp/ccXCx1YG.s
collect2 -o test /tmp/ccZfdaDo. o /tmp/ccn8Cjq6.o
-
cc1:将.c文件处理成.s文件,对应预处理和编译过程。
-
as:将.s文件处理成.o文件,对应汇编过程。
-
collect2:将.o文件处理成可执行文件,对应链接过程。