对ARM进行裸机开发时,汇编是必不可少的,因为C语言无法直接操作CPU的内置寄存器,也就无法完成很多硬件初始化的功能,如内存控制器的初始化。
市面上大多数讲解ARM汇编开发的书籍都把ADS作为开发环境,因此使用的汇编语言也就是ARMASM,开发平台也限制到了Windows。然而在嵌入式领域,Linux作为开发环境更加普及,那么如何在Linux下进行ARM的汇编程序设计呢?
其实,Linux平台上早就有了支持ARM的汇编器,那就是著名的binutils软件包,它包含了汇编、链接、二进制操作等所有的ARM汇编环境。
1 binutils简介
binutils是支持Unix类系统汇编与链接开源软件包,提供汇编、链接等二进制文件操作工具。其官方主页是: http://www.gnu.org/software/binutils。著名的GCC编译器本身并不提供汇编和链接功能,而是依赖于这个binutils才能完成高级语言的编译、汇编、链接过程。它提供的工具包括:
* GNU链接器ld
* GNU汇编器as
* objcopy 转换二进制格式
* ar 对象文件打包管理
* c++filt C++符号名字反mangling
* nm 打印二进制文件里的符号信息
* readelf 读取分析elf格式文件信息
* ranlib 产生archive包的索引
* size 列出二进制文件的大小
* objdump 打印二进制文件信息
* strip 去除二进制文件中的符号信息
* strings 打印二进制文件中的可打印符号
* dlltool 为构建和使用DLL创建文件
* gprof 显示配置信息
* addr2line 把内存地址对应到源文件中的行号(用于调试)
* nlmconv 转为对象代码为NLM
* gold 只用于ELF格式的新生代连接器(尚处于测试阶段)
对于ARM汇编程序开发,as,ld,objcopy是最基本的工具。
2 binutils安装
对于ARM汇编来说,最常见的就是开发平台是基于X86的LinuxPC机器,而运行平台则是基于ARM的嵌入式硬件平台。这就需要一个能生成ARM机器码的交叉汇编器和连接器。binutils自然能够满足这个小小的要求,只是需要进行编译安装就可以了。
2.1 准备binutils源码
去其官网下载最新的源码包,截至目前(2016年12月12日)最新的版本为2.27,下载得到的文件名为: binutils-2.27.tar.bz2。
解压
tar -jxvf binutils-2.27.tar.bz2
得到binutils-2.27文件夹。
不建议直接在binutils-2.27这个源文件目录下直接配置编译,以免造成混乱。为此,新建一个空目录build-binutils,用于编译。
2.2 配置,编译,安装
进入build-binutils目录,执行如下配置命令:
../binutils-2.27/configure --prefix=/home/smstong/ARM --target=arm-linux-gnueabihf
上面指定了binutils的安装目录与目标平台,运行完成会在当前目录下生成Makefile。执行make,make install完成安装
make
make install
与GCC不同,binutils的配置、编译、安装非常简单,很少会出错。安装完成后会产生如下目录结构:
ARM
├── arm-linux-gnueabihf
│ ├── bin
│ │ ├── ar
│ │ ├── as
│ │ ├── ld
│ │ ├── ld.bfd
│ │ ├── nm
│ │ ├── objcopy
│ │ ├── objdump
│ │ ├── ranlib
│ │ ├── readelf
│ │ └── strip
│ └── lib
│ └── ldscripts
│
├── bin
│ ├── arm-linux-gnueabihf-addr2line
│ ├── arm-linux-gnueabihf-ar
│ ├── arm-linux-gnueabihf-as
│ ├── arm-linux-gnueabihf-c++filt
│ ├── arm-linux-gnueabihf-elf