歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> ARM平台交叉編譯器的制作

ARM平台交叉編譯器的制作

日期:2017/3/1 10:08:49   编辑:Linux編程
ARM平台交叉編譯器的制作

主機環境:

  1. Ubuntu 12.04.1 64bit
  2. gcc version 4.6.3
   ubuntu 12.04.1 64bit
   gcc version 4.6.3


1. 下載最新源碼包
  1. binutils-2.22.tar.gz
  2. gcc-4.7.2.tar.bz2
  3. gmp-5.0.5.tar.xz
  4. mpfr-3.1.1.tar.xz
  5. mpc-1.0.1.tar.gz
  6. glibc-2.16.0.tar.xz
  7. glibc-linuxthreads-2.5.tar.bz2
  8. glibc-ports-2.16.0.tar.xz
  9. linux-3.5.4.tar.bz2
   binutils-2.22.tar.gz

   gcc-4.7.2.tar.bz2
   gmp-5.0.5.tar.xz
   mpfr-3.1.1.tar.xz
   mpc-1.0.1.tar.gz

   glibc-2.16.0.tar.xz
   glibc-linuxthreads-2.5.tar.bz2
   glibc-ports-2.16.0.tar.xz

   linux-3.5.4.tar.bz2
將以上源碼包放入~/src目錄中

1. 配置編譯環境
  1. cd ~/src
  2. vim armenv
  3. # 將以下內容寫入armenv文件中保存退出
  4. TARGET=arm-linux-gnueabi
  5. PREFIX=/opt/cross/gcc-4.7.2/$TARGET
  6. PATH=$PREFIX/bin:$PATH
  7. export TARGET PREFIX PATH
  8. # 配置編譯環境
  9. . armenv
cd ~/src
vim armenv
# 將以下內容寫入armenv文件中保存退出
TARGET=arm-linux-gnueabi
PREFIX=/opt/cross/gcc-4.7.2/$TARGET
PATH=$PREFIX/bin:$PATH

export TARGET PREFIX PATH

# 配置編譯環境
. armenv
2. 編譯binutils
  1. tar -xzf binutils-2.22.tar.gz
  2. mkdir binutils-build
  3. cd binutils-build
  4. ../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX
  5. make -j2
  6. sudo make install
  7. cd ..
tar -xzf binutils-2.22.tar.gz
mkdir binutils-build
cd binutils-build
../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX
make -j2
sudo make install
cd ..

3. 第一次編譯gcc

  1. tar -xjf gcc-4.7.2.tar.bz2
  2. mkdir gcc-bootstrap-build
  3. tar -xf gmp-5.0.5.tar.xz
  4. tar -xf mpfr-3.1.1.tar.xz
  5. tar -xf mpc-1.0.1.tar.gz
  6. cd gcc-4.7.2
  7. mv -v gmp-5.0.5 gmp
  8. mv -v mpfr-3.1.1 mpfr
  9. mv -v mpc-1.0.1 mpc
  10. cd ../gcc-bootstrap-build
  11. ../gcc-4.7.2/configure \
  12. --target=$TARGET --host=x86_64-linux-gnu --build=x86_64-linux-gnu \
  13. --enable-targets=all --prefix=$PREFIX \
  14. --enable-languages=c --with-newlib --without-headers --disable-nls \
  15. --disable-threads --disable-shared --disable-libmudflap --disable-libssp \
  16. --disable-libgomp --disable-decimal-float --enable-checking=release \
  17. --disable-bootstrap --disable-libquadmath \
  18. --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \
  19. --with-mpfr-lib=$(pwd)/mpfr/src/.libs
  20. make -j2 all-gcc
  21. make -j2 all-target-libgcc
  22. sudo make install-gcc
  23. sudo make install-target-gcc
  24. sudo cp -v libiberty/libiberty.a $PREFIX/lib
  25. # 以下添加libgcc_eh.a,libgcc_s.a到libgcc.a的軟鏈接,防止編譯C庫時出錯
  26. sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
  27. sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed 's/libgcc/&_s/'`
  28. cd ..
tar -xjf gcc-4.7.2.tar.bz2
mkdir gcc-bootstrap-build
tar -xf gmp-5.0.5.tar.xz
tar -xf mpfr-3.1.1.tar.xz
tar -xf mpc-1.0.1.tar.gz
cd gcc-4.7.2
mv -v gmp-5.0.5 gmp
mv -v mpfr-3.1.1 mpfr
mv -v mpc-1.0.1 mpc
cd ../gcc-bootstrap-build

../gcc-4.7.2/configure \
  --target=$TARGET --host=x86_64-linux-gnu --build=x86_64-linux-gnu \
  --enable-targets=all --prefix=$PREFIX \
  --enable-languages=c --with-newlib --without-headers --disable-nls \
  --disable-threads --disable-shared --disable-libmudflap --disable-libssp \
  --disable-libgomp --disable-decimal-float --enable-checking=release \
  --disable-bootstrap --disable-libquadmath \
  --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \
  --with-mpfr-lib=$(pwd)/mpfr/src/.libs
make -j2 all-gcc 
make -j2 all-target-libgcc
sudo make install-gcc
sudo make install-target-gcc
sudo cp -v libiberty/libiberty.a $PREFIX/lib
# 以下添加libgcc_eh.a,libgcc_s.a到libgcc.a的軟鏈接,防止編譯C庫時出錯
sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed 's/libgcc/&_s/'`
cd ..

