14

卢骏 · 2020年06月02日

ARM编译器(二)arm编译器

这里说的arm编译器,是指arm公司出的编译器,包括以下几个:

◾armclang: 编译 c ,c++, GNU assembly language的源代码,不能编译ARM汇编代码

◾armasm: 只能编译 arm汇编代码

◾armlink: 链接器,用来将目标代码,链接成可执行程序

◾armar: 打包,将目标代码打包成一个库

◾fromelf: 将可执行程序,转换为其他的镜像文件。

以下是编译流程
1.png

这个编译器,和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下支持的处理器
2.png

使用armclang –target=arm-arm-none-eabi –mcpu=list查看 aarch32下支持的处理器
3.png

3、–march

–march指定,编译代码时,针对哪一个架构进行编译。

使用armclang –target= aarch64-arm-none-eabi -march=list 查看aarch64下支持的架构,可以看出对于aarch64,总共支持3种架构。
4.png

使用armclang –target=arm-arm-none-eabi -march=list 查看aarch32下支持的架构,这个支持的架构就多了,从armv6-armv8。
5.png

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)

例子:
6.png

二、armasm

armasm工具,只能编译ARM汇编代码,不能编译GNU汇编代码。

1、-I

指定搜索目录

2、–cpu

指定的指令集

如 –cpu=8-A.64 , 指定armv8架构的64bit的指令集

3、-g

汇编,加上调试信息

4、–predefine

定义一个宏,传递给汇编代码中使用。

例子:
7.png

三、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.png

8、不使用链接脚本

使用armlink链接init.o 和 main.o,生成可执行文件。其中代码段起始地址是0,数据段起始地址是0x400000,bss段的起始地址是0x405000。

init.o的init段,作为生成可执行文件的最开始段。
9.png

9、使用链接脚本

以下是使用链接脚本来进行链接。

下图中,链接脚本的格式。

外面指定LR1,是一个大段,从地址0x0000-0x2000。在这个RL1段,包括3个小段

◾ER_RO: 只读段,从0地址开始。其中init.o的INIT段作为这个段的开始,其他段放置在这个段的后面

◾ER_RW: 可读可写段,从0x400000开始

◾ER_ZI: bss段,从0x405000开始
10.png

10、#pragma pack(n)

#pragma用来指定打包数据时,各个数据的空间占据。
11.png

对于char型,占用1个字节, 对于short型,占用2个字节, 对于int型,占用4个字节。
12.png
13.png

fromelf

反汇编工具。

fromelf –text –c –a elf文件 -o 文本文件

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
推荐阅读
关注数
23554
内容数
1003
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息