libc、glibc與gcc


轉http://blog.163.com/dragon_sjl@126/blog/static/100473339201107101517380/

 

1、gcc(gnu collect compiler)是一組編譯工具的總稱。它主要完成的工作任務是“預處理”和“編譯”,以及提供了與編譯器緊密相關的運行庫的支持,如libgcc_s.so、libstdc++.so等。

Linux系統下的Gcc(GNU C Compiler)是GNU推出的功能強大、性能優越的多平台編譯器,是GNU的代表作品之一。gcc是可以在多種硬體平台上編譯出可執行程序的超級編譯器,其執行效率與一般的編譯器相比平均效率要高20%~30%。 
Gcc 編譯器能將C、C++語言源程序、匯程式化序和目標程序編譯、連接成可執行文件,如果沒有給出可執行文件的名字,gcc將生成一個名為a.out的文件。 在Linux系統中,可執行文件沒有統一的后綴,系統從文件的屬性來區分可執行文件和不可執行文件。而gcc則通過后綴來區別輸入文件的類別,下面我們來 介紹gcc所遵循的部分約定規則。 
.c為后綴的文件,C語言源代碼文件; 
.a為后綴的文件,是由目標文件構成的檔案庫文件; 
.C,.cc或.cxx 為后綴的文件,是C++源代碼文件; 
.h為后綴的文件,是程序所包含的頭文件; 
.i 為后綴的文件,是已經預處理過的C源代碼文件; 
.ii為后綴的文件,是已經預處理過的C++源代碼文件; 
.m為后綴的文件,是Objective-C源代碼文件; 
.o為后綴的文件,是編譯后的目標文件; 
.s為后綴的文件,是匯編語言源代碼文件; 
.S為后綴的文件,是經過預編譯的匯編語言源代碼文件。 
Gcc的執行過程 
雖然我們稱Gcc是C語言的編譯器,但使用gcc由C語言源代碼文件生成可執行文件的過程不僅僅是編譯的過程,而是要經歷四個相互關聯的步驟∶預處理(也稱 預編譯,Preprocessing)、編譯(Compilation)、匯編(Assembly)和連接(Linking)。 
命令gcc首先 調用cpp進行預處理,在預處理過程中,對源代碼文件中的文件包含(include)、預編譯語句(如宏定義define等)進行分析。接着調用cc1進 行編譯,這個階段根據輸入文件生成以.o為后綴的目標文件。匯編過程是針對匯編語言的步驟,調用as進行工作,一般來講,.S為后綴的匯編語言源代碼文件 和匯編、.s為后綴的匯編語言文件經過預編譯和匯編之后都生成以.o為后綴的目標文件。當所有的目標文件都生成之后,gcc就調用ld來完成最后的關鍵性 工作,這個階段就是連接。在連接階段,所有的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的 地方。

 

2、binutils提供了一系列用來創建、管理和維護二進制目標文件的工具程序,如匯編(as)、連接(ld)、靜態庫歸檔(ar)、反匯編 (objdump)、elf結構分析工具(readelf)、無效調試信息和符號的工具(strip)等。通常,binutils與gcc是緊密相集成 的,沒有binutils的話,gcc是不能正常工作的。

3、glibc是gnu發布的libc庫,也即c運行庫。glibc是linux系統中最底層的api(應用程序開發接口),幾乎其它任何的運行庫 都會倚賴於glibc。glibc除了封裝linux操作系統所提供的系統服務外,它本身也提供了許多其它一些必要功能服務的實現,主要的如下:
 (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,其它基本功能

 

3、glibc和libc都是Linux下的C函數庫,那么到底有什么區別呢?
見到Linux下好多的庫函數,曾經令我困惑,其實他們是有章可循的。
libc是Linux下的ANSI C的函數庫;
glibc是Linux下的GUN C函數庫;
ANSI C和GNU C有什么區別呢?
ANSI C是基本的C語言函數庫,包含了C語言最基本的庫函數。這個庫可以根據 頭文件划分為 15 個部分,其中包括:字符類型 (<ctype.h>)、錯誤碼 (<errno.h>)、 浮點常數 (<float.h>)、數學常數 (<math.h>)、標准定義 (<stddef.h>)、 標准 I/O (<stdio.h>)、工具函數 (<stdlib.h>)、字符串操作 (<string.h>)、 時間和日期 (<time.h>)、可變參數表 (<stdarg.h>)、信號 (<signal.h>)、 非局部跳轉 (<setjmp.h>)、本地信息 (<local.h>)、程序斷言 (<assert.h>) 等等。這在其他的C語言的IDE中都是有的。
而GNU C函數庫是一種類似於第三方插件的東西,由於Linux是用C語言寫的,所以Linux的一些操作是用C語言實現的,所以GNU組織開發了一個C語言的庫 用於我們更好的利用C語言開發基於Linux操作系統的程序。其實我們可以把它理解為類似於Qt是一個C++的第三方函數庫一樣。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM