use gcc 4.12 on Fedora 7
可參考 http://www.uclinux.org/pub/uClinux/m68k-elf-tools/tools-20061214/build-uclinux-tools.sh 的做法,可惜完全沒用

1. download soure codes.

a. http://gcc.gnu.org/ (2006-03-06)
ftp://mirrors.laffeycomputer.com/pub/gcc.gnu.org/pub/gcc/releases/gcc-3.4.6/gcc-3.4.6.tar.gz
b. http://www.gnu.org/software/binutils/ (2007/12/3)
ftp://sourceware.org/pub/binutils/snapshots/binutils-2.18.50.tar.bz2
c. http://www.uclibc.org/ (2007-05-06)
http://www.uclibc.org/downloads/uClibc-0.9.27.tar.bz2
d. http://sourceware.org/newlib/ (2005-12-16)
ftp://sources.redhat.com/pub/newlib/newlib-1.14.0.tar.gz
e.
http://www.uclinux.org/pub/uClinux/m68k-elf-tools/tools-20061214/elf2flt-20060608.tar.gz

2. make directory
a. mkdir /sigma/toolchains
b. cd /sigma/toolchains
c. mkdir arm
d. mkdir build-gcc
e. mkdir build-binutils

3. extract
a. cd /sigma/toolchains
b. tar jxvf /mnt/hgfs/sigma/src/toolchains/binutils-2.18.50.tar.bz2
c. tar zxvf /mnt/hgfs/sigma/src/toolchains/gcc-3.4.6.tar.gz
d. tar jxvf /mnt/hgfs/sigma/src/toolchains/uClibc-0.9.27.tar.bz2
e. tar zxvf /mnt/hgfs/sigma/src/toolchains/newlib-1.14.0.tar.gz
f. tar zxvf /mnt/hgfs/sigma/src/toolchains/elf2flt-20060608.tar.gz
g. cd /sigma/toolchains/gcc-3.4.6
h. ln -s ../newlib-1.14.0 newlib

4. build binutils

a. cd /sigma/toolchains/build-binutils
b. configure
../binutils-2.18.50/configure \
--srcdir=../binutils-2.18.50 \
--target=arm-elf \
--prefix=/sigma/toolchains/arm \
--enable-softfloat \
--enable-shared
c. make
d. make install
e. export PATH=/sigma/toolchains/arm/bin:$PATH

- ARM7TDMI 與 ARM9TDMI 不支援硬體浮點運算。
- 筆者使用的 target device (em8622) 是 ARM7TDMI 的裝置,ARM7TDMI並沒有DSP,因此必須建立啟用軟體浮點運算功能。
- 編譯完成後可以在 /sigma/toolchains 目錄下找到執行檔。
- 設定 path 是因為在 build gcc 時需用到 arm-elf-ar。

5. build elf2flt
a. cd /sigma/toolchains/elf2flt-20060608
b. configure
./configure --target=arm-elf --prefix=/sigma/toolchains/arm \
--with-bfd-include-dir=/sigma/toolchains/build-binutils/bfd \
--with-binutils-include-dir=/sigma/binutils-2.18.50/include \
--with-libbfd=/sigma/toolchains/build-binutils/bfd/.libs/libbfd.a \
--with-libiberty=/sigma/toolchains/build-binutils/libiberty/libiberty.a
c. make
d. make install

6. build gcc without library
a. cd /sigma/toolchains/build-gcc
c. configure
../gcc-3.4.6/configure \
--srcdir=../gcc-3.4.6 \
--target=arm-elf \
--prefix=/sigma/toolchains/arm \
--enable-multilib \
--enable-threads \
--with-cpu=arm7 \
--with-float=soft \
--with-newlib \
--without-headers \
--enable-languages=c, c++
d. make all-gcc
e. make install-gcc

