这里说原生ARM环境指的是由ARM公司官方提供的的ARM编译工具集,主要包括以下几个工具:
armclang: 用于编译 c ,c++, GNU assembly language的源代码,不能编译ARM汇编代码
armasm:汇编器, 只能编译 arm汇编代码
armlink: 链接器,用来将目标代码,链接成可执行程序
armar: 打包,将目标代码打包成一个库
fromelf: 将可执行程序,转换为其他的镜像文件。
以下是编译流程
这个编译器,和ARM-GCC编译器最大的区别在于,这个工具是要收费的,而ARM-GCC是不用收费的。
ArmClang编译器的参数介绍
1、–target
选项
必选项,指定使用哪一种ARM指令集进行编译。只有两个选项:
–target=aarch64-arm-none-eabi : 指定使用aarch64
–target=arm-arm-none-eabi : 指定使用aarch32
2、–mcpu
选项
通过指定特定的处理器型号进行编译。当指定了target,可以不指定这个。
如:
1 | –mcpu=cortex-a53 #表示 指定处理器是cortex-a53, |
如果要查看指定target下支持的处理器型号,可使用–mcpu=list
指令选项,如下:
1 | armclang –target=aarch64-arm-none-eabi –mcpu=list #查看 aarch64下支持的处理器 |
3、–march选项
指定编译时针对哪一个架构进行编译。
可以使用armclang –target= aarch64-arm-none-eabi -march=list
查看aarch64下支持的架构,可以看出对于aarch64,总共支持3种架构。
而aarch32下支持的架构就多了,从armv6-armv8。
4、-g
选项
表示编译器编译的时候,加上调试信息
1 | armclang –target=aarch64-arm-none-eabi -g test.c |
5、-Olevel
选项
优化等级,level越高,优化等级越高。
-O0表示没有优化。
-Os表示减小代码密度,平衡代码大小和代码速度。
-Omax表示针对该target,使用最大的优化。
6、-marm -mthumb
选项
-marm
表示A32指令集 , -mthumb
表示T32指令集
7、-Wpedantic
选项
显示警告信息
8、-S
选项
将c代码,或者.S代码,预处理,生成.s代码。
9、-c
选项
只编译不链接,生成中间目标代码(.o)
例子:
ArmAsm汇编器的参数介绍
1、-I
选项
指定搜索目录
2、–cpu
选项
指定的指令集
如 –cpu=8-A.64
, 指定armv8架构的64bit的指令集
3、-g
选项
汇编,加上调试信息
4、–predefine
选项
定义一个宏,传递给汇编代码中使用。
例子:
Armlink连接器参数介绍
链接器,用来链接各个.o文件,得到最终的elf。
1、–ro_base
选项
指定RO段的起始地址
2、–rw_base
选项
指定RW段的起始地址
3、–zi_base
选项
指定bss段的起始地址
4、–map –symbols
选项
显示生成镜像的memory map,以及symbols信息
5、–scatter
选项
指定链接脚本
6、–output
选项
指定生成的文件
7、诊断信息
诊断信息的选项:
8、不使用链接脚本
使用armlink
链接init.o
和 main.o
,生成可执行文件。
其中:
代码段起始地址是0,
数据段起始地址是0x400000,
bss段的起始地址是0x405000。
init.o
的init段,作为生成可执行文件的最开始段。
9、使用链接脚本
以下是使用链接脚本来进行链接。
下图中,链接脚本的格式。
外面指定LR1,是一个大段,从地址0x0000-0x2000。在这个RL1段,包括3个小段
- ER_RO: 只读段,从0地址开始。其中
init.o
的INIT段作为这个段的开始,其他段放置在这个段的后面 - ER_RW: 可读可写段,从0x400000开始
- ER_ZI: bss段,从0x405000开始
10、#pragma pack(n)
#pragma用来指定打包数据时,各个数据的空间占据。
!
对于char型,占用1个字节, 对于short型,占用2个字节, 对于int型,占用4个字节。
fromelf工具介绍
反汇编工具。
1 | fromelf –text –c –a elf文件 -o 文本文件 |
本文为作者原创 转载时请注明出处 谢谢
乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站