hello.c 预处理 hello.i 编译 hello.s 汇编 hello.o 链接 hello
gcc -E hello.c -o hello.i预处理
gcc -s hello.i -o hello.s将编译成hello.i的汇编文件hello.s
gcc -c hello.s -o hello.o 将hello.s汇编成2进制文件
Gcc通过后缀来区别输入文件的类别,常见类型有:
.c为后缀的文件: C语言源代码文件
.a为后缀的文件: 是由目标文件构成的库文件
.cc或.cxx 为后缀的文件: 是C++源代码文件
.h为后缀的文件: 头文件
.o为后缀的文件: 是编译后的目标文件
.s为后缀的文件: 是汇编语言源代码文件
GCC的编译选项
-o output_filename:确定可执行文件的名称为output_filename。如果不给出这个选项,gcc就
给出预设的可执行文件a.out。
-O,对程序进行优化编译、链接,采用这个选项,整个源代码会在编译、连接过程中进行
优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地
要慢一些。
2.2 Gcc编译选项
-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。
-c 不链接。编译器只是由输入的.c等源代码文件编译生成.o为后缀的中间文件
-g 产生调试工具所需要的符号信息,要想对编译出的程序进行调试,就必须加入这个选项
-I dirname: 将dirname所指出的目录作为编译器寻找头文件的标准路径。
C程序中的头文件包含两种情况∶
1 #include <A.h>
2 #include “B.h”
Gcc编译选项
对于<>,gcc在系统预设的头文件目录(如/usr/include)中搜寻相应的文件;而对于””,gcc在当前目录中搜寻头文件。-I选项的作用是告诉gcc,如果在当前目录中没有找到需要的文件,就到指定的dirname目录中去寻找。例:gcc foo.c -I /home/include -o foo
-wall :生成所有警告信息
-w:不生成警告信息
-DMACRO:定义MACRO宏,等效于在程序中使用#define MACRO
在OS中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量。在OS中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
交叉编译工具链
arm_linux_gcc
交叉编译工具
arm-linux-ld -Tled.lds -o led.elf led.o
输出使用链接器脚本
arm-linux-readelf 查看ELF文件信息
file [可执行文件] 查看运行平台
arm-linux-readelf -d [可执行文件] 查看程序执行所依赖的库
arm-inux-objdump 反汇编器
示例:arm-linux-objdump -D -S [可执行文件] >dump输出汇编代码到dump
arm-linux-gcc -g hello.c -o hello
arm-linux-objdump -D -S [可执行文件] >dump
arm-linux-objcopy 文件格式转换器
arm-linux-objcopy -o binary led.elf led.bin将elf文件格式转化成二进制文件,避免arm处理器的自己解析