Glibc 軟體包包含了主要的 C 函數庫。這個庫提供了配置設定記憶體、搜尋目錄、打開關閉檔案、讀寫檔案、操作字元串、模式比對、基礎算法等基本程式。
大概編譯時間:
16.3 SBU
所需磁盤空間:
1.1 GB

<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 軟體包需要這些頭檔案。
編譯軟體包:
在本小節裡,運作 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><xxx></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>