使用环境:Linux Debian 2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012 x86_64 GNU/Linux
一、准备文件
binutils-2.18.tar.bz2 (http://ftp.gnu.org/gnu/)
gcc-3.4.6.tar.gz
glibc-2.3.6.tar.gz
glibc-linuxthreads-2.3.6.tar.bz2
linux-2.6.18.tar.xz
gcc patches: 33_all_pr15068-fix.patch (http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo/src/patchsets/gcc/3.4.6/gentoo/)
glibc patches:5090_all_divdi3-asm-fix.patch (http://sources.gentoo.org/cgi-bin/viewvc.cgi/gentoo/src/patchsets/glibc/2.3.6/)
6200_all_arm-glibc-2.3.4-ioperm.patch
6230_all_arm-glibc-2.3.6-socket-no-weak-alias.patch
glibc- 2.3.6-libgcc_eh-1.patch (http://www.linuxfromscratch.org/patches/downloads/glibc/)
注:将源码补丁的内容复制下来保存为文本文件即可
文件存放目录层次关系如下(/表示目录 ||表示文件):
home/user/workspace
||binutils-2.18.tar.bz2
|| binutils-2.18a.tar.bz2
|| gcc-3.4.6.tar.gz
|| glibc-2.3.6.tar.gz
|| glibc-linuxthreads-2.3.6.tar.gz
/patches
||33_all_pr15068-fix.patch
||5090_all_divdi3-asm-fix.patch
||6200_all_arm-glibc-2.3.6-ioperm.patch
||6230_all_arm-glibc-2.3.6-socket-no-weak-lias.patch
|| glibc-2.3.6-libgcc_eh-1.patch
在user和root的.bashrc都添加以下变量方便稍候的输入
export TARGET=arm- linux // 目标平台
export PREFIX=/usr/local/arm-linux-gcc/3.4.6
export TARGET_PREFIX=$PREFIX/$TARGET //目标平台库文件
export PATH=$PATH:$PREFIX/bin
二、编译binutils
cd /home/user/workespace/
tar -xvf binutils-2.18.tar.bz2
cd binutils-2.18
./configure --target=$TARGET --prefix=$PREFIX
make
make install
ls $PREFIX/bin
如果可以看到以下文件则说明成功了
arm-linux-addr2line arm-linux-gprof arm-linux-objdump arm-linux-strings
arm-linux-ar arm-linux-ld arm-linux-ranlib arm-linux-strip
arm-linux-as arm-linux-nm arm-linux-readelf
arm-linux-c++filt arm-linux-objcopy arm-linux-size
二、 编译不带Glibc库支持的gcc
cd /home/user/workspace/
tar -xvf gcc-3.4.6.tar.gz
patch -p1 -d gcc-3.4.6 < patches/33_all_pr15068-fix.patch
cp gcc-3.4.6/gcc/config/arm/t-linux gcc-3.4.6/gcc/config/arm/t-linux.bk
vim gcc-3.4.6/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” // 关闭某些需要Glibc支持的特性
cd gcc-3.4.6
mkdir build
cd build
../configure --target=$TARGET --prefix=$PREFIX --disable-threads --disable-shared --enable-languages=c
make
make installd
ls $PREFIX/bin
生成了以下文件:
arm-linux-addr2line arm-linux-gcc arm-linux-ld arm-linux-readelf
arm-linux-ar arm-linux-gcc-3.4.6 arm-linux-nm arm-linux-size
arm-linux-as arm-linux-gccbug arm-linux-objcopy arm-linux-strings
arm-linux-c++filt arm-linux-gcov arm-linux-objdump arm-linux-strip
arm-linux-cpp arm-linux-gprof arm-linux-ranlib
三、 准备linux-kernel头文件
cd /home/user/workspace/
tar -xvf linux-2.6.18.tar.gz
cd linux-2.6.18
make include/linux/version.h
cp -r include/linux $TARGET_PREFIX/include/linux
cp -r include/asm-generic $TARGET_PREFIX/include/asm-generic
cp -r include/asm-arm $TARGET_PREFIX/include/asm
ls $PREFIX/include
asm asm-generic linux
四、 编译glibc
cd /home/user/workspace/
tar -xvf glibc-2.3.6.tar.gz
tar -xvf glibc-linuxthreads-2.3.6.tar.gz --directory=./glibc-2.3.6
patch -p0 -d glibc-2.3.6 < patches/5090_all_divdi3-asm-fix.patch
patch -p1 -d glibc-2.3.6 < patches/6200_all_arm-glibc-2.3.6-ioperm.patch
patch -p1 -d glibc-2.3.6 < patches/6230_all_arm-glibc-2.3.6-socket-no-weak-lias.patch
patch -p1 -d glibc-2.3.6 < patches/glibc-2.3.6-libgcc_eh-1.patch
ln -s $PREFIX/lib/gcc/arm-linux/3.4.6/libgcc.a $PREFIX/lib/gcc/arm-linux/3.4.6/libgcc_eh.a
cd glibc-2.3.6
mkdir build
cd build
由于glibc库是用在arm体系的,所以必须使用刚刚生成不支持glibc库的交叉编译链编译。
CC=arm-linux-gcc
../configure --target=$TARGET --prefix=$TARGET_PREFIX --host=$TARGET --enable-add-ons=linuxthreads --enable-shared --with-headers=$TARGET_PREFIX/include
make
出错:
In file included from version.c:33:
/home/user/workspace/build-tools/glibc-2.3.6/build/csu/version-info.h:2: error: missing terminating " character
/home/user/workspace/build-tools/glibc-2.3.6/build/csu/version-info.h:3: error: missing terminating " character
version.c:40: error: syntax error before string constant
make[2]: *** [/home/user/workspace/build-tools/glibc-2.3.6/build/csu/version.o] 错误 1
make[2]: Leaving directory `/home/user/workspace/build-tools/glibc-2.3.6/csu'
make[1]: *** [csu/subdir_lib] 错误 2
make[1]: Leaving directory `/home/user/workspace/build-tools/glibc-2.3.6'
make: *** [all] 错误 2
提示glibc-2.3.6/build/csu/version-info.h文件缺少了一个”
打开version-info.h文件
"Compiled on a Linux >>2.6.32-5-amd64<< system on 2012-06-23.\n"
"Available extensions:
"
" GNU libio by Per Bothner\n"
" crypt add-on version 2.1 by Michael Glad and others\n"
" linuxthreads-0.10 by Xavier Leroy\n"
" BIND-8.2.3-T5B\n"
" libthread_db work sponsored by Alpha Processor Inc\n"
" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"
修改为:
"Compiled on a Linux >>2.6.32-5-amd64<< system on 2012-06-23.\n"
"Available extensions:"
" GNU libio by Per Bothner\n"
" crypt add-on version 2.1 by Michael Glad and others\n"
" linuxthreads-0.10 by Xavier Leroy\n"
" BIND-8.2.3-T5B\n"
" libthread_db work sponsored by Alpha Processor Inc\n"
" NIS(YP)/NIS+ NSS modules 0.19 by Thorsten Kukuk\n"
即第二行的结尾的”被放到第三行了,调整过来即可。
继续...
make
make install
五、 编译带glibc库支持的gcc
cd /home/user/workspace/
rm -rf gcc-3.4.6/gcc/config/arm/t-linux
mv gcc-3.4.6/gcc/config/arm/t-linux.bk gcc-3.4.6/gcc/config/arm/t-linux
cd gcc-3.4.6/build
rm -rf *
../configure --target=$TARGET --prefix=$PREFIX --enable-multilib --enable-shared --enable-languages=c,c++
make
make install
六、编译gdb
cd /home/user/workspace/
tar -xvf gdb-6.8a.tar.bz2
cd gdb-6.8/
mkdir build
cd build
../configure --target=$TARGET --prefix=$PREFIX
make
错误:
cc1: warnings being treated as errors
http://www.cnblogs.com/gdb/eval.c: In function ‘evaluate_subexp_standard’:
http://www.cnblogs.com/gdb/eval.c:1705: error: ‘subscript_array’ may be used uninitialized in this function
make[2]: *** [eval.o] 错误 1
vim ./gdb/Makefile
修改145行 "WERROR_CFLAGS = -Werror" 为 "WERROR_CFLAGS = #-Werror"即可
继续...
make
make install
大功告成!