您的位置:首页 > 运维架构 > Linux

在Ubuntu13.10上自己动手搭建交叉编译环境arm-linux-gcc-4.8.2

2013-11-30 22:03 696 查看
编译环境:

内核名称:Linux

硬件架构名称:i686

硬件平台:i386

操作系统:Ubuntu 13.10

当前系统gcc版本号:4.8.1

首先先介绍几个重要的名词:host, build, target
build -- 你在什么平台上编译的这个编译器

host -- 这个编译器将来要在什么平台上运行

target -- 编译器最终会生成在哪个平台上执行的可执行代码
--------------------------------------------------------------------------------

Target: 嵌入式软件真正运行的机器,不是开发机器,而是目标机器,一般用[arch]-[vendor]-[OS]-[libc]进行标识,

Common archs: arm, sparc, x86_64, powerpc

Common vendors: pc, softfloat, unknown

Common OS: linux, elf, uclinux

Common libc: gnu, eabi, uclibc

比如:arm-unknown-linux-gnu (ARM architecture, no vendor, linux OS, and the gnueabi ABI),用于编译ARM架构的u-boot、linux内核、linux应用等。

一、准备工作

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.6.1.tar.bz2

linux-2.6.34.14.tar.xz

mpfr-3.1.2.tar.bz2

mpc-1.0.1.tar.gz

gmp-5.1.3.tar.bz2

2、准备软件环境

#apt-get install xz-utils

#apt-get install m4

#apt-get install libncurses-dev

#apt-get install g++

#apt-get install gawk

3、设置环境变量(建议直接在~/.bashrc中修改,注意修改之后要使变量生效)

#vim ~/.bashrc

export TARGET=arm-linux-gnueabi

export PREFIX=/usr/local/arm/4.8.2

export TARGET_PREFIX=$PREFIX/$TARGET

export PATH=$PATH:$PREFIX/bin

#source ~/.bashrc

4、为宿主机安装mpfr、mpc、gmp

#tar -xjvf gmp-5.1.3.tar.bz2

#cd gmp-5.1.3

#mkdir build && cd build

#../configure --prefix=/usr/local/gmp --build=x86_64-linux-gnu

#make

#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

#make install

#tar -xzvf mpc-1.0.1.tar.gz

#cd mpc-1.0.1

#mkdir build && cd build

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

#make

#make install

5、复制linux-kernel-headers

#xz -d linux-2.6.34.14.tar.xz

#tar -xvf linux-2.6.34.14.tar

#cd linux-2.6.34.14

#make menuconfig

不做修改,直接退出。

#make include/linux/version.h

#mkdir -p $TARGET_PREFIX/include

#cp -r ./include/linux/ $TARGET_PREFIX/include

#cp -r ./include/asm-generic/ $TARGET_PREFIX/include

#cp -r ./arch/arm/include/asm/ $TARGET_PREFIX/include

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

二、编译binutils

#tar -xjvf binutils-2.23.1.tar.bz2

#cd binutils-2.23.1

#mkdir build && cd build

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

#make

#make install

完成后,去$PREFIX中检查一下生成的工具。

# cd $PREFIX/bin

# ll

有如下文件:

arm-linux-addr2line*

arm-linux-ar*

arm-linux-as*

arm-linux-c++filt*

arm-linux-elfedit*

arm-linux-gprof*

arm-linux-ld*

arm-linux-ld.bfd*

arm-linux-nm*

arm-linux-objcopy*

arm-linux-objdump*

arm-linux-ranlib*

arm-linux-readelf*

arm-linux-size*

arm-linux-strings*

arm-linux-strip*

这些生成的文件的作用分别为:

arm-linux-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息

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

arm-linux-as:GNU的汇编器

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

arm-linux-elfedit:用途暂时未知

arm-linux-gprof:GNU汇编器预编译器

arm-linux-ld:GNU的连接器

arm-linux-ld.bfd:用途暂时未知

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

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

arm-linux-objdump:显示目标文件的信息

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

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

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

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

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

三、建立初始编译器(不带glibc支持)

#tar -xjvf gcc-4.8.2.tar.bz2

