功能實現
主要的如下:
(1)string,字元串處理
(2)signal,信號處理
(3)dlfcn,管理共享庫的動態載入
(4)direct,檔案目錄操作
(5)elf,共享庫的動態載入器,也即interpreter
(6)iconv,不同字元集的編碼轉換
(7)inet,socket接口的實現
(8)intl,國際化,也即gettext的實現
(9)io
(10)linuxthreads
(11)locale,本地化
(12)login,虛擬終端設備的管理,及系統的安全訪問
(13)malloc,動態記憶體的分配與管理
(14)nis
(15)stdlib,其它基本功能
內容
由於 glibc 囊括了幾乎所有的 UNIX 通行的標準,可以想見其內容包羅萬象。而就像其他的 UNIX 系統一樣,其內含的檔案群分散於系統的樹狀目錄結構中,像一個支架一般撐起整個作業系統。以 glibc-2.2 為例,這些檔案群主要包括:
1.分享函式庫群:
這是 glibc 的主體,分布 /lib 與 /usr/lib 中,包括 libc 標準 C 函式庫、libm 數學函式庫、libcrypt 加密與編碼函式庫、libdb 資料庫函式庫、libpthread 行程多執行緒函式庫、libnss 網路服務函式庫 .... 等等。這些都是可分享函式庫,檔名都以 .so 做結尾。其中,/lib/ld*.so 是程式與函式庫連結的工具。有的用於程式編譯時將程式與函式庫內的函式物件連結,在只支持靜態連結的系統中,此連結方式就是直接將所需的物件自函式庫中抽出來與程式的可執行檔相連,而在支持可分享函式庫的系統中,在程式編譯時期的連結只是在執行檔中紀錄了那些函式物件是存在那個函式庫檔案中,等該程式開始執行時,則由另一個負責動態連結的 ld*.so 將所需的函式庫連結好並執行。
一般而言,負責程式編譯時期的連結器檔名為 ld. so,而負責程式執行時的動態連結器檔名為 ld- .so 或 ld-linux. so (在 GNU/Linux 系統中)。
函式庫標頭檔與程式開發元件:
這些標頭檔檔名都以 .h 為結尾,全部在 /usr/include/ 底下,其內容為函式庫中各函式的宣告、巨集定義、資料物件的型別 .... 等等,這些都是程式開發者不可或缺的部分。
除此之外,在 /usr/lib/ 中還有若干 .o 與 .a 的檔案,這些是程式編譯過程中要連結為可執行檔時所需的元件,有些則為上述可分享函式庫的靜態連線版本,而後者可以在某些特殊場合下需要靜態連結程式時使用。
函式庫說明檔案:
在一般的 UNIX 系統下,這些說明檔案是放在 /usr/man 或 /usr/share/man 底下,統稱為 man pages,其底下還分若干章節,其中第二章 (man2) 講的是系統呼叫,而第三章 (man3) 講的就是 libc 標準函式庫,這些都是系統開發者重要的參考資料。
而在 GNU 的系統中,除了 man pages 之外,還有一套稱為 info 的檔案資料系統,而且裡頭的說明往往比 man pages 還要詳盡,這在 glibc 中也不例外。glibc 的 info 檔案位於 /usr/share/info/libc. info* ,本文中有許多素材就是取自這些檔案的內容。
字集轉換模組與區域化資料庫:
這些是與程式國際化與本土化相關的部分,主要可分成四大塊: /usr/lib/gconv/ 內含大量的字集轉換模組,大部分是各種字集及編碼方式與系統的基底字集之間的 轉換。第二塊是 /usr/lib/locale,內含以系統基底字集寫成的區域化資料庫 (locale),像是 LC_CTYPE、LC_TIME .... 等等。第三塊是
/usr/share/locale/,內含可跨平台使用的區域化資料,主要是各套用程式的信息翻譯部分。而最後一塊是 /usr/share/i18n/,其內容是各區域化資料庫的原始碼,以及系統支持的內碼對應表 .... 等等。
時區資料庫:
主要分別在 /usr/share/zoneinfo 底下,內含世界各地時區與格林威治時間的轉換資料。
其他工具程式與設定檔:
工具程式分布在 /usr/bin 與 /sbin 底下,包括一些轉碼與區域化資料庫相關的程式如 iconv, locale, localedef 等,以及用來顯示套用程式與可分享函式庫相依關係的 ldd, 還有可分享函式庫搜尋路徑管理程式 ldconfig .... 等。而其相關的設定檔則位於 /etc 底下。
disaos
03-11-03, 10:42
規格
在 GNU/Linux 系統中,其 C 函式庫的發展史點出了 GNU/Linux 演進的幾個重要里程碑,由此可以突顯出 C 函式庫在系統中的地位與重要性。早期的 GNU/Linux 系統並不支援可分享函式庫,因此所有的套用程式都是以靜態連結的方式存於系統中。直到 1995-1996 年 libc5 問世以後,系統才開始支持 ELF 可分享函式庫,同時該版的 C 函式庫也創作了其他 UNIX 上大部分的功能與函式群,可謂 GNU/Linux 發展上的一大進步。
然而 libc5 在程式國際化 (I18N) 與本土化 (L10N) 方面的支持很差,故那個時候若要開發所謂中文化的程式,就非得自行創作一套標準不可。直到一兩年後, GNU/Linux 換用了 GNU 所開發的 glibc-2.0 做為其 C 函式庫後,其國際化與本土化的支援才開始起步,後來經歷 glibc-2.1,到了現在的 2.2 版,整個多國語文的開發環境才大至成熟。
用 glibc 做為系統的 C 函式庫,是 GNU/Linux 演進的一個重要里程碑。在 GNU 的計畫中,開發 glibc 原本是要給他們尚未問世的核心 GNU/Hurd 用的,由於當時幾乎 99% 的 GNU 系統工具已開發完成,就獨缺核心 Hurd,而恰巧 Linux 核心在 Torvalds 的帶領下已逐漸成熟穩定,而且可以順利執行所有的 GNU 系統工具。故 GNU 團隊便順應 Linux 核心的特性,改寫了他們的 glibc,使其可以適用於 Hurd 核心與 Linux 核心。如此,在這兩個平台上就有了一致的程式開發環境,使得所有的 GNU 程式可以在這兩個平台之間順利移植。
比起過去的 libc5,glibc 系列 (一般又稱之為 libc6) 除了有完整的國際化與本土化支援外,同時還符合許多標準與規格,使得在 glibc 下開發的程式可以很容易移植到其他 UNIX 平台去。這些標準包括:
ISO C:
ISO C 是 International Standard for the C programming language 的縮寫,此標準明定了 C 語言的語法,標準 C 函式庫應具備那些標頭檔、巨集定義、函式與物件 .... 等等,幾乎在任何平台上的 C 語言 (包括非 UNIX 平台) 都支援此標準。
POSIX:
POSIX 是 Portable Operating System Interface for Computer Environments 的縮寫,它是 ISO C 的延伸,明定了一個可移植的作業系統所應具備種種條件,其範圍不只有系統函式庫而已,還同時包括一些標準的工具程式、系統核心應有的特色與創作、以及在 C 函式庫中某些與作業系統相關的低階控制支援 (如系統呼叫視窗) 等等。由於 glibc 是完全按照 POSIX 的標準製作的,同時搭配了符合 POSIX 標準的 Linux 核心,故在此環境下開發的程式可以做到完全符合 POSIX 的規格。
Berkeley Unix:
Berkeley Unix 泛稱柏克萊大學所開發的 UNIX 系列作業系統,包括 4.2 BSD、4.3 BSD、4.4 BSD 以及早期的 SunOS。這些系統的 C 函式庫中有許多傑出的設計,但卻沒有在上述兩個標準中,包括 select() 函式、sockets .... 等等,這些在 glibc 中都有支援。
SVID:
SVID 是 System V Interface Description 的縮寫,它是一份描述 AT&T UNIX System V 系統規格的檔案,它是 POSIX 標準的延伸。Glibc 創作了大部分的 SVID 規格要求,其中較重要的包括了行程之間的通?標準以及分享式記憶體 (shared memory),至於其他的部分則較不常使用。創作 SVID 主要的目的是希望可以做到與 UNIX System V 的相容與程式的可移植性。
XPG:
XPG 是 X/Open Portability Guide 的縮寫,是由 X/Open Company, Ltd. 所發表,同時 X/Open 還擁有 UNIX 商標的著作權。而這份規格不但是 POSIX 標準的擴充,同時也明定了一個 UNIX 作業系統所應符合的要求。其中包括了 iconv() 字集轉換介面,以及部分 BSD 與 SVID 的特色。
除了上述的規格外,glibc 還內含了 GNU 特有的特色,稱之為 GNU Extension。這些特色在某些情況下可以方便程式的撰寫與維護,但就不見得可以移植到其他 UNIX 平台上,故在可移植性的考量下使用時必須留意。
安裝下列程式: catchsegv, gencat, getconf, getent, glibcbug, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, mtrace, nscd, nscd_nischeck, pcprofiledump, pt_chown, rpcgen, rpcinfo, sln, sprof, tzselect, xtrace, zdump 和 zic
安裝下列庫檔案: ld. so, libBrokenLocale.[a,so], libSegFault. so, libanl.[a,so], libbsd-compat.a, libc.[a,so], libc_nonshared.a, libcrypt.[a,so], libdl.[a,so], libg.a, libieee.a, libm.[a,so], libmcheck.a, libmemusage. so, libnsl.a, libnss_compat. so, libnss_dns. so, libnss_files. so, libnss_hesiod. so, libnss_nis. so, libnss_nisplus. so, libpcprofile. so, libpthread.[a,so], libresolv.[a,so], librpcsvc.a, librt.[a,so], libthread_db. so 和 libutil.[a,so]
簡短說明
catchsegv 當程式發生segmentation fault的時候, 用來建立一個堆疊跟蹤。
gencat 建立訊息列表。
getconf 針對檔案系統的指定變數顯示其系統設定值。
getent 從系統管理資料庫獲取一個條目。
glibcbug 建立glibc的bug報告並且email到bug報告的郵件地址。
iconv 轉化字元集。
iconvconfig 建立快速讀取的iconv模組所使用的設定檔案。
ldconfig 設定動態程式庫的實時綁定。
ldd 列出每個程式或者命令需要的共享庫。
lddlibc4 輔助 ldd 操作目標檔案。
locale 是一個 Perl 程式,可以告訴編譯器打開或關閉內建的locale支持。
localedef 編譯locale標準。
mtrace...
nscd 提供對常用名稱設備調用的快取的守護進程。
nscd_nischeck 檢查在進行NIS+偵查時是否需要安全模式。
pcprofiledump 列印PC profiling產生的信息。
pt_chown 是一個輔助程式,幫助grantpt設定子虛擬終端的屬主,用戶組和讀寫許可權。
rpcgen 產生實現RPC協定的C代碼。
rpcinfo 對RPC伺服器產生一個RPC呼叫。
sln 用來創建符號連結,由於它本身是靜態連線的,在動態連線不起作用的時候,sln仍然可以建立符號連結。
sprof 讀取並顯示共享目標的特徵描述數據。
tzselect 對用戶提出關於當前位置的問題,並輸出時區信息到標準輸出。
xtrace 通過列印當前執行的函式跟蹤程式執行情況。
zdump 顯示時區。
zic 時區編譯器。
ld. so 幫助動態程式庫的執行。
libBrokenLocale 幫助程式處理破損locale,如Mozilla。
libSegFault 處理 segmentation fault 信號,試圖捕捉segfaults。
libanl 異步名稱查詢庫。
libbsd-compat 為了在linux下執行一些BSD程式,libbsd-compat提供了必要的可移植性。
libc 是主要的C庫--常用函式的集成。
libcrypt 加密編碼庫。
libdl 動態連線接口。
libg g++的運行時。
libieee IEEE浮點運算庫。
libm 數學函式館。
libmcheck 包括了啟動時需要的代碼。
libmemusage 幫助 memusage 蒐集程式運行時記憶體占用的信息。
libnsl 網路服務庫。
libnss* 是名稱服務切換庫,包含了解釋主機名,用戶名,組名,別名,服務,協定等等的函式。
libpcprofile 幫助核心跟蹤在函式, 源碼行和命令中CPU使用時間。
libpthread POSIX 執行緒庫。
libresolv 創建,傳送及解釋到網際網路域名伺服器的數據包。
librpcsvc提供RPC的其他服務。
librt 提供了大部分的POSIX.1b實時擴展的接口。
libthread_db 對建立多執行緒程式的調試很有用。
libutil 包含了在很多不同的 Unix程式中使用的“標準”函式。
Glibc 安裝依賴關係
Glibc 依賴於: Bash, Binutils, Coreutils, Diffutils, Gawk, GCC, Gettext, Grep, Make, Perl, Sed, Texinfo .