Ubuntu 14.04 交叉编译工具制作

原创 2014年07月11日 10:16:59

前言

    需要在目标板上移植linu-3.08内核及目标板上跑应用程序,在 ubuntu14.04  64位系统上建立交叉编译环境。参考wyjkk博文

http://blog.csdn.net/wyjkk/article/details/5792048。将成功制作的整个过程记录如下:

编译环境:

    内核名称:Linux
    硬件架构名称:i686
    硬件平台:i386
    操作系统:Ubuntu 14.04 LST

    当前系统安装的gcc版本号:4.8.2

1.下载源码包和补丁包

binutils-2.23.1.tar.bz2

gcc-4.8.2.tar.bz2
glibc-2.18.tar.bz2
glibc-linuxthreads-2.5.tar.bz2
gdb-7.7.tar.bz2
linux-3.0.8.tar.gz
mpfr-3.1.2.tar.bz2
mpc-1.0.1.tar.gz
gmp-5.1.3.tar.bz2

2.准备软件环境
#sudoapt-get install xz-utils
#sudo apt-get install m4
#sudo apt-getinstall libncurses-dev
#apt-get install g++(系统已经安装4.8.2版)
#sudo apt-getinstall gawk

3.为宿主机安装mpfrmpcgmp(之前有安装过这三个库,此步可略过)
#tar-xjvf gmp-5.1.3.tar.bz2
#cd gmp-5.1.3
#mkdir build

#cdbuild
#../configure --prefix=/usr/local/gmp--build=x86_64-linux-gnu
#make
#sudo make install

#tar-xjvf mpfr-3.1.2.tar.bz2
# cd mpfr-3.1.2
#./configure--build=x86_64-linux-gnu --prefix=/usr/local/mpfr--with-gmp=/usr/local/gmp
#make
#sudo make install

#tar-xzvf mpc-1.0.1.tar.gz
#cd mpc-1.0.1
#mkdir build

#cdbuild
#../configure --build=x86_64-linux-gnu--prefix=/usr/local/mpc --with-gmp=/usr/local/gmp--with-mpfr=/usr/local/mpfr
#make
#sudo make install


make 出现错误:error:libmpfr not found or uses a different ABI (including static vsshared).

解决:apt-getinstall libmpfr-dev

4.建立工作目录

自己选一个合适的地方,建立一个总文件夹Embedded,并且在其下建立build-toolskerneltools三个子文件夹、我们以后的操作就都在这里进行了。

$mkdir Embedded

$cd Embedded

$mkdir build-tools kernel tool

$ls

build-tools kernel tool

各文件夹作用如下:

build-tools: 保存binutilsgccglibc的源代码和用来编译这些源代码的目录。

kernel : 保存内核源代码和补丁。

tools : 保存编译好的交叉编译工具和库文件。

然后在build-tools文件夹中建立如下子文件夹:


$cd build-tools

$mkdir build-binutils build-boot-gcc build-glibc build-gcc


build-binutils :编译binutils的目录

build-boot-gcc:编译gcc启动部分的目录

build-glibc :编译glibc的目录

build-gcc :编译完整gcc的目录


5.设置环境变量:

这里设置环境变量只是为了方便,因为每个工具的config都需要输入类似的变量,不如放在环境变量里。


在命令行下打开sudogedit ~/.bashrc,在文档最后输入下面几行,然后source~/.bashrc使环境变理生效


exportPRJROOT=/home/yake/Embedded

exportTARGET=arm-linux-gnueabi

exportPREFIX=$PRJROOT/tools

exportTARGET_PREFIX=$PREFIX/$TARGET

exportPATH=$PREFIX/bin:$PATH


各变量的具体意义如下:

PRJROOT : 整个工程的根目录,这里当然是Embeded

TARGET :目标文件对应的体系结构,arm-linux代表编译出来的target只能在arm体系结构中运行

PREFIX : 设置目标文件夹的路径前缀

TARGET_PREFIX : 设置目标文件夹的路径前缀路径

PATH : 添加可执行文件的路径,这里主要是只中间编译工具等


6.建立内核include文件

解压linux-3.0.8.tar.gz源码到kernel目录下:

#tar-xzvf linux-3.0.8.tar.gz -C /home/yake/Embedded/kernel


cd/home/yake/Embedded/kernel/linux-3.0.8