重新解压mpfr-3.1.2.tar.bz2、mpc-1.0.1.tar.gz、gmp-5.1.3.tar.bz2,并改名复制至gcc-4.8.2中

#rm -rf mpfr-3.1.2 mpc-1.0.1 gmp-5.1.3

#tar -xjvf gmp-5.1.3.tar.bz2

#mv gmp-5.1.3 gmp

#mv ./gmp ./gcc-4.8.2

#tar -xjvf mpfr-3.1.2.tar.bz2

#mv mpfr-3.1.2 mpfr

#mv ./mpfr ./gcc-4.8.2

#tar -xzvf mpc-1.0.1.tar.gz

#mv mpc-1.0.1 mpc

#mv ./mpc ./gcc-4.8.2

#cd gcc-4.8.2

#mkdir build

#cd build

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

#make all-gcc

#make install-gcc

#make all-target-libgcc

#make install-target-libgcc

完成之后,$PREFIX/bin下又多了几个文件:

arm-linux-cpp*

arm-linux-gcc*

arm-linux-gcc-4.8.2*

arm-linux-gcov*

这些生成的文件的作用分别为:

arm-linux-cpp:GNU的C的预编译器

arm-linux-gcc:GNU的C语言编译器

arm-linux-gcc-4.8.2:GNU的C语言编译器,其实和arm-linux-gcc是一样的

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

四、编译glibc

Glibc是交叉编译环境的运行库。

#tar -xvf glibc-2.18.tar.xz

#tar -xvf glibc-linuxthreads-2.5.tar.bz2 --directory=./glibc-2.18

# cd glibc-2.18

# mkdir build

# cd build

# CC=$TARGET-gcc

#export CFLAGS="-g -O2 -march=arm"

# ln -s /usr/local/arm/4.8.2/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc.a /usr/local/arm/4.8.2/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc_eh.a

创建config.cache配置文件

# vim config.cache

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

libc_cv_arm_tls=yes

# ../configure --host=$TARGET --target=$TARGET --prefix=$TARGET_PREFIX --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin --with-headers=$TARGET_PREFIX/include

#make all

#make install

五、建立全套编译器(full gcc)

# cd gcc-4.8.2/build/

# rm -rf *

# ../configure --prefix=$PREFIX --target=$TARGET --enable-shared --enable-languages=c,c++

# make

# make install

完成之后,$PREFIX/bin下又多了几个文件:

arm-linux-c++*

arm-linux-g++*

这些生成的文件的作用分别为:

arm-linux-g++:GNU的c++编译器

arm-linux-c++:等同于arm-linux-g++

六、编译gdb

# tar -xvf gdb-7.6.1.tar.bz2

# make

# make install

七、创建链接

# cd $PREFIX/bin

# ln -s arm-linux-gnueabi-addr2line arm-linux-addr2line

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

# ln -s arm-linux-gnueabi-as arm-linux-as

# ln -s arm-linux-gnueabi-c++ arm-linux-c++

# ln -s arm-linux-gnueabi-c++filt arm-linux-c++filt

# ln -s arm-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 -s arm-linux-gnueabi-gcc arm-linux-gcc

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

# ln -s arm-linux-gnueabi-gcov arm-linux-gcov

# ln -s arm-linux-gnueabi-gdb arm-linux-gdb

# ln -s arm-linux-gnueabi-gdbtui arm-linux-gdbtui

# ln -s arm-linux-gnueabi-gprof arm-linux-gprof

# ln -s arm-linux-gnueabi-ld arm-linux-ld

# ln -s arm-linux-gnueabi-ld.bfd arm-linux-ld.bfd

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

# ln -s arm-linux-gnueabi-objcopy arm-linux-objcopy

# ln -s arm-linux-gnueabi-objdump arm-linux-objdump

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

# ln -s arm-linux-gnueabi-readelf arm-linux-readelf

# ln -s arm-linux-gnueabi-run arm-linux-run

# ln -s arm-linux-gnueabi-size arm-linux-size

# ln -s arm-linux-gnueabi-strings arm-linux-strings

# ln -s arm-linux-gnueabi-strip arm-linux-strip

八、验证

使用vim编写一个简单文件,这里以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, not stripped

有如上输出表示编译ARM版本程序成功。

至此完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: