常用GCC編譯選項

2021-10-01 02:45:19 字數 1951 閱讀 5850

1. gcc -v  打出編譯資訊   gcc相當於工具集合

2. -w只打出編譯器認為會出錯的告警 -wall 所有告警 -wfatal_errors 在遇到第乙個錯誤時停止編譯

3. ar x 有同名的.o怎麼辦?

4. 重名動態庫和靜態庫會先鏈結動態庫,-static -shared

5. 動態庫必須加-fpic,生成位址無關**,使用相對距-離

6. -wl 加乙個聯結器引數 -rpath= 新增執行時鏈結庫目錄

7. c語言都是在編譯期間優化

-o

-fpic

編譯選項高階:專案編譯選項詳解

1. -wno-*** 禁用某些警告

例如:-wno-pointer-sign 遮蔽傳入引數型別不一致的告警

2. -fno-common 這個表示禁止編譯器把未初始化的全域性變數放入common段並當成弱符號,應把乙個未初始化的全域性變數當做乙個強符號

3. -ffunction-sections -fdata-sections -wl,–gc-sections

-ffunction-sections 和 -fdata-sections 將每個函式或符號建立為乙個sections,其中每個sections名與function或data名保持一致(可以通過readelf檢視段表來驗證)。而在鏈結階段, -wl,–gc-sections 指示鏈結器去掉不用的section,開啟該選項,主要是用於去掉所有函式sfp(stack frame pointer)的,即在函式呼叫時不儲存棧幀指標sfp,代價是不能通過backtrace進行除錯根據堆疊資訊了。通過去掉sfp,可以提高程式執行速度,達到優化程式的目的。

另外乙個類似選項-fomit-leaf-frame-pointer:用於去掉子函式leaf function的sfp。

該選項屬於優化選項,在指定-o選項時,也會開啟該選項。

4. -fshort-enums支援給enum型別分配它宣告的值域範圍的位元組數;

enum型別等於大小足夠的最小整數型別。

也就是說

typedef enum numnum;

num num1;

sizeof(num1)不增加這個-fshort-enums選項的時候為4,增加後為大小為1;

-fno-short-enums則是無這個選項優化處理。gcc是預設沒有-fshort-enums這個選項的;

5. -fsigned-char 將char設定為signed char型別。類似的還有

-funsigned-char

-fno-signed-char

-fsigned-char

-fno-unsigned-char

6. -fstack-protector-all(公司要求必加)

避免棧溢位被攻擊者利用。在緩衝區和控制資訊間插入乙個canary word。當緩衝區被溢位時,在返回位址被覆蓋之前canary word會首先被覆蓋。通過檢查canary word的值是否被修改,就可以判斷是否發生了溢位攻擊。

7. -fmessage-length=0

預設情況下,gnu工具鏈編譯過程中,控制台輸出的一行資訊是不換行的,這樣,當輸出資訊過長時(如編譯錯誤時的資訊),會導致你無法看到完整的輸出資訊,加入-fmessage-length=0後,輸出資訊會根據控制台的寬度自動換行,這樣就能看全輸出資訊了。

8. -fvisibility=hidden

隱藏所有符號,不能被外部使用。若某些介面需要提供給外部使用可以加上

voidattribute((visibility(「default」))) foo(void)

9. -wl,-bsymbolic

表示強制採用本地的全域性變數定義。

應用程式進行鏈結的時候,動態庫中全域性變數定義,將會被應用程式中同名的全域性變數所覆蓋。這樣也就造成了,在動態庫中修改a變數時,應用程式中的a也發生了變化。

GCC常用編譯選項

gcc編譯選項解析 gcc是linux下基於命令列的c語言編譯器,其基本的使用語法如下。gcc option filename 對於編譯c 的源程式,其基本語法如下 g option filename 其中option為gcc使用時的選項,而filename為需要gcc做編譯的處理的的檔名。就gcc...

gcc 常用編譯選項

g 加入除錯資訊 m64 64位 c 只做預處理 編譯和彙編,不鏈結,產生的是目標檔案 o檔案 s 只做預處理和編譯,把檔案編譯成為彙編 include 某個 簡單來說,就是便以某個檔案,需要另乙個檔案的時候,就可以用它設定,功能就相當於在 中使用 include,例如gcc hello.c inc...

常用GCC 編譯選項

x 指定檔案型別 如 gcc x c main.pig,用c編譯mian.pig檔案 o制定目標名稱,預設的時候,gcc 編譯出來的檔案是a.out,很難聽,如果 你和我有同感,改掉它,哈哈 例子用法 gcc o hello.exe hello.c 哦,windows用習慣了 m生成檔案關聯的資訊。...