個人arm-gcc工具編譯安裝過程

個人編譯環境是在xubuntu裏,開始前確認環境裏有texinfo, gawk(注意mawk編譯glibc header時會有問題), bison, flex,沒有就安裝它們。
工做的目錄是用戶目錄下
源文件放在目錄cross_source裏
編譯的工做目錄是cross_buildjava

xxx 就是存放解壓出來的源代碼,例如binutils-2.19.tar.bz2,解壓放在binutils-2.19
xxx_build 用於編譯的目錄,例如binutils-2.19.tar.bz2,編譯目錄是binutils-2.19_buildlinux

用到的文件是
binutils-2.19.tar.bz2
gcc-core-4.3.2.tar.bz2
gcc-g++-4.3.2.tar.bz2
mpfr-2.3.2.tar.bz2
gmp-4.2.4.tar.bz2
linux-2.6.28.tar.bz2
glibc-ports-2.7.tar.bz2
glibc-2.7.tar.bz2c++

首先建立目錄
>mkdir cross_source
>mkdir cross_build
>cd cross_build編程

1編譯,安裝binutils
binutils的配置和編譯安裝,binutils的編譯通常不會遇到什麼問題,至少我沒有遇到。
>tar -jxvf ../cross_source/binutils-2.19.tar.bz2
>mkdir binutils-2.19_build
>cd binutils-2.19_build
>../binutils-2.19/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2
>make
>sudo make all install
這就會把binutils的編譯結果安裝到/usr/local/arm/4.3.2/裏
binutils安裝後須要把路徑導出。
>export PATH=$PATH:/usr/local/arm/4.3.2/bin
>export PATH=$PATH:/usr/local/arm/4.3.2/arm-linuxubuntu

2第一次編譯,安裝gcc
<第一次編譯gcc只是爲了產生針對target用的編譯工具,所以不須要頭文件和特別注意的,固然要注意知足target的要求>
>cd ..  #轉到cross_build
>tar -jxvf ../cross_source/gcc-core-4.3.2.tar.bz2
從 GCC-4.3起,安裝GCC將依賴於GMP-4.1以上版本和MPFR-2.3.2以上版本。若是將這兩個軟件包分別解壓到GCC源碼樹的根目錄下,並 分別命名爲"gmp"和"mpfr",那麼GCC的編譯程序將自動將二者與GCC一塊兒編譯。建議儘量使用最新的GMP和MPFR版本。
>tar -jxvf ../cross_source/mpfr-2.3.2.tar.bz2
>tar -jxvf ../cross_source/gmp-4.2.4.tar.bz2
>mv mpfr-2.3.2 gcc-4.3.2/mpfr
>mv gmp-4.2.4 gcc-4.3.2/gmp
既 然是第一次安裝ARM交叉編譯工具,那麼本機的glibc支持的應該是本機的編譯工具庫,而不是ARM交叉編譯工具庫。而且支持ARM交叉編譯工具的其它 支持語言(好比:C++、java)的libc庫(最終的gcc生成的二進制代碼聯接須要該庫支持)咱們也沒有,因此,要增長編譯開關:
--enable-languages=c --disable-threads --disable-shared
一樣,因爲第一次安裝ARM交叉編譯工具,那麼支持的libc庫的頭文件也沒有!因此咱們徵用Dinhibit_libc來解決這個問題。操做以下:
>cp gcc-4.3.2/gcc/config/arm/t-linux ~/gcc-3.4.5/gcc/config/arm/t-linux.orig
>vim gcc-4.3.2/gcc/config/arm/t-linux
給TARGET_LIBGCC2_CFLAGS = 增長操做參數
-Dinhibit_libc -D__gthr_posix_h
保存退出。
>mkdir gcc-4.3.2_build
>cd gcc-4.3.2_build
>../gcc-4.3.2/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2 --disable-threads --disable-shared --enable-languages=c --disable-libmudflap --disable-libssp
因爲沒有arm的glibc,須要使用--disable-libmudflap --disable-libssp,禁止兩個邊界檢查使用的庫。
>make all #忽略編譯的錯誤,我也沒有編譯經過,不過不用擔憂的,立刻安裝。
>sudo make installvim

3建立頭文件,主要是kernel的頭文件,解壓下載的linux kernel (若是有對應的arm的kernel更好)
>cd ..  #轉到cross_build
>tar -jxvf ../cross_source/linux-2.6.28.tar.bz2
>cd linux-2.6.28
>make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
在menuconfig裏面load一個別人的2410的配置而後退出並保存
>make ARCH=arm CROSS_COMPILE=arm-linux- #這個不用等編譯結束,開始一兩分鐘就用Ctrl+C停止。
@複製kernel頭文件到目標
>sudo cp -a include/linux /usr/local/arm/4.3.2/include/linux
>sudo cp -a include/asm-arm /usr/local/arm/4.3.2/include/asm
>sudo cp -a include/asm-generic /usr/local/arm/4.3.2/include/asm-generic
>sudo cp -a arch/arm/include/asm /usr/local/arm/4.3.2/include
>sudo cp -a arch/arm/mach-s3c2410/include/mach /usr/local/arm/4.3.2/include/asm編程語言

4編譯glibc
>cd .. #轉到cross_build
>tar -jxvf ../cross_source/glibc-2.7.tar.bz2
安裝arm內核支持的包
>tar -jxvf ../cross_source/glibc-ports-2.7.tar.bz2
>mv -v glibc-ports-2.7 glibc-2.7/ports
>cd glibc-2.7
打補丁
>patch -Np1 -i ../../cross_source/glibc-2.7-alpha_ioperm_fix-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-alpha_PTR_MANGLE_fix-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-branch_update-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-branch_update-1A.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-libgcc_eh-1.patch
>patch -Np1 -i ../../cross_source/glibc-2.7-localedef_segfault-1.patch
接着作如下動做
原來從gcc4.3開始將一部分頭文件放到另外一個文件夾中,致使glibc找不到,對glibc的configure作補丁:
>sed -i -e "/ccheaders=/s@\`\(\$CC.*include\)\`@\"& -isystem \`\1-fixed\`\"@" configure
還有就是爲了編譯經過修改的文件
>sed -i 's/# define UNDOCARGS_5\tUNDOCARGS_4/&\n\n# define DOCARGS_6\tDOCARGS_5\n# define UNDOCARGS_6\tUNDOCARGS_5/' ports/sysdeps/unix/sysv/linux/arm/nptl/sysdep-cancel.h
>sed -i 's/__deprecated/__attribute__((deprecated))/' ../linux-2.6.27/arch/arm/include/asm/memory.h
在上面的文件memory.h裏,增長宏CONFIG_DRAM_BASE和CONFIG_DRAM_SIZE的定義(隨便定義便可),還有就是把「<mach/memory.h>」爲「<asm/mach/memory.h>」
在文件裏ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h,增長頭文件#include <tls.h>工具

>mkdir -v glibc-2.7_build
>cd glibc-2.7_build
>CC=arm-linux-gcc AR=arm-linux-ar RANLIB=arm-linux-ranlib ../glibc-2.7/configure --host=arm-linux --prefix=/usr/local/arm/4.3.2/arm-linux --enable-add-ons --with-headers=/usr/local/arm/4.3.2/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
>make
>sudo make install
按照上面的方法,編譯是能經過的。flex

5用現有的交叉編譯工具從新構造gcc
>cd .. #轉到cross_build
恢復先前修改的t-linux文件:
>cd gcc-4.3.2/gcc/config/arm/
>mv  t-linux t-linux-bak
>mv  t-linux-org t-linux
>
安裝c++包
>tar -jxvf ../cross_source/gcc-g++-4.3.2.tar.bz2ui

cd ../gcc-4.3.2_build/
>make clean
>make distclean

若是須要gcc支持C和C++編程語言,用下面這個配置:
>../gcc-4.3.2/configure --target=arm-linux --prefix=/usr/local/arm/4.3.2 --enable-languages=c,c++ --enable-threads=posix  --enable-shared --enable-__cxa_atexit --with-local-prefix=/usr/local/arm/4.3.2/arm-linux

>make all>sudo make install好,編譯結束了,試試本身作的arm-gcc工具吧

相關文章
相關標籤/搜索