目标代码文件、可执行文件和库
C編程的基本策略是使用程序?qū)⒃创a轉(zhuǎn)換為可執(zhí)行文件,此文件包含可運行的機(jī)器語言代碼。C分兩步完成這一工作:編譯和鏈接。編譯器將源代碼轉(zhuǎn)換為中間代碼,連接器將此中間代碼與其他代碼相結(jié)合來生成可執(zhí)行文件。C使用被劃分為兩部分的這一方法使程序便于模塊化,你可以分別編譯各個模塊,然后使用連接器將編譯過的模塊結(jié)合起來。這樣,如何需要改變一個模塊,則不必重新編譯所有其他模塊。同時,鏈接器將您的程序與編譯的庫代碼結(jié)合起來。
? ? 中間文件的形式有多種選擇。最一般的選擇,同時也是我們這里講述的實現(xiàn)方式所采取的選擇,是將源代碼轉(zhuǎn)換為機(jī)器代碼。將結(jié)果放置在一個目標(biāo)代碼文件(或簡稱目標(biāo)文件)中(這里假定您的源代碼由單個文件組成)。雖然目標(biāo)文件包含機(jī)器語言代碼,但該文件還不能運行。目標(biāo)文件包含源代碼的轉(zhuǎn)換結(jié)果,但它還不是一個完整的程序。
? ? 目標(biāo)代碼文件中所缺少的第一個元素是一種叫做啟動代碼(Start-up code)的東西,此代碼相當(dāng)于您的程序和操作系統(tǒng)之間的接口。例如你可以在dos 或Linux下運行一個 IBM PC 兼容機(jī),在兩種情況中硬件是相同的,所以都會使用同樣的目標(biāo)代碼,但是 DOS與Linux要使用不用的啟動代碼,因為這兩種系統(tǒng)處理程序的方式不同的。
所缺少的第二個元素是庫例程的代碼。幾乎所有C程序都利用標(biāo)準(zhǔn)庫中所包含的例程(稱為函數(shù))。例如,前面的concrete.c使用了函數(shù)printf()。目標(biāo)代碼文件不包含這一函數(shù)的指令。實際代碼存儲在另一個稱為“庫”的文件中,庫文件中包含許多函數(shù)的目標(biāo)代碼。
? ? 鏈接器的作用是將這3個元素(目標(biāo)代碼、系統(tǒng)的標(biāo)準(zhǔn)啟動代碼和庫代碼)結(jié)合在一起,并將他們存放在單個文件,即可執(zhí)行文件中。對庫代碼來說,鏈接器只從庫中提取您所使用的函數(shù)所需的代碼(見圖1.4所示)
簡而言之,目標(biāo)文件和可執(zhí)行文件都是由機(jī)器語言指令組成的。但目標(biāo)文件只包含您所編寫的代碼轉(zhuǎn)換成的機(jī)器語言,而可執(zhí)行文件還包含您所使用的庫例程以及啟動代碼。
總結(jié)
以上是生活随笔為你收集整理的目标代码文件、可执行文件和库的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LC_ALL=C的含义
- 下一篇: x86中的页表结构和页表项格式