Ubuntu11.04中搭建交叉編譯環境(arm-linux-gcc-4.6.1版本)

Ubuntu11.04中搭建交叉編譯環境(arm-linux-gcc-4.6.1版本)

 聲明:本文主要參考http://blog.csdn.net/xt_xiaotian/article/details/6836739,並根據實際狀況做了必定的修改與說明html

 

編譯環境:java

內核名稱:Linuxlinux

內核發行版:2.6.38-11-genericc++

內核版本:#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011express

硬件架構名稱:i686ubuntu

硬件平臺:i386vim

操做系統:GNU/Linuxc#

當前系統gcc版本號:4.5.2bash

在Linux中創建整個ARM交叉編譯環境的總體過程爲: 架構

一、  下載源碼包

二、  創建編譯目錄並設置環境變量

三、  安裝內核頭文件

四、  安裝二進制工具(binutils)

五、  創建初始編譯器工具鏈(簡版gcc)

六、  創建glibc庫

七、  創建全套編譯器工具鏈(full gcc)

八、  驗證

1、下載源碼包

GNU的全部源碼文件均可以到這個地址下載:http://ftp.gnu.org/gnu/

Linux Kernel源代碼能夠去這裏下載:http://www.kernel.org

mpc能夠去這裏下載:http://www.multiprecision.org

下載的源碼包以下:

binutils-2.21.1.tar.bz2

gcc-4.6.1.tar.gz

glibc-2.14.tar.gz

glibc-linuxthreads-2.5.tar.bz2

glibc-ports-2.13.tar.gz 

gmp-5.0.2.tar.bz2

linux-2.6.32.45.tar.gz

mpc-0.9.tar.gz

mpfr-2.4.2.tar.gz

注:mpfr不建議使用3.0.0版本。mpfr-3.0.0有Bug,會致使gcc編譯不過。

 

2、創建編譯目錄並設置環境變量

 

選定本身的工做目錄,如我選擇/opt/embedded做爲本身的工做目錄。而後再embedded中創建build-tools、kernel、tools三個文件夾。實例:

root@ubuntu:/opt/ming# cd /opt/

root@ubuntu:/opt# mkdir embedded

root@ubuntu:/opt# cd embedded/

root@ubuntu:/opt/embedded# mkdir build-tools kernel tools

root@ubuntu:/opt/embedded# cd build-tools/

root@ubuntu:/opt/embedded/build-tools# mkdir build-binutils build-boot-gcc build-glibc build-gcc 

各文件夾的做用以下:

/opt/embedded:交叉編譯環境的主目錄

 

/opt/embedded/build-tools:存放binutils、gcc、glibc等GNU源碼和用來編譯這些源代碼的目錄

 

/opt/embedded/kernel:用來存放Linux內核源代碼 

/opt/embedded/tools:用來存放編譯好的交叉編譯工具和庫文件

/opt/embedded/build-tools/build-binutils:編譯binutils的目錄

/opt/embedded/build-tools/build-boot-gcc:編譯gcc啓動部分的目錄

/opt/embedded/build-tools/build-glibc:編譯glibc的目錄

/opt/embedded/build-tools/build-gcc:編譯整個gcc的目錄

 

創建好編譯目錄以後即是設置環境變量(建議直接在~/.bashrc中修改,注意修改以後要從新運行Terminal)。以下:

export PRJROOT=/opt/embedded 

export TARGET=arm-linux

export PREFIX=$PRJROOT/tools 

export TARGET_PREFIX=$PREFIX/$TARGET

export PATH=$PREFIX/bin:$PATH

各個環境變量的意義以下:

 

PRJROOT:整個交叉編譯環境的根目錄

TARGET:目標文件對應的architecture,arm-linux表示編譯出來的target只能在arm architecture中運行

PREFIX:目標文件夾的路徑前綴

TARGET_PREFIX:目標文件夾的路徑前綴路徑

PATH:可執行文件路徑,這裏主要指定編譯工具等

 

3、安裝內核頭文件

將Linux內核源碼解壓至$PRJROOT/kernel目錄,而後創建幾個文件的符號連接,最後生成version.h文件。實例:

首先解壓Linux內核源文件

 

root@ubuntu:/opt/embedded/kernel# cp /mnt/hgfs/VMwareShare_Ubuntux64/linux-2.6.32.45.tar.gz .

root@ubuntu:/opt/embedded/kernel# tar -xvf linux-2.6.32.45.tar.gz

root@ubuntu:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux

root@ubuntu:/opt/embedded/kernel# mkdir /opt/embedded/tools/arm-linux/include

root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/include/linux /opt/embedded/tools/arm-linux/include/linux

root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/include/asm-generic /opt/embedded/tools/arm-linux/include/asm-generic

root@ubuntu:/opt/embedded/kernel# ln -s /opt/embedded/kernel/linux-2.6.32.45/arch/arm/include/asm /opt/embedded/tools/arm-linux/include/asm (也多是是asm-arm,示內核版本而定)

 

下面檢查上面建立的符號連接是否正確。實例:

root@ubuntu:/opt/embedded/kernel# cd /opt/embedded/tools/arm-linux/include/

root@ubuntu:/opt/embedded/tools/arm-linux/include# ll

asm -> /opt/embedded/kernel/linux-2.6.32.45/arch/arm/include/asm/

asm-generic -> /opt/embedded/kernel/linux-2.6.32.45/include/asm-generic/

linux -> /opt/embedded/kernel/linux-2.6.32.45/include/linux/

有如上結果表示符號連接建立正確。

 

最後生成version.h文件。實例:

root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45# cd /opt/embedded/kernel/linux-2.6.32.45/

root@ubuntu:/opt/embedded/kernel/linux-2.6.32.45# make include/linux/version.h

  CHK     include/linux/version.h

  UPD     include/linux/version.h

 

接着進入相應目錄查看version.h文件是否創建成功。

 

 注:上述的作法理論上沒什麼問題,但實際操做時,若是用其餘版本的linux內核可能會出現頭文件包含不全的狀況,這會直接致使後面編譯glibc時出現未定義、未聲明、缺乏頭文件(如asm/unistd.h)的錯誤。若是可能的話,建議按上述操做直接copy好用的其餘交叉編譯工具鏈中的asm-arm、asm-generic、linux目錄。

 

4、安裝二進制工具(binutils)

 

Binutils是一些二進制工具集合,其中包含了經常使用的一些命令。首先將binutils-2.21.1.tar.bz2解壓至build-tools,而後進入build-binutils目錄,配置並編譯binutils,最後使用make install進行安裝。實例:

root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/

root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/binutils-2.21.1.tar.bz2 .

root@ubuntu:/opt/embedded/build-tools# tar -xjf binutils-2.21.1.tar.bz2

root@ubuntu:/opt/embedded/build-tools# cd build-binutils/

root@ubuntu:/opt/embedded/build-tools/build-binutils# ../binutils-2.21.1/configure --target=$TARGET --prefix=$PREFIX

root@ubuntu:/opt/embedded/build-tools/build-binutils# make

root@ubuntu:/opt/embedded/build-tools/build-binutils# make install

 

完成後,去$PREFIX中檢查一下生成的工具。實例:

root@ubuntu:/opt/embedded/build-tools/build-binutils# cd /opt/embedded/tools/bin

root@ubuntu:/opt/embedded/tools/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:剝掉目標文件的全部的符號信息

 

注:編譯過程當中有可能出現的錯誤:

gcc -DHAVE_CONFIG_H -I.  -I. -I. -I../bfd -I./config -I./../include -I./.. -I./../bfd -DLOCALEDIR="\"/tools/cross/share/locale\""  -W -Wall -Wstrict-prototypes -Wmissing-prototypes -Werror -g -O2 -MT tc-arm.o -MD -MP -MF .deps/tc-arm.Tpo -c -o tc-arm.o `test -f 'config/tc-arm.c' || echo './'`config/tc-arm.c

cc1: warnings being treated as errors

config/tc-arm.c: In function ‘make_mapping_symbol’:

config/tc-arm.c:2489: 警告:if 語句體爲空

make[4]: *** [tc-arm.o] 錯誤 1  // 排錯要充分利用報錯信息。

make[4]: Leaving directory `/root/build/binutils-2.20_cross/gas'

make[3]: *** [all-recursive] 錯誤 1

make[3]: Leaving directory `/root/build/binutils-2.20_cross/gas'

make[2]: *** [all] 錯誤 2

make[2]: Leaving directory `/root/build/binutils-2.20_cross/gas'

make[1]: *** [all-gas] 錯誤 2

make[1]: Leaving directory `/root/build/binutils-2.20_cross'

make: *** [all] 錯誤 2

解決方案:

 1)網上說的在tc-arm.c中加個括號,沒研究,可能好用;

 2)在make這一步中,可能會在編譯../binutils-2.21/gas/config/tc-arm.c出現gcc把警告當成錯誤的錯誤,其緣由在於編譯該文件時使用了-Werror選項,解決辦法是修改../binutils-2.21/gas/configure文件第10624行,把ERROR_ON_WARNING=yes改成ERROR_ON_WARNING=no,保存退出,從新執行make便可。

 3)在配置時,關閉Warning報錯,也能夠編譯成功:(我用的是這種)

[root@localhost binutils-2.20_cross_no_2]# ./configure --target=arm-linux --disable-werror && make

參考:http://hi.baidu.com/thinke365/blog/item/0b525013fc1f095af819b853.html

 

5、創建初始編譯器(簡版 gcc)

 

Gcc是最主要的編譯器。首先將gcc-4.6.1.tar.gz解壓至build-tools,而後將gmp-5.0.2.tar.bz二、mpfr-2.4.2.tar.gz、mpc-0.9.tar.gz分別解壓至gcc源碼所在目錄,並將目錄重命名爲gmp、mpfr、mpc,而後進入build-boot-gcc目錄,進行編譯配置,而後make all-gcc並安裝,最後make all-target-gcc並安裝。實例:

root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/

root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/gcc-4.6.1.tar.gz .

root@ubuntu:/opt/embedded/build-tools# tar -xvf gcc-4.6.1.tar.gz

root@ubuntu:/opt/embedded/build-tools# cd gcc-4.6.1/

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/mpfr-2.4.2.tar.gz .

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/gmp-5.0.2.tar.bz2 .

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cp /mnt/hgfs/VMwareShare_Ubuntux64/mpc-0.9.tar.gz .

 

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xvf mpfr-2.4.2.tar.gz

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv mpfr-2.4.2/ mpfr

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xjf gmp-5.0.2.tar.bz2

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv gmp-5.0.2/ gmp

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# tar -xvf mpc-0.9.tar.gz

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# mv mpc-0.9 mpc

 

這裏須要修改一下編譯配置文件:/opt/embedded/build-tools/gcc-4.6.1/gcc

/config/arm/t-linux

將「TARGET_LIBGCC2_CFLAGS = -fomit-frame-pointer –fPIC」改成

「TARGET_LIBGCC2-CFLAGS = -fomit-frame-pointer -fPIC -Dinhibit_libc -D__gthr_posix_h」。

 

而後即可以切換到目錄build-boot-gcc進行編譯了,實例:

 

root@ubuntu:/opt/embedded/build-tools/gcc-4.6.1# cd /opt/embedded/build-tools/build-boot-gcc/

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# ../gcc-4.6.1/configure --target=$TARGET --prefix=$PREFIX --without-headers --enable-languages=c --disable-threads --with-newlib --disable-shared --disable-libmudflap --disable-libssp

 

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make all-gcc

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make install-gcc

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make all-target-libgcc

root@ubuntu:/opt/embedded/build-tools/build-boot-gcc# make install-target-libgcc

 

 

 

完成以後,$PREFIX/bin下又多了幾個文件:

arm-linux-cpp*

arm-linux-gcc*

arm-linux-gcc-4.6.1*

arm-linux-gcov*

這些生成的文件的做用分別爲:

arm-linux-cpp:GNU的C的預編譯器

arm-linux-gcc:GNU的C語言編譯器

arm-linux-gcc-4.6.1:GNU的C語言編譯器,其實和arm-linux-gcc是同樣的

arm-linux-gcov:gcc 的輔助測試工具,用來分析和優化程序

 

6、創建glic庫

 

Glibc是交叉編譯環境的運行庫。首先將glibc-2.14.tar.gz解壓至build-tools,而後將glibc-linuxthreads-2.5.tar.bz2解壓至glibc源碼所在目錄,將glibc-ports-2.13.tar.gz解壓至glibc源碼所在目錄,並重命名爲ports。進入build-glibc文件夾,創建用於配置glibc的config.cache文件,而後配置並編譯glibc,安裝glibc,最後修改libc.so。實例:

 

root@ubuntu:/opt/embedded/build-tools# cd /opt/embedded/build-tools/

root@ubuntu:/opt/embedded/build-tools# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-2.14.tar.gz .

root@ubuntu:/opt/embedded/build-tools# tar -xvf glibc-2.14.tar.gz

root@ubuntu:/opt/embedded/build-tools# cd glibc-2.14/

root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-linuxthreads-2.5.tar.bz2 .

root@ubuntu:/opt/embedded/build-tools/glibc-2.14# tar -xjf glibc-linuxthreads-2.5.tar.bz2

root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cp /mnt/hgfs/VMwareShare_Ubuntux64/glibc-ports-2.13.tar.gz .

root@ubuntu:/opt/embedded/build-tools/glibc-2.14# tar -xvf glibc-ports-2.13.tar.gz

root@ubuntu:/opt/embedded/build-tools/glibc-2.14# mv glibc-ports-2.13/ ports

root@ubuntu:/opt/embedded/build-tools/glibc-2.14# cd ../build-glibc/

 

創建用於配置glibc的config.cache文件,文件內容爲:

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

libc_cv_arm_tls=yes

 

注:在編譯過程當中可能會發現本應自動生成的posix/config-name.h並無自動生成,找不到config-name.h這個文件。這個文件是用來編譯uname的。暫時沒辦法讓它自動生成,只好本身比照uname-a的信息建一個config-name.h文件:

在build-glibc目錄下創建一個posix目錄

# vim build-glibc/posix/config-name.h

在vim編輯器裏輸入:

/* This file is generated by ../scripts/config-uname.sh.  DO NOT EDIT.

   This is used only by the generic uname function for systems with no real

   uname call.  If this data is not correct, it does not matter much.  */

#ifdef config_name_h

#define config_name_h

 

#define UNAME_SYSNAME 「Linux」

#define UNAME_RELEASE 「2.6.38-11-generic」

#define UNAME_VERSION 「#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011」

#define UNAME_MACHINE 「i686」

 

#endif /* config_name_h */

 

創建完成以後,即可以開始配置並編譯glibc了,實例:

root@ubuntu:/opt/embedded/build-tools/build-glibc# (PATH=$PREFIX/bin:$PATH ) BUILD_CC="gcc" CC=$TARGET-gcc ../glibc-2.14/configure --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/ 

root@ubuntu:/opt/embedded/build-tools/build-glibc# PATH=$PREFIX/bin:$PATH make

 

編譯出錯:

1)checking for suffix of object files... configure: error: in `/opt/embedded/build-tools/build-glibc':

configure: error: cannot compute suffix of object files: cannot compile

See `config.log' for more details

## ----------- ##

## Core tests. ##

## ----------- ##

 

configure:2363: checking build system type

configure:2377: result: x86_64-unknown-linux-gnu

configure:2397: checking host system type

configure:2410: result: arm-unknown-linux-gnu

configure:2439: checking for arm-linux-gcc

configure:2466: result: arm-linux-gcc

configure:2735: checking for C compiler version

configure:2744: arm-linux-gcc --version >&5

../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -v >&5

../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -V >&5

../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2744: arm-linux-gcc -qversion >&5

../glibc-2.14/configure: line 2746: arm-linux-gcc: command not found

configure:2755: $? = 127

configure:2760: checking for suffix of object files

configure:2782: arm-linux-gcc -c conftest.c >&5

../glibc-2.14/configure: line 2784: arm-linux-gcc: command not found

configure:2786: $? = 127

configure: failed program was:

| /* confdefs.h */

| #define PACKAGE_NAME "GNU C Library"

| #define PACKAGE_TARNAME "c-library"

| #define PACKAGE_VERSION "(see version.h)"

| #define PACKAGE_STRING "GNU C Library (see version.h)"

| #define PACKAGE_BUGREPORT "glibc"

| #define PACKAGE_URL "http://www.gnu.org/software/c-library/"

 

解決方法:PATH=$PREFIX/bin:$PATH ../glibc-2.14/configure BUILD_CC="gcc" CC=arm-linux-gcc --host=$TARGET --target=$TARGET --prefix=/usr --enable-add-ons --disable-profile --cache-file=config.cache --with-binutils=$PREFIX/bin/ --with-headers=$TARGET_PREFIX/include/ ,在配置前面加上PATH=$PREFIX/bin:$PATH ,雖然你可能已加到bash.bashrc或/etc/profile,即將編譯成的arm-linux-gcc設置了環境變量,用arm-linux-gcc -v檢查發現已存在,但就是很差使,編譯會報錯(上述),故在配置前面加上此句。

 

2)[ALL ]     mawk: scripts/gen-sorted.awk: line 19: regular expression compile failed (bad class -- [], [^] or [)

   [ALL ]     /[^

   [ALL ]     mawk: scripts/gen-sorted.awk: line 19: syntax error at or near ]

   [ALL ]     mawk: scripts/gen-sorted.awk: line 19: runaway regular expression /, "", subd ...

在gen-sorted.awk第19行,出錯,這是一個簡單的錯誤,缺乏了轉義符

解決辦法:

  查找一個看有沒有相似的

  cd /tmp/crosstool-ng/targets/src/glibc-cvs-2.9/scripts

sed '/\^\//p' gen-sorted.awk -n

輸出的則是存在語法錯誤的語句

能夠直接用

sed -i 's/\^\//\^\\\//g' gen-sorted.awk

  這種方法不完善,後面的仍是會出現錯誤。

網上搜了下,須要用/usr/bin/gawk 替換/usr/bin/mawk,即

   sudo apt-get install gawk

   cd /usr/bin

   sudo mv mawk mawk.bak

   sudo ln -s gawk mawk

 

3)../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S:30: Error: previous CFI entry not closed (missing .cfi_endproc)

解決方法:

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S

找到以下行:

ENTRY(__default_sa_restorer)

在其下添加:

END(__default_sa_restorer)

找到以下行:

ENTRY(__default_rt_sa_restorer)

在其下添加:

END(__default_rt_sa_restorer)

 

4)繼續make編譯

root@ubuntu:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

../sysdeps/unix/syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc

解決方法:

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/unix/syscall-template.S

找到以下行:

 

#define T_PSEUDO(SYMBOL, NAME, N)                PSEUDO (SYMBOL, NAME, N)

在其上添加:

#define PSEUDO(name, syscall_name, args)   \

  .text;                                \

  ENTRY (name);                        \

    DO_CALL (syscall_name, args);         \

    cmn r0, $4096;

5)繼續make編譯

root@ubuntu:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

allocatestack.c:247:33: 錯誤:‘TLS_DTV_UNALLOCATED’未聲明(在此函數內第一次使用)

解決方法:

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/nptl/allocatestack.c

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/elf/dl-tls.c

分別在文件中的include後面添加:

#define TLS_DTV_UNALLOCATED      ((void *) -1l)

6)繼續make編譯

root@ubuntu:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

/opt/embedded/tools/lib/gcc/arm-linux/4.6.1/../../../../arm-linux/bin/ld: cannot find -lgcc_eh

解決方法:

root@ubuntu:/opt/embedded/build-tools/build-glibc# ln -s /opt/embedded/tools/lib/gcc/arm-linux/4.6.1/libgcc.a /opt/embedded/tools/lib/gcc/arm-linux/4.6.1/libgcc_eh.a

7)繼續make編譯

root@ubuntu:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

../sysdeps/ieee754/dbl-64/s_fma.c:152:15: 錯誤:‘FE_TOWARDZERO’未聲明(在此函數內第一次使用)

解決方法:

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/ieee754/dbl-64/s_fma.c

在文件中的include後面添加:

#define FE_TOWARDZERO 0xc00000

#define FE_INEXACT 16

8)繼續make編譯

root@ubuntu:/opt/embedded/build-tools/build-glibc# make

編譯出錯:

../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: 錯誤:‘FE_TOWARDZERO’未聲明(在此函數內第一次使用)

解決方法:

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../glibc-2.14/sysdeps/ieee754/dbl-64/s_fmaf.c

在文件中的include後面添加:

#define FE_TOWARDZERO 0xc00000

#define FE_INEXACT 16

9)繼續make編譯

 

root@ubuntu:/opt/embedded/build-tools/build-glibc# make

root@ubuntu:/opt/embedded/build-tools/build-glibc# make install_root=$TARGET_PREFIX prefix="" install

 

10)最後,修改libc.so便完成此步驟

root@ubuntu:/opt/embedded/build-tools/build-glibc# vi ../../tools/arm-linux/lib/libc.so

找到以下行:

GROUP ( /lib/libc.so.6 /lib/libc_nonshared.a  AS_NEEDED ( /lib/ld-linux.so.2 ) )

將其改成: 

GROUP ( libc.so.6 libc_nonshared.a ) 

 

 

7、創建全套編譯器(full gcc)

 

首先進入build-gcc目錄,而後配置並編譯full gcc,最後安裝就完成了。實例:

root@ubuntu:/opt/embedded/build-tools/build-glibc# cd /opt/embedded/build-tools/build-gcc/

root@ubuntu:/opt/embedded/build-tools/build-gcc# ../gcc-4.6.1/configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ --disable-libgomp

root@ubuntu:/opt/embedded/build-tools/build-gcc# make

root@ubuntu:/opt/embedded/build-tools/build-gcc# make install 

完成以後,$PREFIX/bin下又多了幾個文件:

 arm-linux-c++*

arm-linux-g++*

這些生成的文件的做用分別爲:

arm-linux-g++:GNU的c++編譯器

arm-linux-c++:等同於arm-linux-g++

 

8、驗證

使用vim編寫一個簡單文件,這裏以hello.c爲例:

而後執行編譯命令:

root@ubuntu:/opt/embedded/tmp# arm-linux-gcc -static hello.c –o hello

編譯完成後驗證最終編譯出的文件。實例:

root@ubuntu:/opt/embedded/tmp# file hello 

hello: ELF 32-bit LSB executable, ARM, version 1, statically linked, for GNU/Linux 2.0.0, not stripped

有如上輸出表示編譯ARM版本程序成功。

相關文章
相關標籤/搜索