ARM平台交叉编译器的制作
主机环境:
- Ubuntu 12.04.1 64bit
- gcc version 4.6.3
ubuntu 12.04.1 64bit
gcc version 4.6.3
1. 下载最新源码包
- 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
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. 配置编译环境
- 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
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
- 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 ..
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
- 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 ..
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. 安装内核头文件
- 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 ..
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库
- 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 ..
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
- 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 ..
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) 动态编译
- 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
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) 静态编译
- 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
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
实际还未放入开发板中进行测试,待开发板环境搭好,测试过再做更新。