GCC的幾個重要選項解釋-創(chuàng)新互聯(lián)

GCC的幾個重要選項解釋

成都創(chuàng)新互聯(lián)服務(wù)項目包括清水網(wǎng)站建設(shè)、清水網(wǎng)站制作、清水網(wǎng)頁制作以及清水網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,清水網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到清水省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

詳細(xì)可見:[GNU Compiler Collection (GCC)]

https://gcc.gnu.org/onlinedocs/gcc/

https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html

-c 編譯或者匯編代碼,但是不鏈接

-S 在編譯之后停止,但不匯編

-E 預(yù)處理后停止,但不編譯

-o 指定輸出文件的名稱

-v 顯示編譯的每個階段使用的命令

-std 指定要用的語言標(biāo)準(zhǔn)

-g 產(chǎn)生調(diào)試信息

-pg 產(chǎn)生額外信息,被gprof用來做profilling

-O 優(yōu)化可執(zhí)行代碼

-W 設(shè)置編譯器的警報級別

-pedantic以ANSI/ISO C標(biāo)準(zhǔn)列出的所有警告,不符合該語言標(biāo)準(zhǔn)的地方將產(chǎn)生相應(yīng)的警告信息

-I 指定文件包含的目錄

-L 指定庫目錄(編譯時的庫搜索目錄)

-D 預(yù)定義在源代碼中出現(xiàn)的宏

-U 取消所有定義的宏

-f 指定用來控制編譯器行為的選項

-m 指定與硬件相關(guān)的選項

GCC相關(guān)信息查看

-help                  顯示此幫助說明

-target-help           顯示目標(biāo)機(jī)器特定的命令行選項

-help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,...]

                          顯示特定類型的命令行選項

 (使用‘-v --help’顯示子進(jìn)程的命令行參數(shù))

-version               顯示編譯器版本信息

-dumpspecs              顯示所有內(nèi)建 spec 字符串

-dumpversion            顯示編譯器的版本號

-dumpmachine            顯示編譯器的目標(biāo)處理器

-print-search-dirs      顯示編譯器的搜索路徑

-print-libgcc-file-name 顯示編譯器伴隨庫的名稱

-print-file-name=<庫>   顯示 <庫> 的完整路徑

-print-prog-name=<程序> 顯示編譯器組件 <程序> 的完整路徑

-print-multi-directory  顯示不同版本 libgcc 的根目錄

-print-multi-lib        顯示命令行選項和多個版本庫搜索路徑間的映射

-print-multi-os-directory 顯示操作系統(tǒng)庫的相對路徑

-print-sysroot          顯示目標(biāo)庫目錄

-print-sysroot-headers-suffix 顯示用于尋找頭文件的 sysroot 后綴

目前了解的GCC相關(guān)具體選項

GCC的幾個重要選項解釋

-fpic

用于生成位置無關(guān)代碼,位置無關(guān)碼的作用:

1、程序在運行期間動態(tài)加載到內(nèi)存中;

2、程序在不同場合與不同程序組合后加載到內(nèi)存(一般用于動態(tài)鏈接庫)

3、在運行期間不同地址相互之間的映射;(如bootloader)

簡言之,位置無關(guān)碼就是可以在進(jìn)程的任意內(nèi)存位置執(zhí)行的目標(biāo)碼,動態(tài)鏈接庫必須使用。

-L.

搜索相應(yīng)庫文件路徑,.是指當(dāng)前路徑;

-march=armv7-a

-march=armv7-a是指編譯出來的匯編語言是針對armv7架構(gòu)的;

-mtune=contex-a8

與上面一樣,這個則是針對板子上的CPU選項是contex-a8類型的;

-mfloat-abi=soft/softfp/hard

"soft"選項:表明不使用FPU硬件,而是使用GCC的整數(shù)算術(shù)運算來模擬浮點運算。此選項為默認(rèn),因此一定要修改為softfp。

"softfp"選項:表明要使用FPU硬件來做浮點運算,只是,函數(shù)的參數(shù)傳遞到整數(shù)寄存器(r0-r3)中,然后再傳遞到FPU中。

