工程中编写自己的makefile---3 交叉编译工具
2017-06-05 16:07
204 查看
1 交叉编译工具
一个C/C++文件要经过预处理(preprocessing),编译(compilation),汇编(assembly),连接(linking);1.1 概述
1,预处理.c >> .i
将要包含(include)的文件插入源文件中,将宏定义展开,根据条件编译命令选择要使用的代码,最后将这些代码输出到一个”.i”文件中等待进一步处理;一般用到arm-linux-cpp
2,编译
.i >> .s
把C/C++的代码(比如上面的”.i”文件)”翻译”成汇编代码,所用到的工具是 ccl
3,汇编
.s >> .o
将上一步中的汇编代码翻译成符合一定格式的机器可识别但不能执行的机器代码,在linux系统上一般表现为 .o 后缀的目标文件(OBJ文件),用到的工具是arm-linux-as ; ”反汇编”是指将机器代码装换为汇编代码,在调试程序时常用到;
4,连接
.o >> elf
将多个 .o 文件和系统库文件链接成为可在特定平台运行的可执行文件,(linux下为ELF格式),用到的工具为
arm-linux-ld
1.2 arm-linux-gcc选项
1.2.1 总体选项
1,-o file指定输出的文件为file; 但只能指定一个输出文件;
2,-c
输出 .o 文件
编译或汇编源文件,但不做连接,编译器输出对应于源文件的目标文件,默认情况下,GCC通过使用”.o”替代源文件名的后缀”.c”,”.i”,”.s”等,产生OBJ文件名; 可以使用”-o”选项选择其他的名字;
gcc 忽略 –c 选项后面任何无法识别的输入文件(不编译或汇编)
3,-S
输出 .s 文件
编译后即停止,不进行汇编,对于每个输入的非汇编语言文件,输出结果是汇编语言文件; 默认情况下,GCC通过使用”.s”替代源文件名的后缀”.c”,”.i”,等,产生汇编文件名; 可以使用”-o”选项选择其他的名字;
4,-E
输出 .i 文件
预处理后即停止,不进行编译,预处理后的代码送往标准输出;
5,-v
显示制作GCC工具自身时的配置命令,同时显示编译器驱动程序,预处理器,编译器的版本号;
6,-pipe
在编译过程的不同阶段间使用管道而非临时文件进行通信
7,-x language
明确指出后面输入文件的语言为 language (而不是从文件后缀得到默认选择)
警告选项
8,-Wall
基本打开了所有需要注意的警告信息;
9,调试选项
-g
以操作系统的本地格式(stabs,COFF, XCOFF,或DWARF).产生调试信息. GDB能够使用这些调试信息.
10,优化选项
-O,-O0,-O1,-O2,-O4,优化;
1.2.2 连接器选项
下面的选项用于连接OBJ文件,输出可执行文件或库文件;1,object-file-name
gcc -o test main.o sub.o 其中: main.o sub.o就是输入的文件
2,-l(小写l)library
连接名为library的库文件,常接”-L”指定的库搜索路径; 指定期望连接的库的名字,注意!!!文件的顺序就是链接的顺序
3,-nostartfiles
不连接系统标准启动文件,而标准库文件仍然正常使用,在编译bootloader,内核时将用到这个选项;
4,-nostdlib
不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器,在编译bootloader,内核时将用到这个选项;
5,-static
连接静态库是使用该选项
6,-shared
生成一个共享OBJ文件,他可以和其他OBJ文件连接产生可执行文件,当不想以源代码发布程序时,使用”-shared”选项生成库文件;
1.2.3 目录选项
1,I(大写i)dir在头文件的搜索路径列表中添加dir目录
2,L(大写l)dir
常接”-L”指定的库文件搜索路径
1.2.4 库选项
参考4.1.1节1.3 arm-linux-ld选项
arm-linux-ld 用于将多个目标文件,库文件连接成可执行文件,1.4 arm-linux-objcopy选项
用来复制一个目标文件的内容到另一个文件中;可以使用不同的源文件格式来输出目的文件,及可以进行格式转换;1,Input-file outfile
分别表示输入目标文件(源目标文件)和输出目标文件(目的目标文件);如果没有明确指出输出目标文件,则将输出目标文件覆盖到输入目标文件;
2,-I bfdname或--input-target=bfdname
用来指明源文件格式;
3,-O bfdname或--output-target=bfdname
用来指明目标文件格式;
4,-F bfdname--target=bfdname
指明源文件格式目标文件格式,只进行复制不转换;
5,-S 或 --strip-all
不从源文件中复制重定位信息和符号信息到目标文件中去
6,-g 或--strip-debug
不从源文件中复制调试符号到目标文件中去
1.5 arm-linux-objdump选项
用于显示二进制文件信息,常用来查看反汇编代码;1,-b bfdname
指定目标码格式,
2,-d
反汇编可执行段
3,-D
反汇编所有段
4,-f
显示文件的整体头部摘要信息;
5,-h
显示文件的各个段头部摘要信息;
6,-i
显示支持的目标文件格式和CPU架构,他们在“-b”“-m”选项中用到
7,-m machine
指定反汇编目标文件时使用的架构;
例如:
将ELF格式的文件转换为反汇编文件
arm-linux-objdump–D elf_file > dis_file
将二进制文件转换为反汇编文件
Arm-linux-objdump–D –b binary –m arm bin_file>dis_file
相关文章推荐
- 自己动手编写交叉编译工具链
- 交叉编译工具及 makefile工程管理工具
- 用crosstool-ng建立自己的ARM交叉编译工具链 (适用于S3C6410以及其它处理器)
- GCC 编译动态链接库和静态链接库 + 大型工程Makefile编写 + Linux环境变量的设置和查看方法
- 工程中编写自己的makefile---5 在实例2中使用库文件
- 1.4.3.自己动手安装交叉编译工具链1
- 制作自己的交叉编译工具
- 工程中编写自己的makefile---6 makefile学习
- 工程中编写自己的Makefile---1 一些基本概念
- 通用Makefile的编写和在项目工程中使用Makefile(包括动态库、静态库的链接、整个工程联合编译)
- Linux:crosstool-ng制作自己的交叉编译工具
- Clion 使用自己编写的 Makefile编译
- 写驱动时交叉编译之makefile编写模板
- 工程中编写自己的makefile---7 shell学习
- 用crosstool-ng建立自己的ARM交叉编译工具链 (适用于S3C6410以及其它处理器)
- 写驱动时交叉编译之makefile编写模板(tiny6410)
- 写驱动时交叉编译之makefile编写模板(tiny6410)
- 用crosstool-ng构建自己的交叉编译工具链
- 嵌入式Linux完全开发手册-------------基础知识(交叉编译工具、Makefile、常用汇编指令)
- 工程中编写自己的makefile---8 编写Arm开发板的makefile