- 修改 unknown-elf.h 是配合 uClibc-0.9.28.3,使用 0.9.27 以前版本則無此問題。
- GCC 3.4 必須在編譯設定時加上 “--with-float=soft|hard” 來指定要使用軟體或硬體浮點運算,在這裡我們必須指定使用軟體浮點運算。
- GCC 3.4 針對 ”arm-elf” 的 cross toolchains 改用由 Nicolas Pitre 所設計的 ARM 軟體浮點運算功能,這個新的 ARM 軟體浮點運算實作不但體積小而且比原來的 C 版本速度更快。因此請務必將target 設定成 arm- elf,GCC 預設才會去使用新的軟體浮點運算。
- 編譯完成後可以在 /sigma/toolchains 目錄下找到執行檔。
- with-headers 會造成下列錯誤,千萬不要用,改用 without-headers。
In file included from ../../gcc-3.4.6/gcc/crtstuff.c:62:
../../gcc-3.4.6/gcc/tsystem.h:79:19: stdio.h: No such file or directory
../../gcc-3.4.6/gcc/tsystem.h:82:23: sys/types.h: No such file or directory
../../gcc-3.4.6/gcc/tsystem.h:85:19: errno.h: No such file or directory
../../gcc-3.4.6/gcc/tsystem.h:92:20: string.h: No such file or directory
../../gcc-3.4.6/gcc/tsystem.h:93:20: stdlib.h: No such file or directory
../../gcc-3.4.6/gcc/tsystem.h:94:20: unistd.h: No such file or directory
../../gcc-3.4.6/gcc/tsystem.h:100:18: time.h: No such file or directory

7. build newlib
a. cd /sigma/toolchains/newlib-1.14.0
b. configure
./configure \
--target=arm-elf \
--prefix=/sigma/toolchains/arm \
--enable-softfloat \
--enable-shared
c. make all
d. make install

8. build gcc with library
a. cd /sigma/toolchains/build-gcc
b. make all
c. make install

9. build uClibc
a. cd /sigma/toolchains/uClibc-0.9.27
b. make menuconfig
** Target Architecture (arm)
** Target Architecture Features and Options
++ Target Processor Type (Generic Arm)
++ Target Processor Endianness (Little Endian)
-- Target CPU has a memory management unit (MMU)
++ Enable floating point number support
-- Target CPU has a floating point unit
++ Enable full C99 math library support
++ (-Wall) Compiler Warnings
++ (/sigma/armutils_2.8.0.2/build_arm/linux-2.4.26-em86xx) Linux kernel header location
** General Library Settings
-- Generate Position Independent Code
++ Support global constructors and destructors
++ POSIX Threading Support
-- Build pthreads debugging support
++ Large File Support
++ Malloc Implementation (malloc)
-- Malloc returns live pointer for malloc(0)
++ Dynamic atexit() Support
++ Shadow Password Support
++ Support only Unix 98 PTYs
++ Assume that /dev/pts is a devpts or devfs file system
++ Support 'struct tm' timezone extension fields
++ Enable caching of the last valid timezone 'TZ' string
++ Enable '/etc/TZ' file support to set a default timezone (uClibc-specific)
++ Repeatedly read the '/etc/TZ' file
++ (/etc/TZ) Path to the 'TZ' file for setting the global timezone
** Networking Support
-- IP version 6 Support
++ Remote Procedure Call (RPC) support
++ Full RPC support
其它不用改了。
b. CFLAG=-nostdinc make CROSS=arm-elf-
c. make PREFIX=/sigma/toolchains/arm/arm-elf DEVEL_PREFIX=/ install
d. ln -s /sigma/toolchains/arm/arm-elf/include /sigma/toolchains/arm/arm-elf/sys-include

- 記得要加 CFLAG=-nostdinc,讓 arm-elf-gcc 只用 uClibc 本身的 include 而不會去找 newlib 的 include,會相衝的。
- 如果在 gcc 那裏有 with-headers,步驟d 可以不用做。

台南小新 發表在 痞客邦 PIXNET 留言(8) 人氣()


留言列表 (8)

