基于 linux-3.0.3、binutils-2.21.1glibc-2.13glibc-ports-2.13gcc-4.6.1gmp-5.0.2mpfr-3.0.1mpc-0.9

2508阅读 0评论2011-12-15 shanshan2627
分类:LINUX

1.创建宿主机编译环境
# apt-get install build-essential libncurses5-dev
创建setbuildenv.sh脚本
setbuildenv.sh
+--------------setbuildenv.sh-----------------+
  1. #!/bin/sh
  2. export PRJROOT=/home/mini/arm
  3. export TARGET=arm-linux
  4. export PREFIX=${PRJROOT}/tools
  5. export TARGET_PREFIX=${PREFIX}/${TARGET}
  6. export PATH=${PREFIX}/bin:${PATH}
复制代码
+--------------------------------------------------+
$ source setbuildenv.sh
$ cd
$ mkdir arm
$ cd ${PRJROOT}
$ mkdir build-tools tools kernel
$ cd ${PRJROOT}/build-tools
$ mkdir build-binutils build-boot-gcc build-gcc build-glibc  build-glibc-headers
$ cd ${PRJROOT}/tools
$ mkdir arm-linux

2.安装内核文件
$ cd ${PRJROOT}/kernel
$ wget 
$ tar xvf linux-3.0.3.tar.gz
$ cd linux-3.0.3
$ cp arch/arm/configs/s3c2410_defconfig ./.config
$ make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-
$ mkdir -p ${TARGET_PREFIX}/include
$ cp -r include/linux/ ${TARGET_PREFIX}/include
$ cp -r include/asm-generic/ ${TARGET_PREFIX}/include
$ cp -r arch/arm/include/asm/ ${TARGET_PREFIX}/include
################################################################################
$ make ARCH=arm CROSS_COMPILE=arm-linux-
此步的目的是生成 include/linux/version.h 文件,而不是真正的编译,忽略所有错误。
################################################################################

3.编译 binutils
$ cd ${PRJROOT}/build-tools
$ wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.1.tar.gz
$ tar xvf binutils-2.21.1.tar.gz
$ cd build-binutils
$ ../binutils-2.21.1/configure --target=${TARGET} --prefix=${PREFIX}
$ make
$ make install

