《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.2 工具链技术备注...
? ? ? ? ?本節(jié)解釋總體構(gòu)建方法之中的某些基本原理和技術(shù)細(xì)節(jié)。并不需要立即理解本節(jié)中的所有問題。在進(jìn)行實(shí)際構(gòu)建的過程中,絕大部分的信息將會(huì)變得愈加清晰。在該過程中可隨時(shí)查閱本小節(jié)的內(nèi)容。
第五章的總體目標(biāo)是生成一個(gè)臨時(shí)的系統(tǒng),它包含一個(gè)已知的較好工具集,該工具集可與宿主系統(tǒng)分離。通過使用 chroot,其余各章中的命令將被包含在此環(huán)境中,以保證目標(biāo) LFS 系統(tǒng)能夠潔凈且無故障地生成。該構(gòu)建過程的設(shè)計(jì)就是為了使得新讀者有最少的風(fēng)險(xiǎn),同時(shí)還能有最好的指導(dǎo)價(jià)值。
注意
在繼續(xù)之前,請(qǐng)留意工作平臺(tái)的名稱,它通常稱作目標(biāo)系統(tǒng)三段式名稱。目標(biāo)系統(tǒng)三段式名稱可通過運(yùn)行腳本 config.guess 簡單獲得,許多軟件的源碼包都附帶有該腳本(譯者注:目標(biāo)系統(tǒng)三段式名稱描述了代碼運(yùn)行的平臺(tái),是GNU 構(gòu)建系統(tǒng)中的一個(gè)核心概念,形如 i686-pc-gnu-linux。它包含三個(gè)字段:CPU家族/型號(hào)的名稱(如 i686)、供應(yīng)商(pc)和操作系統(tǒng)名稱(如 gnu-linux)。更詳細(xì)的信息請(qǐng)參閱 http://wiki.osdev.org/Target_Triplet)。解壓 Binutils 源碼包,執(zhí)行其中的腳本:./config.guess 并查看其輸出。例如,對(duì)于一個(gè)現(xiàn)代的 32 位英特爾處理器,其輸出很可能為 i686-pc-linux-gnu。
還請(qǐng)留意平臺(tái)的動(dòng)態(tài)鏈接器的名稱,它通常被稱為動(dòng)態(tài)加載器(不要與 Binutils 中的標(biāo)準(zhǔn)鏈接器 ld 混淆)。該動(dòng)態(tài)鏈接器由 Glibc 提供,它尋找并加載程序所需的共享庫,為程序運(yùn)行作準(zhǔn)備,并運(yùn)行它。對(duì)于 32 位英特爾的機(jī)器,動(dòng)態(tài)鏈接器的名稱為 ld-linux.so.2。判斷動(dòng)態(tài)鏈接器的一個(gè)可靠方法是檢查宿主系統(tǒng)中的任意一個(gè)二進(jìn)制文件,執(zhí)行:readelf -l <二進(jìn)制文件名> | grep interpreter 且查看其輸出。可在 Glibc 源碼樹的根目錄下的 shlib-versions 文件中找到所有平臺(tái)的權(quán)威參考。
下面是第五章構(gòu)建方法的幾個(gè)關(guān)鍵技術(shù)點(diǎn):
-
通過改變 LFS_TGT 變量的目標(biāo)系統(tǒng)三段式中的 “供應(yīng)商” 字段,從而稍微調(diào)整工作平臺(tái)的名稱,以保證第一遍構(gòu)建 Binutils 和 GCC 時(shí)能夠生成兼容的交叉鏈接器和交叉編譯器。此處的交叉鏈接器和交叉編譯器生成的二進(jìn)制文件與當(dāng)前的硬件兼容,而不是用于其它的硬件架構(gòu)。
-
臨時(shí)庫經(jīng)交叉編譯獲得。由于交叉編譯原本就不應(yīng)該依賴于宿主系統(tǒng),因此,通過降低宿主系統(tǒng)的頭文件或庫進(jìn)入新工具的可能性,該方法可去除目標(biāo)系統(tǒng)的可能污染。交叉編譯的方式,還可以在 64 位硬件平臺(tái)上同時(shí)構(gòu)建出 32 位和 64 位庫。
-
謹(jǐn)慎操作 GCC 源碼,以告訴編譯器將使用哪個(gè)目標(biāo)系統(tǒng)動(dòng)態(tài)鏈接器。
Binutils 是首個(gè)安裝的包,這是因?yàn)閳?zhí)行 GCC 和 Glibc 的 configure 時(shí)都將進(jìn)行有關(guān)匯編器和鏈接器的多項(xiàng)特性測試,以判斷允許或禁用哪些軟件特性。其重要性可能更甚于最初的意識(shí)。對(duì) GCC 或 Glibc 的錯(cuò)誤配置可能導(dǎo)致工具鏈出現(xiàn)難以捉摸的問題,可能直到整個(gè)構(gòu)建過程接近尾聲時(shí)才會(huì)顯現(xiàn)出這些問題。通常情況下,一次測試套件失敗可在你進(jìn)行太多其它工作前暴露出該錯(cuò)誤。
Binutils 將其匯編器和鏈接器安裝在兩個(gè)位置,即 /tools/bin 和 /tools/$LFS_TGT/bin。一個(gè)位置的工具是硬鏈接到另一個(gè)位置的。鏈接器的一個(gè)重要方面是它的庫搜索順序。可給 ld 傳遞參數(shù) --verbose 獲得詳細(xì)信息。如,ld --verbose | grep SEARCH 可得到當(dāng)前的搜索路徑及其順序。通過編譯一個(gè)模擬程序并向鏈接器傳遞 --verbose 開關(guān),可顯示 ld 都鏈接了哪些文件。例如,gcc dummy.c -Wl,--verbose 2>&1 | grep succeeded 將顯示鏈接過程中成功打開的所有文件。
下一個(gè)安裝的包是 GCC。下面是運(yùn)行 GCC 的 configure 的輸出的一個(gè)例子:
checking what assembler to use... /tools/i686-lfs-linux-gnu/bin/as checking what linker to use... /tools/i686-lfs-linux-gnu/bin/ld基于前述原因,這很重要。它還說明了 GCC 的配置腳本并不會(huì)搜索 PATH 目錄來尋找使用什么工具。不過,在 gcc 自身的實(shí)際運(yùn)行中,并不需要使用同樣的搜索路徑。運(yùn)行:gcc -print-prog-name=ld 可獲知 gcc 使用是何種標(biāo)準(zhǔn)鏈接器(LCTT 譯注:gcc -print-prog-name 這個(gè)命令是為了顯示 gcc 使用的某些內(nèi)部工具的絕對(duì)路徑,但事實(shí)上,ld 并不是 GCC 的內(nèi)部工具,因此這條命令實(shí)際上沒什么用)。
在編譯模擬程序時(shí),向 gcc 傳遞命令行選項(xiàng) -v 可獲得詳細(xì)信息。例如,gcc -v dummy.c 將顯示預(yù)處理器、編譯和匯編階段的詳細(xì)信息,包括 gcc 的 include 搜索路徑及其順序。
下一個(gè)安裝的包是經(jīng)過凈化的 Linux API 頭文件。這些頭文件可使得標(biāo)準(zhǔn) C 庫(Glibc)與 Linux 內(nèi)核提供的特性進(jìn)行交行交互。
下一個(gè)安裝的包是 Glibc。構(gòu)建 Glibc 時(shí),最重要的考量是編譯器、二進(jìn)制工具和內(nèi)核頭文件。由于 Glibc 總是使用傳遞給它的配置腳本的 --host 參數(shù)有關(guān)的編譯器,如,在我們這個(gè)場景中是 i686-lfs-linux-gnu-gcc,因此編譯器通常不是一個(gè)問題。二進(jìn)制工具和內(nèi)核頭文件可能會(huì)更復(fù)雜一些。因此,請(qǐng)謹(jǐn)慎行事并利用可用的配置開關(guān)以強(qiáng)制使用正確的選擇。configure 運(yùn)行完畢,目錄 glibc-build 下的文件 config.make 包含有所有的重要細(xì)節(jié)。需要注意的是,CC="i686-lfs-gnu-gcc" 用來控制使用哪個(gè)二進(jìn)制工具,-nostdinc 和 -isystem 標(biāo)志用來控制編譯器的 include 搜索路徑。這些條目強(qiáng)調(diào)了 Glibc 包的一個(gè)重要方面,即其構(gòu)建機(jī)制是非常自給自足的,通常并不依賴默工具鏈的默認(rèn)設(shè)置。
在第二遍編譯 Binutils 過程中,我們能夠利用配置開關(guān) --with-lib-path 來控制 ld 的庫搜索路徑。
第二遍編譯 GCC 時(shí),也需要修改其源代碼以告訴 GCC 使用新的動(dòng)態(tài)鏈接器。如果不加修改,將會(huì)導(dǎo)致 GCC 自身的程序嵌入來自宿主系統(tǒng)目錄 /lib 的動(dòng)態(tài)鏈接器名稱,這將破壞遠(yuǎn)離宿主系統(tǒng)的目標(biāo)。正是基于前面的這個(gè)出發(fā)點(diǎn),核心工具鏈?zhǔn)亲园妥酝泄艿摹5谖逭缕渌能浖紝⒃?/tools 中的新 Glibc 的基礎(chǔ)上進(jìn)行構(gòu)建。
在進(jìn)入第六章中的 chroot 環(huán)境前,將安裝的首個(gè)主要的軟件包是 Glibc,這是因?yàn)樗焐哂星懊嫣峒暗淖越o自足特點(diǎn)。一旦將 Glibc 安裝到 /usr 中,我們將快速改變工具鏈的默認(rèn)設(shè)置,然后繼續(xù)構(gòu)建目標(biāo) LFS 系統(tǒng)的其余部分。
創(chuàng)建者:Gerard Beekmans
編輯者:Matthew Burgess 和 Armin K.
翻譯團(tuán)隊(duì):LCTT
譯者/校對(duì):Yuking-net,wxy
原文鏈接? ? ? ?
總結(jié)
以上是生活随笔為你收集整理的《Linux From Scratch》第二部分:准备构建 第五章:构建临时文件系统- 5.2 工具链技术备注...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “中国智造”为System x提供创新源
- 下一篇: zabbix安装与使用