C/C++編譯原理

  • 整體過程

C源程序——>預編譯處理(.c)——>編譯、優化程序(.s、 .asm)——>彙編程序(.obj、 .o、 .a、 .ko)——>鏈接程序(.exe、 .elf、 .axf等)


C/C++編譯就是將C/C++的代碼映射到相應的機器碼,以及討論其中的內存管理模式,包括內存的分配,如何使用等等,整型、數組、指針等這些在內存中的實現機制。


  • 分點解析

編譯將相應的高級語言代碼映射到彙編語言,處理define,include等命令,加載外部的代碼;


彙編:將彙編語言映射到機器碼;該階段將彙編代碼翻譯成目標文件,此時的文件爲二進制代碼。在windows環境下該文件的後綴名爲:.obj,但此時的文件是不可執行的,必須通過鏈接的方式才能夠執行;而在在Linux環境下,則對應生成後綴爲:.o、 .a、 .ko的文件。 目標文件由段組成。通常一個目標文件中至少有兩個段:

代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執行的,但一般卻不可寫。

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


鏈接:源文件被翻譯成目標代碼後需要被鏈接到一起才能被執行。所以需要形成相應的動態和靜態鏈接庫。動態連接庫是在程序運行時動態的加載,靜態連接庫是直接拷貝進入程序,在程序執行時,這些靜態連接庫加載進來。 


補充

編譯單元:根據C++標準,每一個CPP文件就是一個編譯單元。每個編譯單元之間是相互獨立並且互相不可知。


目標文件:由編譯所生成的文件,以機器碼的形式包含了編譯單元裏所有的代碼和數據,還有一些其他信息,如未解決符號表,導出符號表和地址重定向表等。目標文件是以二進制的形式存在的。


鏈接器的工作順序當鏈接器進行鏈接的時候,首先決定各個目標文件在最終可執行文件裏的位置。然後訪問所有目標文件的地址重定義表,對其中記錄的地址進行重定向(加上一個偏移量,即該編譯單元在可執行文件上的起始地址)。然後遍歷所有目標文件的未解決符號表,並且在所有的導出符號表裏查找匹配的符號,並在未解決符號表中所記錄的位置上填寫實現地址。最後把所有的目標文件的內容寫在各自的位置上,再作一些另的工作,就生成一個可執行文件。

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