歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Unix知識 >> Unix教程 >> UNIX系統 目標文件初探

UNIX系統 目標文件初探

日期:2017/2/27 17:40:07   编辑:Unix教程
UNIX(R) 系統中運行的程序遵守一種稱為目標文件格式的精心設計。了解更多關於目標文件格式的內容,以及可以用來研究系統中目標文件的工具。

計算機編程的最新技術將一種特殊的人性與一組特殊的工具結合在一起,用以生產出對其他人非常有幫助的一種神奇的產品,即軟件。計算機程序員是一群注重細節的人,他們可以處理計算機中各種各樣的困難。計算機的要求非常苛刻,並且不能容忍其中存在任何的偏差。毫無疑問,無論您的個性如何以及在工作中使用了何種輔助工具,計算機程序的編寫都是非常困難的。

在 UNIX® 和 Linux® 中,任何事物都是文件。您可以認為,UNIX 和 Linux 編程實際上是編寫處理各種文件的代碼。系統由許多類型的文件組成,但目標文件具有一種特殊的設計,提供了靈活和多樣的用途。

目標文件是包含帶有附加地址和值的助記符號的路線圖。這些符號可以用來對各種代碼段和數據段進行命名,包括經過初始化的和未初始化的。它們也可以用來定位嵌入的調試信息,就像語義 Web,非常適合由程序進行閱讀。

行業工具

計算機編程中使用的工具包括代碼編輯器,如 vi 或 Emacs,您可以使用這些工具輸入和編輯希望計算機在完成所需任務時執行的指令,以及編譯器和連接器,它們可以生成真正實現這些目標的機器代碼。

高級的工具,稱為集成調試環境 (IDE),它以統一的外觀集成了不同工具的功能。IDE 使得編輯器、編譯器、連接器和調試器之間的界限變得很模糊。因此,為了更深入地研究和了解系統,在使用集成的套件之前,最好先單獨地使用這些工具。(注意:IDE 也通常被稱為集成開發環境。)

編譯器可以將您在代碼編輯器中創建的文本轉換為目標文件。最初,目標文件被稱為代碼的中間表示形式,因為它用作連接編輯器(即連接器)的輸入,而連接編輯器最終完成整個任務並生成可執行的程序作為輸出。

從代碼到可執行代碼的轉換過程經過了良好的定義並實現了自動化,而目標文件是這個鏈中有機的連接性環節。在這個轉換過程中,目標文件作為連接編輯器所使用的映象,使得它們能夠解析各種符號並將不同的代碼和數據段連接在一起形成統一的整體。

歷史

計算機編程領域中存在許多著名的目標文件格式。DOS 系列包括 COM、OBJ 和 EXE 格式。UNIX 和 Linux 使用 a.out、COFF 和 ELF。Microsoft® Windows® 使用可移植的執行文件 (PE) 格式,而 Macintosh 使用 PEF、Mach-O 和其他文件格式。

最初,各種類型的計算機具有自己獨特的目標文件格式,但隨著 UNIX 和其他在不同硬件平台上提供可移植性的操作系統的出現,一些常用的文件格式上升為通用的標准。其中包括 a.out、COFF 和 ELF 格式。

要了解目標文件,需要一組可以讀取目標文件中不同部分並以更易於讀取的格式顯示這些內容的工具。本文將討論這些工具中比較重要的方面。但首先,您必須創建一個工作台,並在其中建立一個研究對象。

工作台

啟動一個 xterm 會話,讓我們先創建一個空白的工作台,並開始對目標文件進行研究。下面的命令創建了一個目錄,可以將目標文件放到該目錄中進行研究:

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 工具庫中提供的各種工具,可以將這個簡單的“Hello World”程序作為研究的對象。您將學習構建和查看目標文件的輸出,而不是使用任何快捷方法直接創建可執行文件(的確有許多這樣的快捷方法)。

文件格式

C 編譯器的正常輸出是用於您所指定的目標處理器的匯編代碼。匯編代碼是匯編器的輸入,在缺省情況下,匯編器將生成所有目標文件的祖先,即 a.out 文件。這個名稱本身表示匯編輸出 (Assembler Output)。要創建 a.out 文件,可以在 xterm 窗口中輸入下面的命令:

cc hw.c

注意:如果出現了任何錯誤或者沒有創建 a.out 文件,那麼您可能需要檢查自己的系統或源文件 (hw.c),以找出其中的錯誤。還需要檢查是否已將 cc 定義為運行您的 C/C++ 編譯器。

最新的 C 編譯器將編譯和匯編步驟組合成一個步驟。您可以指定不同開關選項以查看 C 編譯器的匯編輸出。通過輸入下面的命令,您可以看到 C 編譯器的匯編輸出:

cc -S hw.c

這個命令生成了一個新的文件 hw.s,其中包含您通常無法看到的匯編輸入文本,因為編譯器在缺省情況下將生成 a.out 文件。正如所預期的,UNIX 匯編程序可以對這種輸入文件進行匯編,以生成 a.out 文件。

Copyright © Linux教程網 All Rights Reserved