arm-linux-gcc 4.3.2編譯安裝過程

來源:互聯網
上載者:User

arm-linux-gcc 4.3.2編譯安裝過程

 

本文由《我的arm-gcc工具編譯安裝過程》修正而成,紅字部分為與原作不同之處,希望對大家有所協助。

原文地址:http://szyou.tiao.blog.163.com/blog/static/28351497200902193223687/

 

我的編譯環境是在ubuntu8.10 amd64,gcc版本為4.3.2,編譯的linux核心版本為2.6.8,故後面需要修改少許核心標頭檔。

開始前確認環境裡有texinfo, gawk(注意mawk編譯glibc header時會有問題), bison, flex,沒有就安裝它們。
>sudo apt-get install texinfo gawk bison flex

工作的目錄是使用者目錄下
源檔案放在目錄cross_source裡
編譯的工作目錄是cross_build

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

用到的檔案是
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.bz2

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

1編譯,安裝binutils
binutils的配置和編譯安裝,binutils的編譯一般不會遇到什麼問題,至少我沒有遇到。
>sudo apt-get install texinfo
>tar -jxvf ../cross_source/binutils-2.19.tar.bz2
根據[Bug gas/7026] New: ARM target wont build, error: format not a string literal and no format arguments,修改tc-arm.c
>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-linux

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 install

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>
*/

//added by David.Morre,從這裡開始做:

>cd /usr/local/arm/4.3.2/include/asm
>ln -s arch-s3c2410 arch
>cd - #轉到cross_build
在/usr/local/arm/4.3.2/include/asm/unistd.h的第311行加入:
#define __ARM_NR_set_tls (__ARM_NR_BASE+5)

285行加入:
#define __NR_set_tid_address        (__NR_SYSCALL_BASE+256)

>mkdir -v glibc-2.7_build

>cd glibc-2.7

>gedit ./ports/sysdeps/unix/sysv/linux/arm/nptl/lowlevellock.h

加入一行#include <tls.h>,儲存退出。

>cd ../glibc-2.7_build

>sudo gedit ~/.bashrc

加入以下一行export PATH=$PATH:/usr/local/arm/4.3.2/bin

(注意:如果以前PATH加入了arm-linux-gcc交叉編譯鏈,需要去掉)
>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
按照上面的方法,編譯是能通過的。

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++包
>cd ../../.. #轉到cross_build檔案夾下
>tar -jxvf ../cross_source/gcc-g++-4.3.2.tar.bz2 #gcc-core-4.3.2將由gcc-g++-4.3.2覆蓋,以加入C++部分

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
將/usr/local/arm/4.3.2/include檔案夾拷貝至/usr/local/arm/4.3.2/arm-linux檔案夾中
>make all
>sudo make install
好,編譯結束了,試試自己做的arm-linux-gcc工具吧

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.