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

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. 自己动手安装ARM交叉编译工具链

    一,首先说一下在linux中安装软件的特点: 相比windows下安装要稍显复杂,linux中安装一般有以下几种方法: 1.在线安装,譬如ubuntu中使用apt-get install vim 来安 ...

  2. arm-linux交叉编译工具链的制作(基于S3C2440)【转】

    本文转载自:http://eric-gao.iteye.com/blog/2160622 制作arm-linux交叉编译工具链一般通过crosstool工具或者crosstool-NG,前者使用方便, ...

  3. 交叉编译及树莓派(或其他平台)交叉编译工具链的安装

    交叉编译是什么: 交叉编译是一个行为,是在一个平台上生成另一个平台上的可执行代码. 比如:我们在windows上面编写C51的代码,并编译成可执行代码,如xx.hex,是在C51上面运行不是在wind ...

  4. Crosstool-ng制作交叉编译工具链

    Crosstool-ng制作交叉编译工具链 交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编 ...

  5. Linux ARM交叉编译工具链制作过程

    一.下载源文件 源代码文件及其版本与下载地址: Binutils-2.19.tar.bz2 http://ftp.gnu.org/gnu/binutils/ gcc-4.4.4.tar.bz2 htt ...

  6. arm hisiv100 linux,hisiv100交叉编译工具链安装

    hisi交叉编译工具链安装 一.         摘要: 交叉编译简单的说,就是A机器上编译生成,运行在B机器上.那么在A机器上的编译工具安装,就是本文所要描述的内容. 工欲善其事必先利其器,所以交叉 ...

  7. 全手工制作arm-linux交叉编译工具链《一》-转

    全手工制作arm-linux交叉编译工具链 (Gcc 4.2.1 + Glibc 2.6.1 + Linux 2.6.22.6)<一> 作者:Garfield Trump 仅仅是本人在学习 ...

  8. 制定交叉编译工具_制作交叉编译工具链的方法总结(详细)

    网上这类文章比较多,但是都不是很具体,刚好有门课结课论文要写这个,所以就总结了一下.以下的过程都是在ubuntu7.10上实际运行过的. 手工制作交叉编译工具 在制作工具开始前先要选好所需要的Binu ...

  9. ARM交叉编译工具链分类说明

    为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译得到的程 ...

最新文章

  1. MySQL最新版8.0.21安装配置教程~
  2. main方法的格式讲解
  3. springboot数据源不正确_springboot配置多数据源
  4. ES6——举个例子理解Promise的原理和使用
  5. ole2高级编程技术 pdf_21天快速掌握Python语言,《21天学通Python》PDF版送给你去学...
  6. 嵌套字典|python_Python | 如果不是,则使用嵌套,根据销售额计算折扣
  7. 彻底搞懂Cookie、Session、JWT和Token
  8. android打开视频噔_Android、iOS不可错过!10款堪称神器的高质量APP,请低调使用...
  9. omnet++tictoc3案例解析
  10. 怎样计算计算机的硬盘大小,硬盘容量大小计算的办法
  11. 2021年全球与中国数字射线照相设备行业市场规模及发展前景分析
  12. go mysql 异步_GO操作MYSQL
  13. MATLAB多项式计算
  14. 使用weixin-java-miniapp配置进行单个小程序的配置
  15. java的数据异常_java的各种异常
  16. redhat 7.4 安装php,在 CentOS 中安装 PHP 7.4 的方法
  17. Modelsim下时序(功能)仿真altera IP核 程序(重要)
  18. 阻容感基础09:电感器原理(1)-电感器模型
  19. [读书笔记]Mindset
  20. c盘gnway是什么文件_gnauphelper.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...

热门文章

  1. 学生管理系统(JAVA版) —— 按学号查询信息页面
  2. Fintech系列(八) -- 游戏驿站GME股价暴涨事件中的杠杆工具和轧空现象
  3. 数学问题(四)——素数
  4. 读一本好书,享一段时光
  5. 2021年茶艺师(中级)考试题及茶艺师(中级)模拟考试
  6. python-爬取网站数据
  7. R语言中如何进行PCA分析?利用ggplot和prcomp绘制基因表达量分析图
  8. P2P模式分析之资金池与第三方托管
  9. 关于onMeasure
  10. 《孙子兵法》国学智慧