本篇主要介紹程式軟體的安裝和編譯過程,這裡需要按照LFS文檔所描述的按照順序安裝,否則可能會出現依賴問題導緻編譯失敗的情況發生。
1. Linux-4.13.16 API Headers
執行如下指令,将頭檔案拷貝到/usr/include下:
make INSTALL_HDR_PATH=dest headers_install
find dest/include ( -name .install -o -name …install.cmd ) -delete
cp -rv dest/includecrt[1in].*succeeded’ dummy.log
輸出結果應該如下:
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
我的輸出結果如下:
/usr/lib/…/lib64/crt1.o succeeded
/usr/lib/…/lib64/crti.o succeeded
/usr/lib/…/lib64/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’
忽略帶有‘-linux-gnu’字樣的資訊後,輸出結果如下:
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
确定使用正确的libc:
grep "/lib.*/libc.so.6 " dummy.log
我的輸出結果如下:
attempt to open /lib64/libc.so.6 succeeded
確定gcc使用正确的動态連結器:
grep found dummy.log
我的輸出結果如下:
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2
清除測試檔案:
rm -v dummy.c a.out dummy.log
3.5 Zlib-1.2.8
編譯配置、編譯、檢查和安裝:
./configure --prefix=/usr
make
make check
make install
共享庫需要移動到/lib,需要重建/usr/lib中的.so檔案:
mv -v /usr/lib/libz.so.* /lib
ln -sfv …/…/lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so
3.6 File-5.25
編譯配置、編譯、檢查和安裝:
./configure --prefix=/usr
make
make check
make install
3.7 Binutils-2.26
驗證在chroot環境下PTY工作正常:
expect -c “spawn ls”
輸出結果如下則表示正常:
spawn ls
修複發現的一個問題:
patch -Np1 -i …/binutils-2.26-upstream_fix-2.patch
建立編譯目錄、編譯、檢查和安裝:
mkdir -v build
cd build
…/configure --prefix=/usr
–enable-shared
–disable-werror
make tooldir=/usr
make check
make tooldir=/usr install
3.8 GMP-6.1.0
編譯配置:
./configure --prefix=/usr
–enable-cxx
–disable-static
–docdir=/usr/share/doc/gmp-6.1.0
編譯并生成html文檔:
make
make html
檢視結果并檢查:
make check 2>&1 | tee gmp-check-log
awk ‘/# PASS:/{total+=$3} ; END{print total}’ gmp-check-log
安裝:
make install
make install-html
3.9 MPFR-3.1.3
修複漏洞:
patch -Np1 -i …/mpfr-3.1.3-upstream_fixes-2.patch
配置、編譯、檢查、安裝:
./configure --prefix=/usr
–disable-static
–enable-thread-safe
–docdir=/usr/share/doc/mpfr-3.1.3
make
make html
make check
make install
make install-html
3.10 MPC-1.0.3
配置、編譯、檢查、安裝
./configure --prefix=/usr
–disable-static
–docdir=/usr/share/doc/mpc-1.0.3
make
make html
make check
make install
make install-html
3.11 GCC-5.3.0
建立編目錄、編譯配置、編譯:
mkdir -v build
cd build
SED=sed
…/configure --prefix=/usr
–enable-languages=c,c++
–disable-multilib
–disable-bootstrap
–with-system-zlib
make
檢查:
gcc耗用大量的堆棧空間,是以檢查時設定堆棧大小:
ulimit -s 32768
make -k check
檢視測試結果概要:
…/contrib/test_summary
上述檢查結果可以與如下網站中的資訊做對比:
http://www.linuxfromscratch.org/lfs/build-logs/7.9-systemd/ 和 http://gcc.gnu.org/ml/gcc-testresults/.
安裝,make install
一些連結和驗證:
- lib目錄下建立gcc 的連結:
ln -sv …/usr/bin/cpp /lib
- 建立cc符号連結:
ln -sv gcc /usr/bin/cc
- 增加一個相容符号連結啟用編譯程式時進行的連結時間優化:
install -v -dm755 /usr/lib/bfd-plugins
ln -sfv …/…/libexec/gcc/$(gcc -dumpmachine)/5.3.0/liblto_plugin.so
/usr/lib/bfd-plugins/
- 工具鍊完成,做如下驗證測試:
echo ‘int main(){}’ > dummy.c
cc dummy.c -v -Wl,–verbose &> dummy.log
readelf -l a.out | grep ‘: /lib’
測試結果如下:
[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
- 确定設定正确的啟動檔案:
grep -o ‘/usr/lib.*/crt[1in].*succeeded’ dummy.log
輸出結果:
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/…/…/…/…/lib64/crt1.o succeeded
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/…/…/…/…/lib64/crti.o succeeded
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/…/…/…/…/lib64/crtn.o succeeded
- 驗證編譯器可以搜尋到正确的頭檔案:
grep -B4 ‘^ /usr/include’ dummy.log
輸出結果:
#include <…> search starts here:
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include
/usr/local/include
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include-fixed
/usr/include
- 驗證新的連結器使用正确的搜尋路徑:
grep ‘SEARCH.*/usr/lib’ dummy.log |sed ‘s|; |\n|g’
輸出結果:
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib64")
SEARCH_DIR("/usr/local/lib64")
SEARCH_DIR("/lib64")
SEARCH_DIR("/usr/lib64")
SEARCH_DIR("/usr/x86_64-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
- 确認使用了正确的libc
grep "/lib.*/libc.so.6 " dummy.log
輸出結果:
attempt to open /lib64/libc.so.6 succeeded
- 确認使用正确的動态連結器:
grep found dummy.log
輸出結果:
found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2
- 清理測試檔案:
rm -v dummy.c a.out dummy.log
- 移動放錯的檔案:
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/ *gdb.py /usr/share/gdb/auto-load/usr/lib
3.12 Bzip2-1.0.6
打包更新檔:
patch -Np1 -i …/bzip2-1.0.6-install_docs-1.patch
確定符号連結是相對的,并且man安裝在了正确的位置:
sed -i ‘s@(ln -s -f )$(PREFIX)/bin/@\1@’ Makefile
sed -i “s@(PREFIX)/man@(PREFIX)/share/[email protected]” Makefile
編譯準備、編譯、安裝、連結、清除:
make -f Makefile-libbz2_so
make clean
make
make PREFIX=/usr install
cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv …/…/lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat
3.13 Pkg-config-0.29
配置、編譯、檢查、安裝:
./configure --prefix=/usr
–with-internal-glib
–disable-host-tool
–docdir=/usr/share/doc/pkg-config-0.29
make
make check
make install
3.14 Ncurses-6.0
不要安裝配置不處理的靜态庫:
sed -i ‘/LIBTOOL_INSTALL/d’ c++/Makefile.in
配置、編譯、安裝:
./configure --prefix=/usr
–mandir=/usr/share/man
–with-shared
–without-debug
–without-normal
–enable-pc-files
–enable-widec
make
make install
移動共享庫到/lib,重建符号連結:
mv -v /usr/lib/libncursesw.so.6* /lib
ln -sfv …/…/lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so
很多應用程式希望編譯器找到非寬字元的Ncurses庫,通過符号連結和連接配接器欺騙這樣的應用連結到寬字元庫:
for lib in ncurses form panel menu ; do
rm -vf /usr/lib/lib l i b . s o e c h o " I N P U T ( − l {lib}.so echo "INPUT(-l lib.soecho"INPUT(−l{lib}w)" > /usr/lib/lib${lib}.so
ln -sfv l i b w . p c / u s r / l i b / p k g c o n f i g / {lib}w.pc /usr/lib/pkgconfig/ libw.pc/usr/lib/pkgconfig/{lib}.pc
done
確定編譯時會查找-lcurses舊應用程式仍可以編譯:
rm -vf /usr/lib/libcursesw.so
echo “INPUT(-lncursesw)” > /usr/lib/libcursesw.so
ln -sfv libncurses.so /usr/lib/libcurses.so
安裝幫助文檔:
mkdir -v /usr/share/doc/ncurses-6.0
cp -v -R doc/* /usr/share/doc/ncurses-6.0
3.15 Attr-2.4.47
修改存放文檔的目錄,使其放在版本特定的目錄:
sed -i -e ‘s|/@pkg_name@|&[email protected]_version@|’ include/builddefs.in
防止再次安裝幫助文檔:
sed -i -e “/SUBDIRS/s|man[25]||g” man/Makefile
配置、編譯、測試、安裝、移動共享庫到/lib并重建連結:
./configure --prefix=/usr --disable-static
make
make -j1 tests root-tests
make install install-dev install-lib
chmod -v 755 /usr/lib/libattr.so
mv -v /usr/lib/libattr.so.* /lib
ln -sfv …/…/lib/$(readlink /usr/lib/libattr.so) /usr/lib/libattr.so
3.16 Acl-2.2.52
修改存放文檔的目錄,使其放在特定的目錄:
sed -i -e ‘s|/@pkg_name@|&[email protected]_version@|’ include/builddefs.in
修複一些損壞的測試:
sed -i “s:| sed.*::g” test/{sbits-restore,cp,misc}.test
修複一組名稱超長時會使getfacl -e出現段錯誤的問題:
./configure --prefix=/usr
–disable-static
–libexecdir=/usr/lib
配置、編譯、安裝、移動共享庫到/lib并重建連結:
./configure --prefix=/usr
–disable-static
–libexecdir=/usr/lib
make
make install install-dev install-lib
chmod -v 755 /usr/lib/libacl.so
mv -v /usr/lib/libacl.so.* /lib
ln -sfv …/…/lib/$(readlink /usr/lib/libacl.so) /usr/lib/libacl.so
3.17 Libcap-2.25
阻止靜态庫安裝、安裝、編譯、移動共享庫并重建連結:
sed -i '/install.STALIBNAME/d’ libcap/Makefile
make
make RAISE_SETFCAP=no prefix=/usr install
chmod -v 755 /usr/lib/libcap.so
mv -v /usr/lib/libcap.so. /lib
ln -sfv …/…/lib/$(readlink /usr/lib/libcap.so) /usr/lib/libcap.so
3.18 Sed-4.2.2
配置、編譯、檢查、安裝
./configure --prefix=/usr --bindir=/bin --htmldir=/usr/share/doc/sed-4.2.2
make
make html
make check
make install
make -C doc install-html
3.19 Shadow-4.2.1
準備工作:
sed -i ‘s/groups$(EXEEXT) //’ src/Makefile.in
find man -name Makefile.in -exec sed -i ‘s/groups.1 / /’ {} \;
find man -name Makefile.in -exec sed -i ‘s/getspnam.3 / /’ {} \;
find man -name Makefile.in -exec sed -i ‘s/passwd.5 / /’ {} \;
sed -i -e ‘s@#ENCRYPT_METHOD [email protected]_METHOD SHA512@’ \
-e ‘s@/var/spool/mail@/var/mail@’ etc/login.defs
sed -i ‘s/1000/999/’ etc/useradd
配置、編譯、安裝、移動程式到正确的位置:
./configure --sysconfdir=/etc --with-group-name-max-length=32
make
make install
mv -v /usr/bin/passwd /bin
3.20 後續軟體包清單
經過以上的安裝,我們發現後續的程式安裝都大同小異,故以下不做過多贅述,我們可以通過lfs7.9的描述安裝後續的軟體包,後續的軟體包都有:
1. Psmisc-22.21
2. Iana-Etc-2.30
3. M4-1.4.17
4.Bison-3.0.4
5. Flex-2.6.0
6. Grep-2.23
7. Readline-6.3
8. Bash-4.3.30
9. Bc-1.06.95
10. Libtool-2.4.6
11. GDBM-1.11
12. Gperf-3.0.4
13. Expat-2.1.0
14. Inetutils-1.9.4
15. XML::Parser-2.44
16. Intltool-0.51.0
17. Autoconf-2.69
18. Automake-1.15
19. Xz-5.2.2
20. Kmod-22
21. Gettext-0.19.7
22. Systemd-229
23. Procps-ng-3.3.11
24. E2fsprogs-1.42.13
25. Coreutils-8.25
26. Diffutils-3.3
27. Gawk-4.1.3
28. Findutils-4.6.0
29. Groff-1.22.3
30. GRUB-2.02~beta2
31. Gzip-1.6
32. IPRoute2-4.4.0
33. Kbd-2.0.3
34. Libpipeline-1.4.1
35. Make-4.1
36. Patch-2.7.5
37. D-Bus-1.10.6
38. Util-linux-2.27.1
39. Man-DB-2.7.5
40. Tar-1.28
41. Texinfo-6.1
42. Vim-7.4
至此,安裝完成。後續進入chroot的方式:
chroot “KaTeX parse error: Expected 'EOF', got '\ ' at position 35: …i \̲ ̲ HOME=/root …TERM” PS1=’\u:\w$ ’
PATH=/bin:/usr/bin:/sbin:/usr/sbin
/bin/bash --login
如果需要清理删除調試的相關内容,請自行參考lfs的文檔。