临时系统是为了独立出宿主系统,再来编译干净的目标系统
linux-header、glibc、调整工具链、第二遍gcc、binutils
1、Linux-2.6.22.5
make mrproper
#防止配置文件残留,清除一下已保持源文件的干净
make headers_check
make INSTALL_HDR_PATH=dest headers_install#只编译内核头文件
cp -rv dest/include/* /tools/include
#目标系统的头文件都是存放在/usr/include下面的,
#临时系统由于不遵守LSB,所以就存在/tools下面。
2、Glibc-2.5.1
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.5.1/configure –prefix=/tools \
–disable-profile –enable-add-ons \
–enable-kernel=2.6.0 –with-binutils=/tools/bin \
–without-gd –with-headers=/tools/include \
–without-selinux#–with-headers=/tools/include:头文件和库文件是紧密联系的。
make -j4
touch /tools/etc/ld.so.conf
make install
3、调整工具链
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#echo $(gcc -dumpmachine):i686-pc-linux-gnu
#把搜索路径为/usr/lib的ld命令,替换为搜索路径为/tools/lib的ld
#/tools/bin 和/tools/$(gcc -dumpmachine)/bin 是硬连接关系。gcc -dumpspecs | sed ‘s@^/lib/ld-linux.so.2@/tools&@g’ \
> `dirname $(gcc -print-libgcc-file-name)`/specs#使gcc编译时使用的是/tools/lib/ld-linux.so.2这个动态连接器
#gcc的specs位于/tools/lib/gcc/i686-pc-linux-gnu/4.1.2下
#ld和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#删除gcc下面的头文件:/lib/gcc/i686-pc-linux-gnu/4.1.2/include
#测试一下
echo ‘main(){}’ > dummy.c
cc dummy.c
readelf -l a.out | grep ‘: /tools’结果为:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
4、安装测试工具,非必须
1、tcl-8.4.15
cd unix
./configure –prefix=/tools
make && make install
make install-private-headers#安装tcl头文件,expect要用
ln -sv tclsh8.4 /tools/bin/tclsh
2、Expect-5.43.0
patch -Np1 -i ../expect-5.43.0-spawn-1.patch
cp configure{,.bak}
sed ‘s:/usr/local/bin:/bin:’ configure.bak > configure#把/usr/local/bin替换为/bin
./configure –prefix=/tools –with-tcl=/tools/lib \
–with-tclinclude=/tools/include –with-x=no
make
make SCRIPTS=”” install3、DejaGNU-1.4.4
./configure –prefix=/tools
make install
5、gcc-4.1.2
expect -c “spawn ls”
#结果为:spawn ls
cp -v gcc/Makefile.in{,.orig}
sed ‘s@\./fixinc\.sh@-c true@’ gcc/Makefile.in.orig > gcc/Makefile.in#将./fixinc.sh 这一行替代为空
#原文 $(SHELL) ./fixinc.sh ../../gcc/include \cp -v gcc/Makefile.in{,.tmp}
sed ‘s/^XCFLAGS =$/& -fomit-frame-pointer/‘ gcc/Makefile.in.tmp \
> gcc/Makefile.in#XCFLAGS = -fomit-frame-pointer
patch -Np1 -i ../gcc-4.1.2-specs-1.patch
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.1.2/configure –prefix=/tools \
–with-local-prefix=/tools –enable-clocale=gnu \
–enable-shared –enable-threads=posix \
–enable-__cxa_atexit –enable-languages=c,c++ \
–disable-libstdcxx-pch#–enable-clocale=gnu:
#本参数确保 C++ 库在任何情况下都使用正确的 locale 模块
#–enable-__cxa_atexit:
#用 __cxa_atexit 代替 atexit 来登记 C++ 对象的本地静态和全局析构函数
make && make install
#测试一下readelf -l a.out | grep ‘: /tools’
结果为:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
6、Binutils-2.17
mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.17/configure –prefix=/tools \
–disable-nls –with-lib-path=/tools/lib
#–with-lib-path=/tools/lib:使用刚装的lib(glib装的)
make && make install
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
#为目标工具链做准备
cp -v ld/ld-new /tools/bin