#makemenuconfig(输入这条命令前必须保证终端窗口足够大,否则无法完整显示配置菜单会错误退出)
不做修改,直接退出。
这个是编译glibc时必须的,使用命令#makeinclude/generated/uapi/linux/version.h(3.13版本)

#makeinclude/linux/version.h
#sudo mkdir -p $TARGET_PREFIX/include


#cp -r /home/yake/Embedded/kernel/linux-3.0.8/include/linux/$TARGET_PREFIX/include/
# cp -r/home/yake/Embedded/kernel/linux-3.0.8/include/asm-generic$TARGET_PREFIX/include/
# cp -r/home/yake/Embedded/kernel/linux-3.0.8/arch/arm/include/asm$TARGET_PREFIX/include/



接着进入相应目录查看version.h文件是否建立成功。


7.编译binutils

解压binutils源码到文件夹:$PRJROOT/build-tools

tar-xjvf binutils-2.23.1.tar.bz2 -C $PRJROOT/build-tools

配置:

cd$PRJROOT/build-tools/build-binutils

#../binutils-2.23.1/configure --target=$TARGET --prefix=$PREFIX

编译:make-j4

安装:makeinstall


完成后检查一下$PREFIX文件夹,是不是多了三个子文件夹,bin,lib, share? 打开bin,发现里面生成了14个可执行文件:


[root@localhostbin]# ls

arm-none-linux-gnueabi-addr2line arm-none-linux-gnueabi-as arm-none-linux-gnueabi-gprof arm-none-linux-gnueabi-nm arm-none-linux-gnueabi-objdump arm-none-linux-gnueabi-readelf arm-none-linux-gnueabi-stringsarm-none-linux-gnueabi-ar arm-none-linux-gnueabi-c++filt arm-none-linux-gnueabi-ld arm-none-linux-gnueabi-objcopy arm-none-linux-gnueabi-ranlib arm-none-linux-gnueabi-size arm-none-linux-gnueabi-strip



他们的功能分别是:


add2line :将你要找的地址转成文件和行号,它要使用debug信息。

ar :产生、修改和解开一个存档文件

as gnu的汇编器

c++filt C++java中有一种重载函数,所用的重载函数最后会被编译转化成汇编的标,c++filt就是实现这种反向的转化,根据标号得到函数名。

gprof gnu汇编器预编译器。

ld gnu的连接器

nm :列出目标文件的符号和对应的地址

objcopy :将某种格式的目标文件转化成另外格式的目标文件

objdump :显示目标文件的信息

ranlib :为一个存档文件产生一个索引,并将这个索引存入存档文件中

readelf :显示elf格式的目标文件的信息

size :显示目标文件各个节的大小和目标文件的大小

strings :打印出目标文件中可以打印的字符串,有个默认的长度,为4

strip :剥掉目标文件的所有的符号信息



8.建立bootstrapgcc

首先,我们为什么要建立bootstrapgcc,而不能一次性成功?原因有两点:


一是由于平台本身的gcc编译器和我们要建立的gcc版本不同,第一次用平台本身的编译器去build目标版本的gcc编译器的时候,新生成的目标编译器(相当于初始编译器编译链接生成的可执行文件)必然带有初始编译器的特征。而当我们用新生成的编译器再次编译自身时,便可去掉这种差异性。


二是因为gcc编译器依赖于glibc,而当前我们的glibc是基于本机的,所以我们首先要build基于arm体系结构的glibc,再在glibc的基础上生成基于arm体系结构的gcc


这一步是最容易出错的,对每一步都必须谨慎,不要犯粗心之类的低级错误。


解压gcc源码到build-tool文件夹下

#tar-xjvf gcc-4.8.2.tar.bz2 -C $PRJROOT/build-tools


解压mpfr-3.1.2.tar.bz2mpc-1.0.1.tar.gzgmp-5.1.3.tar.bz2,并改名复制至gcc-4.8.2

#tar-xjvf gmp-5.1.3.tar.bz2
#mvgmp-5.1.3 gmp

#tar -xjvfmpfr-3.1.2.tar.bz2
#mvmpfr-3.1.2 mpfr

#tar -xzvfmpc-1.0.1.tar.gz
#mv mpc-1.0.1mpc

#mv./gmp $PRJROOT/build-tools/gcc-4.8.2

#mv ./mpc $PRJROOT/build-tools/gcc-4.8.2

#mv ./mpfr $PRJROOT/build-tools/gcc-4.8.2


#cd $PRJROOT/build-tools/build-boot-gcc


配置:

#../gcc-4.8.2/configure--target=$TARGET --prefix=$PREFIX --without-headers--enable-languages=c --disable-threads --with-newlib --disable-shared--disable-libmudflap --disable-libssp


编译:#makeall-gcc -j4

安装gcc:#make install-gcc

编译安装libgcc,这个是后面编译glibc必须的。

编译:#makeall-target-libgcc -j4

安装libgcc:# make install-target-libgcc


安装完成后,在$PREFIX/bin下又多了几个文件,

arm-none-linux-gnueabi-cpp : gnuC的预编译器

arm-none-linux-gnueabi-gcc : gnuC语言编译器

arm-none-linux-gnueabi-gcc-4.8.2: gnuC语言编译器,其实和arm-linux-gcc是一样的

arm-none-linux-gnueabi-gccbug : 一个可执行脚本,具体作用未知。

arm-none-linux-gnueabi-gcov : gcc 的辅助测试工具,用来分析和优化程序


9.建立glibc

glibc是交叉编译环境的运行库

解压源码:

#tar-xjvf glibc-2.18.tar.bz2 -C $PRJROOT/build-tools
#tar -xvfglibc-linuxthreads-2.5.tar.bz2--directory=$PRJROOT/build-tools/glibc-2.18
# cd$PRJROOT/build-tools/build-glibc

../glibc-2.18/configureCC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib --host=$TARGET--target=$TARGET --prefix=$TARGET_PREFIX --with-tls--disable-profile --enable-add-ons --with-binutils=$PREFIX/bin--with-headers=$TARGET_PREFIX/include libc_cv_forced_unwind=yeslibc_cv_c_cleanup=yes libc_cv_arm_tls=yes


编译:make

安装:makeinstall


10.建立完整版gcc

进入目录build-gcc,

#cd $PRJROOT/build-tools/build-gcc

配置:

../gcc-4.8.2/configure--target=$TARGET --prefix=$PREFIX --enable-languages=c,c++--disable-libgomp


编译:

makeall -j4


安装:

makeinstall


安装完成后,在$PREFIX/bin下多了gnuc++编译器:

arm-none-linux-gnueabi-gcc

arm-none-linux-gnueabi-c++


11.编译gdb

#tar-zxvf gdb-7.7.tar.gz -C $PRJROOT/build-tools

#cd$PRJROOT/build-tools/gdb-7.7

#./configure--prefix=$PREFIX --target=$TARGET

#make
#make
install

安装完成后,在$PREFIX/bin下多了gnuc++编译器:

arm-none-linux-gnueabi-gdb

arm-none-linux-gnueabi-run

12.创建链接
#cd $PREFIX/bin
# ln -s arm-linux-gnueabi-addr2linearm-linux-addr2line
# ln -s arm-linux-gnueabi-ar arm-linux-ar
#ln -s arm-linux-gnueabi-as arm-linux-as
# ln -sarm-linux-gnueabi-c++ arm-linux-c++
# ln -sarm-linux-gnueabi-c++filt arm-linux-c++filt
# ln -sarm-linux-gnueabi-cpp arm-linux-cpp

#ln -s arm-linux-gnueabi-elfedit arm-linux-elfedit


#ln -s arm-linux-gnueabi-g++ arm-linux-g++
# ln -sarm-linux-gnueabi-gcc arm-linux-gcc
# ln -sarm-linux-gnueabi-gcc-4.8.2 arm-linux-gcc-4.8.2
# ln -sarm-linux-gnueabi-gcov arm-linux-gcov

#ln -s arm-linux-gnueabi-gdb arm-linux-gdb
# ln -sarm-linux-gnueabi-gprof arm-linux-gprof
# ln -sarm-linux-gnueabi-ld arm-linux-ld
# ln -s arm-linux-gnueabi-ld.bfdarm-linux-ld.bfd
# ln -s arm-linux-gnueabi-nm arm-linux-nm
# ln-s arm-linux-gnueabi-objcopy arm-linux-objcopy
# ln -sarm-linux-gnueabi-objdump arm-linux-objdump
# ln -sarm-linux-gnueabi-ranlib arm-linux-ranlib
# ln -sarm-linux-gnueabi-readelf arm-linux-readelf
# ln -sarm-linux-gnueabi-run arm-linux-run
# ln -s arm-linux-gnueabi-sizearm-linux-size
# ln -s arm-linux-gnueabi-stringsarm-linux-strings
# ln -s arm-linux-gnueabi-strip arm-linux-strip

