標籤:blog http java color 使用 os
編譯gcc 的時候
主要參考自http://blog.csdn.net/mcy_cool/article/details/17047027
出於部分原因進行了修改,標紅的地方為修改的地方
編譯環境:
核心名稱:Linux
硬體架構名稱:i686
硬體平台:i386
作業系統:Ubuntu 13.10
當前系統gcc版本號碼:4.8.1
目標平台OK6410:ARM11
一、準備工作
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 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
# 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版本程式成功。
至此完成。
針對6410的gcc設定
http://www.arm9home.net/simple/index.php?t7832.html
http://www.crifan.com/find_s3c6410_march_macpu_mtune_mfpu_mfloat_abi/,原理正確,配置有問題,還是參照上面地址中
Ubuntu11.04中搭建交叉編譯環境(arm-linux-gcc-4.6.1版本),http://my.oschina.net/u/225867/blog/38473