这里说的arm编译器,是指arm公司出的编译器,包括以下几个:
◾armclang: 编译 c ,c++, GNU assembly language的源代码,不能编译ARM汇编代码
◾armasm: 只能编译 arm汇编代码
◾armlink: 链接器,用来将目标代码,链接成可执行程序
◾armar: 打包,将目标代码打包成一个库
◾fromelf: 将可执行程序,转换为其他的镜像文件。
以下是编译流程
这个编译器,和ARM-GCC编译器最大的区别在于,这个工具是要收费的,而ARM-GCC是不用收费的。
一、armclang
1、–target
armclang工具,需要指定target,表示对于源代码,使用哪一种ARM指令集进行编译。只有两个选项:
◾–target=aarch64-arm-none-eabi : 指定使用aarch64
◾–target=arm-arm-none-eabi : 指定使用aarch32
2、–mcpu
–mcpu, 表示对于源代码,指定针对指定的处理器进行编译。当指定了target,可以不指定这个。
如:–mcpu=cortex-a53 : 指定处理器是cortex-a53,这样编译的指令,就是目标在该处理器上执行的指令。
使用armclang –target=aarch64-arm-none-eabi –mcpu=list查看 aarch64下支持的处理器
使用armclang –target=arm-arm-none-eabi –mcpu=list查看 aarch32下支持的处理器
3、–march
–march指定,编译代码时,针对哪一个架构进行编译。
使用armclang –target= aarch64-arm-none-eabi -march=list 查看aarch64下支持的架构,可以看出对于aarch64,总共支持3种架构。
使用armclang –target=arm-arm-none-eabi -march=list 查看aarch32下支持的架构,这个支持的架构就多了,从armv6-armv8。
4、-g
编译器编译的时候,加上调试信息
5、-Olevel
优化等级,level越高,优化等级越高。 -O0表示没有优化。-Os表示减小代码密度,平衡代码大小和代码速度。-Omax表示针对该target,使用最大的优化。
6、-marm -mthumb
指令集 : -marm表示A32指令集 , -mthumb表示T32指令集
7、-Wpedantic
显示警告信息
8、-S
将c代码,或者.S代码,预处理,生成.s代码。
9、-c
只编译不链接,生成中间目标代码(.o)
例子:
原作者:卢骏