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