1、什么是crosstool-ng

crosstool-ng,全称是crosstool Next Generation,即下一代crosstool,即crosstool的升级版。那么什么是crosstool 呢?crosstool,是个交叉编译器的制作工具。交叉编译器简单的说可以理解为在X86电脑上编译处ARM的运行程序。更详细的介绍可以参考《构建嵌入式LINUX系统》的第四章。

2、制作交叉编译工具链的步骤

a、从网址 http://crosstool-ng.org/download/crosstool-ng/下载相应版本的crosstool-ng工具,我下载的版本是crosstool-ng-1.20.0.tar.bz2。若有补丁也需要同时下载,网址为http://crosstool-ng.org/download/crosstool-ng/01-fixes/

b、解压crosstool-ng-1.20.0.tar.bz2。命令为tar xjf crosstool-ng-1.20.0.tar.bz2。解压后得到一个名为crosstool-ng-1.20.0的文件夹。输入命令cd crosstool-ng-1.20.0进入文件夹,如果有兴趣可以看下README文件,它会教你一步步制作交叉编译工具链。另外doc文件夹下有详细的制作步骤可以参考。

c、配置、编译安装crosstool-ng-1.20.0。步骤:进入crosstool-ng-1.20.0文件夹,执行./configure --prefix=/work/tools/crosstool-ng命令配置crosstool-ng-1.20.0,/work/tools/crosstool-ng为crosstool-ng-1.20.0的安装路径。若配置过程中出现错误,一般是缺少某个程序造成的,缺什么安装什么就可以了。一般需要安装的程序为 sudo apt-get install sed bash cut dpkg-dev bison flex patch texinfo automake m4 libtool stat cvs websvn tar gzip bzip2 lzma readlink libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk。配置成功后执行make命令编译,然后make install进行安装。如果后面出现编译错误,再增加相应的包即可。安装完成后可以执行export PATH=$PATH:/work/tools/crosstool-ng/bin。把ct-ng命令放到环境变量中,这样就可以在任何地方执行ct-ng了。为了测试是否安装成功可以输入ct-ng --help命令测试。就出现相应的说明就说明安装成功了。

d、配置工具链选项。步骤:将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到源码包主目录下,在源码包主目录下执行cp samples/arm-unknown-linux-gnueabi/crosstool.config .config;

然后执行:ct-ng menuconfig可以看到如下的配置画面
进入Paths and misc options -- →菜单,修改内容如下:
1)、(${HOME}/src) Local tarballs directory # 指定制作编译器所需要的源码包的下载存放,可以修改成任意位置,请注意权限。现在指定到/work/tools/crosstool-ng-1.20.0/src 下。
2)、(/opt/${CT_TARGET}) Prefix directory # 制作好的编译器所放置的目录。现在指定到/work/tools/crosstool-ng_build下。
3)、选择Debug crosstool-NG,会多出一个子菜单,选中Save intermediate steps,此选项提供一个从上一步错误的地方继续编译,而不是从新编译,这样节约大量的时间。选择(3)Number of parallel jobs(NEW),这个菜单需要下拉才能看到此项为增加编译时的并行进程数,以增加运行速度,加速编译。

进入target options -- →菜单,修改的内容如下:

1)、确认Target Architecture (arm) ---> # 注意看这项是不是ARM平台

2)、ARMv4t 表示编译出的编译器支持ARMv4t架构的cpu;ARM920t 为指定cpu的类型,S3C2440使用的CPU核心为ARM920t。通过查找资料,这个应该是指令集的架构,对于S3C2410/S3C2440,都ARM920T的核心,架构指令是armv4t,所以,如果要编译2410/2440的,就选armv4t。以此类推S3C6410 ARM1176JZF-S核心使用的是armv6架构,就选armv6。可以通过./arm-linux-gcc --target查看架构。

进入Toolchain option-- →菜单,修改的内容如下:

1)、Tuple's vendor string指定经销商的名称,影响向生成的编译器的前缀为arm-andy-Linux-gnueabi;Tuple's alias是生成编译器别名,可以使用arm-linux-gcc简洁的命令

进入Operating System --->菜单。选择编译的内核版本。这里使用默认的参数

进入Binary utilities --->选择binutils的源码包版本号,配置二进制工具。这里使用默认参数。

C-library --->菜单,选择glibc库版本,使用默认参数

C compiler --->菜单选择GCC版本,选择默认参数

Debug facilities --->菜单,选择调试工具版本,默认参数。

Companion libraries --->菜单,编译工具,GMP是实现任意精度算术运算的软件包,可以完成有符号整数、有理数和浮点数的运算。只要计算机的内存满足需求,GMP的运算精度没有任何限制。MPFR是一个用于高精度浮点运算的C库。默认参数

接着保存退出。配置完成。

e、下面就可以开始编译了,默认情况下,源码包会从网络下载,会占用比较大的带宽,下载后总大小在200MB左右,下载好会放到 /work/tools/crosstool-ng-1.20.0/src下。也可以先从网上下载,大部分软件可以在这个清华镜像下载:https://mirrors.tuna.tsinghua.edu.cn,然后再编译。也可以先编译,如果缺少相应的包下载不成功,会提示。大致的包列表如下:

binutils-2.22.tar.bz2

cloog-0.18.1.tar.gz

dmalloc-5.5.2.tgz

