匯編文件后綴.s與.S


轉載: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM