天天看點

重走LFS之路:(八) 基礎系統編譯-1重走LFS之路:(八) 基礎系統編譯-1

重走LFS之路:(八) 基礎系統編譯-1重走LFS之路:(八) 基礎系統編譯-1

(題圖來自: techradar.com)

從現在開始,我們進入真正意義上的lfs系統的基礎系統編譯。

這個階段比較漫長,中間還有可能出現各種各樣的問題,我會盡量翔實地記錄遇到的各種狀況和解決方案,以供後來參考。

<a target="_blank"></a>

<code>cd /src/linux-3.19</code>

執行編譯清理

重新編譯

<code>make install_hdr_path=dest headers_install</code>

删除非必要檔案

<code>find dest/include \( -name .install -o -name ..install.cmd \) -delete</code>

手工安裝

<code>cp -rv dest/include/* /usr/include</code>

<code>cd /src</code>

解壓并進入源碼目錄

<code>tar xf man-pages-3.79.tar.xz</code>

<code></code>

<code>cd man-pages-3.79</code>

安裝

<code>make install</code>

<code>cd /src/glibc-2.21</code>

此時需要給glibc打個更新檔

<code>patch -np1 -i ../glibc-2.21-fhs-1.patch</code>

然後解決32位的相容問題

<code>sed -e ‘/ia32/s/^/1:/’ \</code>

<code>-e ‘/sse2/s/^1://’ \</code>

<code>-i sysdeps/i386/i686/multiarch/mempcpy_chk.s</code>

由于之前編譯過glibc,存在glibc-build目錄,是以需要重命名一下老的建構目錄并重建一個空的建構目錄進入

<code>mv ../glibc-build ../glibc-build.tool</code>

<code>mkdir -v ../glibc-build</code>

<code>cd ../glibc-build</code>

配置編譯選項,其中開啟了2.6核心支援

<code>../glibc-2.21/configure \</code>

<code>–prefix=/usr \</code>

<code>–disable-profile \</code>

<code>–enable-kernel=2.6.32 \</code>

<code>–enable-obsolete-rpc</code>

配置完成後進行編譯和編譯測試

<code>make</code>

<code>make check</code>

在這裡,lfs 7.7官方文檔給出了一個警告

在這一節中,glibc的測試套件非常關鍵,任何情況下都請不要跳過。
重走LFS之路:(八) 基礎系統編譯-1重走LFS之路:(八) 基礎系統編譯-1

1-glibccheck

在這份summary中,有2個錯誤,但是沒關系,不用害怕,可以繼續往下。

建立一個配置檔案

<code>touch /etc/ld.so.conf</code>

正常安裝

在這裡需要說的是,雖然官方文檔說測試套件很重要,但是就實際經驗來看,隻要能夠正常make過去,通常不會出現什麼大問題,是以隻要不是很嚴重的錯誤,check不過也可以先讓它過去,真正出問題時候再說。

為nscd建立配置檔案和運作時目錄

<code>cp -v ../glibc-2.21/nscd/nscd.conf /etc/nscd.conf</code>

<code>mkdir -pv /var/cache/nscd</code>

然後進行地方設定和安裝

<code>mkdir -pv /usr/lib/locale</code>

<code>localedef -i cs_cz -f utf-8 cs_cz.utf-8</code>

<code>localedef -i de_de -f iso-8859-1 de_de</code>

<code>localedef -i de_de@euro -f iso-8859-15 de_de@euro</code>

<code>localedef -i de_de -f utf-8 de_de.utf-8</code>

<code>localedef -i en_gb -f utf-8 en_gb.utf-8</code>

<code>localedef -i en_hk -f iso-8859-1 en_hk</code>

<code>localedef -i en_ph -f iso-8859-1 en_ph</code>

<code>localedef -i en_us -f iso-8859-1 en_us</code>

<code>localedef -i en_us -f utf-8 en_us.utf-8</code>

<code>localedef -i es_mx -f iso-8859-1 es_mx</code>

<code>localedef -i fa_ir -f utf-8 fa_ir</code>

<code>localedef -i fr_fr -f iso-8859-1 fr_fr</code>

<code>localedef -i fr_fr@euro -f iso-8859-15 fr_fr@euro</code>

<code>localedef -i fr_fr -f utf-8 fr_fr.utf-8</code>

<code>localedef -i it_it -f iso-8859-1 it_it</code>

<code>localedef -i it_it -f utf-8 it_it.utf-8</code>

<code>localedef -i ja_jp -f euc-jp ja_jp</code>

<code>localedef -i ru_ru -f koi8-r ru_ru.koi8-r</code>

<code>localedef -i ru_ru -f utf-8 ru_ru.utf-8</code>

<code>localedef -i tr_tr -f utf-8 tr_tr.utf-8</code>

<code>localedef -i zh_cn -f gb18030 zh_cn.gb18030</code>

<code>make localedata/install-locales</code>

繼續配置glibc,寫入nsswitch.conf檔案

<code>cat &gt; /etc/nsswitch.conf &lt;&lt; “eof”</code>

<code># begin /etc/nsswitch.conf</code>

<code>passwd: files</code>

<code>group: files</code>

<code>shadow: files</code>

<code>hosts: files dns</code>

<code>networks: files</code>

<code>protocols: files</code>

<code>services: files</code>

<code>ethers: files</code>

<code>rpc: files</code>

<code># end /etc/nsswitch.conf</code>

<code>eof</code>

安裝時區資料

<code>tar xf ../tzdata2015a.tar.gz</code>

<code>zoneinfo=/usr/share/zoneinfo</code>

<code>mkdir -pv $zoneinfo/{posix,right}</code>

<code>for tz in etcetera southamerica northamerica europe africa antarctica \</code>

<code>asia australasia backward pacificnew systemv; do</code>

<code>zic -l /dev/null -d $zoneinfo -y “sh yearistype.sh” ${tz}</code>

<code>zic -l /dev/null -d $zoneinfo/posix -y “sh yearistype.sh” ${tz}</code>

<code>zic -l leapseconds -d $zoneinfo/right -y “sh yearistype.sh” ${tz}</code>

<code>done</code>

<code>cp -v zone.tab zone1970.tab iso3166.tab $zoneinfo</code>

<code>zic -d $zoneinfo -p america/new_york</code>

<code>unset zoneinfo</code>

其中america/new_york可以改成其他地區,官方文檔上是按紐約時間走的。不過沒關系,時區和語言設定可以在系統運作之後再調整。

現在也可以調整,使用tzselect

<code>tzselect</code>

然後按照提示選擇:大洲-&gt;國家-&gt;時區-&gt;确認

或者直接将地區檔案複制替換/etc/localtime,比如将時間調整為上海時間

<code>cp -v /usr/share/zoneinfo/asia/shanghai /etc/localtime</code>

配置動态加載

<code>cat &gt; /etc/ld.so.conf &lt;&lt; “eof”</code>

<code># begin /etc/ld.so.conf</code>

<code>/usr/local/lib</code>

<code>/opt/lib</code>

<code>cat &gt;&gt; /etc/ld.so.conf &lt;&lt; “eof”</code>

<code># add an include directory</code>

<code>include /etc/ld.so.conf.d/*.conf</code>

<code>mkdir -pv /etc/ld.so.conf.d</code>

接下來的編譯與上面不同,需要對工具鍊來進行一些調整

<code>mv -v /tools/bin/{ld,ld-old}</code>

<code>mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}</code>

<code>mv -v /tools/bin/{ld-new,ld}</code>

<code>ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld</code>

<code>gcc -dumpspecs | sed -e ‘s@/tools@@g’ \</code>

<code>-e ‘/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}’ \</code>

<code>-e ‘/\*cpp:/{n;s@$@ -isystem /usr/include@}’ &gt; \</code>

<code>`dirname $(gcc –print-libgcc-file-name)`/specs</code>

測試調整後的工具鍊

<code>echo ‘main(){}’ &gt; dummy.c</code>

<code>cc dummy.c -v -wl,–verbose &amp;&gt; dummy.log</code>

<code>readelf -l a.out | grep ‘: /lib’</code>

如果正确,應有如下回顯

<code>[requesting program interpreter: /lib64/ld-linux-x86-64.so.2]</code>

檢視成功日志

<code>grep -o ‘/usr/lib.*/crt[1in].*succeeded’ dummy.log</code>

應有如下回顯

<code>/usr/lib/../lib64/crt1.o succeeded</code>

<code>/usr/lib/../lib64/crti.o succeeded</code>

<code>/usr/lib/../lib64/crtn.o succeeded</code>

檢視頭檔案包含日志

<code>grep -b1 ‘^ /usr/include’ dummy.log</code>

<code>#include &lt;…&gt; search starts here:</code>

<code>/usr/include</code>

檢視lib日志

<code>grep ‘search.*/usr/lib’ dummy.log |sed ‘s|; |\n|g’</code>

應有如下回顯,比官方文檔多第一條和最後一條

<code>search_dir(“=/tools/x86_64-unknown-linux-gnu/lib64″)</code>

<code>search_dir(“/usr/lib”)</code>

<code>search_dir(“/lib”)</code>

<code>search_dir(“=/tools/x86_64-unknown-linux-gnu/lib”);</code>

檢視libc日志

<code>grep “/lib.*/libc.so.6 ” dummy.log</code>

<code>attempt to open /lib64/libc.so.6 succeeded</code>

最後檢視動态連接配接日志

<code>grep found dummy.log</code>

<code>found ld-linux-x86-64.so.2 at /lib64/ld-linux-x86-64.so.2</code>

清理測試檔案

<code>rm -v dummy.c a.out dummy.log</code>

<code>tar xf zlib-1.2.8.tar.xz</code>

<code>cd zlib-1.2.8</code>

<code>./configure –prefix=/usr</code>

此時需要移動一些子產品檔案,建立一些符号連結

<code>mv -v /usr/lib/libz.so.* /lib</code>

<code>ln -sfv ../../lib/$(readlink /usr/lib/libz.so) /usr/lib/libz.so</code>

<code>cd /src/file-5.22</code>

由于以前編譯過,是以需要先清理一下

<code>make clean</code>

然後可以進行正常配置和安裝

由于chroot進來,需要先進行一個環境測試

<code>expect -c “spawn ls”</code>

回顯應為

<code>spawn ls</code>

由于之前編譯過binutils,是以需要重命名建構目錄,再建立一個空的建構目錄并進入

<code>mv ../binutils-build ../binutils-build.tool</code>

<code>mkdir -v ../binutils-build</code>

<code>cd ../binutils-build</code>

配置編譯選項

<code>../binutils-2.25/configure –prefix=/usr \</code>

<code>–enable-shared \</code>

<code>–disable-werror</code>

編譯時需要加一個tooldir的參數,之後編譯測試

<code>make tooldir=/usr</code>

<code>make -k check</code>

最後安裝

<code>make tooldir=/usr install</code>

原文釋出時間:2015-04-13

本文來自雲栖合作夥伴“linux中國”

繼續閱讀