發表留言
  • 黑豬肉
  • 一些cross-compiler的問題

    版主您好阿!小弟最近在做cross-compiler的動作,爬到了您這篇教學.
    小弟是想用gcc+glibc+binutils建構一個i686linux to i686linux的cross-compiler,因為沒有elf2flt,所以跳過那步驟,但是在make install gcc的時候出現了錯誤,
    "/bin/bash: line 3: cd: i686-pc-linux-gnu/libstdc++-v3: 沒有此一檔案或目錄"
    在build-gcc的目錄下有一個空的i686-pc-linux-gnu目錄,也有一個build-i686-pc-linux-gnu不是空的目錄,感覺起來有錯,可是我不知道錯在哪...
    還請版主幫忙解惑...先謝過!!
    我gcc的configure是下成:../gcc-4.4.0/configure \
    --srcdir=../gcc-4.4.0 \
    --target=i686-pc-linux-gnu \
    --prefix=/home/student/cross-compiler \
    --enable-multilib \
    --enable-threads \
    --with-glibc \
    --without-headers \
    --enable-languages=c, c++
  • 你少加了 --with-newlib,造成 gcc 會去找 libstdc++-v3。

    台南小新 於 2009/07/08 11:55 回覆

  • 黑豬肉
  • 您好~

    可是我是用glibc不是用newlib,那這樣
    --with-newlib還是要下嗎?
    因為我把他改成
    --with-glibc
    還是說這樣不對?@@
    感謝!
  • glibc 是 C 的函式庫,newlib 是 C++ 的函式庫,二者是不同的,還是要下 --with-newlib。

    台南小新 於 2009/07/08 14:17 回覆

  • 黑豬肉
  • 大感謝!!

    感謝版主熱新的回覆...而且回覆超快!^____^
    我目前正在試,不過電腦慢...make一次要等將近一小時,待會看看結果如何.
    在一次感謝邱大大..!!
  • 有問題可以加入我的 msn: jyhshin@msn.com。

    台南小新 於 2009/07/08 14:37 回覆

  • Olds
  • 邱大您好,
    1. 請問為何要自己編toolchains, SigmaDesigne 官方的不能用嗎?

    2. 這幾天在google找到ㄧ個GPL_DA-70900.tar.gz, 請問可以用嗎?? (少了 config 的目錄)

  • SigmaDesign只提供 2.95.3, 如果要 porting 一些比較新的軟體, 常常遇到編譯問題, 需要較新版本的 gcc 才會沒問題. GPL_DA-70900.tar.gz 這個我沒試過, 可能你要自己試驗看看了.

    台南小新 於 2009/08/05 21:02 回覆

  • olds
  • 感謝邱大~ 真的很快

    再請問
    1. 請問邱大用此Platform 是應用再哪一項目 (我有一EM8621L, 想作一個Media player)

    2. 請問邱大,編好的toolchain有考慮發布? 可否冒昧向您索討

  • 1. 我是做一台廣告機, 不過公司好像準備停案了.
    2. 其實最後我也是用原廠的 toolchain, 因為發現用我自己做的去編譯原廠的撥放程式, 會出很多問題, 主要是 hard float 跟 soft float 的問題.我也沒有存檔可以給你, linux 已經重灌了, 你可以照著上述方法編譯看看, 有問題再問我吧.

    台南小新 於 2009/08/06 08:39 回覆

  • olds
  • 還是依然感謝您。事實上,昨天造您的方法 編到5.c. 就失敗了。看來還是要用SigmaDesign's toolchain.

    另外,廣告機與Media player 是依樣的東西,只是輸出不同罷了。 所以還是要好好研讀邱大的工作葵花寶典。 謝謝囉~
  • olds
  • 邱大,我已將armutils-2.4.69 編譯完成,也得到了toolchain 且編譯一些簡單的程式for uclinux ok.

    我想,下一步是做rootfs/romfs燒錄在flash. 我現在用fedora 沒有uuencode utility, 問一下您是如何刷新flash? write /dev/mtd directly? Howto...

    另,請問可以跟您要RMF的包? thanks...
  • 你的問題太複雜了, 請加入我的 msn: jyhshin@msn.com, 我們線上交談比較快。

    台南小新 於 2009/08/11 23:35 回覆