真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯網站制作重慶分公司

gcc編譯器-創(chuàng)新互聯

1. GCC工具

GCC編譯器:
GCC(GNU Compiler Collection)是由 GNU 開發(fā)的編程語言編譯器。 GCC最初代表“GNU C Compiler”,當時只支持C語言。 后來又擴展能夠支持更多編程語言,包括 C++、Fortran 和 Java 等。 因此,GCC也被重新定義為“GNU Compiler Collection”,成為歷史上最優(yōu)秀的編譯器, 其執(zhí)行效率與一般的編譯器相比平均效率要高 20%~30%。
GCC的官網地址為:https://gcc.gnu.org/,在Ubuntu系統下系統默認已經安裝好GCC編譯器,可以通過如下命令查看Ubuntu系統中GCC編譯器的版本及安裝路徑:
在這里插入圖片描述

站在用戶的角度思考問題,與客戶深入溝通,找到法庫網站設計與法庫網站推廣的解決方案,憑借多年的經驗,讓設計與互聯網技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網站設計、做網站、企業(yè)官網、英文網站、手機端網站、網站推廣、申請域名、網頁空間、企業(yè)郵箱。業(yè)務覆蓋法庫地區(qū)。GCC編譯工具鏈:

GCC編譯工具鏈(toolchain),是指以GCC編譯器為核心的一整套工具。它主要包含以下三部分內容:

gcc-core:即GCC編譯器,用于完成預處理和編譯過程,把C代碼轉換成匯編代碼。
Binutils :除GCC編譯器外的一系列小工具包括了鏈接器ld,匯編器as、目標文件格式查看器readelf等。
glibc:包含了主要的 C語言標準函數庫,C語言中常常使用的打印函數printf、malloc函數就在glibc 庫中。

在很多場合下會直接用GCC編譯器來指代整套GCC編譯工具鏈。

Binutils工具集:

Binutils(bin utility),是GNU二進制工具集,通常跟GCC編譯器一起打包安裝到系統,它的官方說明網站地址為: https://www.gnu.org/software/binutils/ 。
在進行程序開發(fā)的時候通常不會直接調用這些工具,而是在使用GCC編譯指令的時候由GCC編譯器間接調用。下面是其中一些常用的工具:

as:匯編器,把匯編語言代碼轉換為機器碼(目標文件)。
ld:鏈接器,把編譯生成的多個目標文件組織成最終的可執(zhí)行程序文件。
readelf:可用于查看目標文件或可執(zhí)行程序文件的信息。
nm : 可用于查看目標文件中出現的符號。
objcopy: 可用于目標文件格式轉換,如.bin 轉換成 .elf 、.elf 轉換成 .bin等。
objdump:可用于查看目標文件的信息,最主要的作用是反匯編。
size:可用于查看目標文件不同部分的尺寸和總尺寸,例如代碼段大小、數據段大小、使用的靜態(tài)內存、總大小等。

系統默認的Binutils工具集位于/usr/bin目錄下,可使用如下命令查看系統中存在的Binutils工具集:

ls /usr/bin/ | grep linux-gnu-
glibc庫:

glibc庫是GNU組織為GNU系統以及Linux系統編寫的C語言標準庫,因為絕大部分C程序都依賴該函數庫,該文件甚至會直接影響到系統的正常運行,例如常用的文件操作函數read、write、open,打印函數printf、動態(tài)內存申請函數malloc等。
在Ubuntu系統下,libc.so.6是glibc的庫文件,可直接執(zhí)行該庫文件查看版本,在主機上執(zhí)行如下命令:
glibc庫文件路徑,可直接執(zhí)行:

/lib/x86_64-linux-gnu/libc.so.6
GCC編譯

1.編寫程序源碼

#includeint main()
{
printf("hello, world! This is a C program.\n");
for(int i=0;i<10;i++ ){
printf("output i=%d\n",i);
}
return 0;
}
# 在Ubuntu的hello_c目錄下執(zhí)行如下命令
gcc hello.c –o hello #使用gcc把hello.c編譯成hello程序
ls #查看目錄下的文件
./hello #執(zhí)行生成的hello程序

GCC 編譯工具鏈在編譯一個C源文件時需要經過以下 4 步:

預處理:為把頭文件的代碼、宏之類的內容轉換成生成的.i文件,還是C代碼。
編譯:把預處理后的.i文件通過編譯成.s文件,匯編語言。
匯編:將匯編語言文件生成目標文件.o文件,機器碼。
鏈接:將每個源文件對應的.o文件鏈接起來,就生成一個可執(zhí)行程序文件。
(1)預處理階段

預處理過程中,對源代碼文件中的文件包含 (include)、 預編譯語句 (如宏定義define等)進行展開,生成 .i 文件。 可理解為把頭文件的代碼、宏之類的內容轉換成更純粹的C代碼,不過生成的文件以.i為后綴。
使用GCC的參數 “-E”,可以讓編譯器生成 .i 文件,參數 “-o”,可以指定輸出文件的名字。
具體命令如下:

