Linux GCC常用命令
目錄
一、示例一
1.簡單編譯
1.1預(yù)處理
1.2編譯為匯編代碼
1.3匯編
1.4連接
?2.多個程序文件的編譯
3檢錯
4庫文件連接
?二、示例二
1.準(zhǔn)備hello.c
?2.預(yù)處理
3.編譯
4.匯編
5.鏈接
6.分析ELF文件
6.1ELF文件的段
6.2反匯編ELF
一、示例一
1.簡單編譯
創(chuàng)建文件mkdir test4
cd? test4
gedit test.c
test.c內(nèi)容如下:
?
?這個程序一步到位的·指令是gcc test.c -o test。這一過程是分為四個階段進(jìn)行的,即預(yù)處理(也稱預(yù)編譯)、編譯、匯編和連接。
1.1預(yù)處理
gcc -E test.c -o test.i 或者gcc -E test.c
gcc 的-E選項 可以讓編譯器在預(yù)處理后停止,并輸出與處理結(jié)果。在本例中,預(yù)處理結(jié)果就是將stdio.h文件中的內(nèi)容插入到test.c中
1.2編譯為匯編代碼
gcc -S test.i -o test.s
gcc的-S選項表示程序編譯期間,在生成匯編代碼之后停止,-o輸出匯編代碼文件。
1.3匯編
gcc -c test.s -o test.o
對于上一小節(jié)生成的匯編代碼文件test.s,gas匯編器負(fù)責(zé)將其編譯為目標(biāo)文件
1.4連接
gcc test.o -o test
?
對于上一小節(jié)中生成的test.o,將其與C標(biāo)準(zhǔn)輸入輸出庫進(jìn)行連接,最終生成程序test,然后執(zhí)行
?2.多個程序文件的編譯
該處內(nèi)容有在上上一篇博客中編寫,有需要可前往。
3檢錯
gcc -pedantic test.c -o test
-pedantic選項能夠幫助程序員發(fā)現(xiàn)一些不符合ANSI/ISO C標(biāo)準(zhǔn)的代碼,但不是全部,事實上只有ANSI/ISO C語言標(biāo)準(zhǔn)中要求進(jìn)行編譯器診斷的情況才有可能被GCC發(fā)現(xiàn)并警告。
gcc -Wall test.c -o test
-Wall能夠使GCC產(chǎn)生更多的警告信息
gcc -Werror test.c -o test
-Werror選項會使GCC在所有產(chǎn)生警告的地方停止編譯,迫使程序員對代碼進(jìn)行修改。
4庫文件連接
函數(shù)庫實際上就是一些頭文件(.h)和庫文件(so、lib、dll)的集合,Linux下的大多數(shù)函數(shù)都默認(rèn)頭文件放到/usr/include目錄下,而庫文件則放到/usr/lib目錄下,但有時候需要用到的庫不在這些目錄下,所以GCC在編譯時必須用自己的辦法來查找所需的頭文件和庫文件。
test.c是在Linux上使用c連接mysql,需要去官網(wǎng)下載MySQL Connectors的C庫,里面有一個include文件夾,包含mysql connectors的頭文件,還有一個lib文件夾,里面包含二進(jìn)制so文件libmysqlclient.so
include文件夾路徑為/usr/dev/mysql/include.lib? ??
lib文件夾是/usr/dev/mysql/lib
編譯成可執(zhí)行文件
gcc -c -I /usr/dev/mysql/include test.c -o test.o
鏈接
把所有目標(biāo)文件鏈接成可執(zhí)行文件
gcc -L /usr/dev/mysql/lib -lmysqlclient test.o -o test
?
強(qiáng)制鏈接時使用靜態(tài)庫
默認(rèn)情況下,GCC在鏈接時會優(yōu)先使用動態(tài)庫。為了讓GCC在鏈接時只用到靜態(tài)庫可使用以下命令
gcc -L /usr/dev/mysql/lib? -static -lmysqlclient test.o -o test
?二、示例二
1.準(zhǔn)備hello.c
?2.預(yù)處理
gcc -E hello.c -o hello.i
3.編譯
gcc -S hello.i -o hello.s
?
4.匯編
gcc -c hello.s -o hello.o或者as -c hello.s -o hello.o
?
5.鏈接
若使用命令gcc hello.c -o hello則會使用動態(tài)庫進(jìn)行鏈接,生成的ELF可執(zhí)行文件大小和鏈接的動態(tài)庫如下所示
?若使用命令gcc -static hello.c -o hello則會使用靜態(tài)庫進(jìn)行鏈接,生成的ELF可執(zhí)行文件大小和鏈接的動態(tài)庫如下所示
6.分析ELF文件
6.1ELF文件的段
readelf -S hello
6.2反匯編ELF
objdump -D hello
使用objdump -S將其反匯編并且將其C語言源代碼混合顯示出來
gcc -o hello -g hello.c
objdump -S hello
?
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Linux GCC常用命令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: adb 录屏+ps将转gif、截图
- 下一篇: linux 其他常用命令