導航:首頁 > 源碼編譯 > linuxgcc安全編譯選項

linuxgcc安全編譯選項

發布時間:2025-09-30 13:47:21

linux的終端怎麼運行C語言

打開終端 然後VI環境下編譯運行
一. 常用編譯命令選項
假設源程序文件名為test.c。

1. 無選項編譯鏈接
用法:#gcc test.c
作用:將test.c預處理、匯編、編譯並鏈接形成可執行文件。這里未指定輸出文件,默認輸出為a.out。

2. 選項 -o
用法:#gcc test.c -o test
作用:將test.c預處理、匯編、編譯並鏈接形成可執行文件test。-o選項用來指定輸出文件的文件名。

3. 選項 -E
用法:#gcc -E test.c -o test.i

⑵ Gcc 和 Clang

GCC 編譯器作為 Linux 系統下的主要 C/C++ 編譯工具,廣泛安裝於多數 Linux 發行版中。其命令形式通常為「gcc」,並提供了豐富的選項來輔助編譯過程。其中,常用選項包括:-E 僅執行預處理,-c 編譯或匯編源文件但不執行鏈接,-S 完成編譯但不匯編,僅生成匯編代碼,-o 用於指定輸出文件名。在 Linux 系統中,未指定輸出文件名時,默認輸出名為「a.out」,源文件後綴生成為「.o」,匯編文件後綴為「.s」。GCC支持多種環境的代碼生成,如使用-m32、-m64、-m16選項生成不同位數環境的代碼,例如,-m32下int、long和指針類型均為32位,-m64下int為32位,long和指針類型為64位,-m16與-m32類似,但在匯編文件開頭添加了gcc匯編制導,用於運行16位模式的二進制文件。

編譯過程主要分為預處理、編譯、匯編和鏈接四個階段。下面以一段源碼為例,詳細分析每個階段的內容。

首先,預處理過程會展開宏定義和條件編譯,生成預處理文件。使用cpp命令執行預處理,得到的sample.i文件中,宏定義和條件編譯已根據實際情況展開,宏引用被替換為實際值。通過-D指令可以自定義宏的值,進行預處理。在Linux系統下,通過「man gcc」可查詢GCC命令的詳細用法。

接著,GCC將預處理文件編譯為匯編代碼,生成匯編文件。匯編文件包含了核心的匯編代碼,展示了編譯過程中的匯編指令和數據操作。對比32位機器和64位機器匯編代碼的差異,可以發現主要在於寄存器的位寬和指令的位寬不同。

匯編代碼中,.cfi_startproc和.cfi_endproc用於初始化和結束本地數據結構,本地標簽用於分支目的地標記。基本匯編指令如pushl、movl、subl、cmpl、je、addl、sall、ret、movl等,分別用於操作寄存器、存儲數據、進行算術運算和邏輯運算、控制流程等。了解這些基本指令的用途有助於深入理解程序的執行流程。

使用GCC的-c選項編譯源代碼為機器代碼,通過-o選項指定輸出文件名。可以使用as命令得到機器語言,通過objmp指令查看目標文件的機器碼,反匯編指令幫助理解機器碼的含義。在程序中發現符號定義沖突時,可以使用nm命令列出目標文件中的符號,快速定位問題。

最後,鏈接器(ld)將編譯生成的目標文件鏈接為可執行文件。鏈接過程中,鏈接器解析未定義的符號引用,將目標文件中的佔位符替換為實際的符號地址。如果缺少必要的CRT文件,ld會生成警告。可通過查詢/usr/lib/x86_64-linux-gnu路徑找到CRT文件。C運行時文件(CRT)包含程序入口函數_start,負責調用__libc_start_main初始化libc,並調用main函數;_init函數在main函數前運行;_fini函數在main函數後運行。鏈接時使用-lc選項鏈接C標准庫。

Clang 是一個基於LLVM的C/C++編譯器,提供C/C++/Objective C/Objective C++語言的編譯支持,旨在超越GCC。Clang預處理、生成匯編代碼、生成目標文件、得到可執行文件的過程與GCC類似,但Clang提供了更多的特性,如更快的編譯速度、更好的錯誤診斷和更先進的類型推斷能力。使用Clang替代GCC進行C程序編譯時,可以體驗到這些額外的優勢。

