天天看點

LFS(Linux From Scratch)建構過程全記錄(五):正式建構LFS系統 -編譯并安裝程式

  本篇主要介紹程式軟體的安裝和編譯過程,這裡需要按照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

  一些連結和驗證:

  1. lib目錄下建立gcc 的連結:
ln -sv …/usr/bin/cpp /lib
  1. 建立cc符号連結:
ln -sv gcc /usr/bin/cc
  1. 增加一個相容符号連結啟用編譯程式時進行的連結時間優化:

install -v -dm755 /usr/lib/bfd-plugins

ln -sfv …/…/libexec/gcc/$(gcc -dumpmachine)/5.3.0/liblto_plugin.so

/usr/lib/bfd-plugins/

  1. 工具鍊完成,做如下驗證測試:

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]
  1. 确定設定正确的啟動檔案:
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

  1. 驗證編譯器可以搜尋到正确的頭檔案:
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

  1. 驗證新的連結器使用正确的搜尋路徑:
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");

  1. 确認使用了正确的libc
grep "/lib.*/libc.so.6 " dummy.log

  輸出結果:

attempt to open /lib64/libc.so.6 succeeded
  1. 确認使用正确的動态連結器:
grep found dummy.log

  輸出結果:

found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2
  1. 清理測試檔案:
rm -v dummy.c a.out dummy.log
  1. 移動放錯的檔案:

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 &quot; I N P U T ( − l {lib}.so echo &quot;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的文檔。

繼續閱讀