轉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++的第三方函數庫一樣。