目標代碼(objectcode)指計算機科學中編譯器或彙編器處理原始碼後所生成的代碼,它一般由機器代碼或接近於機器語言的代碼組成。[1]目標檔案(objectfile)即存放目標代碼的計算機檔案,它常被稱作二進制檔案(binaries)。
目標檔案包含著機器代碼(可直接被計算機中央處理器執行)以及代碼在運行時使用的數據,如重定位信息,如用於連結或調試的程式符號(變數和函式的名字),此外還包括其他調試信息。[2]目標檔案是從原始碼檔案產生程式檔案這一過程的中間產物,連結器正是通過把目標檔案連結在一起來生成執行檔或庫檔案。目標檔案中唯一的要素是機器代碼,例如,用於嵌入式系統的目標檔案可能僅僅含有機器代碼。
目標檔案格式
目標檔案用以存放目標代碼和由編譯器或彙編器生成的相關數據的計算機檔案格式稱為目標檔案格式。
目標檔案格式有許多不同的種類。最初每種類型計算機都擁有自身獨特的格式,但隨著Unix和其他可移植作業系統的問世,人們定義了例如COFF和ELF這些格式,並在不同的系統上使用它們。通常,連結器的輸入和輸出使用相同的檔案格式,庫檔案和執行檔格式也是一樣使用相同的格式。
設計或選擇一種目標檔案格式是計算系統整體設計的關鍵部分。它影響著連結器的性能並因此影響著程式設計師在開發時的總耗時;如果格式是用於執行檔,那么格式的設計還會影響程式的開始運行花費的時間,以及影響到系統對用戶請求的反應速度。大部分目標檔案格式以區塊的方式來組織,每一區塊中都裝載著同種數據。在虛擬記憶體系統需要這些塊的時候,它可以通過將這些塊分頁後調入,無需進一步地處理就可使用。
最簡單的目標檔案格式是DOS的COM檔案格式,它是一種僅僅由原始數據組成的檔案。COM格式的檔案始終被載入到某固定位置。其他的格式都由一組複雜精密的數據結構序列組成,這些格式的規範說明書一般會有許多頁。
調試信息可以是目標檔案格式中的一個組成部分,就像COFF中的那樣,或是一種可能被數個目標格式使用的半獨立格式,如stabs或DWARF。
GNU計畫的bfd庫提供了一套通用的應用程式編程接口用來操縱各式各樣的目標檔案格式。
典型的目標檔案格式所支持的數據類型有:
符號起始區塊(BSSBlockStartedbySymbol的縮寫)
正文段(textsegment或譯作代碼段)
數據段(datasegment)
主要格式
DOS
COM
EXE(MZ)
可重定位目標模組格式(RelocatableObjectModuleFormat一般稱作“OBJ檔案”或“OMF”,也在微軟視窗作業系統中被一些開發工具廠商所使用)
嵌入式系統
IEEE-695
S-records
Macintosh
PEF/CFM
Unix
a.out(Unix/Linux)
COFF(SystemV)
ECOFF(Mips)
XCOFF(AIX)
可執行與可連結檔案格式(SystemV縮寫為ELF,用於大多數現代計算系統中)
Mach-O(NeXT,MacOSX)
視窗(Windows)
16位的NewExecutable
PortableExecutable
其他
IBM360目標格式
NetWare可載入模組(NetWareLoadableModule縮寫為NLM)
OMF(VME)
SOM(HP)
XBE(Xbox的執行檔格式)
APP(SymbianOS的執行檔格式)
可重定位動態目標檔案格式(RelocatableDynamicObjectFileFormat縮寫為RDOFF)
hunk(AMIGAOS)