LFS -- Linux from Scratch,就是一種從網上直接下載源碼,從頭編譯LINUX的安裝方式。它不是發行版,只是一個菜譜,告訴你到哪裡去買菜(下載源碼),怎麼把這些生東西( raw code) 作成符合自己口味的菜肴---個性化的linux,不單單是個性的桌面。
優點:了解Linux工作方式;自定義你的系統;建立袖珍型Linux;安全性
我的LFS計劃:
本來計劃先通過VMWare在虛擬機中做一下試驗,結果編譯時間太長了,未果。
所以不太甘心,晚上卸載掉Fedura Core 1,重新安裝了一個只帶GCC等編譯必須軟件的最小化Fedura系統,
大概才1G多,騰出來空間劃分出一個2G的留給LFS。
機器環境介紹:
Athlon XP 1700+ OC 2000+
512MB PC133內存
80GB ATA100 IDE硬盤
已安裝系統: Windows XP, Fedura Core 1
Linux myhost 2.4.22-1.2115.nptl #1 Wed Oct 29 15:31:21 EST 2003 i686 athlon i386 GNU/Linux
關於$LFS: 設定LFS分區路徑,使用
export LFS=/mnt/lfs
加載。使用范例:
./configure --prefix=$LFS/tools
關於SBUs: Static Binutils Unittime, 靜態 Binutils 單位時間
Binutils是LFS中第一個需要編譯的軟件包,以它編譯的時間作為基准單位,可以估算出其它軟件包的編譯時間
Chapter 3. 准備新分區
3.1 創建一個新分區:(LFS主分區2G + swap分區)
fdisk /dev/hda
n - 增加分區 t - 更改分區類型 p - 顯示分區表 w - 寫入磁盤
3.2 在新分區上創建文件系統:(ext2)
mke2fs /dev/hda4
[root@myhost root]# mke2fs /dev/hda4
mke2fs 1.34 (25-Jul-2003)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
251392 inodes, 502031 blocks
25101 blocks (5.00%) reserved for the super user
First data block=0
16 block groups
32768 blocks per group, 32768 fragments per group
15712 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 37 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
建立swap分區(由於我的內存比較大 所以沒建立swap分區):
mkswap /dev/hda8
附:當前/dev/hda分區情況
Disk /dev/hda: 80.0 GB, 80026361856 bytes
255 heads, 63 sectors/track, 9729 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 637 5116671 7 HPFS/NTFS
/dev/hda2 1160 9729 68838525 f Win95 Ext'd (LBA)
/dev/hda3 638 828 1534207+ 83 Linux
/dev/hda4 829 1078 2008125 83 Linux
/dev/hda5 1160 1912 6048441 b Win95 FAT32
/dev/hda6 2015 4564 20482843+ 7 HPFS/NTFS
/dev/hda7 4565 9729 41487831 7 HPFS/NTFS
3.3 加載新的分區
[root@myhost root]# export LFS=/mnt/lfs
[root@myhost root]# mkdir -p $LFS
[root@myhost root]# mount /dev/hda4 $LFS
mkdir -p, --parents: no error if existing, make parent Directories as needed
建立sources目錄
[root@myhost root]# mkdir $LFS/sources
[root@myhost root]# chmod a+wt $LFS/sources
t: sticky
STICKY DIRECTORIES
When the sticky bit is set on a directory, files in that directory may
be unlinked or renamed only by root or their owner. Without the sticky
bit, anyone able to write to the directory can delete or rename files.
The sticky bit is commonly found on directories, sUCh as /tmp, that are
world-writable.
#---- install script begin ----------------------------------------------------
export LFS=/mnt/lfs
mkdir -p $LFS
mount /dev/hda4 $LFS
mkdir $LFS/sources
chmod a+wt $LFS/sources
#---- install script end ------------------------------------------------------
Chapter 4 安裝材料: 包和補丁
4.1 所需軟件包及補丁:
使用 Linux From Scratch 官方提供的 LFS 5.0:
http://packages.lfs-es.org/lfs-packages-5.0.tar
中國 linuxsir 鏡像:
http://lfs.linuxsir.org/htdocs/files/lfs-packages-5.0.tar
內含軟件清單如下:
autoconf-2.57.tar.bz2 inetutils-1.4.2.tar.bz2
automake-1.7.6.tar.bz2 kbd-1.08-more-programs.patch
bash-2.05b-2.patch kbd-1.08.tar.bz2
bash-2.05b.tar.bz2 less-381.tar.bz2
binutils-2.14.tar.bz2 lfs-bootscripts-1.12.tar.bz2
bison-1.875-attribute.patch lfs-utils-0.3.tar.bz2
bison-1.875.tar.bz2 liBTool-1.5.tar.bz2
bzip2-1.0.2.tar.bz2 linux-2.4.22.tar.bz2
coreutils-5.0-hostname-2.patch m4-1.4.tar.bz2
coreutils-5.0.tar.bz2 make-3.80.tar.bz2
coreutils-5.0-uname.patch MAKEDEV-1.7.bz2
dejagnu-1.4.3.tar.bz2 man-1.5m2-80cols.patch
diffutils-2.8.1.tar.bz2 man-1.5m2-manpath.patch
e2fsprogs-1.34.tar.bz2 man-1.5m2-pager.patch
ed-0.2-mkstemp.patch man-1.5m2.tar.bz2
ed-0.2.tar.bz2 man-pages-1.60.tar.bz2
expect-5.39.0-spawn.patch modutils-2.4.25.tar.bz2
expect-5.39.0.tar.bz2 ncurses-5.3-etip-2.patch
file-4.04.tar.bz2 ncurses-5.3.tar.bz2
findutils-4.1.20.tar.bz2 ncurses-5.3-vsscanf.patch
flex-2.5.4a.tar.bz2 net-tools-1.60-miitool-gcc33-1.patch
gawk-3.1.3-libexecdir.patch net-tools-1.60.tar.bz2
gawk-3.1.3.tar.bz2 patch-2.5.4.tar.bz2
gcc-2.95.3-2.patch perl-5.8.0-libc-3.patch
gcc-2.95.3-no-fixinc.patch perl-5.8.0.tar.bz2
gcc-2.95.3-returntype-fix.patch procinfo-18.tar.bz2
gcc-2.95.3.tar.bz2 procps-3.1.11-locale-fix.patch
gcc-3.3.1-no_fixincludes-2.patch procps-3.1.11.tar.bz2
gcc-3.3.1-specs-2.patch psmisc-21.3.tar.bz2
gcc-3.3.1-suppress-libiberty.patch sed-4.0.7.tar.bz2
gcc-core-3.3.1.tar.bz2 shadow-4.0.3-newgrp-fix.patch
gcc-g++-3.3.1.tar.bz2 shadow-4.0.3.tar.bz2
gcc-testsuite-3.3.1.tar.bz2 sysklogd-1.4.1.tar.bz2
gettext-0.12.1.tar.bz2 sysvinit-2.85.tar.bz2
glibc-2.3.2-sscanf-1.patch tar-1.13.25.tar.bz2
glibc-2.3.2.tar.bz2 tcl8.4.4-src.tar.bz2
glibc-linuxthreads-2.3.2.tar.bz2 texinfo-4.6.tar.bz2
grep-2.5.1.tar.bz2 util-linux-2.12.tar.bz2
groff-1.19.tar.bz2 vim-6.2.tar.bz2
grub-0.93-gcc33-1.patch zlib-1.1.4.tar.bz2
grub-0.93.tar.bz2 zlib-1.1.4-vsnprintf.patch
gzip-1.3.5.tar.bz2
Chapter 5 創建臨時系統
5.1 工具鏈技術說明
Chapter 5 的目的是提供一個健全的(sane)臨時環境,使我們可以通過 chroot 進入,借助它我們可以在 Chapter 6 建立一個干淨無誤的 LFS 系統。因此我們要盡可能的從主系統分離,建立一個自給自足(self-contained and self-hosted)的工具鏈(toolchain)。此臨時系統安裝在 $LFS/tools 下。
關鍵技術要點:
1. 類似於交叉編譯(cross compiling)的原理,把工具裝載同一前綴下協同工作,從而發揮一些GNU的“魔力”。
2. 小心處理標准連接庫的搜索路徑,以保證程序只連接到我們選擇的庫上。
3. 小心處理GCC的specs文件,來告訴編譯器選用正確的動態連接器。
工作平台(work platform / target triplet): i686-pc-linux-gnu
確定方法: 解開 binutils 源碼,運行 ./config.guess 並觀察結果
動態連接器(動態加載器): /lib/ld-linux.so.2
確定方法: 用下面的命令來檢查主系統中的任何一個二進制程序:'readelf -l <name of binary> grep interpreter'並觀察結果
[root@myhost root]# readelf -l /bin/dmesg grep interpreter
[Requesting program interpreter: /lib/ld-linux.so.2]
5.2 創建$LFS/tools目錄,並創建符號連接/tools
[root@myhost root]# mkdir $LFS/tools
[root@myhost root]# ln -s $LFS/tools /
5.3 增加lfs用戶
[root@myhost /]# useradd -s /bin/bash -m lfs
[root@myhost /]# passwd lfs
[root@myhost /]# chown lfs $LFS/tools
[root@myhost /]# chown lfs $LFS/sources
[root@myhost /]# su - lfs
[lfs@myhost lfs]$
"-" 讓 su 命令啟動一個新的,干淨的shell
5.4 環境設置
[lfs@myhost lfs]$ cat >~/.bash_profile << "EOF"
> set +h
> umask 022
> LFS=/mnt/lfs
> LC_ALL=POSIX
> PATH=/tools/bin:$PATH
> export LFS LC_ALL PATH
> unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
> EOF
[lfs@myhost lfs]$ source ~/.bash_profile
說明:
set +h 關掉bash的 "hash"功能。關掉hash功能,那些交互的命令(make,patch, sed,cp 等等)將總是使用新的程序。
將用戶文件創建掩碼(umask)設為022。 rwx-r-x-r-x
LC_ALL 變量控制某些軟件包的本地化,使它們輸出的信息遵守指定國家的規范。設置成 "POSIX" (或"C",它們倆是相同的)我們保證在chroot環境中不會出現任何問題。
我們把 /tools/bin 附加到標准路徑前面,是為了在安裝過程中,總是能用到已經安裝了的臨時工具。
CC, CXX, CPP, LD_LIBRARY_PATH 和 LD_PRELOAD 環境變量都有可能破壞我們的工具鏈,因此這裡取消它們的設置,以預防可能的問題。
source 命令讀了剛才創建的設置文件。
#---- install script begin ----------------------------------------------------
mkdir $LFS/tools
ln -s $LFS/tools /
useradd -s /bin/bash -m lfs
passwd lfs
chown lfs $LFS/tools
chown lfs $LFS/sources
su - lfs
cat > ~/.bash_profile << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
PATH=/tools/bin:$PATH
export LFS LC_ALL PATH
unset CC CXX CPP LD_LIBRARY_PATH LD_PRELOAD
EOF
source ~/.bash_profile
#---- install script end ------------------------------------------------------
5.5 安裝 Binutils-2.14 第一遍
預計所需編譯時間: 1.0SBU
預計所需硬盤空間: 194MB
Binutils 是一組開發工具,包括連接器、匯編器和其它用於生成目標文件和檔案的工具。
安裝下列程序: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
安裝下列庫文件: libiberty.a, libbfd.[a, so], libopcodes.[a, so]
測算時間方法:
time { command seq1 && command seq2 && ... && command seqn; }
注意: 在{後面有一個空格, 在最後一條命令序列後面有一個分號,然後和後面的}只見至少要有一個空格
[lfs@myhost tools]$ cp $LFS/sources/binutils-2.14.tar.bz2 /tools/
[lfs@myhost tools]$ bunzip2 binutils-2.14.tar.bz2
[lfs@myhost tools]$ tar xvf binutils-2.14.tar
[lfs@myhost tools]$ rm binutils-2.14.tar
[lfs@myhost tools]$ cd binutils-2.14
[lfs@myhost binutils-2.14]$ mkdir ../binutils-build
[lfs@myhost binutils-2.14]$ cd ../binutils-build
[lfs@myhost binutils-build]$ ../binutils-2.14/configure
> --prefix=/tools --disable-nls
[lfs@myhost binutils-build]$ make configure-host
[lfs@myhost binutils-build]$ make LDFLAGS="-all-static"
make configure-host: 強制所有的子目錄都進行配置,無此參數,靜態連接就會失敗
make LDFLAGS="-all-static": 通過libtool將參數傳遞給連接器,使 Binutils 軟件包中所有程序都靜態連接
[lfs@myhost binutils-build]$ make install
[lfs@myhost binutils-build]$ make -C ld clean
[lfs@myhost binutils-build]$ make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib
為後面的"鎖定"glibc准備連接器腳本:
make -C ld clean: 刪除所有編譯生成文件,但保留子目錄ld
make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib: 重新編譯ld子目錄中的所有文件
#---- install script begin ----------------------------------------------------
cd /tools
cp $LFS/sources/binutils-2.14.tar.bz2 /tools/
bunzip2 binutils-2.14.tar.bz2
tar xvf binutils-2.14.tar
rm binutils-2.14.tar
cd binutils-2.14
mkdir ../binutils-build
cd ../binutils-build
time { ../binutils-2.14/configure
--prefix=/tools --disable-nls &&
make configure-host &&
make LDFLAGS="-all-static" &&
make install &&
make -C ld clean &&
make -C ld LDFLAGS="-all-static" LIB_PATH=/tools/lib;
}
#---- install script end ------------------------------------------------------
real 2m54.436s
user 2m22.380s
sys 0m22.020s
5.6 安裝 GCC-3.3.1 第一遍
預計所需編譯時間: 4.4SBU
預計所需硬盤空間: 300MB
GCC軟件包包含GNU C/C++編譯器
安裝下列程序: c++, cc(link to gcc), cc1, cc1plus, collect2, cpp, g++, gcc, gccbug, gcov
安裝下列庫文件: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.[a,so] 和 libsupc++.a
[lfs@myhost tools]$ cp $LFS/sources/gcc-core-3.3.1.tar.bz2 /tools
[lfs@myhost tools]$ bunzip2 gcc-core-3.3.1.tar.bz2
[lfs@myhost tools]$ tar xvf gcc-core-3.3.1.tar
[lfs@myhost tools]$ rm gcc-core-3.3.1.tar
[lfs@myhost tools]$ cd gcc-3.3.1
[lfs@myhost gcc-3.3.1]$ mkdir ../gcc-build
[lfs@myhost gcc-3.3.1]$ cd ../gcc-build
[lfs@myhost gcc-build]$ ../gcc-3.3.1/configure --prefix=/tools
> --with-local-prefix=/tools
> --disable-nls --enable-shared
> --enable-languages=c
configure --enable-shared: 這個參數咋一看有點自相矛盾。但只有加上它,才能編譯出 libgcc_s.so.1 和 libgcc_eh.a, Glibc(下一個軟件包)的配置腳本只有在能找到 libgcc_eh.a 時才能確保產生正確的結果。請注意,gcc的可執行程序仍然會被靜態連接,因為這是由後面 BOOT_LDFLAGS 中的 -static來控制的。
[lfs@myhost gcc-build]$ make BOOT_LDFLAGS="-static" bootstrap
make bootstrap: bootstrap目標不僅僅是編譯 GCC,而是重復編譯它幾次。它用第一次編譯生成的程序來第二次編譯自己,然後又用第二次編譯生成的程序來第三次編譯自己,最後比較第二次和第三次編譯的結果,以確保編譯器能毫無差錯的編譯自身,這通常表明編譯是正確的。
[lfs@myhost gcc-build]$ make install
[lfs@myhost gcc-build]$ ln -sf gcc /tools/bin/cc
[lfs@myhost gcc-build]$ cd ..
[lfs@myhost tools]$ rm -rf gcc-3.3.1
[lfs@myhost tools]$ rm -rf gcc-build
#---- install script begin ----------------------------------------------------
cd /tools
cp $LFS/sources/gcc-core-3.3.1.tar.bz2 /tools
bunzip2 gcc-core-3.3.1.tar.bz2
tar xvf gcc-core-3.3.1.tar
rm gcc-core-3.3.1.tar
cd gcc-3.3.1
mkdir ../gcc-build
cd ../gcc-build
time { ../gcc-3.3.1/configure --prefix=/tools
--with-local-prefix=/tools
--disable-nls --enable-shared
--enable-languages=c &&
make BOOT_LDFLAGS="-static" bootstrap &&
make install &&
ln -sf gcc /tools/bin/cc;
}
cd ..
rm -rf gcc-3.3.1
rm -rf gcc-build
#---- install script end ------------------------------------------------------
real 12m6.969s
user 11m21.500s
sys 0m39.570s
5.7 安裝 Linux-2.4.22 頭文件
預計所需編譯時間: 0.1SBU
預計所需硬盤空間: 186MB
[lfs@myhost tools]$ cp $LFS/sources/linux-2.4.22.tar.bz2 /tools
[lfs@myhost tools]$ bunzip2 linux-2.4.22.tar.bz2
[lfs@myhost tools]$ tar xvf linux-2.4.22.tar
[lfs@myhost tools]$ rm linux-2.4.22.tar
[lfs@myhost tools]$ cd linux-2.4.22
[lfs@myhost linux-2.4.22]$ make mrproper
[lfs@myhost linux-2.4.22]$ make include/linux/version.h
創建平台相關的 include/asm 符號鏈接:
[lfs@myhost linux-2.4.22]$ make symlinks
安裝平台相關的內核頭文件:
[lfs@myhost linux-2.4.22]$ mkdir /tools/include/asm
[lfs@myhost linux-2.4.22]$ cp include/asm/* /tools/include/asm
[lfs@myhost linux-2.4.22]$ cp -R include/asm-generic /tools/include
安裝跨平台的內核頭文件:
[lfs@myhost linux-2.4.22]$ cp -R include/linux /tools/include
還有幾個內核頭文件要使用 autoconf.h 頭文件。因為我們沒有配置內核,所以就需要自己創建這個文件,以避免編譯錯誤。創建一個空的 autoconf.h 文件。
[lfs@myhost linux-2.4.22]$ touch /tools/include/linux/autoconf.h
[lfs@myhost linux-2.4.22]$ cd ..
[lfs@myhost tools]$ rm -rf linux-2.4.22
#---- install script begin ----------------------------------------------------
cd /tools
cp $LFS/sources/linux-2.4.22.tar.bz2 /tools
bunzip2 linux-2.4.22.tar.bz2
tar xvf linux-2.4.22.tar
rm linux-2.4.22.tar
cd linux-2.4.22
time { make mrproper &&
make include/linux/version.h &&
make symlinks &&
mkdir /tools/include/asm &&
cp include/asm/* /tools/include/asm &&
cp -R include/asm-generic /tools/include &&
cp -R include/linux /tools/include &&
touch /tools/include/linux/autoconf.h;
}
cd ..
rm -rf linux-2.4.22
#---- install script end -------------------------------------------------------
real 0m1.932s
user 0m0.180s
sys 0m0.140s
5.8 安裝 Glibc-2.3.2
預計所需編譯時間: 11.8SBU
預計所需硬盤空間: 800MB
Glibc 是提供系統調用和基本函數的 C 庫,比如open, malloc, printf等等。所有動態連接的程序都要用到它。
安裝下列程序: catchsegv, gencat, getconf, getent, glibcbug, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump 和 zic
安裝下列庫文件: ld.so, libBrokenLocale.[a,so], libSegFault.so, libanl.[a,so], libbsd-compat.a, libc.[a,so], libc_nonshared.a, libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage.so, libnsl.a, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so, libpcprofile.so, libpthread.[a,so], libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db.so 和 libutil.[a,so]
[lfs@myhost tools]$ cp $LFS/sources/glibc-2.3.2.tar.bz2 /tools
[lfs@myhost tools]$ bunzip2 glibc-2.3.2.tar.bz2
[lfs@myhost tools]$ tar xvf glibc-2.3.2.tar
[lfs@myhost tools]$ rm glibc-2.3.2.tar
[lfs@myhost tools]$ cd glibc-2.3.2
[lfs@myhost glibc-2.3.2]$ cp $LFS/sources/glibc-linuxthreads-2.3.2.tar.bz2 .
[lfs@myhost glibc-2.3.2]$ tar xvf glibc-linuxthreads-2.3.2.tar
[lfs@myhost glibc-2.3.2]$ rm glibc-linuxthreads-2.3.2.tar
[lfs@myhost glibc-2.3.2]$ mkdir /tools/etc
[lfs@myhost glibc-2.3.2]$ touch /tools/etc/ld.so.conf
修正缺少/tools/etc/ld.so.conf文件的警告
[lfs@myhost glibc-2.3.2]$ cp $LFS/sources/glibc-2.3.2-sscanf-1.patch .
[lfs@myhost glibc-2.3.2]$ patch -Np1 -i glibc-2.3.2-sscanf-1.patch
用GCC 3.3.1來編譯Glibc時需要修正
[lfs@myhost glibc-2.3.2]$ mkdir ../glibc-build
[lfs@myhost glibc-2.3.2]$ cd ../glibc-build
[lfs@myhost glibc-build]$ ../glibc-2.3.2/configure --prefix=/tools
> --disable-profile --enable-add-ons
> --with-headers=/tools/include
> --with-binutils=/tools/bin
> --without-gd
參數說明:
--disable-profile: 它關掉了 profiling 信息相關的庫文件編譯
--enable-add-ons: 這個開關打開所有 Glibc的附加包,我們這裡是 linuxthreads。
--with-binutils=/tools/bin 和 --with-headers=/tools/include: 這些參數並不是必需的。但它們能保證在編譯 Glibc 時不會用錯內核頭文件和 Binutils 程序。
--without-gd: 這個參數保證我們不編譯 memusagestat 程序,該程序會頑固地連接到主系統的庫文件(libgd, libpng, libz 等等).
[lfs@myhost glibc-build]$ make
[lfs@myhost glibc-build]$ make check
Glibc的測試套件
[lfs@myhost glibc-build]$ make install
[lfs@myhost glibc-build]$ make localedata/install-locales
完整安裝locale,或者也可以用下面的方法來最小化安裝
[lfs@myhost glibc-build]$ mkdir -p /tools/lib/locale
[lfs@myhost glibc-build]$ localedef -i de_DE -f ISO-8859-1 de_DE
[lfs@myhost glibc-build]$ localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
[lfs@myhost glibc-build]$ localedef -i en_HK -f ISO-8859-1 en_HK
[lfs@myhost glibc-build]$ localedef -i en_PH -f ISO-8859-1 en_PH
[lfs@myhost glibc-build]$ localedef -i en_US -f ISO-8859-1 en_US
[lfs@myhost glibc-build]$ localedef -i es_MX -f ISO-8859-1 es_MX
[lfs@myhost glibc-build]$ localedef -i fr_FR -f ISO-8859-1 fr_FR
[lfs@myhost glibc-build]$ localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
[lfs@myhost glibc-build]$ localedef -i it_IT -f ISO-8859-1 it_IT
[lfs@myhost glibc-build]$ localedef -i ja_JP -f EUC-JP ja_JP
[lfs@myhost glibc-build]$ cd ..
[lfs@myhost tools]$ rm -rf glibc-2.3.2
[lfs@myhost tools]$ rm -rf glibc-build
#---- install script begin ----------------------------------------------------
cd /tools
cp $LFS/sources/glibc-2.3.2.tar.bz2 /tools
tar jxvf glibc-2.3.2.tar.bz2
rm glibc-2.3.2.tar.bz2
cd glibc-2.3.2
cp $LFS/sources/glibc-linuxthreads-2.3.2.tar.bz2 .
tar jxvf glibc-linuxthreads-2.3.2.tar.bz2
rm glibc-linuxthreads-2.3.2.tar.bz2
mkdir /tools/etc
touch /tools/etc/ld.so.conf
cp $LFS/sources/glibc-2.3.2-sscanf-1.patch .
patch -Np1 -i glibc-2.3.2-sscanf-1.patch
mkdir ../glibc-build
cd ../glibc-build
../glibc-2.3.2/configure --prefix=/tools
--disable-profile --enable-add-ons
--with-headers=/tools/include
--with-binutils=/tools/bin
--without-gd
time { make; }
make check
make install
make localedata/install-locales
cd ..
rm -rf glibc-2.3.2
rm -rf glibc-build
#---- install script end -------------------------------------------------------
real 18m11.625s
user 15m30.590s
sys 2m2.520s
##############################################
直接解壓 .tar.bz2 的兩種方法
tar jxvf filename.tar.bz2
bzcat filename.tar.bz2 tar -xv
##############################################
5.9 "Locking in" Glibc
[lfs@myhost tools]$ cd /tools/binutils-build
[lfs@myhost binutils-build]$ make -C ld install
安裝調整過的連接器
[lfs@myhost tools]$ rm -rf binutils-2.14
[lfs@myhost tools]$ rm -rf binutils-build
[lfs@myhost tools]$ SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
> sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g'
> $SPECFILE > tempspecfile
[lfs@myhost tools]$ mv tempspecfile $SPECFILE &&
> unset SPECFILE
修改 /tools/lib/gcc-lib/i686-pc-linux-gnu/3.3.1/specs,
將"/lib/ld-linux.so.2" 替換成 "/tools/lib/ld-linux.so.2"
[lfs@myhost tools]$ rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}
刪除掉由於GCC的 fixincludes 腳本將主系統中的頭文件copy到gcc的頭文件中所產生的錯誤文件
[lfs@myhost tools]$ echo 'main(){}' > dummy.c
[lfs@myhost tools]$ gcc dummy.c
[lfs@myhost tools]$ readelf -l a.out grep ': /tools'
測試新工具鏈編譯的連接是否正常,如果一切OK,結果如下:
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
[lfs@myhost tools]$ rm a.out dummy.c
至此完成了工具鏈的安裝,可以用它來編譯剩下的工具了。
#---- install script begin ----------------------------------------------------
cd /tools/binutils-build
make -C ld install
rm -rf binutils-2.14
rm -rf binutils-build
SPECFILE=/tools/lib/gcc-lib/*/*/specs &&
sed -e 's@ /lib/ld-linux.so.2@ /tools/lib/ld-linux.so.2@g'
$SPECFILE > tempspecfile
mv tempspecfile $SPECFILE &&
unset SPECFILE
rm -f /tools/lib/gcc-lib/*/*/include/{pthread.h,bits/sigthread.h}
echo 'main(){}' > dummy.c
gcc dummy.c
readelf -l a.out grep ': /tools'
rm a.out dummy.c
#---- install script end ------------------------------------------------------
5.10 安裝 Tcl-8.4.4
預計所需編譯空間: 0.9SBU
預計所需硬盤空間: 23MB
TCL: Tool Command Language
安裝下列程序: tclsh (link to tclsh8.4)
安裝下列庫文件: libtl8.4.so
[lfs@myhost tools]$ cp $LFS/sources/tcl8.4.4-src.tar.bz2 .
[lfs@myhost tools]$ tar jxvf tcl8.4.4-src.tar.bz2
[lfs@myhost tools]$ rm tcl8.4.4-src.tar.bz2
[lfs@myhost tools]$ cd tcl8.4.4/unix
[lfs@myhost unix]$ ./configure --prefix=/tools
[lfs@myhost unix]$ make
[lfs@myhost unix]$ TZ=UTC make test
將時區設置為 Coordinated Universal Time (UTC), 又叫GMT,同時進行測試。
根據官方文檔,本測試套件總會出錯,原因不明。可是我測試通過了。
Tests ended at Sat Nov 22 16:46:51 UTC 2003
all.tcl: Total 10503 Passed 9671 Skipped 832 Failed 0
[lfs@myhost unix]$ make install
[lfs@myhost unix]$ ln -s tclsh8.4 /tools/bin/tclsh
#---- install script begin ----------------------------------------------------
cd /tools
cp $LFS/sources/tcl8.4.4-src.tar.bz2 .
tar jxvf tcl8.4.4-src.tar.bz2
rm tcl8.4.4-src.tar.bz2
cd tcl8.4.4/unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
ln -s tclsh8.4 /tools/bin/tclsh
#---- install script end ------------------------------------------------------
5.11 安裝 Expect-5.39.0
預計所需編譯時間: 0.1SBU
預計所需編譯空間: 3.9MB
Expect 軟件包包換一個程序,可以與其他程序交互,以編程方式生成對話框。
安裝下列程序: expect
安裝下列庫文件: libexpect5.39.a
[lfs@myhost tools]$ cd /tools
[lfs@myhost tools]$ cp $LFS/sources/expect-5.39.0* .
[lfs@myhost tools]$ tar jxvf expect-5.39.0.tar.bz2
[lfs@myhost tools]$ rm expect-5.39.0.tar.bz2
[lfs@myhost tools]$ cd expect-5.39
[lfs@myhost expect-5.39]$ patch -Np1 -i ../expect-5.39.0-spawn.patch
修正了Expect中的一個bug,這個bug會使GCC的測試套件運行時產生假錯誤。
[lfs@myhost expect-5.39]$ ./configure
> --prefix=/tools
> --with-tcl=/tools/lib
> --with-x=no
[lfs@myhost expect-5.39]$ make
(測試套件 make test 我沒進行)
[lfs@myhost expect-5.39]$ make SCRIPTS="" install
SCRIPTS="": 禁止安裝我們不需要的 expect腳本
[lfs@myhost tools]$ rm expect-5.39.0-spawn.patch
[lfs@myhost tools]$ rm -rf expect-5.39
[lfs@myhost tools]$ rm -rf tcl8.4.4
#---- install script begin ----------------------------------------------------
cd /tools
cp $LFS/sources/expect-5.39.0* .
tar jxvf expect-5.39.0.tar.bz2
rm expect-5.39.0.tar.bz2
cd expect-5.39
patch -Np1 -i ../expect-5.39.0-spawn.patch