- 论坛徽章:
- 0
|
警告:本文的内容有一定的危險性,可能會造成突然pc硬件溫度過高而燒毀或起火,電腦突然爆炸等危險,請勿模仿,未滿18嵗的兒童請在家長陪同下操作,製作過程請先備好滅火器已備萬一,>_
何謂"骨灰",本文所用的軟件是快照或最新版,這樣能夠體驗linux的最新技術,當然也有可能面臨一些軟件無法順利通過編譯要手工改代碼或者打補丁.爲什麽要用 快照 ,快照版 可能修復了發現了的漏洞(這也可能引入新的漏洞),可能加入了一些新的功能(當然這樣可能使得軟件不穩定甚至不能正常工作).
另外按本文步驟地成功與否還涉及到 rpwt
本文參考了 lfs hlfs clfs blfs cblfs 手冊,並加入了一些本人(Power_By_RTL)的心得.另外由於軟件包的變化可能較快從而導致一些連接失效,你可以在連接文件的目錄找 新的或者舊的版本
好了開始
首先準備分區,
挂載分區,
export LFS=/mnt/lfs
mkdir -pv $LFS
mount -v -t ext3 /dev/ $LFS
創建連接 ,
mkdir -v $LFS/tools
ln -sv $LFS/tools /
建立一個用戶來 build 第一階段
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
更改一些目錄的宿主,
chown -v lfs $LFS/tools
如果你要一個目錄裝代碼可以建一個目錄
mkdir -pv $LFS/sources
chown -v lfs $LFS/sources
設置lfs 用戶的密碼
passwd lfs
現在以 lfs 用戶登錄
RTL:lfs | 西元2008年10月06日 (週一) 02時51分03秒 | ~
$
設置lfs用戶的環境變量,
cat > ~/.bash_profile exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
載入環境變量,
source ~/.bash_profile
這時是,
lfs:~$
開始構建一個臨時的系統,如果你這階段中斷恢復時,
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
然後切換到 lfs 用戶
cat > ~/.bash_profile exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX PATH=/tools/bin:/bin:/usr/bin
export LFS LC_ALL PATH
EOF
source ~/.bash_profile
首先安装的第一个软件包是 Binutils
ftp://gcc.gnu.org/pub/binutils/snapshots/binutils-2.19.50.tar.bz2
ftp://gcc.gnu.org/pub/binutils/snapshots
Binutils 的文档推荐用一个新建的目录来编译它,而不是在源码目录中,
mkdir -v ../binutils-build
cd ../binutils-build
CC="gcc -B/usr/bin/" ../binutils-2.19.50/configure --prefix=/tools --disable-nls --disable-werror --with-pkgversion="GNU Binutils For LFS"
--disable-nls 不使用多囯語言
--disable-werror 不將警告視爲錯誤(--enable-werror將編譯過程中的警告視爲錯誤,並停止編譯,在編譯過程中給gcc傳遞-Werror)
--with-pkgversion="GNU Binutils For LFS" 定義PKG字符默認是 GNU Binutils (Binutils-2.17.50以上有效)
編譯
make
安裝
make install
爲了稍后的調整工具連而再build一次 ld
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp -v ld/ld-new /tools/bin
GCC
ftp://gcc.gnu.org/pub/gcc/snapshots/4.4-20081003/gcc-4.4-20081003.tar.bz2
ftp://gcc.gnu.org/pub/gcc/snapshots/
由於這個版本的gcc(gcc-4.3以上) GMP 和 MPFR 包,一些系統可能未裝或者版本較低,現在先將它們靜態編譯都gcc裏,將他們解壓到gcc代碼目錄,
http://ftp.gnu.org/gnu/gmp/gmp-4.2.4.tar.bz2
http://www.mpfr.org/mpfr-current/mpfr-2.3.2.tar.bz2
tar -jxf ../mpfr/2.3.2.tar.bz2
mv -v mpfr-2.3.2 mpfr
tar -jxf ../gmp-4.2.4.tar.bz2
mv -v gmp-4.2.4 gmp
不需要fixincludes,fixincludes 脚本偶尔会因为修改系统的头文件而出错,而且現在fix的是主系統的頭文件
sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
爲什麽不fixincludes這時根本就沒有安裝内核頭文件,gcc用的是當前系統的頭文件fix的只是當前系統的頭文件,而且在后面安裝glibc時gcc使用fix的頭文件比内核的頭文件還要優先,所以這裡不fix
gcc的文档推荐用一个新建的目录来编译它,而不是在源码目录中,
mkdir -v ../gcc-build
cd ../gcc-build
配置
CC="gcc -B/usr/bin/" ../gcc-4.4-20081003/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --enable-shared --enable-languages=c --disable-decimal-float
--disable-decimal-float 不使用小数点浮动
build
make
安裝
make install
建立一個連接因爲有些程序找的是cc 而不是gcc
ln -vs gcc /tools/bin/cc
下面安裝内核頭文件
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.5.tar.bz2
如果你想用2.6.27-rc 内核可以 下2.6.26内核+2.6.27-rc 補丁
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
注意内核是2.6.18以上的版本才有make headers_check ,make headers_install
Glibc
Glibc 推荐在源码目录新建的目录来编译它,而不是在源码目录中,
mkdir -v ../glibc-build
cd ../glibc-build
echo "CFLAGS += -march=i486 -mtune=native" > configparms
../glibc-2.8-20081006/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 --enable-stackguard-randomization
--disable-profile 不使用profiling 信息相关的库文件
--enable-add-ons 搜索其他目錄並編譯找到的
--enable-kernel=2.6.0 指定系統最低運行的内核版本\n--without-gd 不編譯與gd庫有關的程序和庫
--without-selinux 不使用對selinux 相關的特性
--enable-stackguard-randomization 在程序启动时使用一个随机数初始化 __stack_chk_guard
編譯它
make
安裝
mkdir -v /tools/etc
touch /tools/etc/ld.so.conf
make install
調整工具鏈
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 -dumpspecs | sed 's@/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs
del 一些從 當前系統來的頭文件
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
./a.out && readelf -l a.out | grep ': /tools'
如無意外顯示的是
[Requesting program interpreter: /tools/lib/ld-linux.so.2]
現在再看看庫文件時都也正確
ldd a.out
如果返回的是累次
linux-gate.so.1 => (0xffffe000)
libc.so.6 => /tools/lib/libc.so.6 (0xb7e86000)
/tools/lib/ld-linux.so.2 (0xb7fbd000)
就可以繼續了
安裝一些測試軟件的軟件
tcl
http://tcl.sourceforge.net/
http://prdownloads.sourceforge.net/tcl/tcl8.5.4-src.tar.gz
cd unix
./configure --prefix=/tools
编译软件包
make
安裝
make install
make install-private-headers
ln -sv tclsh8.5 /tools/bin/tclsh
Expect
http://expect.nist.gov/src/expect-5.43.0.tar.gz
http://www.linuxfromscratch.org/patches/lfs/development/expect-5.43.0-spawn-1.patch
http://www.linuxfromscratch.org/patches/lfs/development/expect-5.43.0-tcl_8.5.4_fix-1.patch
patch -Np1 -i ../expect-5.43.0-spawn-1.patch
patch -Np1 -i ../expect-5.43.0-tcl_8.5.4_fix-1.patch
cp configure{,.bak}
sed 's:/usr/local/bin:/bin:' configure.bak > configure
./configure --prefix=/tools --with-tcl=/tools/lib \
--with-tclinclude=/tools/include --with-x=no
make
make SCRIPTS="" install
DejaGNU
http://ftp.gnu.org/gnu/dejagnu/dejagnu-1.4.4.tar.gz
./configure --prefix=/tools
make install
GMP
./configure --prefix=/tools --enable-mpbsd
make
make install
由於當前的工具鏈還沒有c++ 編譯器因此現在不編譯對c++ 的支持(不加--encble-cxx configure)
MPFR
./configure --prefix=/tools --enable-thread-safe
make
make install
--enable-thread-safe 使用綫程安全
gcc
先测试宿主系统中PTY是否设置正常
expect -c "spawn ls"
如果返回
The system has no more ptys. Ask your system administrator to create more.
要解决主系统中的 PTY ,否則以後的運行測試組件將沒有任何意義。具体请参见 LFS 的 FAQ :
http://www.linuxfromscratch.org/lfs/faq.html#no-ptys
。
不需要fixincludes,
cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c
[email=true@']true@'[/email]
gcc/Makefile.in.orig > gcc/Makefile.in
前面的bootstrap 编译使用了 -fomit-frame-pointer 选项,爲了保持一致性
cp -v gcc/Makefile.in{,.tmp} &&
sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \ > gcc/Makefile.in
下面的 將改變动态连接器的位置
for file in $(find gcc/config -name linux64.h -o -name linux.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo "
#undef STANDARD_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0" >> $file
touch $file.orig
done
gcc的文档推荐用一个新建的目录来编译它,而不是在源码目录中,
mkdir -v ../gcc-build
cd ../gcc-build
配置
../gcc-4.4-20081003/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 --disable-bootstrap --enable-c99 --enable-long-long
--disable-libstdcxx-pch 不使用libstdc++ 编译预编译头(PCH),這個階段沒有軟件包需要它
--enable-c99 使用c99相關的特徵
--enable-long-long 支持'long long'类型
--disable-bootstrap 這個版本的gcc 默認是bootstrap ,現在禁止它
make
安裝
make install
測試一下gcc是否正常
echo 'main(){}' > dummy.c
cc dummy.c
./a.out && readelf -l a.out | grep ': /tools'
正常情況下返回
[Requesting program interpreter:
/tools/lib/ld-linux.so.2]
測試一下c++ 編譯器
g++ dummy.c
./a.out && ldd a.out
正常情況下返回類次
linux-gate.so.1 => (0xffffe000)
libstdc++.so.6 => /tools/lib/libstdc++.so.6 (0xb7e34000)
libm.so.6 => /tools/lib/libm.so.6 (0xb7e0f000)
libgcc_s.so.1 => /tools/lib/libgcc_s.so.1 (0xb7df1000)
libc.so.6 => /tools/lib/libc.so.6 (0xb7cbc000)
/tools/lib/ld-linux.so.2 (0xb7f24000)
請確定你的結果與上面一致才繼續
Binutils
Binutils 的文档推荐用一个新建的目录来编译它,而不是在源码目录中,
mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.19.50/configure --prefix=/tools --disable-nls --with-lib-path=/tools/lib --with-pkgversion="GNU Binutils For LFS"
編譯
make
安裝
make install
爲了稍后的調整工具連而再build一次 ld
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin
Ncurses
ftp://invisible-island.net/ncurses/ncurses-5.6.tar.gz
./configure --prefix=/tools --with-shared --without-debug --without-ada --enable-overwrite
現在還不需要對寬字符的支持,因爲多用的locale 為 C
make
make install
Bash
http://ftp.gnu.org/gnu/bash/bash-3.2.tar.gz
http://www.linuxfromscratch.org/patches/downloads/bash/bash-3.2-fixes-8.patch
打一個補丁來修正一些bug
patch -Np1 -i ../bash-3.2-fixes-8.patch
./configure --prefix=/tools --without-bash-malloc
make
make install
建一個連接
ln -vs bash /tools/bin/sh
Bzip2
http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz
make
make PREFIX=/tools install
Coreutils
http://ftp.gnu.org/gnu/coreutils/coreutils-6.12.tar.gz
http://www.linuxfromscratch.org/patches/downloads/coreutils/coreutils-6.12-old_build_kernel-1.patch
在一些老内核上一些程序可能會異常,用一個補丁來修正
patch -Np1 -i ../coreutils-6.12-old_build_kernel-1.patch
./configure --prefix=/tools --enable-install-program=hostname
make
make install
cp -v src/su /tools/bin/su-tools
Diffutils
http://ftp.gnu.org/gnu/diffutils/diffutils-2.8.7.tar.gz
./configure --prefix=/tools
make
make install
E2fsprogs
http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.41.1.tar.gz
在代碼目錄外編譯
mkdir -v build
cd build
../configure --prefix=/tools
make libs
make install-libs
Findutils
http://ftp.gnu.org/gnu/findutils/findutils-4.4.0.tar.gz
./configure --prefix=/tools
make
make install
Gawk
http://ftp.gnu.org/gnu/gawk/gawk-3.1.6.tar.bz2
./configure --prefix=/tools
make
make install
Gettext
http://ftp.gnu.org/gnu/gettext/gettext-0.17.tar.gz
cd gettext-tools
./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp -v src/msgfmt /tools/bin
Grep
http://ftp.gnu.org/gnu/grep/grep-2.5.3.tar.bz2
./configure --prefix=/tools --disable-perl-regexp
make
make install
--disable-perl-regexp 以免編譯時連接到 主系統的PCRE庫
Gzip
http://ftp.gnu.org/gnu/gzip/gzip-1.3.12.tar.gz
用glibc裏面的futimens函數代替gzip自帶的
for file in gzip.c lib/utimens.{c,h} ; do \
cp -v $file{,.orig}
sed 's/futimens/gl_&/' $file.orig > $file
done
./configure --prefix=/tools
make
make install
Make
http://ftp.gnu.org/gnu/make/make-3.81.tar.bz2
./configure --prefix=/tools
make
make install
Patch
http://ftp.gnu.org/gnu/patch/patch-2.5.9.tar.gz
./configure --prefix=/tools
make
make install
Perl
http://ftp.funet.fi/pub/CPAN/src/perl-5.10.0.tar.gz
http://www.linuxfromscratch.org/patches/hlfs/svn/perl-5.10.0-libc-1.patch
用個補丁,调整指向 C 库的硬连接路径
patch -Np1 -i ../perl-5.10.0-libc-1.patch
gcc 4.2以上要 sed 一下
mv -v makedepend.SH{,.orig}
sed 's/command /command[ -]/' makedepend.SH.orig > makedepend.SH
./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perl utilities
install -v perl pod/pod2man /tools/bin
install -vd /tools/lib/perl5/5.10.0
cp -vR lib/* /tools/lib/perl5/5.10.0
這時看一下perl是正常
perl -V
Sed
http://ftp.gnu.org/gnu/sed/sed-4.1.5.tar.gz
./configure --prefix=/tools --without-included-regex
make
make install
Tar
http://ftp.gnu.org/gnu/tar/tar-1.20.tar.bz2
./configure --prefix=/tools
make
make install
Texinfo
http://ftp.gnu.org/gnu/texinfo/texinfo-4.11.tar.bz2
./configure --prefix=/tools
make
make install
M4
http://ftp.gnu.org/gnu/m4/m4-1.4.10.tar.bz2
./configure --prefix=/tools
make
make install
Bison
http://ftp.gnu.org/gnu/bison/bison-2.3.tar.bz2
./configure --prefix=/tools
make
make install
Flex
http://downloads.sourceforge.net/flex/flex-2.5.35.tar.bz2
./configure --prefix=/tools
make
make install
Util-linux-ng
ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/v2.14/util-linux-ng-2.14.1.tar.bz2
[/url]
./configure --prefix=/tools
make -C mount mount umount
make -C text-utils more
cp -v mount/{,u}mount text-utils/more /tools/bin
整理一下
find /tools/lib -type f -exec strip --strip-debug '{}' ';'
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{info,man}
ok第一階段完成
現在切換到root
export LFS=/mnt/lfs
創建一些目錄和設備
mkdir -pv $LFS/{dev,proc,sys}
mknod -m 600 $LFS/dev/console c 5 1
mknod -m 666 $LFS/dev/null c 1 3
挂載内核相關的文件系統
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
Chroot 階段
chroot "$LFS" /tools/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
這時候從起后的恢復
export LFS=/mnt/lfs
mount -v --bind /dev $LFS/dev
mount -vt devpts devpts $LFS/dev/pts
mount -vt tmpfs shm $LFS/dev/shm
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
ln -sv $LFS/tools /
chroot "$LFS" /tools/bin/env -i \
HOME=/root TERM="$TERM" PS1='\u:\w\$ ' \
PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
/tools/bin/bash --login +h
創建一些系統目錄
mkdir -pv /{bin,boot,etc/opt,home,lib,mnt,opt}
mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
for dir in /usr /usr/local; do
ln -sv share/{man,doc,info} $dir
done
mkdir -v /var/{lock,log,mail,run,spool}
mkdir -pv /var/{opt,cache,lib/{misc,locate},local}
建立一些連接,一些程序使用的是絕對路徑,为了兼容这些程序,创建一些符号链接,放心以後編譯了那個包就會用實際的程序取代那些連接
ln -sv /tools/bin/{bash,cat,grep,pwd,stty} /bin
ln -sv /tools/bin/perl /usr/bin
ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
ln -sv bash /bin/sh
touch /etc/mtab
创建 /etc/passwd 文件:
cat > /etc/passwd
创建 /etc/group 文件:
cat > /etc/group
exec /tools/bin/bash --login +h
touch /var/run/utmp /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/run/utmp /var/log/lastlog
chmod -v 664 /var/run/utmp /var/log/lastlog
chmod -v 600 /var/log/btmp
内核頭文件
[url=http://www.eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.5.tar.bz2]http://www.eu.kernel.org/pub/linux/kernel/v2.6/linux-2.6.26.5.tar.bz2
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /usr/include
編譯優化(如果你不確定請跳過)
不當的優化選項會導致程式出錯甚至無法執行
http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
(x86平臺的一些優化選項)
設置环境变量来优化编译
export CFLAGS="-march=pentium4 -mtune=pentium4 -Os -s -Wa,-mtune=pentium4"
export CXXFLAGS=$CFLAGS
export CPPFLAGS="-DNDEBUG -D_FILE_OFFSET_BITS=64"
ps: -march -mtune 是告訴gcc cpu的類型,-Os 是以生成的程式最小化優先(有些編譯器有bug以Os編譯出來的程序是不能正常工作的慎用),默認一般是O2,-Wa 將mtune=pentium4傳遞給彙編器(gnu as)(binutils-2.17.50以上才支持)
glibc最終
ftp://gcc.gnu.org/pub/glibc/snapshots/glibc-2.8-20081006.tar.bz2
ftp://gcc.gnu.org/pub/glibc/snapshots/glibc-2.8-ports-20081006.tar.bz2
http://www.linuxfromscratch.org/patches/downloads/glibc/glibc-2.8-20080929-iconv_tests-1.patch
http://www.linuxfromscratch.org/patches/downloads/glibc/glibc-2.8-20080929-ildoubl_test-1.patch
http://svn.cross-lfs.org/svn/repos/cross-lfs/trunk/patches/glibc-2.8-localedef_segfault-1.patch
localdef程序可能出現段錯誤(segfault)用一個補丁修復它
patch -Np1 -i ../glibc-2.8-localedef_segfault-1.patch
下面兩個補丁修復一些測試程序的錯誤
patch -Np1 -i glibc-2.8-20080929-iconv_tests-1.patch &&
patch -Np1 -i glibc-2.8-20080929-ildoubl_test-1.patch
mkdir -v ../glibc-build
cd ../glibc-build
CFLAGS="-march=pentium4 -mtune=pentium4 -O2 -s -Wa,-mtune=pentium4" ../glibc-2.8-20081006/configure --prefix=/usr --disable-profile --enable-add-ons --enable-kernel=2.6.0 --libexecdir=/usr/lib/glibc --with-tls --enable-stackguard-randomization
make
測試,這很重要請不要跳過,否則就是那系統的穩定性作賭注
cp -v ../glibc-2.8-20081006/iconvdata/gconv-modules iconvdata
make -k check 2>&1 | tee glibc-check-log
grep Error glibc-check-log
安裝
touch /etc/ld.so.conf
make install
安裝locale
mkdir -pv /usr/lib/locale
make localedata/install-locales
配置文件
cat > /etc/nsswitch.conf passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
cp -v --remove-destination /usr/share/zoneinfo/PRC /etc/localtime
cat > /etc/ld.so.conf /usr/local/lib
/opt/lib
# End /etc/ld.so.conf
EOF
再次調整工具鏈
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 -dumpspecs | sed \
-e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' \
-e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
-e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' > \
`dirname $(gcc --print-libgcc-file-name)`/specs
測試是否正確
echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
返回
[Requesting program interpreter: /lib/ld-linux.so.2]
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
返回
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
grep -B1 '^ /usr/include' dummy.log
返回
#include search starts here:
/usr/include
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
返回
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
grep "/lib/libc.so.6 " dummy.log
返回
attempt to open /lib/libc.so.6 succeeded
grep found dummy.log
返回
found ld-linux.so.2 at /lib/ld-linux.so.2
Binutils
ftp://gcc.gnu.org/pub/binutils/snapshots/binutils-2.19.50.tar.bz2
expect -c "spawn ls"
若返回
The system has no more ptys.
Ask your system administrator to create more.
則運行測試是無意義的
mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.19.50/configure --prefix=/usr --enable-shared --enable-nls --with-pkgversion="GNU Binutils For LFS"
ps 請已-O2級別來編譯,不要用-Os或-O3
測試
make check
結果
=== ld Summary ===
# of expected passes 490
# of unexpected failures 14
# of expected failures 4
安裝
make tooldir=/usr
make tooldir=/usr install
cp -v ../binutils-2.19.50/include/libiberty.h /usr/include
GMP
http://ftp.gnu.org/gnu/gmp/gmp-4.2.4.tar.bz2
./configure --prefix=/usr --enable-cxx --enable-mpbsd
make
make install
測試,請不要跳過
make check >check.log 2>&1
awk '/tests passed/{total+=$2} ; END{print total}' check.log
正常是返回 139
MPFR
http://www.mpfr.org/mpfr-current/mpfr-2.3.2.tar.bz2
./configure --prefix=/usr --enable-thread-safe
make
make install
gcc
ftp://gcc.gnu.org/pub/gcc/snapshots/4.4-20081003/gcc-4.4-20081003.tar.bz2
sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
sed -i 's@\./fixinc\.sh@-c
[email=true@']true@'[/email]
gcc/Makefile.in
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.4-20081003/configure --prefix=/usr --libexecdir=/usr/lib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++ --disable-bootstrap --enable-c99 --enable-long-long --with-tune=pentium4
make
make install
ln -sv ../usr/bin/cpp /lib
ln -sv gcc /usr/bin/cc
測試一下
echo 'main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
./a.out && readelf -l a.out | grep ': /lib'
返回
[Requesting program interpreter: /lib/ld-linux.so.2]
grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
返回
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o succeeded
grep -B3 '^ /usr/include' dummy.log
返回
/usr/local/include
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/include
/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/include-fixed
/usr/include
grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
返回
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
grep "/lib/libc.so.6 " dummy.log
返回
attempt to open /lib/libc.so.6 succeeded
grep found dummy.log
返回
found ld-linux.so.2 at /lib/ld-linux.so.2
Sed
http://ftp.gnu.org/gnu/sed/sed-4.1.5.tar.gz
./configure --prefix=/usr --bindir=/bin
make
性能相關,我這裡靜態連接sed
rm sed/sed
make -C sed sed CC="gcc -static -s"
測試,sed很重要請不要跳過
make check
結果
===================
All 75 tests passed
===================
安裝
make install
E2fsprogs
http://prdownloads.sourceforge.net/e2fsprogs/e2fsprogs-1.41.1.tar.gz
http://www.linuxfromscratch.org/patches/downloads/e2fsprogs/e2fsprogs-1.41.1-fixes-1.patch
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/75126/showart_1273654.html |
|