複製鏈接
請複製以下鏈接發送給好友

glibc

鎖定
glibc是GNU發佈的libc庫,即c運行庫。glibc是linux系統中最底層的api,幾乎其它任何運行庫都會依賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現。由於glibc囊括了幾乎所有的 UNIX 通行的標準,可以想見其內容包羅萬象。而就像其他的 UNIX 系統一樣,其內含的檔案羣分散於系統的樹狀目錄結構中,像一個支架一般撐起整個操作系統。在 GNU/Linux 系統中,其C函式庫發展史點出了GNU/Linux 演進的幾個重要里程碑,用 glibc 作為系統的C函式庫,是GNU/Linux演進的一個重要里程碑。
glibc是一種按照LGPL許可協議發佈的,自由的,公開源代碼的,方便從網絡下載的C的編譯程序。GNU C運行期庫,是一種C函數庫,是程序運行時使用到的一些API集合,它們一般是已預先編譯好,以二進制代碼形式存在Linux類系統中,GNU C運行期庫通常作為GNU C編譯程序的一個部分發布。
glibc最初是自由軟件基金會(FSF)為其GNU操作系統所寫,但當前最主要的應用是配合Linux內核,成為GNU/Linux操作系統一個重要的組成部分。
外文名
glibc
字符串處理
string
信號處理
signal
文件目錄操作
direct

glibc功能實現

主要的如下:
(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內容

由於 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 底下。

glibc規格

在 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]

glibc簡短説明

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.

glibclibc、glibc和glib的關係

glibc 和 libc 都是 Linux 下的 C 函數庫。libc 是 Linux 下的 ANSI C 函數庫;glibc 是 Linux 下的 GNU C 函數庫。
ANSI C 函數庫是基本的 C 語言函數庫,包含了 C 語言最基本的庫函數。這個庫可以根據頭文件劃分為 15 個部分,其中包括:
  1. <ctype.h>:包含用來測試某個特徵字符的函數的函數原型,以及用來轉換大小寫字母的函數原型;
  2. <errno.h>:定義用來報告錯誤條件的宏;
  3. <float.h>:包含系統的浮點數大小限制;
  4. <math.h>:包含數學庫函數的函數原型;
  5. <stddef.h>:包含執行某些計算 C 所用的常見的函數定義;
  6. <stdio.h>:包含標準輸入輸出庫函數的函數原型,以及他們所用的信息;
  7. <stdlib.h>:包含數字轉換到文本,以及文本轉換到數字的函數原型,還有內存分配、隨機數字以及其他實用函數的函數原型;
  8. <string.h>:包含字符串處理函數的函數原型;
  9. <time.h>:包含時間和日期操作的函數原型和類型;
  10. <stdarg.h>:包含函數原型和宏,用於處理未知數值和類型的函數的參數列表;
  11. <signal.h>:包含函數原型和宏,用於處理程序執行期間可能出現的各種條件;
  12. <setjmp.h>:包含可以繞過一般函數調用並返回序列的函數的原型,即非局部跳轉;
  13. <locale.h>:包含函數原型和其他信息,使程序可以針對所運行的地區進行修改。
  14. 地區的表示方法可以使計算機系統處理不同的數據表達約定,如全世界的日期、時間、美元數和大數字;
  15. <assert.h>:包含宏和信息,用於進行診斷,幫助程序調試。
上述庫函數在其各種支持 C 語言的 IDE 中都是有的。
GNU C 函數庫是一種類似於第三方插件的東西。由於 Linux 是用 C 語言寫的,所以 Linux 的一些操作是用 C 語言實現的,因此,GNU組織開發了一個 C 語言的庫以便讓我們更好的利用 C 語言開發基於 Linux 操作系統的程序。不過現在的不同的 Linux 的發行版本對這兩個函數庫有不同的處理方法,有的可能已經集成在同一個庫裏了。
glibc是linux下面c標準庫的實現,即GNU C Library。glibc本身是GNU旗下的C標準庫,後來逐漸成為了Linux的標準c庫,而Linux下原來的標準c庫Linux libc逐漸不再被維護。Linux下面的標準c庫不僅有這一個,如uclibc、klibc,以及上面被提到的Linux libc,但是glibc無疑是用得最多的。glibc在/lib目錄下的.so文件為libc.so.6。
glib 和 glibc 基本上沒有太大聯繫,可能唯一的共同點就是,其都是 C 編程需要調用的庫而已。
glib 是 Gtk+ 庫和 Gnome 的基礎。glib 可以在多個平台下使用,比如 Linux、Unix、Windows 等。glib 為許多標準的、常用的 C 語言結構提供了相應的替代物 [1] 
glib是GTK+的基礎庫,它由基礎類型、對核心應用的支持、實用功能、數據類型和對象系統五個部分組成,可以在[http://www.gtk.orggtk網站]下載其源代碼。是一個綜合用途的實用的輕量級的C程序庫,它提供C語言的常用的數據結構的定義、相關的處理函數,有趣而實用的宏,可移植的封裝和一些運行時機能,如事件循環、線程、動態調用、對象系統等的API。GTK+是可移植的,當然glib也是可移植的,你可以在linux下,也可以在windows下使用它。使用gLib2.0(glib的2.0版本)編寫的應用程序,在編譯時應該在編譯命令中加入pkg-config --cflags --libs glib-2.0,如:
gcc pkg-config --cflags --libs glib-2.0 hello.c -o hello
使用glib最有名的就是GNOME了。
參考資料
  • 1.    Hagen W V. Building and Installing Glibc[J]. Definitive Guide to Gcc, 2006:247-279.