glibc

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
功能實現,內容,規格,簡短說明,libc、glibc和glib的關係,

功能實現

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

libc、glibc和glib的關係

glibc 和 libc 都是 Linux 下的 C 函式館。libc 是 Linux 下的 ANSI C 函式館;glibc 是 Linux 下的 GUN 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 語言實現的,因此,GUN 組織開發了一個 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 語言結構提供了相應的替代物。
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了。

相關詞條

熱門詞條

聯絡我們