天天看點

《Linux From Scratch》第三部分:建構LFS系統 第六章:安裝基本的系統軟體- 6.9. Glibc-2.21

           Glibc 軟體包包含了主要的 C 函數庫。這個庫提供了配置設定記憶體、搜尋目錄、打開關閉檔案、讀寫檔案、操作字元串、模式比對、基礎算法等基本程式。

大概編譯時間:

16.3 SBU

所需磁盤空間:

1.1 GB

《Linux From Scratch》第三部分:建構LFS系統 第六章:安裝基本的系統軟體- 6.9. Glibc-2.21

<code>iconv()</code> 的實作,應用于那些沒有這個函數的系統,或者函數實作中不支援

Unicode 轉換的系統。”

Glibc 提供了函數 <code>iconv()</code> 的實作而且支援 Unicode 轉換,是以對于

LFS 系統來說并不需要 libiconv 庫。

有些 Glibc 程式會用到和 FHS 不相容的 <code>/var/db</code> 目錄來存儲它們的運作時資料。打上如下的更新檔讓這些程式在 FHS 相容的位置存儲它們的運作時資料。

Glibc 的編譯系統是自包含的,可以完美安裝,盡管編譯器的配置檔案和連結器仍然指向 <code>/tools</code>。這在 Glibc 安裝前沒法調整,因為如果調整的話 Glibc 的 autoconf 測試将會提示錯誤,不符合我們實作一個幹淨建構的目标。

修正軟體包裡的一個會影響到 32 位架構系統的正規表達式:

Glibc 文檔裡建議在 Glibc 源代碼目錄之外的特定編譯目錄下編譯:

配置 Glibc 準備編譯:

新出現的 configure 選項參數的含義:

<dl></dl>

<dt></dt>

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

<dd></dd>

安裝 NIS 和 RPC 相關的頭檔案,預設是不安裝的;重新編譯 Glibc 時以及一些 BLFS 軟體包需要這些頭檔案。

編譯軟體包:

《Linux From Scratch》第三部分:建構LFS系統 第六章:安裝基本的系統軟體- 6.9. Glibc-2.21

在本小節裡,運作 Glibc 的測試套件是很關鍵的。在任何情況下都不要跳過這個測試。

通常會有一些測試不能通過,但是一般你可以忽略任何下面列出來的失敗項。現在開始測試編譯結果:

你可能會看到一些失敗的測試項。Glibc 的測試套件對宿主系統有一定的依賴。下面是目前版本 LFS 裡最常見的問題:

測試項 tst/tst-cputimer1 和 rt/tst-cpuclock2 已知是通不過的。具體原因還不清楚,不過一些細微的時間問題可能導緻這些測試失敗。

如果你系統的 CPU 不是相對較新的 Genuine Intel 或 Authentic AMD 處理器,數學運算測試有時候會失敗。

因為測試的時候還沒有網絡,測試項 posix/tst-getaddrinfo4 和 posix/tst-getaddrinfo5 将總是失敗。

其它已知的在某些架構平台上會失敗的測試項是 malloc/tst-malloc-usable 和 nptl/tst-cleanupx4。

在安裝 Glibc 時會抱怨找不到 <code>/etc/ld.so.conf</code> 檔案,這隻是無關緊要的輸出資訊。下面的方式可以避免這個警告:

安裝軟體包:

為 nscd 安裝配置檔案并建立運作時目錄:

為 nscd 安裝系統支援檔案:

上面的指令并沒有安裝可以讓你的電腦用不同語言響應的語言環境。語言環境并不是必須的,隻是如果有些語言環境缺失,後續的測試套件可能會跳過一些重要測試用例。

單獨的語言環境可以用 localedef

程式安裝。例如,下面第一個 localedef

指令将 <code>/usr/share/i18n/locales/cs_CZ</code> 字元無關的語言環境定義和

<code>/usr/share/i18n/charmaps/UTF-8.gz</code> 字元表定義組合在一起,并将結果附加到

<code>/usr/lib/locale/locale-archive</code> 檔案末尾。下面的指令将安裝能完美覆寫測試所需語言環境的最小集合:

另外,安裝适合你自己國家、語言和字元集的語言環境。

或者,也可以一次性安裝在 <code>glibc-2.21/localedata/SUPPORTED</code> 檔案裡列出的所有語言環境(包括以上列出的所有語言環境以及其它更多),執行下面這個非常耗時的指令:

你需要的語言環境幾乎不大可能沒列在 <code>glibc-2.21/localedata/SUPPORTED</code> 檔案中,但如果真的沒有可以使用 localedef 指令建立和安裝。

盡管 Glibc 在檔案 <code>/etc/nsswitch.conf</code> 丢失或損壞的情況下會建立一個預設的,但是我們需要手動該建立檔案,因為 Glibc 的預設檔案在網絡環境下工作時有問題。另外,也需要設定一下時區。

運作下面的指令建立一個新檔案 <code>/etc/nsswitch.conf</code>:

安裝時區資料:

zic 指令的含義:

<code>zic -L /dev/null ...</code>

這會建立沒有時間補償的 posix 時區資料。一般将它們同時放在 <code>zoneinfo</code> 和 <code>zoneinfo/posix</code> 目錄下。另外需要将 POSIX 時區資料放到 <code>zoneinfo</code> 目錄下,否則很多測試套件會報錯。在嵌入式平台,如果存儲空間緊張而且你也不準備更新時區,也可以不用 <code>posix</code> 目錄進而節省 1.9MB,但是一些應用程式或測試套件也許會出錯。

<code>zic -L leapseconds ...</code>

這會建立包含時間補償的 right 時區資料。在嵌入式平台,空間比較緊張而且你也不打算更新時區或者不需要準确時間,你可以忽略 <code>right</code> 目錄進而節省 1.9MB。

<code>zic ... -p ...</code>

這會建立 <code>posixrules</code> 檔案。我們使用紐約是因為 POSIX 要求夏令時規則與 US 标準一緻。

一種确定本地時區的方式是運作下面的腳本:

在詢問了幾個關于位置的問題後,腳本會輸出所在時區的名字(比如 America/Edmonton)。在 <code>/usr/share/zoneinfo</code> 檔案中也有其它一些可用時區,比如 Canada/Eastern 或 EST5EDT,這些時區并沒有被腳本列出來但也是可以使用的。

然後運作下面的指令建立 <code>/etc/localtime</code> 檔案:

将指令中的 <code>&lt;xxx&gt;</code> 替換成你所在實際時區的名字(比如 Canada/Eastern)。

預設情況下,動态庫加載器(<code>/lib/ld-linux.so.2</code>)會搜尋目錄 <code>/lib</code> 和 <code>/usr/lib</code> 查找程式運作時所需的動态庫檔案。不過,如果庫檔案不在 <code>/lib</code> 和 <code>/usr/lib</code> 目錄下,需要把它所在目錄加到 <code>/etc/ld.so.conf</code> 檔案裡,保證動态庫加載器能找到這些庫。通常有兩個目錄包含額外的動态庫,<code>/usr/local/lib</code> 和 <code>/opt/lib</code>,把這兩個目錄加到動态庫加載器的搜尋路徑中。

運作下面的指令建立一個新檔案<code>/etc/ld.so.conf</code>:

如果需要的話,動态庫加載器也可以查找目錄并包含裡面配置檔案的内容。通常在這個包含目錄下的檔案隻有一行字指向庫目錄。運作下面的指令增加這個功能:

安裝的程式:

catchsegv, gencat, getconf, getent,

iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef,

makedb, mtrace, nscd, pcprofiledump, pldd, rpcgen, sln,

sotruss, sprof, tzselect, xtrace, zdump, 和 zic

安裝的庫:

ld-2.21.so, libBrokenLocale.{a,so},

libSegFault.so, libanl.{a,so}, libc.{a,so}, libc_nonshared.a,

libcidn.so, libcrypt.{a,so}, libdl.{a,so}, libg.a, libieee.a,

libm.{a,so}, libmcheck.a, libmemusage.so, libnsl.{a,so},

libnss_compat.so, libnss_dns.so, libnss_files.so,

libnss_hesiod.so, libnss_nis.so, libnss_nisplus.so,

libpcprofile.so, libpthread.{a,so}, libpthread_nonshared.a,

libresolv.{a,so}, librpcsvc.a, librt.{a,so}, libthread_db.so,

和 libutil.{a,so}

安裝的目錄:

/usr/include/arpa, /usr/include/bits,

/usr/include/gnu, /usr/include/net, /usr/include/netash,

/usr/include/netatalk, /usr/include/netax25,

/usr/include/neteconet, /usr/include/netinet,

/usr/include/netipx, /usr/include/netiucv,

/usr/include/netpacket, /usr/include/netrom,

/usr/include/netrose, /usr/include/nfs, /usr/include/protocols,

/usr/include/rpc, /usr/include/rpcsvc, /usr/include/sys,

/usr/lib/audit, /usr/lib/gconv, /usr/lib/locale,

/usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo,

/var/cache/nscd, 和 /var/lib/nss_db

可以在程式因為段錯誤終止的時候建立棧調用曆史

生成消息條目

顯示檔案系統相關的系統配置變量的值

擷取系統資料庫的内容

字元集轉換

建立 iconv 快速加載子產品配置檔案

配置動态連結器的運作時環境

報告某個程式或動态庫所依賴的動态庫。

協助 ldd 處理某些目标檔案。

輸出目前語言環境的大量資訊

編譯語言環境規格

根據輸入的文本建立簡單資料庫

讀取并解析記憶體跟蹤檔案,然後用友善人閱讀的格式顯示一個摘要

一個背景服務程式,提供最常用名字服務請求的緩存

輸出個人電腦分析時生成的資訊

列出運作中程序正在使用的動态共享目标

生成實作遠端程序調用(RPC)協定的 C 語言代碼

一個靜态連結的 ln 程式

跟蹤指定指令裡的動态庫函數調用

讀取并顯示共享目标分析資料

詢問使用者該系統的地理位置并給出相應的時區描述

跟蹤程式執行過程并列印目前執行的函數

時區資料輸出工具

時區資料編譯工具

用于動态庫執行的輔助程式

Glibc 内部的一個粗暴破解用來修複損壞程式(比如,一些 Motif 應用)。檢視檔案 <code>glibc-2.21/locale/broken_cur_max.c</code> 裡的注釋來了解更多資訊

段錯誤信号處理函數,catchsegv會用到

一個異步名字查找庫

主要的 C 庫

Glibc 内部用于在函數 <code>getaddrinfo()</code> 中處理國際化域名

密碼學函數庫

動态連結接口函數庫

不包含函數的一個空庫。以前是 g++ 的運作時庫

連結該子產品會強制使用電氣與電子工程師協會(IEEE) 定義的數學函數錯誤處理規則。預設的是 POSIX.1 錯誤處理。

數學運算函數庫

連結這個庫後會打開記憶體配置設定檢查

memusage 指令用它來協助收集應用程式裡記憶體使用資訊

網絡服務函數庫

名稱服務切換函數庫,包含了解析主機名、使用者名、組名、别稱、服務、協定等等的函數。

包含一些分析函數,用于跟蹤特定源代碼裡的 CPU 時間占用情況

POSIX 線程函數庫

包含了建立、發送和解析網際網路域名伺服器封包的函數

包含了提供雜項 RPC 服務的函數

包含了實作 POSIX.1b 實時擴充裡規定的大部分接口的函數

包含了友善建構多線程程式調試工具的函數

包含各種 Unix 應用程式中用到的“标準” 函數的代碼

建立者:Gerard Beekmans

編輯者:Matthew Burgess 和 Armin K.

翻譯團隊:LCTT

譯者/校對:zpl1025,wxy

<a href="https://linux.cn/lfs/LFS-BOOK-7.7-systemd/chapter06/glibc.html" target="_blank">原文連結</a>

繼續閱讀