编译arm-linux-gcc4.8.2
编译gcc 的时候
出于部分原因进⾏了修改,标红的地⽅为修改的地⽅
编译环境:
内核名称:Linux
硬件架构名称:i686
硬件平台:i386
操作系统:Ubuntu 13.10
当前系统gcc版本号:4.8.1
⽬标平台OK6410:ARM11
⼀、准备⼯作
1、下载源码包
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.
#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.
#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的连接器
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.、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.
#mv mpc-1.0.1 mpc
#mv ./mpc ./gcc-4.8.2
#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.
#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 CC=$TARGET-gcc CFLAGS=”-g O2 –march-armv6”
说明:把CC和CFLAGS给修改后将影响到后来编译gcc,导致cc采⽤arm-linux-gcc⽽CXX采⽤g++平台不同出错,其中-march-armv6为6410采⽤的ARM11指令集
#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++  --with-arch=armv6 –with-cpu=arm1176jzf-s –with-tune=arm1176jzf-s –with-fpu=vfp
说明:6410包含浮点数处理器,编译gcc的时候把它加进去,还有arm11架构是armv6指令集的
# 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
#./configure --prefix=$PREFIX --target=$TARGET
说明:红⾊应该加⼊,原⽂有误
# make
# 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版本程序成功。
⾄此完成。
针对6410的gcc设置

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。