初探Unix操作系統(tǒng)目標(biāo)文件
在我們使用Unix操作系統(tǒng)的開(kāi)始階段,我們也許對(duì)Unix操作系統(tǒng)不敢嘗試更好的方法,因?yàn)槲覀儾恢涝撛趺词褂茫裉煳覀兙蛠?lái)對(duì)Unix操作系統(tǒng)目標(biāo)文件進(jìn)行初探。
Unix操作系統(tǒng)中運(yùn)行的程序遵守一種稱(chēng)為目標(biāo)文件格式的精心設(shè)計(jì)。了解更多關(guān)于目標(biāo)文件格式的內(nèi)容,以及可以用來(lái)研究系統(tǒng)中目標(biāo)文件的工具。
計(jì)算機(jī)編程的***技術(shù)將一種特殊的人性與一組特殊的工具結(jié)合在一起,用以生產(chǎn)出對(duì)其他人非常有幫助的一種神奇的產(chǎn)品,即軟件。計(jì)算機(jī)程序員是一群注重細(xì)節(jié)的人,他們可以處理計(jì)算機(jī)中各種各樣的困難。計(jì)算機(jī)的要求非??量蹋⑶也荒苋萑唐渲写嬖谌魏蔚钠?。毫無(wú)疑問(wèn),無(wú)論您的個(gè)性如何以及在工作中使用了何種輔助工具,計(jì)算機(jī)程序的編寫(xiě)都是非常困難的。
在 Unix操作系統(tǒng)® 和 Linux® 中,任何事物都是文件。您可以認(rèn)為,Unix操作系統(tǒng) 和 Linux 編程實(shí)際上是編寫(xiě)處理各種文件的代碼。系統(tǒng)由許多類(lèi)型的文件組成,但目標(biāo)文件具有一種特殊的設(shè)計(jì),提供了靈活和多樣的用途。
目標(biāo)文件是包含帶有附加地址和值的助記符號(hào)的路線圖。這些符號(hào)可以用來(lái)對(duì)各種代碼段和數(shù)據(jù)段進(jìn)行命名,包括經(jīng)過(guò)初始化的和未初始化的。它們也可以用來(lái)定位嵌入的調(diào)試信息,就像語(yǔ)義 Web,非常適合由程序進(jìn)行閱讀。
Unix操作系統(tǒng)行業(yè)工具
計(jì)算機(jī)編程中使用的工具包括代碼編輯器,如 vi 或 Emacs,您可以使用這些工具輸入和編輯希望計(jì)算機(jī)在完成所需任務(wù)時(shí)執(zhí)行的指令,以及編譯器和連接器,它們可以生成真正實(shí)現(xiàn)這些目標(biāo)的機(jī)器代碼。
高級(jí)的工具,稱(chēng)為集成調(diào)試環(huán)境 (IDE),它以統(tǒng)一的外觀集成了不同工具的功能。IDE 使得編輯器、編譯器、連接器和調(diào)試器之間的界限變得很模糊。因此,為了更深入地研究和了解系統(tǒng),在使用集成的套件之前,***先單獨(dú)地使用這些工具。(注意:IDE 也通常被稱(chēng)為集成開(kāi)發(fā)環(huán)境。)
編譯器可以將您在代碼編輯器中創(chuàng)建的文本轉(zhuǎn)換為目標(biāo)文件。最初,目標(biāo)文件被稱(chēng)為代碼的中間表示形式,因?yàn)樗米鬟B接編輯器(即連接器)的輸入,而連接編輯器最終完成整個(gè)任務(wù)并生成可執(zhí)行的程序作為輸出。
從代碼到可執(zhí)行代碼的轉(zhuǎn)換過(guò)程經(jīng)過(guò)了良好的定義并實(shí)現(xiàn)了自動(dòng)化,而目標(biāo)文件是這個(gè)鏈中有機(jī)的連接性環(huán)節(jié)。在這個(gè)轉(zhuǎn)換過(guò)程中,目標(biāo)文件作為連接編輯器所使用的映象,使得它們能夠解析各種符號(hào)并將不同的代碼和數(shù)據(jù)段連接在一起形成統(tǒng)一的整體。
歷史
計(jì)算機(jī)編程領(lǐng)域中存在許多著名的目標(biāo)文件格式。DOS 系列包括 COM、OBJ 和 EXE 格式。Unix操作系統(tǒng) 和 Linux 使用 a.out、COFF 和 ELF。Microsoft® Windows® 使用可移植的執(zhí)行文件 (PE) 格式,而 Macintosh 使用 PEF、Mach-O 和其他文件格式。
最初,各種類(lèi)型的計(jì)算機(jī)具有自己獨(dú)特的目標(biāo)文件格式,但隨著Unix操作系統(tǒng)和其他在不同硬件平臺(tái)上提供可移植性的操作系統(tǒng)的出現(xiàn),一些常用的文件格式上升為通用的標(biāo)準(zhǔn)。其中包括 a.out、COFF 和 ELF 格式。
要了解目標(biāo)文件,需要一組可以讀取目標(biāo)文件中不同部分并以更易于讀取的格式顯示這些內(nèi)容的工具。本文將討論這些工具中比較重要的方面。但首先,您必須創(chuàng)建一個(gè)工作臺(tái),并在其中建立一個(gè)研究對(duì)象。
工作臺(tái)
啟動(dòng)一個(gè) xterm 會(huì)話,讓我們先創(chuàng)建一個(gè)空白的工作臺(tái),并開(kāi)始對(duì)目標(biāo)文件進(jìn)行研究。下面的命令創(chuàng)建了一個(gè)目錄,可以將目標(biāo)文件放到該目錄中進(jìn)行研究:
- cd
- mkdir src
- cd src
- mkdir hw
- cd hw
然后,使用您最喜歡的代碼編輯器,在 $HOME/src/hw 目錄中輸入清單 1 中的程序,并命名為 hw.c。
清單 1. hw.c 程序
- #include <stdio.h>
- int main(void)
- { printf("Hello World!\n");
- return 0;}
要使用Unix操作系統(tǒng) 工具庫(kù)中提供的各種工具,可以將這個(gè)簡(jiǎn)單的“Hello World”程序作為研究的對(duì)象。您將學(xué)習(xí)構(gòu)建和查看目標(biāo)文件的輸出,而不是使用任何快捷方法直接創(chuàng)建可執(zhí)行文件(的確有許多這樣的快捷方法)。
文件格式
C 編譯器的正常輸出是用于您所指定的目標(biāo)處理器的匯編代碼。匯編代碼是匯編器的輸入,在缺省情況下,匯編器將生成所有目標(biāo)文件的祖先,即 a.out 文件。這個(gè)名稱(chēng)本身表示匯編輸出 (Assembler Output)。要?jiǎng)?chuàng)建 a.out 文件,可以在 xterm 窗口中輸入下面的命令:cc hw.c
注意:如果出現(xiàn)了任何錯(cuò)誤或者沒(méi)有創(chuàng)建 a.out 文件,那么您可能需要檢查自己的系統(tǒng)或源文件 (hw.c),以找出其中的錯(cuò)誤。還需要檢查是否已將 cc 定義為運(yùn)行您的 C/C++ 編譯器。
***的 C 編譯器將編譯和匯編步驟組合成一個(gè)步驟。您可以指定不同開(kāi)關(guān)選項(xiàng)以查看 C 編譯器的匯編輸出。通過(guò)輸入下面的命令,您可以看到 C 編譯器的匯編輸出:cc -S hw.c
這個(gè)命令生成了一個(gè)新的文件 hw.s,其中包含您通常無(wú)法看到的匯編輸入文本,因?yàn)榫幾g器在缺省情況下將生成 a.out 文件。正如所預(yù)期的,Unix操作系統(tǒng)匯編程序可以對(duì)這種輸入文件進(jìn)行匯編,以生成 a.out 文件。
希望以上的關(guān)于Unix操作系統(tǒng)的知識(shí)對(duì)大家有所幫助。
【編輯推薦】