用Crosstool-ng构建交叉编译工具链

交叉编译指在一个平台上生成另一个平台上的可执行代码。常见的有三种:

  • 在Windows PC上,利用集成开发环境(ADS),运行armcc编译器,编译出针对ARM CPU的可执行代码
  • 在Windows PC上,利用cygwin环境,运行arm-elf-gcc编译器,编译出针对ARM CPU 的可执行代码
  • 在Linux PC上,利用arm-linux-gcc编译器,编译出针对Linux ARM平台的可执行代码

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils、gcc和glibc 3部分组成。
本文使用Crosstool-ng在Ubuntu系统中构建用于ARM平台的交叉编译工具链。

  • 交叉编译工具:arm-linux-6.3.0
  • 编译平台:Ubuntu 14.04.4 LTS
  • 目标平台:S3C6410
  • crosstool-ng-1.23.0

一 、下载安装crosstool-ng

  1. crosstool-ng官网github上下载最新版本。
~/arm-linux-tools$ wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.23.0.tar.bz2
  1. 解压源码,进入源码目录
~/arm-linux-tools$ tar jxvf crosstool-ng-1.23.0.tar.bz2 
~/arm-linux-tools$ cd crosstool-ng-1.23.0/
  1. 安装编译依赖包
sudo apt-get install sed bash dpkg-dev bison flex patch texinfo automake m4 libtool cvs websvn tar gzip bzip2 lzma libncurses5-dev bison flex texinfo automake libtool patch cvs cvsd gperf help2man gawk

安装中提示如下错误:
dpkg: error processing package websvn (--configure):
subprocess installed post-installation script returned error exit status 1
E: Sub-process /usr/bin/dpkg returned an error code (1)
解决

$ sudo mv /var/lib/dpkg/info/ /var/lib/dpkg/info_old/
$ sudo mkdir /var/lib/dpkg/info/
$ sudo apt-get update
  1. 执行编译三部曲
./configure --prefix=/opt/crosstool-ng
make
sudo make install

安装成功后会提示要配置环境变量:

For auto-completion, do not forget to install 'ct-ng.comp' into
your bash completion directory (usually /etc/bash_completion.d)

  1. 配置环境变量
echo "PATH=$PATH:/opt/crosstool-ng/bin" >> ~/.bashrc
source ~/.bashrc

测试是否安装成功

ct-ng -v

GNU Make 3.81
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
This program built for x86_64-pc-linux-gnu

二、 配置交叉编译工具链

创建目录:交叉工具链的输出目录,保存源码包目录,交叉编译器的安装路径

~/arm-linux-tools$ mkdir crosstool-build src x-tools

将crosstool-ng源码包中samples/arm-unknown-linux-gnueabi/下的crosstool.config拷贝到交叉工具链的输出目录crosstool-build下

~/arm-linux-tools/crosstool-build$ cp /opt/crosstool-ng/lib/crosstool-ng-1.23.0/samples/arm-unknown-linux-gnueabi/crosstool.config .config

执行ct-ng menuconfig进入配置界面

ct-ng menuconfig
crosstool-ng 配置界面
  • 设定源码包路径和交叉编译工具链的安装路径
    Paths and misc options--->
    激活 'Try features marked as EXPERIMENTAL' 选项
    (${HOME}/arm-linux-tools/src) Local tarballs directory
    (${HOME}/crosstool-ng/x-tools) Prefix directory
  • 修改交叉编译工具针对的架构(S3C6410)
    Target options--->
    Target architecture(arm)
    Endianness(Little endian)
    Bitness(32-bit)
    (armv6zk) Architecture level
    (arm1176jzf-s) Emit assembly for CPU
    Floating point(hardware FPU)
  • 其它选项用缺省值,退出并保存配置工具
  • 以上配置也可通过直接修改.config文件来完成

执行ct-ng build编译工具链

ct-ng build

编译大约花费4个小时,编译过程中会自动下载所需的源码:


交叉编译器所需要的源码文件列表

添加环境变量

echo "PATH=$PATH:$HOME/arm-linux-tools/x-tools/bin" >> ~/.bashrc
source ~/.bashrc

测试是否安装成功

arm-unknown-linux-gnueabihf-gcc -v

Using built-in specs.
COLLECT_GCC=arm-unknown-linux-gnueabihf-gcc
COLLECT_LTO_WRAPPER=/home/lionel/arm-linux-tools/x-tools/libexec/gcc/arm-unknown-linux-gnueabihf/6.3.0/lto-wrapper
Target: arm-unknown-linux-gnueabihf
Configured with: /home/lionel/arm-linux-tools/crosstool-build/.build/src/gcc-6.3.0/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-unknown-linux-gnueabihf --prefix=/home/lionel/arm-linux-tools/x-tools --with-sysroot=/home/lionel/arm-linux-tools/x-tools/arm-unknown-linux-gnueabihf/sysroot --enable-languages=c,c++ --with-cpu=arm1176jzf-s --with-float=hard --with-pkgversion='crosstool-NG crosstool-ng-1.23.0' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --with-mpfr=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --with-mpc=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --with-isl=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/lionel/arm-linux-tools/x-tools/arm-unknown-linux-gnueabihf/sysroot --enable-long-long
Thread model: posix
gcc version 6.3.0 (crosstool-NG crosstool-ng-1.23.0)

标准化交叉编译链arm-linux-gcc-6.3.0

上面编译生成的工具arm-unknown-linux-gnueabihf-这样的命令,但是很多标准Makefile需要实用标准的交叉编译器的名称,一般这个名称是arm-linux-gcc这样的。
我们可以通过一个shell脚本来完成:

~/arm-linux-tools/x-tools/bin$ sudo vim link.sh
~/arm-linux-tools/x-tools/bin$ sudo sh link.sh

link.sh

#!/bin/sh
PREFIX=arm-unknown-linux-gnueabihf-
AFTFIX=arm-linux-
ln -s ${PREFIX}gcc ${AFTFIX}gcc
ln -s ${PREFIX}addr2line ${AFTFIX}addr2line
ln -s  ${PREFIX}ar ${AFTFIX}ar
ln -s  ${PREFIX}as ${AFTFIX}as
ln -s  ${PREFIX}c++ ${AFTFIX}c++
ln -s  ${PREFIX}c++filt ${AFTFIX}c++filt
ln -s  ${PREFIX}cpp ${AFTFIX}cpp
ln -s  ${PREFIX}g++ ${AFTFIX}g++
ln -s  ${PREFIX}gcov ${AFTFIX}gcov
ln -s  ${PREFIX}gdb ${AFTFIX}gdb
ln -s  ${PREFIX}gprof ${AFTFIX}gprof
ln -s  ${PREFIX}ld ${AFTFIX}ld
ln -s  ${PREFIX}ldd ${AFTFIX}ldd
ln -s  ${PREFIX}nm ${AFTFIX}nm
ln -s  ${PREFIX}objcopy ${AFTFIX}objcopy
ln -s  ${PREFIX}objdump ${AFTFIX}objdump
ln -s  ${PREFIX}populate ${AFTFIX}populate
ln -s  ${PREFIX}ranlib ${AFTFIX}ranlib
ln -s  ${PREFIX}readelf ${AFTFIX}readelf
ln -s  ${PREFIX}size ${AFTFIX}size
ln -s  ${PREFIX}strings ${AFTFIX}strings
ln -s  ${PREFIX}strip ${AFTFIX}strip
ln -s  ${PREFIX}cc ${AFTFIX}cc
ln -s  ${PREFIX}dwp ${AFTFIX}dwp
ln -s  ${PREFIX}elfedit ${AFTFIX}elfedit
ln -s  ${PREFIX}gcc-6.3.0 ${AFTFIX}gcc-6.3.0
ln -s  ${PREFIX}gcc-ar ${AFTFIX}gcc-ar
ln -s  ${PREFIX}gcc-nm ${AFTFIX}gcc-nm
ln -s  ${PREFIX}gcc-ranlib ${AFTFIX}gcc-ranlib
ln -s  ${PREFIX}gcov-tool ${AFTFIX}gcov-tool
ln -s  ${PREFIX}ld.bfd ${AFTFIX}ld.bfd
ln -s  ${PREFIX}ld.gold ${AFTFIX}ld.gold

测试

arm-linux-gcc -v

Using built-in specs.
COLLECT_GCC=arm-linux-gcc
COLLECT_LTO_WRAPPER=/home/lionel/arm-linux-tools/x-tools/libexec/gcc/arm-unknown-linux-gnueabihf/6.3.0/lto-wrapper
Target: arm-unknown-linux-gnueabihf
Configured with: /home/lionel/arm-linux-tools/crosstool-build/.build/src/gcc-6.3.0/configure --build=x86_64-build_pc-linux-gnu --host=x86_64-build_pc-linux-gnu --target=arm-unknown-linux-gnueabihf --prefix=/home/lionel/arm-linux-tools/x-tools --with-sysroot=/home/lionel/arm-linux-tools/x-tools/arm-unknown-linux-gnueabihf/sysroot --enable-languages=c,c++ --with-cpu=arm1176jzf-s --with-float=hard --with-pkgversion='crosstool-NG crosstool-ng-1.23.0' --disable-sjlj-exceptions --enable-__cxa_atexit --disable-libmudflap --disable-libgomp --disable-libssp --disable-libquadmath --disable-libquadmath-support --disable-libsanitizer --disable-libmpx --with-gmp=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --with-mpfr=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --with-mpc=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --with-isl=/home/lionel/arm-linux-tools/crosstool-build/.build/arm-unknown-linux-gnueabihf/buildtools --enable-lto --with-host-libstdcxx='-static-libgcc -Wl,-Bstatic,-lstdc++,-Bdynamic -lm' --enable-threads=posix --enable-target-optspace --enable-plugin --enable-gold --disable-nls --disable-multilib --with-local-prefix=/home/lionel/arm-linux-tools/x-tools/arm-unknown-linux-gnueabihf/sysroot --enable-long-long
Thread model: posix
gcc version 6.3.0 (crosstool-NG crosstool-ng-1.23.0)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容