duma_2_5_15.tar.gz

expat-2.1.0.tar.gz

gcc-4.9.1.tar.bz2

gdb-7.8.tar.gz

glibc-2.19.tar.bz2

gmp-5.1.3.tar.xz

isl-0.12.2.tar.bz2

libelf_0.8.13.orig.tar.gz

linux-3.4.97.tar.gz

ltrace_0.7.3.orig.tar.bz2

mpc-1.0.2.tar.gz

mpfr-3.1.2.tar.xz

ncurses-5.9.tar.gz

strace-4.8.tar.xz

f、执行ct-ng build开始编译,我在编译过程中一共遇到两个问题。

1)、安装到cross-gdb时,出现configure: error: expat is missing or unusable,expat-2.1.0.tar.gz这个文件是运行build时它自己下载的。解决:sudo apt-get install libexpat1-dev.

2)、解决完问题1后执行ct-ng cross-gdb+可以接着前面的编译。又出现了_123136.c:835:15: error: expected ')' before 'int'的错误。在网上搜寻答案。解决:export CPPFLAGS="-P"。

g、最后编译成功界面如下,切换到编译后的路径/work/tools/crosstool-ng_build/bin。执行./arm-linux-gcc -v。若有信息输出,说明编译成功

h、测试编译后的arm程序。未完待续。

利用Crosstool-ng制作交叉编译工具链的更多相关文章

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

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

  2. 使用buildroot创建自己的交叉编译工具链【转】

    本文转载自:https://blog.csdn.net/linczone/article/details/45894181 使用buildroot创建自己的交叉编译工具链 关键字:buildroot ...

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

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

  4. Linux ARM交叉编译工具链制作过程【转】

    本文转载自:http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html 一.下载源文件 源代码文件及其版本与下载 ...

  5. CROSSTOOL-NG建立交叉编译工具链

    CROSSTOOL-NG建立交叉编译工具链 因为考试和学习的原因我已经一段时间没有玩我的JZ2440,现在终于考完试了,我再次找出了我的JZ2440.我之前学习的时候使用的是韦东山老师提供的开发工具, ...

  6. 交叉编译工具链介绍《Building Embedded Linux Systems》

    1.前言 配置和编译一个合适的GNU工具链是相对复杂的并且需要很精细的操作,包括你需要对不同软件库之间的依赖关系.它们的各自的任务,不同软件库版本情况都有比较好的了解,编译工具链是一个乏味的工作. 2 ...

  7. 构建嵌入式Linux交叉编译工具链

    开源交叉编译工具链制作方法汇总: 1) 使用crosstool/crosstool-ng生成 2) 使用buildroot生成 ARM交叉编译工具链说明: 1) arm-linux-gcc是一个集合命 ...

  8. 【转】ARM交叉编译工具链

    原文网址:http://www.veryarm.com/cross-tools 为什么要用交叉编译器? 交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台( ...

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

    转载整理自:http://www.veryarm.com/cross-tools 从授权上,ARM交叉编译工具链分为免费授权版和付费授权版. 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自 ...

随机推荐

  1. 架构师技能图谱 V1.2

    系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 灾难恢复和备份 协议设计 二进制协议 文本协议 接入层架构设计 DNS 轮询 动静态分离 静态化 反 ...

  2. Nginx——基本操作

    1.获得root用户权限 如果鉴定失败多试几次 一. gcc 安装安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install ...

  3. 【Python】Elasticsearch和elasticsearch_dsl

    官网:https://elasticsearch-py.readthedocs.io/en/master/api.html 官网:https://github.com/elastic/elastics ...

  4. Django建站+Vuejs前端

    第一节 @注意 千万注意格式.标签名字: 浏览器开发者模式修改页面不显示:在开发者模式下(F12进入),打开设置页面(F1),勾选 Disable cache (while DevTools is o ...

  5. cdh启动datanode报错

    问题: 为cdh新增节点时,在分配datanode后,启动报错 Can't open /iot/opt/cloudera-manager/cm-5.11.2/run/cloudera-scm-agen ...

  6. redis bind的坑

    启动redis时,发现外网访问不了 检查以下方面 1. ping redis 的ip 2. 检查防火墙端口是否开放3. bind bind bind指的是绑定哪个ip可以访问 bind 要填写你自己r ...

  7. Mybatis pageHelper.startPage(...)是物理分页

    使用PageHelper.startPage(...)进行物理分页 业务需求只显示其中的100条数据 之前是在业务逻辑里对参数limit进行了处理 后来试试sql的limit查询100条数据 但是不确 ...

  8. hbase版本升级的api对比

    前言 今天来介绍一下,hbase的2.1.0版本升级之后和1.2.6版本的api方法的一些不同之处. hbase的工具类 在介绍hbase的相关的java api之前,这里先介绍一下hbase的工具类 ...

  9. Json.Net(Newtonsoft)系列教程 4.Linq To JSON

    转自:https://www.cnblogs.com/sczmzx/p/7813834.html   一.Linq to JSON是用来干什么的? Linq to JSON是用来操作JSON对象的.可 ...

  10. tcp那个孤独的小包到底怎么回事?

    内核3.10,接<tcp的发送端一个小包就能打破对端的delay_ack么?> 我们继续来分析这个没满mss的小包, 可以看到,由于受到syn ack这端是发包端,所以该发送链路协商的ms ...