|
楼主 |
发表于 2008-2-28 18:23:08
|
显示全部楼层
安装Binutils需要一个补丁,在http://svn.cross-lfs.org/svn/rep ... ts_multilib-1.patch
下载。
patch -Np1 -i ../binutils-2.18-genscripts_multilib-1.patch
然后创建编译目录
mkdir ../binutils-build
cd ../binutils-build
这里的参数跟LFS的差不多,就是多了一个--enable-64-bit-bfd,用于确保把64位二进制文件格式支持编译进去。此外,用-m64选项可确保编译出来的代码是64位(可选,一般这是默认选项)。
CC="gcc -m64 -B/usr/bin/" ../binutils-2.18/configure \
--prefix=/tools --disable-nls --disable-werror \
--enable-64-bit-bfd
以下步骤和LFS的一样
make
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp -v ld/ld-new /tools/bin
现在,我们要把Binutils的库挪到/lib64去,因为编译出来的代码是64位:
mv /tools/lib{,64}
ln -s /tools/lib{64,}
5.4 GCC 4.2.3
为了实施我们/lib32:/lib64的Multilib配置,编译GCC的时候需要进行一些调整:
cp gcc/config/i386/t-linux64{,.orig}
sed -e 's@../lib64 ../lib@../lib64 ../lib32@g' \
gcc/config/i386/t-linux64.orig > gcc/config/i386/t-linux64
创建编译目录
mkdir ../gcc-build
cd ../gcc-build
参数方面,GCC会自动在必要时候添加-m64,因此无须再加。此外,--enable-long-long 参数需要添加进去。--disable-bootstrap是可选的,目的是减少一点编译时间。
CC="gcc -B/usr/bin" ../gcc-4.2.3/configure --prefix=/tools \
--with-local-prefix=/tools --disable-nls --enable-shared \
--enable-languages=c --enable-long-long --disable-bootstrap
make
make install
ln -vs gcc /tools/bin/cc
5.5 Linux API headers 2.6.24
跟LFS完全一样,不需要更改:
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
5.6 Glibc 2.7
对于Multilib,Glibc需要生成两次,一次32位,一次64位。
32位:
创建目录
mkdir ../glibc-build
cd ../glibc-build
在有些发行版上,可能检测forced_unwind和c_cleanup的时候会出错,如果不出错,以下这两行可以忽略。
echo "libc_cv_forced_unwind=yes">config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
这条命令是关键,用于设置libc.so的位置。
echo "slibdir=/tools/lib32">>configparms
和LFS相比,主要就是CFLAGS的设置方法不同(以下方法来自CLFS),以及需要添加--host=i686-pc-linux-gnu,CC需要明确加上-m32。
还有,如果你需要添加前述有关config.cache文件的命令,就要使用--cache-file选项。
BUILD_CC="gcc" CC="gcc -m32" CFLAGS="-march=i686 -mtune=generic -g -O2" ../glibc-2.7/configure --prefix=/tools --libdir=/tools/lib32 --host=i686-pc-linux-gnu --with-binutils=/tools/bin --with-headers=/tools/include --cache-file=config.cache --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-__thread --with-tls
make
make install
64位
mkdir ../glibc-build
cd ../glibc-build
echo "libc_cv_forced_unwind=yes">config.cache
echo "libc_cv_c_cleanup=yes" >> config.cache
再次提醒:这个命令是绝对必要!
echo "slibdir=/tools/lib64">>configparms
64位的配置比较简单,只要注意设置--libdir就可以了。--cache-file选项的使用条件同前。
../glibc-2.7/configure --prefix=/tools --libdir=/tools/lib64 --with-binutils=/tools/bin --with-headers=/tools/include --cache-file=config.cache --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-__thread --with-tls
make
make install
5.7 调整工具链
首先调整ld,这一步和LFS一样:
mv -v /tools/bin/{ld,ld-old}
mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv -v /tools/bin/{ld-new,ld}
ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
然后是GCC
gcc -dumpspecs > `dirname $(gcc -print-libgcc-file-name)`/specs
vi `dirname $(gcc -print-libgcc-file-name)`/specs
在vi界面里,将/lib换成/tools/lib32,/lib64换成/tools/lib64,然后保存退出。
以下步骤和LFS一样,删除被GCC调整过的头文件:
GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include &&
find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` &&
unset GCC_INCLUDEDIR
现在测试工具链:
echo "main(){}" > dummy.c
cc dummy.c
readelf a.out -l
应该看到/tools/lib64的字样。
cc -m32 dummy.c
readelf a.out -l
应该看到/tools/lib32的字样。
好了,到这里,我们的完整工具链就完成了。接下来,该是时候构建临时系统了。 |
|