重走LFS之路:(八) 基礎系統編譯-1
(題圖來自: techradar.com)
從現在開始,我們進入真正意義上的LFS系統的基礎系統編譯。
這個階段比較漫長,中間還有可能出現各種各樣的問題,我會盡量翔實地記錄遇到的各種狀況和解決方案,以供後來參考。
Linux-3.19 API Headers
cd /src/linux-3.19
執行編譯清理
cd /src/linux-3.19
重新編譯
make INSTALL_HDR_PATH=dest headers_install
刪除非必要檔案
find dest/include \( -name .install -o -name ..install.cmd \) -delete
手工安裝
cp -rv dest/include/* /usr/include
Man-pages-3.79
cd /src
解壓並進入原始碼目錄
tar xf man-pages-3.79.tar.xz
cd man-pages-3.79
安裝
make install
Glibc-2.21
cd /src/glibc-2.21
此時需要給glibc打個補丁
patch -Np1 -i ../glibc-2.21-fhs-1.patch
然後解決32位的相容問題
sed -e ‘/ia32/s/^/1:/’ \
-e ‘/SSE2/s/^1://’ \
-i sysdeps/i386/i686/multiarch/mempcpy_chk.S
由於之前編譯過glibc,存在glibc-build目錄,所以需要重新命名一下老的構建目錄並重建一個空的構建目錄進入
mv ../glibc-build ../glibc-build.tool
mkdir -v ../glibc-build
cd ../glibc-build
配置編譯選項,其中開啟了2.6核心支援
../glibc-2.21/configure \
–prefix=/usr \
–disable-profile \
–enable-kernel=2.6.32 \
–enable-obsolete-rpc
配置完成後進行編譯和編譯測試
make
make check
在這裡,LFS 7.7官方文件給出了一個警告
在這一節中,glibc的測試套件非常關鍵,任何情況下都請不要跳過。
在這份summary中,有2個錯誤,但是沒關係,不用害怕,可以繼續往下。
建立一個配置檔案
touch /etc/ld.so.conf
正常安裝
make install
在這裡需要說的是,雖然官方文件說測試套件很重要,但是就實際經驗來看,只要能夠正常make過去,通常不會出現什麼大問題,所以只要不是很嚴重的錯誤,check不過也可以先讓它過去,真正出問題時候再說。
為nscd建立配置檔案和執行時目錄
cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
然後進行地方設定和安裝
mkdir -pv /usr/lib/locale
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
make localedata/install-locales
繼續配置glibc,寫入nsswitch.conf檔案
cat > /etc/nsswitch.conf << “EOF”
# Begin /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
安裝時區資料
tar xf ../tzdata2015a.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward pacificnew systemv; do
zic -L /dev/null -d $ZONEINFO -y “sh yearistype.sh” ${tz}
zic -L /dev/null -d $ZONEINFO/posix -y “sh yearistype.sh” ${tz}
zic -L leapseconds -d $ZONEINFO/right -y “sh yearistype.sh” ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
其中America/New_York可以改成其他地區,官方文件上是按紐約時間走的。不過沒關係,時區和語言設定可以在系統執行之後再調整。
現在也可以調整,使用tzselect
tzselect
然後按照提示選擇:大洲->國家->時區->確認
或者直接將地區檔案複製替換/etc/localtime,比如將時間調整為上海時間
cp -v /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
配置動態載入
cat > /etc/ld.so.conf << “EOF”
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
cat >> /etc/ld.so.conf << “EOF”
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d
調整工具鏈
接下來的編譯與上面不同,需要對工具鏈來進行一些調整
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@@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: /lib64/ld-linux-x86-64.so.2]
檢視成功日誌
grep -o ‘/usr/lib.*/crt[1in].*succeeded’ dummy.log
應有如下回顯
/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
檢視lib日誌
grep ‘SEARCH.*/usr/lib’ dummy.log |sed ‘s|; |\n|g’
應有如下回顯,比官方文件多第一條和最後一條
SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/lib64″)
SEARCH_DIR(“/usr/lib”)
SEARCH_DIR(“/lib”)
SEARCH_DIR(“=/tools/x86_64-unknown-linux-gnu/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
Zlib-1.2.8
cd /src
tar xf zlib-1.2.8.tar.xz
cd zlib-1.2.8
./configure –prefix=/usr
make
make check
make install
此時需要移動一些模組檔案,建立一些符號連結
mv -v /usr/lib/libz.so.* /lib
ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so
File-5.22
cd /src/file-5.22
由於以前編譯過,所以需要先清理一下
make clean
然後可以進行正常配置和安裝
./configure –prefix=/usr
make
make check
make install
Binutils-2.25
由於chroot進來,需要先進行一個環境測試
expect -c “spawn ls”
回顯應為
spawn ls
由於之前編譯過binutils,所以需要重新命名構建目錄,再新建一個空的構建目錄並進入
mv ../binutils-build ../binutils-build.tool
mkdir -v ../binutils-build
cd ../binutils-build
配置編譯選項
../binutils-2.25/configure –prefix=/usr \
–enable-shared \
–disable-werror
編譯時需要加一個tooldir的引數,之後編譯測試
make tooldir=/usr
make -k check
最後安裝
make tooldir=/usr install
相關文章
- 重走LFS之路:(九) 基礎系統編譯-2編譯
- 重走JAVA之路(一):覆盤ButterKnife-編譯時註解Java編譯
- 重走JS之路JS
- JAVA基礎之八-方法變數作用域和編譯器Java變數編譯
- C編譯: makefile基礎編譯
- 編譯系統概要編譯
- css預編譯--sass基礎篇CSS編譯
- Linux系統下自行編譯安裝MySQL及基礎配置全過程解析Linux編譯MySql
- 小菜鳥的React之路--Redux基礎1ReactRedux
- Github配合Eclipse和JetBrains系編譯器的使用(基礎篇)GithubEclipseAI編譯
- 容器編排系統之Kubernetes基礎入門
- Java零基礎學習之路(八)Java物件導向Java物件
- OpenJFX編譯填坑之路編譯
- 重走JAVA程式設計之路(三)反射Java程式設計反射
- 逆向基礎(八)
- 【python系統學習16】編碼基礎知識Python
- 容器編排系統之Kubectl工具的基礎使用
- 重走JAVA程式設計之路(一)列舉Java程式設計
- 重走JAVA程式設計之路(二)註解Java程式設計
- linux系統基礎Linux
- hadoop64位系統編譯Hadoop編譯
- 作業系統學習筆記-1:基礎概念作業系統筆記
- 【git】Ubuntu作業系統上安裝Git LFSGitUbuntu作業系統
- C#反編譯工具:.NET Reflector基礎使用C#編譯
- 重走機器學習之路——形而上者謂之道機器學習
- 容器編排系統之Pod資源配置清單基礎
- 『學了就忘』Linux基礎 — 1、UNIX系統介紹Linux
- Linux系統下編譯Openssl 步驟:Linux編譯
- ubuntu系統編譯安裝OpenCV 4.4Ubuntu編譯OpenCV
- Java基礎(八)——IO流1_位元組流、字元流Java字元
- 分散式系統基礎分散式
- 檔案系統基礎
- 八大基礎排序排序
- 容器編排系統K8s之Volume的基礎使用K8S
- 『現學現忘』Git基礎 — 1、版本控制系統介紹Git
- 一文了解如何原始碼編譯Rainbond基礎元件原始碼編譯AI元件
- 編譯安裝最新的Linux系統核心編譯Linux
- Ubuntu 18.04系統編譯安裝Memcached教程。Ubuntu編譯