交叉编译工具链建立与常识

交叉编译工具链的命名规则

arch [-vendor] [-os] [-(gnu)eabi]

arch – 体系架构,如ARM,MIPS,对于MIPS可能还分大端模式mips或者小端模式mipsel;

vendor – 工具链提供商,可能有的工具链会省去这个字段,一般可能是none、芯片提供商如fsl或者是第三方提供商如buildroot(允许自行修改);

os – 目标板中运行的系统,一般为linux,但对于一些专门用于裸板或者uboot的编译工具这个字段可能是bare-metal(裸板);

gnu – 所使用的C库,gnu代指glibC,这个字段还可能是eglibc,uclibc;

eabi – 相对于x86上面的abi,嵌入式应用二进制接口(Embedded Application Binary Interface),如果没有“eabi”字段,说明用的是旧版本的oabi(Old Application Binary Interface)。
一般这个字段还有eabihf这个选项:
对于eabi一般使用softfp和 soft组合兼容软硬浮点,方法是在浮点运算指令处设置一个“陷阱”,如果硬件不支持硬件浮点的话,这个指令将导致异常,这个时候软件浮点处理将服务这个异常。这种运行方式虽然浮点运算使用硬件浮点单元,但是传递参数是仍然使用通用寄存器,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
对于eabihf使用soft和hard处理浮点,与上述不同的是,这个运行方式传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断中需要对浮点寄存器进行出入栈处理,负荷比较高。
一般大家都会使用eabi,由于eabihf与eabi不兼容,所以如果你的源码工程有不开源的.o文件,那么这个时候你只能使用保持跟这些.o文件的编译选项保持一致。

[-(gnu)eabi]举几个例子:
gnu 等价于:glibc+oabi
gnueabi 等价于:glibc+eabi
uclibc 等价于:uclibc+oabi

查询交叉编译工具的默认编译选项

有时候我们需要编译新版本的工具链,但是不太清楚现在正在使用的工具链的详细选项,可以使用以下命令查询:

echo 'main(){}'|mipsel-linux-gcc -E -v -

可以对比前后新旧版本工具链的选项进行配置,比如下面是我的工具链的详细描述:
这里写图片描述

交叉编译工具编译选项的问题

这里需要强调,无论对于编译生成工具链的配置,还是对于工具链的命名,这些都只是影响工具链的默认选项,也就是直接输入arm-linux-gcc这样的命令时使用的编译选项,在后期编译的时候我们还是可以通过添加编译的详细描述进行适当修改:
但是还是非常推荐一个硬件平台使用一套专用的工具链。
①工具链目标cpu的架构版本不同:
比如生成工具链时的目标架构是armv7(cortex-A、cortex-M),但实际使用的硬件平台是armv5,由于新版架构中可能引入了新的指令,所以可能导致运行异常,这个时候可以在编译中添加“-mcpu=arm1176jzf-s”,变换目标架构。
②默认不支持动态库,可以添加“-enable-shared”;不支持多线程,可以添加–enable-threads=posix;浮点处理方式不对,可以通过’-mfloat-abi=softfp’(soft、hard)调整。
③使用的源码比较久,但是版本太高的gcc可能导致莫名其妙的错误,主要可能是语法检测的严谨程度问题,这个时候就只能更换工具链版本了;

MIPS交叉编译工具的编译

下面以生成MIPS的工具链为例子进行演示,ARM工具链的不同只有Toolchain和Target Option下的配置不同:
1.下载:
在 http://buildroot.uclibc.org/downloads/snapshots/buildroot-snapshot.tar.bz2 下载buildroot:
tar -jxvf buildroot-snapshot.tar.bz2
cd buildroot
buildroot是一个根文件系统生成软件,可以通过配置,非常方便的获得各种交叉编译工具链、busybox、U-boot甚至是Kernel。

2.配置buildroot:
make clean
make menuconfig
选择第一项“Target Architecture”,改成MIPS(little endian)
这里写图片描述
另外,选择“Toolchain”,务必将“Kernel Headers”的Linux版本改成你自己主机的Linux版本(因为我们编译出的MIPS交叉工具是需要在我们的主机上运行的),如我的主机是Ubuntu 12.04.4的,Linux版本是3.11.0(可以使用uname -a查看,使用lsb_release -a查看Ubuntu发行版本,另外由于选项中没有3.11.x这个选项,因此使用3.12.x):
这里写图片描述

3.编译:
注意:
1.编译过程中必须联网,因为会下载一些压缩包存放在buildroot/dl文件夹下,比如binutils、gcc等;

2.必须事先安装好bison、flex、texinfo、ncurses等,比如我第一次编译,出现如下错误,因为我没有安装texinfo:sudo apt-get install texinfo 就可以了;
之后就是漫长的等待了,差不多1个小时。。。

4.编译完成后,在buildroot文件夹下多了一个output文件夹,其中就是编译好的文件:
cd buildroot/output/host/usr/bin
我们发现了mips的交叉编译工具已经生成啦~~;
另外,在buildroot/output/target文件夹下,这里有使用mipsel-linux-gcc生成的根文件系统和busybox;
这里写图片描述
5.为了以后方便使用,我们直接将其中的bin文件夹添加到环境变量中,省得我们日后输入长长的路径了。
将路径添加到/etc/profile文件中,然后运行source命令:
source /etc/profile
6.需要强调的是,如果需要移动生成的交叉编译工具链的路径,需要从host整个节点开始移动,否则工具链将不能正常工作。
7.target下的文件系统可以打包后直接用于镜像,该目录下存放的lib,默认情况下编译选项是–share-only,所以都是动态库*.so
而编译工具链自身使用到的glibc等静态库在host/arm-none-linux-gnueabihf/sysroot(或者是libc目录,具体可以使用echo 'main(){}'|mipsel-linux-gcc -E -v -查看--with-sysroot参数),因为嵌入式开发中,对于用到的额外包,经常需要将这些包的库(如tslib,libopenssl等)放到编译链的sysroot下面,如果希望保持编译链自身的整洁,可以将工具链下的sysroot复制一份,并且在工程中使用--sysroot或者CMAKE_SYSROOT()指定。

ARM交叉编译工具链的编译配置选项

下面是我为S3C6410配置的交叉工具链配置:
Target Option下的配置:
这里写图片描述
Toolchain下的配置如下:
这里写图片描述
这里写图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值