#ln -s arm-linux-gnueabi-gcc-ar arm-linux-gcc-ar

#ln -s arm-linux-gnueabi-gcc-nm arm-linux-gcc-nm

#ln -s arm-linux-gnueabi-gcc-ranlib arm-linux-gcc-ranlib

13.验证
gedit
编写一个简单文件,这里以hello.c为例.代码如下:

#include<stdio.h>

main()

{

printf("hello,world\n");

}

保存后退出。进入hello.c文件所在目录,然后执行编译命令:
#arm-linux-gcc -static hello.c -o hello
编译完成后验证最终编译出的文件。实例:
#file hello 
hello: ELF 32-bit LSB executable, ARM, version 1,statically linked, for GNU/Linux 2.0.0, notstripped
有如上输出表示编译ARM版本程序成功。





Ubuntu 14.04 64位 嵌入式交叉编译环境arm-linux-gcc搭建 一次成功

最近在自己电脑上安装了ubuntu14.04 64位 的操作系统,想搭建嵌入式交叉编译环境arm-linux-gcc做嵌入式研究。在网上看了很多有关的帖子和博文,都不能一次成功,经过几次反复的折腾,总...
  • dianzishijian
  • dianzishijian
  • 2015年08月28日 13:45
  • 3478

Ubuntu下Zynq交叉编译环境的搭建

使用Ubuntu 14.04 LTS 一、准备
  • ToAsuN
  • ToAsuN
  • 2014年09月28日 16:49
  • 1905

虚拟机中在Ubuntu14.04下搭建QT交叉编译环境--2014/8/14

一、Ubuntu安装及配置 在windows上下载VMware10.0.2 并安装,在网上找永久密钥激活。打开后是中文版 在Ubuntu官网上下载ubuntu-14.04.1-desktop-i3...
  • zhang2531
  • zhang2531
  • 2014年08月16日 12:44
  • 3154

Ubuntu 14.04 arm-2009q3交叉编译工具链的安装及使用

我的开发板:GEC210。  文章仅作自己学习过程中的记录。  最近在学习ARM开发板,按照开发板附送的安装交叉编译链教程,原文如下: 将光盘中交叉编译工具的源码 arm-2009q3.tar.b...
  • a470038781
  • a470038781
  • 2016年10月30日 19:02
  • 1764

ubuntu 14.04 安装交叉编译工具链arm-none-linux-gnueabi

使用解压版安装方式,下载工具链压缩包: arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2,参考链接。 解压缩到/opt/下...
  • hj74535099
  • hj74535099
  • 2015年12月08日 15:34
  • 2019

64位的ubuntu14.04 LTS安装 Linux交叉编译工具链及32位“ia32-libs”依赖库

转载来自:https://www.cnblogs.com/cartsp/p/5308604.html ubuntu又迎来了其新一代的长期支持版本 14.04 LTS,其带来了许多令人期待的新...
  • songyimin1208
  • songyimin1208
  • 2017年11月13日 20:19
  • 123

ubuntu1104和redhat9下制作交叉编译工具链教程

  • 2011年07月26日 07:08
  • 929KB
  • 下载

ubuntu下利用crosstool制作交叉编译工具

1、ubuntu版本:unbutu10.10(以上版本应该也可以,本人没有测试) 2、制作交叉编译工具需要文件: l binutils-2.16.1.tar.bz2  http://mir...
  • xingren0909
  • xingren0909
  • 2013年08月16日 13:44
  • 338

Ubuntu ARM交叉编译工具链制作过程

本文主机环境为Ubuntu10.04.4桌面版 内核:2.6.32 GCC:4.4.3 ---------------------------------------------------转载...
  • xiaobin_HLJ80
  • xiaobin_HLJ80
  • 2012年10月09日 23:01
  • 2578

ubuntu 利用crosstool-ng-1.8.1制作交叉编译工具链

我的编译主要是参考了: http://blog.chinaunix.net/u3/104206/showart_2325147.html 和 http://blog.chinaunix.net/...
  • shy19910509
  • shy19910509
  • 2017年03月08日 17:10
  • 230
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ubuntu 14.04 交叉编译工具制作
举报原因:
原因补充:

(最多只允许输入30个字)