c語言中編譯鏈接的整個過程


C語言的編譯鏈接過程要把我們編寫的一個c程序(源代碼)轉換成可以在硬件上運行的程序(可執行代碼),需要進行編譯和鏈接。編譯就是把文本形式源代碼翻譯爲機器語言形式的目標文件的過程。鏈接是把目標文件、操作系統的啓動代碼和用到的庫文件進行組織形成最終生成可執行代碼的過程。

      編譯 
         編譯是讀取源程序(字符流),對之進行詞法和語法的分析,將高級語言指令轉換爲功能等效的彙編代碼,源文件的編譯過程包含兩個主要階段: 
         第一個階段是預處理階段,在正式的編譯階段之前進行。預處理階段將根據已放置在文件中的預處理指令來修改源文件的內容。c語言中預處理的主要要做的工作就是:去註釋、替代宏值、打開頭文件和條件編譯。

   第二個階段編譯、優化階段,經過預編譯得到的輸出文件中,只有常量;如數字、字符串、變量的定義,以及C語言的 關鍵字,如main,if,else,for,while,{,}, +,-,*,\等等。 
   編譯程序所要作得工作就是通過詞法分析和語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼表示或彙編代碼。

  彙編 
   彙編實際上指把彙編語言代碼翻譯成目標機器指令的過程。對於被翻譯系統處理的每一個C語言源程序,都將最終經過這一處理而得到相應的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段: 
   代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。 
  鏈接過程

   鏈接程序的主要工作就是將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成爲一個能夠誒操作系統裝入執行的統一整體。    

   根據開發人員指定的同庫函數的鏈接方式的不同,鏈接處理可分爲兩種:    

   (1)靜態鏈接    在這種鏈接方式下,函數的代碼將從其所在地靜態鏈接庫中被拷貝到最終的
可執行程序中。這樣該程序在被執行時這些代碼將被裝入到該進程的虛擬地址空間中。靜態鏈接庫實際上是一個目標文件的集合,其中的每個文件含有庫中的一個或者一組相關函數的代碼。    

    (2) 動態鏈接   在此種方式下,函數的代碼被放到稱作是動態鏈接庫或共享對象的某個目標文件中。鏈接程序此時所作的只是在最終的可執行程序中記錄下共享對象的名字以及其它少量的登記信息。在此可執行文件被執行時,動態鏈接庫的全部內容將被映射到運行時相應進程的虛地址空間。動態鏈接程序將根據可執行程序中記錄的信息找到相應的函數代碼。

   總結起來編譯過程就上面的四個過程:預編譯、編譯、彙編、鏈接。















  數據段:主要存放程序中要用到的各種全局變量或靜態的數據。一般數據段都是可讀,可寫,可執行的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章