4.安装 glibc 头文件
$ cd ${PRJROOT}/build-tools
$ wget 
$ wget 
$ tar xvf glibc-2.13.tar.gz
$ tar xvf glibc-ports-2.13.tar.gz
$ mv glibc-ports-2.13 ./glibc-2.13/ports
$ cd build-glibc-headers
$ ../glibc-2.13/configure --host=${TARGET} --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include
$ make cross-compiling=yes install_root=${TARGET_PREFIX} prefix="" install-headers
################################################################################
错误:
+--------------------------------------------------+
configure: error: GNU libc requires kernel header files from Linux 2.0.10 or later to be installed before configuring.
+--------------------------------------------------+
解决方法:
在安装内核头文件的过程中,在设置好内核配置以后,没有使用相应的命令生成 include/linux/version.h 文件。
$ cd ${PRJROOT}/kernel/linux-3.0.3/
$ make ARCH=arm CROSS_COMPILE=arm-linux-
$ cp -r include/linux/ ${TARGET_PREFIX}/include
$ cp -r include/asm-generic/ ${TARGET_PREFIX}/include
################################################################################
错误:
+--------------------------------------------------+
/usr/bin/install: cannot stat `/home/mini/arm/build-tools/build-glibc-headers/gnu/lib-names.h':  No such file or directory
+--------------------------------------------------+
解决方法:
方法一:
$ su -
# aptitude purge mawk
# apt-get install gawk
# exit
$ cd ${PRJROOT}/build-tools/build-glibc-headers
$ ../glibc-2.13/configure --host=${TARGET} --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include
$ make cross-compiling=yes install_root=${TARGET_PREFIX} prefix="" install-headers
方法二:
$ su -
# apt-get install gawk
# exit
$ cd ${PRJROOT}/build-tools/build-glibc-headers
$ vi config.make
找到如下行:
AWK = mawk
将其修改为:
AWK = gawk
################################################################################

5.安装 gcc 引导编译器
$ cd ${PRJROOT}/build-tools
$ wget 
$ wget 
$ wget http://www.mpfr.org/mpfr-current/mpfr-3.0.1.tar.gz
$ wget 
$ tar xvf gcc-4.6.1.tar.gz
$ tar xvf gmp-5.0.2.tar.gz
$ tar xvf mpfr-3.0.1.tar.gz
$ tar xvf mpc-0.9.tar.gz
$ mv gmp-5.0.2 ./gcc-4.6.1/gmp
$ mv mpfr-3.0.1 ./gcc-4.6.1/mpfr
$ mv mpc-0.9 ./gcc-4.6.1/mpc
$ cd build-boot-gcc
$ mkdir -p ${TARGET_PREFIX}/include/gnu
$ touch ${TARGET_PREFIX}/include/gnu/stubs.h
$ ../gcc-4.6.1/configure --target=${TARGET} --prefix=${PREFIX} --disable-shared --without-headers --with-newlib --enable-languages=c
$ make all-gcc all-target-libgcc
$ make install-gcc install-target-libgcc
################################################################################
错误:
+--------------------------------------------------+
../../../gcc-4.6.1/libgcc/../gcc/gthr-posix.h:41:21: fatal error: pthread.h: No such file or directory
+--------------------------------------------------+
解决方法:
如果没有安装 glibc 头文件,就开始安装 gcc 引导编译器,需要在 configure 后面加上 --disable-threads 选项。
$ cd ${PRJROOT}/build-tools/build-boot-gcc
$ ../gcc-4.6.1/configure --target=${TARGET} --prefix=${PREFIX} --disable-shared --disable-threads --without-headers --with-newlib --enable-languages=c
################################################################################
错误:
+--------------------------------------------------+
/home/mini/arm/tools/arm-linux/include/features.h:381:23: fatal error: gnu/stubs.h: No such file or directory
+--------------------------------------------------+
解决方法:
$ mkdir -p ${TARGET_PREFIX}/include/gnu
$ touch ${TARGET_PREFIX}/include/gnu/stubs.h
################################################################################

6.安装 glibc
$ cd ${PRJROOT}/build-tools
$ cd build-glibc
$ CC=arm-linux-gcc ../glibc-2.13/configure --host=${TARGET} --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
$ ln -s ${PREFIX}/lib/gcc/arm-linux/4.6.1/libgcc.a ${PREFIX}/lib/gcc/arm-linux/4.6.1/libgcc_eh.a
$ make
$ make install_root=${TARGET_PREFIX} prefix="" install
################################################################################
错误:
+--------------------------------------------------+
configure: error: forced unwind support is required
+--------------------------------------------------+
解决方法:
在 configure 后面加上 libc_cv_forced_unwind=yes 选项。
$ cd ${PRJROOT}/build-tools/build-glibc
$ CC=arm-linux-gcc ../glibc-2.13/configure --host=${TARGET} --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
################################################################################
错误:
+--------------------------------------------------+
configure: error: the compiler must support C cleanup handling
+--------------------------------------------------+
解决方法:
在 configure 后面加上 libc_cv_c_cleanup=yes 选项。
$ cd ${PRJROOT}/build-tools/build-glibc
$ CC=arm-linux-gcc ../glibc-2.13/configure --host=${TARGET} --prefix="/usr" --enable-add-ons --with-headers=${TARGET_PREFIX}/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
################################################################################
错误:
+--------------------------------------------------+
../sysdeps/unix/sysv/linux/sys/syscall.h:25:24: fatal error: asm/unistd.h: No such file or directory
+--------------------------------------------------+
解决方法:
$ cd ${PRJROOT}/kernel/linux-3.0.3
$ cp -r arch/arm/include/asm/ ${TARGET_PREFIX}/include
################################################################################
错误:
+--------------------------------------------------+
../ports/sysdeps/unix/sysv/linux/arm/sigrestorer.S:30: Error: previous CFI entry not closed (missing .cfi_endproc)
/tmp/cc9oYU9g.s: Error: open CFI at the end of file; missing .cfi_endproc directive
+--------------------------------------------------+
解决方法:
$ cd ${PRJROOT}/build-tools/build-glibc
$ vi ../glibc-2.13/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)
################################################################################
错误:
+--------------------------------------------------+
/bin/sh: cannot create /home/mini/arm/build-tools/build-glibc/posix/config-name.h.new: Directory nonexistent
+--------------------------------------------------+
解决方法:
$ cd ${PRJROOT}/build-tools/build-glibc
$ mkdir posix
################################################################################
错误:
+--------------------------------------------------+
../sysdeps/unix/syscall-template.S:82: Error: CFI instruction used without previous .cfi_startproc
+--------------------------------------------------+
解决方法:
$ cd ${PRJROOT}/build-tools/build-glibc
$ vi ../glibc-2.13/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;
方法来源:
../glibc-2.13/ports/sysdeps/unix/sysv/linux/arm/sysdep.h
################################################################################
错误:
+--------------------------------------------------+
/home/mini/arm/tools/lib/gcc/arm-linux/4.6.1/../../../../arm-linux/bin/ld: cannot find -lgcc_eh
+--------------------------------------------------+
解决方法:
$ ln -s ${PREFIX}/lib/gcc/arm-linux/4.6.1/libgcc.a ${PREFIX}/lib/gcc/arm-linux/4.6.1/libgcc_eh.a
################################################################################
错误:
+--------------------------------------------------+
../sysdeps/ieee754/dbl-64/s_fma.c:152:15: error: 'FE_TOWARDZERO' undeclared (first use in this function)
../sysdeps/ieee754/dbl-64/s_fma.c:152:15: note: each undeclared identifier is reported only once for each function it appears in
../sysdeps/ieee754/dbl-64/s_fma.c:159:36: error: 'FE_INEXACT' undeclared (first use in the function)
+--------------------------------------------------+
解决方法:
$ cd ${PRJROOT}/build-tools/build-glibc
$ vi ../glibc-2.13/sysdeps/ieee754/dbl-64/s_fma.c
找到如下行:
#include
在其下添加:
#define FE_TOWARDZERO 0xc00000
#define FE_INEXACT 16
方法来源:
../glibc-2.13/ports/sysdeps/arm/eabi/bits/fenv.h
################################################################################
错误:
+--------------------------------------------------+
../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: error: 'FE_TOWARDZERO' undeclared (first use in this function)
../sysdeps/ieee754/dbl-64/s_fmaf.c:39:15: note: each undeclared identifier is reported only once for each function it appears in
../sysdeps/ieee754/dbl-64/s_fmaf.c:43:39: error: 'FE_INEXACT' undeclared (first use in the function)
+--------------------------------------------------+
解决方法:
$ cd ${PRJROOT}/build-tools/build-glibc
$ vi ../glibc-2.13/sysdeps/ieee754/dbl-64/s_fmaf.c
找到如下行:
#include
在其下添加:
#define FE_TOWARDZERO 0xc00000
#define FE_INEXACT 16
方法来源:
../glibc-2.13/ports/sysdeps/arm/eabi/bits/fenv.h
################################################################################

7.安装 gcc 编译器
cd ${PRJROOT}/build-tools/build-gcc
../gcc-4.6.1/configure --target=${TARGET} --prefix=${PREFIX} --enable-shared --enable-languages=c,c++
make all
make install
################################################################################
错误:
+--------------------------------------------------+
/lib/libc.so.6: file not recognized: File format not recognized
+--------------------------------------------------+
解决方法:
$ cd ${TARGET_PREFIX}/lib
$ cp ./libc.so ./libc.so.bak
修改 libc.so 文件,除掉它列举的链接库的绝对路径。基本上,将需要除掉所有链接库文件名中的 /lib/ 字样。
$ vi 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 AS_NEEDED ( ld-linux.so.2 ) )
################################################################################
错误:
+--------------------------------------------------+
configure: error: Pthreads are required to build libgomp
+--------------------------------------------------+
解决方法:
$ cd ${TARGET_PREFIX}/lib
$ cp ./libpthread.so ./libpthread.so.bak
修改 libpthread.so 文件,除掉它列举的链接库的绝对路径。基本上,将需要除掉所有链接库文件名中的 /lib/ 字样。
$ vi libpthread.so
找到如下行:
GROUP ( /lib/libpthread.so.0 /lib/libpthread_nonshared.a )
将其修改为:
GROUP ( libpthread.so.0 libpthread_nonshared.a )
################################################################################

上一篇:Could not read symbols :linux/unix系统编译下的错误
下一篇:sscanf,sscanf_s及其相关用法