1.可执行文件生成过程:pre-processing, compilation, assembly, linking;
2.预处理pre-processing:
使用arm-linux-cpp工具将要include的头文件插入原文件,宏定义展开,根据条件编译指令选择要使用的代码,最后生成一个“.i”文件;
3.编译compilation:
使用cc1(不是arm-linux-cc1)将“.i”文件翻译成汇编代码“.s”文件;
4.汇编assembly:
使用arm-linux-as将汇编代码翻译成一定格式的机器码,在linux系统上一般是ELF目标文件(OBJ文件)“.o”文件;
5.连接linking:
使用arm-linux-ld将OBJ文件和系统库的OBJ文件、库文件连接起来,生成可执行文件;
生成可执行文件hello举例:arm-linux-gcc -o hello hello.c
选项 | 含义 | remark(均可使用-o选项改目标名) |
---|---|---|
-c | 预处理、编译、汇编 | 生成OBJ文件,默认.o文件,不link |
-E | 预处理 | |
-S | 编译 | 生成汇编文件,默认.s文件 |
-o file | 指定输出文件名为file | 预处理、编译、汇编、连接都可使用 |
-v | 详细显示处理过程 | link时会link进一些默认库,即使没-l选项 |
-Wall | 显示警告信息 | |
-g | 加入gdb可使用的调试信息 | |
-O0 | 不优化编译 | |
-O或-O1或-O2或-O3 | 优化编译,编译时间加长 | 比如编译器减少目标码大小及执行时间 |
-llibrary | link名为library的库文件 | 库文件真正名为liblibrary.so |
-nostartfiles | 不link系统标准启动文件 | 比如不link文件crti.o |
-nostdlib | 不link系统标准启动文件和标准库 | 仅传递指定文件给linker |
-static | 静态link共享库到可执行文件 | 导致可执行文件size大 |
-shared | 指定或 link生成共享库文件 | |
-I dir | dir目录作为第一个寻找以“#include <>”定义的头文件的目录 | 查找顺序:dir–>/usr/include–>/usr/local/include |
-L dir | dir目录作为第一个寻找库文件的目录 | 查找顺序:dir–>/lib–>/usr/lib–>/usr/local/lib |