LFS制作-3、临时系统-1临时工具链

临时系统是为了独立出宿主系统,再来编译干净的目标系统
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=”” install

3、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