Objektový soubor

Objektový soubor je počítačový soubor, který je obvykle generovan vývojářskými utilitami a využívá se k sestavení spustitelného programu. Obsahuje strojové instrukce programu, data a metadata. Objektový soubor může být vytvořen pomocí překladače (kompilátorem), asemblerem nebo je výstupem linkeru. Kompilátor překládá zdrojový kód programovacího jazyka do strojově čitelné formy známé jako strojový kód. Díky objektovým souborům můžeme programy snáze komponovat do modulů a ty pak můžeme linkerem seskupit do jednoho souboru. Zavaděč (dynamický linker) zase objektový soubor používá k načtení programu do paměti a při spuštění zavede potřebné knihovny.

Objektový soubor obsahuje pět druhů informací1:

  • Hlavička: informace o souboru, například velikost kódu, název zdrojového souboru, ze kterého byl přeložen a datum vytvoření.
  • Strojový kód: binární instrukce a data generovány kompilerem nebo asemblerem.
  • Relokace: seznam míst ve strojovém kódu, do kterých linker ve strojovém kódu doplní adresy.
  • Symboly: globální proměnné definované v daném modulu, symboly které mají být importovány z jiných modulů nebo jsou definovány linkerem.
  • Debugovací informace: ostatní informace o objektovém kódu které jsou při linkování používané k debugování. To zahrnuje zdrojový kód a čísla řádků kódu, lokální symboly, popisy datových struktur používané strojovým kódem.

Běžně je objektový objekt označen příponou .o nebo .obj. Nejběžnější formát je Common File File Format (COFF) v systémech Windows® a UNIX. COFF je primárně objektový soubor, nad kterým je postaven Windowsový EXE. Linuxové systémy často používají COFF jako objektový soubor, ale už ne jako nosič pro spustitelné soubory. V mnoha Unix systémech se setkáte taky s formátem ELF. Na Mac se používá Mach-O.

Sekce

Objektový soubor je rozdělen do několika sekcí. Obvykle jsou některé konkrétní sekce relevantní pro spustitelný soubor a některé jen pro objektový.

Spustitelný kód (.text)

Strojový kód platformy, typicky spuštitelný a slouží jen pro čtení.

Block started by symbol (.bss)

Obsahuje neinicializovaná (nulová) data. Parametrem této sekce je velikost místa vyhrazeného pro neinicializované statické a globální proměnné. Unixové systémy a Windows inicializují sekci .bss na nulu. Díky této sekci je zajištěné chování programu tak, že globální proměnné, statické proměnné dostanou místo při zavolání programu a zůstane jim přidělené do konce běhu programu.

Data (.data)

Inicializovaná globální data, tzn. statické a globální proměnné.

Data (.rdata)

Konstantní proměnné.

Tabulka symbolů

Symbol reprezentuje nějakou adresu. V programovacím jazyce jsou symboly jako jména proměnných, funkcí, struktur a uživatelem zavedené datové typy a podobně. Symboly musí být v daném jmenném prostoru jednoznačné, aby bylo možné sestavit výsledný program. V některých jazycích je přetěžování funkcí implementováno pomocí name manglingu (dekorátoru) přes tabulku symbolů.

Relokační tabulka (.reloc)

Posloupnost struktur, které říkají na určité adrese souboru se má spočítat skutečná adresa podle určitých kriterií.

Informace pro linker (.directive)

Obsahuje ANSI nebo BOM+UTF8 řetězec direktiv pro linker.

Importní tabulka (.idata)

Potřebujeme je hlavně ve spustitelném souboru. V importní tabulce máme jména knihoven na kterých naše aplikace závisí.

Exportní tabulka (.edata)

Rozdíl mezi Spustitelným souborem a objektovým souborem

Jméno sekce Spustitelný soubor Objektový soubor
.bss Ano Ano
.text Ano Ano
.data Ano Ano
.rdata Ano Ano
.edata Ano NE
.idata Ano NE
.reloc Ano NE
.directive NE ANO
.cormeta NE ANO

  1. John R. Levine. 1999. Linkers and Loaders (1st. ed.). 

Související