Linux-arm-gcc-4.8.2交叉编译工具链制作

Linux-arm-gcc-4.8.2交叉编译工具链制作

参考1:https://blog.csdn.net/weixin_30345055/article/details/99321921

参考2:https://blog.csdn.net/cs_sword2000/article/details/99313127

完完全全按照上面两位博主的博文来制作会碰到很多问题,可能是因为Ubuntu版本的问题,版本越高,问越多。最终采用UBuntu14.04_i386版本,再加以细小的修改两位博主的博文才得以成功!

首先先介绍几个重要的名词: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、编译环境

操作系统Ubuntu14.04_i386
当前系统gcc版本号:4.8.2
Make 版本号:3.81
内核名称:Linux

2、所需源文件

 binutils-2.23.1.tar.bz2
 glibc-2.18.tar.gz
 gcc-4.8.2.tar.bz2
 gmp-5.1.3.tar.bz2
 mpfr-3.1.2.tar.bz2
 mpc-1.0.1.tar.gz
 linux-2.6.34.14.tar.bz2
ubuntu-14.04.1-desktop-i386.iso
也可以到我的百度网盘下载
提取码:crg0

3、环境条件的软件安装

apt-get install xz-utils
apt-get install m4
apt-get install libncurses-dev
apt-get install g++
apt-get install gawk

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

vim ~/.bashrc
	export TARGET=arm-linux-gnueabi
   	export PREFIX=/usr/local/arm/gcc-4.8.2
   	export TARGET_PREFIX=$PREFIX/$TARGET
   	export PATH=$PATH:$PREFIX/bin
source  ~/.bashrc

5、为宿主机安装mpfr、mpc、gmpc

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
mkdir build && cd build
../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

6、复制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-gnueabi-addr2line*
arm-linux-gnueabi-ar*
arm-linux-gnueabi-as*
arm-linux-gnueabi-c++filt*
arm-linux-gnueabi-elfedit*
arm-linux-gnueabi-gprof*
arm-linux-gnueabi-ld*
arm-linux-gnueabi-ld.bfd*
arm-linux-gnueabi-nm*
arm-linux-gnueabi-objcopy*
arm-linux-gnueabi-objdump*
arm-linux-gnueabi-ranlib*
arm-linux-gnueabi-readelf*
arm-linux-gnueabi-size*
arm-linux-gnueabi-strings*
arm-linux-gnueabi-strip*
这些生成的文件的作用分别为:
arm-linux-gnueabi-addr2line:将你要找的地址转成文件和行号,它要使用 debug 信息
arm-linux-gnueabi-ar:产生、修改和解开一个存档文件
arm-linux-gnueabi-as:GNU的汇编器
arm-linux-gnueabi-c++filt:C++ 和 java 中有一种重载函数,所用的重载函数最后会被编译转化成 汇编的 标,c++filt 就是实现这种反向的转化,根据标号得到函数名
arm-linux-gnueabi-elfedit:用途暂时未知
arm-linux-gnueabi-gprof:GNU汇编器预编译器
arm-linux-gnueabi-ld:GNU的连接器
arm-linux-gnueabi-ld.bfd:用途暂时未知
arm-linux-gnueabi-nm:列出目标文件的符号和对应的地址
arm-linux-gnueabi-objcopy:将某种格式的目标文件转化成另外格式的目标文件
arm-linux-gnueabi-objdump:显示目标文件的信息
arm-linux-gnueabi-ranlib:为一个存档文件产生一个索引,并将这个索引存入存档文件中
arm-linux-gnueabi-readelf:显示 elf 格式的目标文件的信息
arm-linux-gnueabi-size:显示目标文件各个节的大小和目标文件的大小
arm-linux-gnueabi-strings:打印出目标文件中可以打印的字符串,有个默认的长度,为4
arm-linux-gnueabi-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 gcc-4.8.2/gmp

tar -xjvf mpfr-3.1.2.tar.bz2
mv mpfr-3.1.2 gcc-4.8.2/mpfr

tar -xzvf mpc-1.0.1.tar.gz
mv mpc-1.0.1 gcc-4.8.2/mpc

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-gnueabi-cpp*
arm-linux-gnueabi-gcc*
arm-linux-gnueabi-gcc-4.8.2*
arm-linux-gnueabi-gcov*
这些生成的文件的作用分别为:
arm-linux-gnueabi-cpp:GNU的C的预编译器
arm-linux-gnueabi-gcc:GNU的C语言编译器
arm-linux-gnueabi-gcc-4.8.2:GNU的C语言编译器,其实和arm-linux-gcc是一样的
arm-linux-gnueabi-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
export CC=$TARGET-gcc
export CFLAGS="-g -O2 -march=armv7-a"
ln -s $PREFIX/lib/gcc/arm-linux-gnueabi/4.8.2/libgcc.a $PREFIX/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)

注意:编译 gcc 时,我们是要生成交叉编译器本身,我们并不是要用交叉编译器编译交叉编译器。因此,需要unset交叉编译的变量,回复gcc编译。

unset CC
unset CFLAGS
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-gnueabi-c++*
arm-linux-gnueabi-g++*
这些生成的文件的作用分别为:
arm-linux-gnueabi-g++:GNU的c++编译器
arm-linux-gnueabi-c++:等同于arm-linux-gnueabi-g++

六、编译gdb

tar -xvf gdb-7.6.1.tar.bz2
cd  gdb-7.6.1
./configure --prefix=$PREFIX --target=$TARGET
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.8.2 arm-linux-gcc-4.8.2
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版本程序成功。

至此完成。

猜你喜欢

转载自blog.csdn.net/qq_16126823/article/details/119615437