编译过程分为4个阶段:预编译、编译、汇编、链接
预编译:
预编译的命令如下
$gcc -E hello.c -o hello.i (-E表示只进行预编译) 预编译生成的文件后缀是.i
预编译过程主要处理以#号开头的预编译指令,做以下工作
1.进行宏替换
2.处理所有的预编译指令,如#ifdef #if #elif #endif ...
3.处理#include预编译指令,将被包含文件内存插入到预编译指定的位置
4.删除所有的注释
5.添加行号和文件名,以便在编译过程中出现错误和告警能够显示行号
6.保留#pragram指令,因为编译器要使用他们
编译:
编译命令如下
$gcc -S hello.i -o hello.s (-S表示编译)
编译过程就是把经过预编译处理的文件进一步进行语法分析、语义分析、词法分析、源码优化及优化后生成相应的汇编代码。
gcc把预编译和编译合并在一起用使用ccl来进行,其实gcc 根据不同参数要求调用预编译和编译处理程序ccl,汇编器as 和链接器ld
汇编:
汇编命令如下:
$as hello.s -o hello.o 或者 $gcc -c hello.s -o hello.o 或者$gcc -c hello.c -o hello.o
汇编是将汇编代码转换成机器可以识别的指令
链接:
链接命令如下:
$ld -static hello.o /lib/*/*.o
链接就是把所有相关的目标文件(.o)链接起来生成可执行文件。
Linux下可以用以下工具来看可执行文件和obj文件
nm:列出目标文件中的符号。
objdump:显示目标文件中的详细信息。(windows 下用dumpbin.exe)
readelf:显示关于 ELF 目标文件的信息。
阅读(1588) | 评论(0) | 转发(0) |