預處理,可理解為把頭文件的代碼匯總成C代碼,把*.c轉換得到*.i文件
gcc –E hello.c –o hello.i

相當于它把原C代碼中包含的頭文件中引用的內容匯總到一處, 如果原C代碼有宏定義,它把宏定義展開成具體的內容。

(2)編譯階段

把預處理后的.i文件通過編譯成為匯編語言,生成.s文件,即把代碼從C語言轉換成匯編語言,這是GCC編譯器完成的工作。在這個過程,GCC會檢查各個源文件的語法,即使我們調用了一個沒有定義的函數,也不會報錯。
GCC可以使用-S選項,讓編譯程序生成匯編語言的代碼文件(.s后綴)。
具體命令如下:

#編譯,可理解為把C代碼轉換為匯編代碼,把*.i轉換得到*.s文件
gcc –S hello.i –o hello.s
#也可以直接以C文件作為輸入進行編譯,與上面的命令是等價的
gcc –S hello.c –o hello.s
(3)匯編階段

將匯編語言文件經過匯編,生成目標文件.o文件,每一個源文件都對應一個目標文件。即把匯編語言的代碼轉換成機器碼,這是as匯編器完成的工作。
GCC的參數“c”表示只編譯(compile)源文件但不鏈接,會將源程序編譯成目標文件(.o后綴)。計算機只認識0或者1,不懂得C語言,也不懂得匯編語言,經過編譯匯編之后,生成的目標文件包含著機器代碼,這部分代碼就可以直接被計算機執(zhí)行。一般情況下,可以直接使用參數“c”,跳過上述的兩個過程,具體命令 如下:

# 匯編,可理解為把匯編代碼轉換為機器碼,把*.s轉換得到*.o,即目標文件
gcc –c hello.s –o hello.o
# 也可以直接以C文件作為輸入進行匯編,與上面的命令是等價的
gcc –c hello.c –o hello.o
(4)鏈接階段

最后將每個源文件對應的目標.o文件鏈接起來,就生成一個可執(zhí)行程序文件,這是鏈接器ld完成的工作。
例如一個工程里包含了A和B兩個代碼文件,在鏈接階段, 鏈接過程需要把A和B之間的函數調用關系理順,也就是說要告訴A在哪里能夠調用到fun函數, 建立映射關系,所以稱之為鏈接。若鏈接過程中找不到fun函數的具體定義,則會鏈接報錯。
雖然本示例只有一個hello.c文件,但它調用了C標準代碼庫的printf函數, 所以鏈接器會把它和printf函數鏈接起來,生成最終的可執(zhí)行文件。
鏈接分為兩種:

動態(tài)鏈接:GCC編譯時的默認選項。動態(tài)是指在應用程序運行時才去加載外部的代碼庫,不同的程序可以共用代碼庫。 所以動態(tài)鏈接生成的程序比較小,占用較少的內存。
靜態(tài)鏈接:鏈接時使用選項 “–static”,它在編譯階段就會把所有用到的庫打包到自己的可執(zhí)行程序中。 所以靜態(tài)鏈接的優(yōu)點是具有較好的兼容性,不依賴外部環(huán)境,但是生成的程序比較大。

執(zhí)行如下命令體驗靜態(tài)鏈接與動態(tài)鏈接的區(qū)別:

# 在hello.o所在的目錄執(zhí)行如下命令
# 動態(tài)鏈接,生成名為hello的可執(zhí)行文件
gcc hello.o –o hello
# 也可以直接使用C文件一步生成,與上面的命令等價
gcc hello.c -o hello
# 靜態(tài)鏈接,使用--static參數,生成名為hello_static的可執(zhí)行文件
gcc hello.o –o hello_static --static
# 也可以直接使用C文件一步生成,與上面的命令等價
gcc hello.c -o hello_static --static

在Ubuntu下,可以使用 ldd 工具查看動態(tài)文件的庫依賴

3. 交叉編譯

如果我們希望編譯器運行在x86架構平臺上,然后編譯生成ARM架構的可執(zhí)行程序,這種編譯器和目標程序運行在不同架構的編譯過程,被稱為 交叉編譯

安裝ARM-GCC
# 在主機上執(zhí)行如下命令
sudo apt install gcc-arm-linux-gnueabihf
# 安裝完成后使用如下命令查看版本
arm-linux-gnueabihf-gcc –v
交叉編譯程序

交叉編譯器與本地編譯器使用起來并沒有多大區(qū)別。

# 在hello.c程序所在的目錄執(zhí)行如下命令
arm-linux-gnueabihf-gcc hello.c –o hello_arm

同樣的C代碼文件,使用交叉編譯器編譯后,生成的hello已經變成了ARM平臺的可執(zhí)行文件,可以通過readelf工具來查看具體的程序信息

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧


網頁題目:gcc編譯器-創(chuàng)新互聯
網站URL:http://weahome.cn/article/gpphj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部