嵌入式Linux应用开发完全手册
3 嵌入式Linux基础知识
3.1 交叉编译工具
- 编译工具链,编译工作由几个步骤完成,分别用到了不同的工具
- PC端应用
- gcc
- ld
- objcopy
- objdump
- 交叉编译(编译和运行在不同的环境下),arm平台工具链
- arm-linux-gcc
- arm-linux-ld
- PC端应用
3.1.1 arm-linux-gcc
- C/C++文件的编译步骤
- 预处理 preprocessing
- 编译 compilation
- 汇编 assembly
- 连接 linking
预处理
根据预处理命令(#开头的命令)修改源文件,形成.i文件
用到额工具是arm-linux-cpp
编译
将经过预处理的.i文件,翻译成汇编代码,.s文件
用到的工具是ccl
汇编
将汇编代码文件.s翻译成目标文件 .o文件
用到的工具是arm-linux-as
连接
将汇编生成的目标文件和库文件连接起来,最终生成特定平台的可执行文件
用到的工具是arm-linux-ld
连接器处理的文件一般包括
- .o 目标文件
- .a 库文件
arm-linux-gcc的重要选项
- -E 预处理 :预处理结果通过stdout显示出来
- -S 预处理、编译 :可以生成.s文件
- -c 预处理、编译、汇编 :可以生成.o文件
- -o 指定输出文件名 :如果不指定名成,按照一般规则生成
- -v 显示制作gcc命令时的配置 :显示更详细的编译信息
- -Wall 显示所有警告信息 :Warning ALL
- -g 产生调试信息,以便GDB使用 : 要使用gdb调试,必须有这个选项
- -O 优化选项 :O0,O1,O2,O3 4级优化,一般应用选O2
- [object-file-name] :连接的时候,目标文件和库文件名称
- -l[library] :连接名为l[library]的库文件,库文件名称规则lib[libraay].so
- -nostartfiles :不连接系统标准启动文件,编译bootloader, 内核的时候会用到
- -nostdlib :不连接系统标准启动文件和标准库文件,编译bootloader和内核会用到
- -static :组织连接共享库,打开这个选线柜让编译出来的结果很大,不动态连接一些库,那么就都包含在编译结果里边了
- -shared :生成库文件
- -I[dir] :头文件搜索路径中添加 dir
- -L[dir] :-l指定某个库需要连接的时候,这个参数增加搜索路径,比如-L. 当前目录作为搜索目录添加进来
/ * 举例 */
[main.c] - include [sub.h]
[sub.h]
[sub.c] - include [sub.h]
--------
gcc -c -o main.o main.c
gcc -c -o sub.o sub.c
gcc -o test main.o sub.o
--------
gcc -S -o main.s main.c
gcc -E main.c | less
--------
gcc -shared -o sub.a sub.o sub2.o sub3.o
arm-linux-ld选项
- -T :指定代码段、数据段、bss段的起始位置,或者指定一个连接脚本
: