libc、glibc與gcc

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

 

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

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來完成最後的關鍵性 工做,這個階段就是鏈接。在鏈接階段,全部的目標文件被安排在可執行程序中的恰當的位置,同時,該程序所調用到的庫函數也從各自所在的檔案庫中連到合適的 地方。api

 

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

三、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,其它基本功能socket

 

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

相關文章
相關標籤/搜索