Clang編譯過程包含預處理、生成32位和64位機器匯編代碼、生成目標文件和得到可執行文件等步驟。使用Clang編譯後的匯編代碼、目標文件和可執行文件與GCC編譯結果一致,但Clang在性能和語言支持方面可能具有優勢。

⑶ linux 如何運行編譯程序

gcc有多達100多個參數,現介紹常用的幾個。如果對其他參數也有興趣,可以參考:man gcc
預先處理選項
-E: 只對文件進行預處理,輸出結果到標准輸出
-C: 告訴預處理器不要丟棄注釋.配合`-E『選項使用. -P: 告訴預處理器不要產生`#line'命令.配合`-E'選項使用.
-v: 顯示正在使用的gcc的版本
常用編譯選項
-c: 將源程序編譯為目標代碼但並不做鏈接的工作,不生成最終的可執行文件,只生成一個與源文件文件名相同的以.o為後綴的目標文件。
-S:將遠程序編譯為一個後綴為.s的匯編語言文件,不會生成可執行文件
-x:強制編譯器用指定的語言編譯器來編譯某個源文件
gcc -x c++ test.c 表示強制用C++編譯器來編譯c程序
-static: 強制連接靜態庫,運行時不依賴動態庫
-share: 編譯時盡量使用動態庫
-o: 指定生成的可執行文件名,如果沒有該選項,如果生成可執行文件,默認文件名為a.out
編譯路徑選項
-i : 指定特定頭文件
gcc –c -i /home/zry/test.h test.c
-I<DIR>:依賴選項,指定頭文件路徑
Linux下大多數函數將頭文件放在/usr/include目錄下,如果需要指定其他路徑,可以使用該選項
gcc –I/home/zry/include –c test.c 添加/home/zry/include到查找路徑
-L<DIR> : 指定庫文件搜素路徑,用法同上
-l<庫名>:指定特定庫文件
gcc –lapp –c test.c
Linux的庫文件有一個約定,即以lib開頭,-lapp表示連接libapp.so庫文件
目標生成選項
-shared: 生成動態庫
gcc –shared libtest.so -i /home/zry/test.h test.c
生成靜態庫需要ar命令,後面講解
-fPIC: 生成可用於動態庫的位置獨立代碼。所有的內部定址均通過全局偏移表完成。
-ansi:支持符合ANSI標準的C程序.
該選項就會關閉GNU C中某些不兼容ANSI C的特性,例如asm, inline和 typeof關鍵字以及諸如unix和vax這些表明當前系統類型的預定義宏。
__asm__, __extension__, __inline__和__typeof__仍然有效
使用`-ansi'選項的時候,預處理器會預定義一個__STRICT_ANSI__宏.有些頭文件 關注此宏,以避免聲明某些函數,或者避免定義某些宏,這些函數和宏不被ANSI標准調用;這樣就不會干擾在其他地方使用這些名字的程序了.
fno-asm:此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作關鍵字。
-fno-strict-prototype:只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式的對參數的個數和類型說明,而不是沒有參數.而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為沒有顯式說明的類型
-fthis-is-varialble:就是向傳統c++看齊,可以使用this當一般變數使用
-fcond-mismatch:允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型
-funsigned-char:
-fno-signed-char:
-fsigned-char:
-fno-unsigned-char:
這四個參數是對char類型進行設置,將char類型設置unsigned char(前兩個參數)或者 signed char(後兩個參數)
-imacros file: 將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身並不出現在輸入文件中
-Dmacro: 相當於C語言中的#define macro
-Dmacro=defn: 相當於C語言中的#define macro=defn
-Umacro: 相當於C語言中的#undef macro
-undef: 取消對任何非標准宏的定義
-M: 生成文件關聯的信息。包含目標文件所依賴的所有源代碼
-MM: 和M一樣,但是它將忽略由#include<file>造成的依賴關系。
-MD: -M相同,但是輸出將導入到.d的文件裡面
-MMD: 和-MM相同,但是輸出將導入到.d的文件裡面
警告選項
fsyntax-only:檢查程序中的語法錯誤,但是不產生輸出信息.
-w:禁止所有警告信息.
-Wno-import: 禁止所有關於#import的警告信息.
-pedantic:打開完全遵從ANSI C標准所需的全部警告診斷;拒絕接受採用了被禁止的語法擴展的程序.
-Werror:將所有警告轉換為錯誤
Werror選項要求GCC將所有警告當作錯誤進行處理。
-Wall: 顯示所有警告信息

⑷ 在linux中,怎麼用gcc編譯文件

在終端中輸入 gcc 文件名 -o 目標文件名
然後 ./目標文件名 就行了,沒有目標文件名,自動存為 a
執行 ./a 就行了。

在使用Gcc編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,其中多數參數我們可能根本就用不到,這里只介紹其中最基本、最常用的參數。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
-c,只編譯,不連接成為可執行文件,編譯器只是由輸入的.c等源代碼文件生成.o為後綴的目標文件,通常用於編譯不包含主程序的子程序文件。
-o output_filename,確定輸出文件的名稱為output_filename,同時這個名稱不能和源文件同名。如果不給出這個選項,gcc就給出預設的可執行文件a.out。
-g,產生符號調試工具(GNU的gdb)所必要的符號資訊,要想對源代碼進行調試,我們就必須加入這個選項。
-O,對程序進行優化編譯、連接,採用這個選項,整個源代碼會在編譯、連接過程中進行優化處理,這樣產生的可執行文件的執行效率可以提高,但是,編譯、連接的速度就相應地要慢一些。
-O2,比-O更好的優化編譯、連接,當然整個編譯、連接過程會更慢。
-Idirname,將dirname所指出的目錄加入到程序頭文件目錄列表中,是跡行運在預編譯過程中使用的參數。C程序中的頭文件包含兩種情況∶
A)#include <myinc.h>
B)#include 「myinc.h」
其中,A類使用尖括弧(< >),B類使用雙引號(「 」)。對於A類,預處理程序cpp在系統預設包含文件目錄(如/usr/include)中搜尋相應的文件,而B類,預處理程序在目姿梁標文件的文件夾內搜索相應文件。

GCC執行過程示例

示例代碼 a.c:
#include <stdio.h>
int main()
{
printf("hello\n");
}
預編譯過程:
這個過程處理宏定義和include,並做語法檢查。
可以看到預編譯後,代碼從5行擴帶旦展到了910行。
gcc -E a.c -o a.i
cat a.c | wc -l
5
cat a.i | wc -l
910
編譯過程:
這個階段,生成匯編代碼。
gcc -S a.i -o a.s
cat a.s | wc -l
59
匯編過程:
這個階段,生成目標代碼。
此過程生成ELF格式的目標代碼。
gcc -c a.s -o a.o
file a.o
a.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped
鏈接過程:
鏈接過程。生成可執行代碼。鏈接分為兩種,一種是靜態鏈接,另外一種是動態鏈接。使用靜態鏈接的好處是,依賴的動態鏈接庫較少,對動態鏈接庫的版本不會很敏感,具有較好的兼容性;缺點是生成的程序比較大。使用動態鏈接的好處是,生成的程序比較小,佔用較少的內存。
gcc a.o -o a
程序運行:
./a
hello
編輯本段
GCC編譯簡單例子

編寫如下代碼:
#include <stdio.h>
int main()
{
printf("hello,world!\n");
}
執行情況如下:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
gcc -c hello.s -o hello.o
gcc hello.c -o hello
./hello
hello,world!

⑸ linux中如何用gcc編譯用vi寫的c文件

方法/步驟

1、進入linux系統,創建C文件「vim test.c」同時進入vim編輯界面也可以利用指令「touch test.c」創建後,然後「vim test.c」進入vim編輯界面。

閱讀全文

與linuxgcc安全編譯選項相關的資料

熱點內容
有什麼軟體可以傳app 瀏覽:421
sn8p2501單片機編程器 瀏覽:92
android獲取系統鈴聲 瀏覽:169
現在什麼app能搜到作業答案 瀏覽:565
編程序求sn 瀏覽:816
多叉樹遍歷java 瀏覽:510
計算機進行重鏡像網路文件夾位置 瀏覽:556
活動策劃全攻略pdf 瀏覽:810
python3中range 瀏覽:444
編碼法的微命令個數 瀏覽:638
程序員怎麼和產品溝通 瀏覽:91
學習python的十大技巧 瀏覽:516
linux網路編程書 瀏覽:796
python中導入模塊 瀏覽:433
matlab參數優化演算法 瀏覽:302
立即執行命令視頻 瀏覽:368
一個切開橙子的圖標是什麼app 瀏覽:332
stm32esp8266雲伺服器 瀏覽:218
不可編程的計算器 瀏覽:415
如何開啟連接無線網伺服器 瀏覽:272