1. 程式人生 > >匯編文件後綴.s與.S

匯編文件後綴.s與.S

proc 進制 做的 相關 cti 流程 選項 動態 printf

轉載:http://www.cnblogs.com/IamEasy_Man/archive/2011/08/10/2134212.html

一。大小寫後綴的區別:

.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