1) 預處理:主要對源碼預編譯語句(如宏定義define)和文件包含進行處理。即對宏指令替換和包含文件放置到需要編譯的文件中,完成后會生成完整的C程序源文件。
2) 編譯:對預處理以后文件進行編譯,生成.s后綴的匯編語言文件,即該文件里是匯編語言的代碼,匯編是一種更底層的語言,直接對硬盤進行操作。
3) 匯編:對匯編語言文件進行匯編,主要調用匯編處理程序來完成匯編,匯編是生成二進制機器代碼的過程,匯編后的文件以.o結尾,稱為目標文件。
4) 鏈接:將多個由匯編生成的目標文件以及引用的庫文件進行模塊鏈接,生成一個完整的可執行文件,鏈接時,所有目標文件被安排在可執行程序的適當位置,同時程序調用的庫函數也從各自所在的函數庫鏈接到程序中。
下面演示C語言代碼 如何轉變成 可執行的二進制文件:
假如現在有段C語言源代碼如下
對其進行預處理,處理后的文件如下圖所示
gcc -E -o a.cxx a.c
生成匯編代碼
gcc -S -o a.s a.c
生成目標文件
gcc -c -o a.o a.c
鏈接生成可執行文件
gcc a.c -o a.out
最后一個可執行文件就生成了
下面是gdb調試程序基本使用
寫一個簡單的c語言程序測試下
生成debug文件
gcc -g -o a.debug hello.c
運行gdb,然后載入調試文件a.debug,list 查看源代碼
break 設置斷點,即運行到第幾行,讓程序暫停一下
info breakpoint 查看斷點,刪除斷點用delete + Num
run 運行程序,如下圖程序會在斷點處暫停
輸入next 讓程序繼續運行一行,輸入continue 讓程序運行到下一個斷點為止
在斷點處可以打印或者操作變量,對排除bug非常有用,退出則按q鍵即可
其他高級的用法可以去查閱相關資料,這里就不一一細說了。