"hard"選項:表明要使用FPU硬件來做浮點運算,并且,函數(shù)的參數(shù)直接傳遞到FPU的寄存器(s0、d0)中。

-mfpu=vfpv3-d16

指定了目標(biāo)機(jī)器上可用的浮點硬件(或硬件仿真),-mfloat-abi=softfp/hard,使用硬浮點指令而不指定-mfpu的話,默認(rèn)使用的是-mfpu=vfp,即不會做neon SIMD優(yōu)化。因此采用neon 內(nèi)置或neon 匯編,必須指定-mfpu=neon。Advanced SIMD (aka NEON) is mandatory for AArch74, so no command line option is needed to instruct the compiler to use NEON.

-mthumb-interwork

這個編譯選項則是支持編譯出來的匯編語言可以支持ARM和THUMB指令集;

-mno-thumb-interwork

缺省情況下是"-mno-thumb-interwork",因為指定了"-mthumb-interwork"產(chǎn)生的代碼稍微大一些;

-Wno-write-strings

會忽略掉C++ char* 轉(zhuǎn)const char*的警告,這樣并不會很安全;

-Wno-trigraphs

關(guān)閉ANSI C的三字母詞編譯出現(xiàn)的錯誤;在ANSI C標(biāo)準(zhǔn)中,定義了9三字母詞(trigraph),三字母詞就是幾個字符的序列,合起來表示另一個字符。

-fno-tree-vectorize

關(guān)閉程序中的向量化的選項;gcc -O3會自動打開 -ftree-vectorize選項

-fno-inline

忽略代碼中的inline關(guān)鍵字,該選項使編譯器將內(nèi)聯(lián)函數(shù)以普通函數(shù)正常對待,等同于無優(yōu)化選項的處理。

-fshort-enums

支持給enum類型分配它聲明的值域范圍的字節(jié)數(shù),即enum類型等于大小足夠的最小整數(shù)類型。

typedef enum num{

one = 1,

two = 2,

three = 3,

four = 4,

}NUM;

NUM num1;

sizeof(num1)不增加這個-fshort-enums選項的時候為4,增加后為大小為1;-fno-short-enums則是無這個選項優(yōu)化處理。gcc是默認(rèn)沒有-fshort-enums這個選項的;

-Wundef

當(dāng)一個沒有定義的符號出現(xiàn)在 #if 中時,給出警告。

-fexpensive-optimizations

執(zhí)行代價高昂的優(yōu)化技術(shù),但是不一定保證運行時性能能提升,反而可能一定程度上會產(chǎn)生負(fù)面影響.

-frename-registers

在寄存器分配后,通過使用rename registers來避免預(yù)定代碼中的虛假依賴。

-fomit-frame-pointer

能夠提高程序性能;原理上最主要的區(qū)別是少了棧幀的切換和棧地址的保存;在gdb 執(zhí)行disassemble命令時,由于沒有保存相應(yīng)棧調(diào)用地址,而導(dǎo)致無法追蹤函數(shù)調(diào)用順序的問題;

-Wno-psabi

Processor Suppliment aBI (psABI)

-fno-strict-aliasing

在編譯選項中加入-fstrict-aliasing的優(yōu)勢在于向編譯器說明不同類型的lvalue將指向不相關(guān)的內(nèi)存區(qū)域,編譯器可以做大量的優(yōu)化。而選項-fno-strict-aliasing向編譯器表明不同類型的lvalue可能指向相關(guān)的內(nèi)存區(qū)域,因此編譯器不會做出一些極端的優(yōu)化而造成不安全

-funwind-tables(為何會產(chǎn)生大量unwind符號?)

unwind table,這個表記錄了與函數(shù)相關(guān)的信息,共三個字段:函數(shù)的起始地址,函數(shù)的結(jié)束地址,一個 info block 指針。

Similar to ‘-fexceptions’, except that it just generates any needed static data, but does not affect the generated code in any other way.

-fexceptions

Enable exception handling

注:大量unwind符號的產(chǎn)生部分是由于-funwind-tables以及-fexceptions,該選項會使object產(chǎn)生符號__aeabi_unwind_cpp_prN,在鏈接之后會在庫文件中生成unwind符號。但是即使不定義這兩個選項,如果代碼中顯式拋出了異常,編譯器會默認(rèn)添加-fexceptions,如果強制手工添加-fno-exceptions會報錯。stack unwind 即從拋出異常的函數(shù)開始,沿著調(diào)用鏈向上找到 catch 所在的函數(shù),然后從拋異常的地方開始,清理調(diào)用鏈上各棧幀內(nèi)已經(jīng)創(chuàng)建了的局部變量,這一整個過程。

-fstack-protector

在關(guān)鍵函數(shù)的堆棧中設(shè)置保護(hù)值。在返回地址和返回值之前,都將驗證這個保護(hù)值。如果出現(xiàn)了緩沖區(qū)溢出,保護(hù)值不再匹配,程序就會退出。程序每次運行,保護(hù)值都是隨機(jī)的,不會被遠(yuǎn)程猜出。

-finline-limit=64

對偽指令數(shù)超過n的函數(shù),編譯程序?qū)⒉贿M(jìn)行內(nèi)聯(lián)展開,默認(rèn)為600。增大此值將增加編譯時間和編譯內(nèi)存用量并且生成的二進(jìn)制文件體積也會變大,此值不宜太大。

-fsigned-char

設(shè)定char的缺省模式為signed char

-no-canonical-prefixes

Do not expand any symbolic links, resolve references to ‘/../’ or ‘/./’, or make the path absolute when generating a relative prefx.

-fdata-sections 以及 -ffunction-sections

將每個函數(shù)或符號創(chuàng)建為一個sections,其中每個sections名與function或data名保持一致。即使compiler為每個function和data item分配獨立的section

-Wl,–gc-sections(為何導(dǎo)致符號的缺失?)

指示鏈接器去掉不用的section(其中-wl, 表示后面的參數(shù) -gc-sections 傳遞給鏈接器),鏈接操作以section作為最小的處理單元(結(jié)合-ffunction-sections),只要一個section中有某個符號被引用,該section就會被放入output中。

什么是"被引用",個人認(rèn)為是指"被調(diào)用",或者符號被export引起的鏈接器認(rèn)為這是一個接口

-Wa,--noexecstack

執(zhí)行l(wèi)d鏈接器堆棧段不可執(zhí)行機(jī)制(其中-wl, 表示后面的參數(shù) -gc-sections 傳遞給assembler)

-frtti

RTTI(Run-Time Type Identification),通過運行時類型信息程序能夠使用基類的指針或引用來檢查這些指針或引用所指的對象的實際派生類型。-frtti選項使編譯器為每個有虛函數(shù)的類添加一些信息以支持rtti特性,例如dynamic_cast typeid之類,不過這個選項默認(rèn)就是打開的,一般都是用-fno-rtti來關(guān)閉這個特性節(jié)約空間

-fvisibility=hidden

能夠?qū)崿F(xiàn)隱藏符號表的作用,nm查看符號表可以看到符號類型從T變?yōu)閠,至于如何去除局部符號t,可以調(diào)用strip -x來去掉。從動態(tài)共享庫中盡可能少地輸出符號是一個好的實踐經(jīng)驗。輸出一個受限制的符號會提高程序的模塊性,并隱藏實現(xiàn)的細(xì)節(jié)。在庫中減少符號的數(shù)目還可以減少庫的內(nèi)存印跡,減少動態(tài)鏈接器的工作量。動態(tài)鏈接器裝載和識別的符號越少,程序啟動和運行的速度就越快。

對于接口函數(shù),可以在函數(shù)聲明前添加__attribute__ ((visibility ("default"))),使其符號被單獨導(dǎo)出。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

網(wǎng)站名稱:GCC的幾個重要選項解釋-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://bm7419.com/article26/cesscg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、營銷型網(wǎng)站建設(shè)ChatGPT、網(wǎng)站策劃、品牌網(wǎng)站制作網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)