4. 安裝內核頭文件
  1. tar -xjf linux-3.5.4.tar.bz2
  2. cd linux-3.5.4
  3. make ARCH=arm headers_check
  4. make ARCH=arm INSTALL_HDR_PATH=dest headers_install
  5. sudo cp -rv dest/include/* $PREFIX/$TARGET/include
  6. 注意:內核頭文件的安裝位置是$PREFIX/$TARGET/include,而不是$PREFIX
  7. cd ..
tar -xjf linux-3.5.4.tar.bz2
cd linux-3.5.4
make ARCH=arm headers_check
make ARCH=arm INSTALL_HDR_PATH=dest headers_install
sudo cp -rv dest/include/* $PREFIX/$TARGET/include
注意:內核頭文件的安裝位置是$PREFIX/$TARGET/include,而不是$PREFIX
cd ..
5. 編譯C庫
  1. tar -xf glibc-2.16.0.tar.xz
  2. tar -xjf glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.16.0
  3. tar -xf glibc-ports-2.16.0.tar.xz
  4. mv glibc-ports-2.16.0 glibc-2.16.0/ports
  5. mkdir glibc-build
  6. cd glibc-build
  7. CC=$TARGET-gcc \
  8. AR=$TARGET-ar \
  9. RANLIB=$TARGET-ranlib \
  10. ../glibc-2.16.0/configure \
  11. --host=$TARGET \
  12. --prefix=$PREFIX/$TARGET \
  13. --with-tls --disable-profile \
  14. --enable-add-ons --with-headers=$PREFIX/$TARGET/include \
  15. libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes
  16. 注意:C庫的安裝位置是$PREFIX/$TARGET,編譯完整的gcc時鏈接使用
  17. sudo make -j2
  18. sudo -s
  19. . ../armenv
  20. make install
  21. exit
  22. cd ..
tar -xf glibc-2.16.0.tar.xz
tar -xjf glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.16.0
tar -xf glibc-ports-2.16.0.tar.xz
mv glibc-ports-2.16.0 glibc-2.16.0/ports
mkdir glibc-build
cd glibc-build

CC=$TARGET-gcc \
AR=$TARGET-ar \
RANLIB=$TARGET-ranlib \
../glibc-2.16.0/configure \
  --host=$TARGET \
  --prefix=$PREFIX/$TARGET \
  --with-tls --disable-profile \
  --enable-add-ons --with-headers=$PREFIX/$TARGET/include \
  libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes
注意:C庫的安裝位置是$PREFIX/$TARGET,編譯完整的gcc時鏈接使用
sudo make -j2
sudo -s
. ../armenv
make install
exit
cd ..
6. 編譯完整的gcc
  1. tar -xf gmp-5.0.5.tar.xz
  2. cd gmp-5.0.5
  3. ./configure --prefix=/usr
  4. make -j2
  5. sudo make install
  6. cd ..
  7. tar -xf mpfr-3.1.1.tar.xz
  8. cd mpfr-3.1.1
  9. ./configure --prefix=/usr
  10. make -j2
  11. sudo make install
  12. cd ..
  13. tar -xf mpc-1.0.1.tar.gz
  14. cd mpc-1.0.1
  15. ./configure --prefix=/usr
  16. make -j2
  17. sudo make install
  18. cd ..
  19. # 若系統中安裝gmp,mpfr,mpc且版本滿足要求,可不用編譯安裝。
  20. # 構建期間,將三者安裝到其他位置,並添加了鏈接搜索路徑,試了幾次都沒有成功。
  21. # 有時間再做嘗試,估計是哪裡配置不正確。
  22. ../gcc-4.7.2/configure --target=$TARGET \
  23. --host=x86_64-linux-gnu --build=x86_64-linux-gnu \
  24. --prefix=$PREFIX \
  25. --enable-languages=c,c++ --enable-shared
  26. make -j2
  27. sudo make install
  28. cd ..
tar -xf gmp-5.0.5.tar.xz
cd gmp-5.0.5
./configure --prefix=/usr
make -j2
sudo make install
cd ..

tar -xf mpfr-3.1.1.tar.xz
cd mpfr-3.1.1
./configure --prefix=/usr
make -j2
sudo make install
cd ..

tar -xf mpc-1.0.1.tar.gz
cd mpc-1.0.1
./configure --prefix=/usr
make -j2
sudo make install
cd ..
# 若系統中安裝gmp,mpfr,mpc且版本滿足要求,可不用編譯安裝。
# 構建期間,將三者安裝到其他位置,並添加了鏈接搜索路徑,試了幾次都沒有成功。
# 有時間再做嘗試,估計是哪裡配置不正確。

../gcc-4.7.2/configure --target=$TARGET \
  --host=x86_64-linux-gnu --build=x86_64-linux-gnu \
  --prefix=$PREFIX \
  --enable-languages=c,c++ --enable-shared
make -j2
sudo make install
cd ..

7. 測試
(1) 動態編譯
  1. arm-linux-gnueabi-gcc -o hello hello.c
  2. arm-linux-gnu-eabi-strip hello
  3. file hello
  4. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped
arm-linux-gnueabi-gcc -o hello hello.c
arm-linux-gnu-eabi-strip hello
file hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped
(2) 靜態編譯
  1. arm-linux-gnueabi-gcc -o hello hello.c -static
  2. arm-linux-gnu-eabi-strip hello
  3. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped
arm-linux-gnueabi-gcc -o hello hello.c -static
arm-linux-gnu-eabi-strip hello
hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped
實際還未放入開發板中進行測試,待開發板環境搭好,測試過再做更新。
Copyright © Linux教程網 All Rights Reserved