一、大小寫字尾的區別
.s
組合語言源程式;彙編
.s
組合語言源程式;預處理,彙編
小寫的s檔案,在後期階段不在進行預處理操作,所以我們不能在這裡面寫預處理的語句在裡面
大寫的s檔案,還會進行預處理、彙編等操作,所以我們可以在這裡面加入預處理的命令
二、編譯的相關流程
預處理(pre-processing)-->編譯(compiling)-->彙編(assembling)-->鏈結(linking)
1、預處理器
根據以字元#開頭的命令(directives),修改原始的c程式
這個階段並不會去檢查**的錯誤,只會把#的語句轉成c**
[gan@localhost gcc]# gcc e hello.c o hello.i
2、編譯階段
在這個階段中,gcc首先要檢查**的規範性、是否有語法錯誤等,以確定**的實際要做的工作,在檢查無誤後,gcc把**翻譯成組合語言。使用者可以使用」-s」選項來進行檢視,該選項只進行編譯而不進行彙編,生成彙編**。組合語言是非常有用的,它為不同高階語言不同編譯器提供了通用的語言。如:c編譯器和fortran編譯器產生的輸出檔案用的都是一樣的組合語言。
[gan@localhost gcc]# gcc s hello.i o hello.s
(3)彙編階段
彙編階段是把編譯階段生成的」.s」檔案轉成目標檔案,讀者在此可使用選項」-c」就可看到彙編**已轉化為」.o」的二進位制目標**了。如下所示:
[gan@localhost gcc]# gcc c hello.s(小寫s) o hello.o
(4)鏈結階段
將庫函式(標頭檔案中用到的)等鏈結到目標檔案中
在成功編譯之後,就進入了鏈結階段。在這裡涉及到乙個重要的概念:函式庫
"stdio.h"中也只有該函式的宣告,而沒有定義函式的實現,那麼,是在**實現」printf」這些庫函式的呢?最後的答案是:系統把這些函式實現都被做到名為libc.so.6的庫檔案中去了,在沒有特別指定時,gcc會到系統預設的搜尋路徑」/usr/lib」下進行查詢,也就是鏈結到libc.so.6庫函式中去,這樣就能實現函式」printf」 了,而這也就是鏈結的作用。
函式庫一般分為靜態庫和動態庫兩種。靜態庫是指編譯鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不再需要庫檔案了。其字尾名一般為」.a」。動態庫與之相反,在編譯鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時由執行時鏈結檔案載入庫,這樣可以節省系統的開銷。動態庫一般字尾名為」.so」,如前面所述的libc.so.6就是動態庫。gcc在編譯時預設使用動態庫。
完成了鏈結之後,gcc就可以生成可執行檔案
[gan@localhost gcc]# gcc hello.o o hello
摘錄 彙編檔案字尾 s 與 S
一 大小寫字尾的區別 s 組合語言源程式 彙編 s 組合語言源程式 預處理,彙編 小寫的s檔案,在後期階段不在進行預處理操作,所以我們不能在這裡面寫預處理的語句在裡面 大寫的s檔案,還會進行預處理 彙編等操作,所以我們可以在這裡面加入預處理的命令 二 編譯的相關流程 預處理 pre processi...
彙編檔案 s 和 S 區別
s 組合語言源程式 操作 彙編 s組合語言源程式 操作 預處理 彙編 1.小寫的 s檔案,在後期階段不會再進行預處理操作了,所以我們不能在其內寫上預處理語句。一般是 c 檔案經過彙編器處理後的輸出。如 gcc 編譯器就可以指定 s 選項進行輸出,且是經過預處理器處理後 的了。2.大寫的 s 檔案,還...
彙編檔案 s和 S的區別
s 組合語言源程式 操作 彙編 s組合語言源程式 操作 預處理 彙編 1.小寫的 s檔案,在後期階段不會再進行預處理操作了,所以我們不能在其內寫上預處理語句。一般是 c 檔案經過彙編器處理後的輸出。如 gcc 編譯器就可以指定 s 選項進行輸出,且是經過預處理器處理後 的了。2.大寫的 s 檔案,還...