Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tato specifikace popisuje strukturu spustitelných souborů (imagí) a souborů objektů v rámci řady operačních systémů Windows. Tyto soubory se označují jako soubory PORTABLE Executable (PE) a Common Object File Format (COFF).
Poznámka:
Tento dokument je poskytován za účelem pomoci při vývoji nástrojů a aplikací pro Windows, ale není zaručeno, že bude kompletní specifikace ve všech ohledech. Společnost Microsoft si vyhrazuje právo tento dokument bez předchozího upozornění změnit.
Tato revize specifikace Microsoft Portable Executable a Common Object File Format Specification nahrazuje všechny předchozí revize této specifikace.
Obecné koncepty
Tento dokument určuje strukturu spustitelných souborů (imagí) a souborů objektů v rámci řady operačních systémů Microsoft Windows. Tyto soubory se označují jako soubory PORTABLE Executable (PE) a Common Object File Format (COFF). Název "Portable Spustitelný soubor" odkazuje na skutečnost, že formát není specifický pro architekturu.
Některé koncepty, které se zobrazují v rámci této specifikace, jsou popsány v následující tabulce:
| Název | Popis |
|---|---|
| atribut certificate |
Certifikát, který slouží k přidružení ověřitelných příkazů k imagi. K souboru lze přidružit několik různých ověřitelných příkazů; Jedním z nejužitečnějších je prohlášení výrobce softwaru, který indikuje, co má být hodnota hash zprávy obrázku. Hodnota hash zprávy se podobá kontrolnímu součtu s tím rozdílem, že je extrémně obtížné ji ztěžovat. Proto je velmi obtížné upravit soubor tak, aby měl stejnou hodnotu hash zprávy jako původní soubor. Prohlášení může být ověřeno jako výrobce pomocí schémat kryptografie veřejného nebo privátního klíče. Tento dokument popisuje podrobnosti o jiných certifikátech atributů, než které umožňují jejich vložení do souborů obrázků. |
| datum a časové razítko |
Razítko, které se používá pro různé účely na několika místech v souboru PE nebo COFF. Ve většině případů je formát každého razítka stejný jako formát, který používají funkce času v knihovně runtime jazyka C. Výjimky najdete v popisovači IMAGE_DEBUG_TYPE_REPRO v ladicím typu. Pokud je hodnota razítka 0 nebo 0xFFFFFFFF, nepředstavuje skutečné ani smysluplné datum a časové razítko. |
| ukazatel souboru |
Umístění položky v samotném souboru před zpracováním linkerem (v případě souborů objektů) nebo zavaděčem (v případě souborů obrázků). Jinými slovy, toto je pozice v souboru uložená na disku. |
| linker |
Odkaz na linker, který je k dispozici v sadě Microsoft Visual Studio. |
| soubor objektu |
Soubor, který je předán jako vstup linkeru. Linker vytvoří soubor obrázku, který se zase používá jako vstup zavaděčem. Pojem "soubor objektu" nemusí nutně znamenat žádné připojení k objektově orientovanému programování. |
| rezervovaná, musí být 0. |
Popis pole, které označuje, že hodnota pole musí být nulová pro generátory a spotřebitelé musí toto pole ignorovat. |
| Relativní virtuální adresa (RVA) |
V souboru obrázku se jedná o adresu položky po načtení do paměti se základní adresou souboru obrázku odečítaného od ní. Hodnota RVA položky se téměř vždy liší od pozice souboru na disku (ukazatel souboru). V souboru objektu je hodnota RVA méně smysluplná, protože umístění paměti nejsou přiřazena. V tomto případě by RVA byla adresa v oddílu (popsaném dále v této tabulce), na kterou se později při propojení použije přemístění. Pro zjednodušení by kompilátor měl pouze nastavit první RVA v každé části na nulu. |
| oddíl |
Základní jednotka kódu nebo dat v souboru PE nebo COFF. Například všechny kódy v souboru objektu lze zkombinovat v rámci jednoho oddílu nebo (v závislosti na chování kompilátoru) můžou zabírat vlastní oddíl. S více oddíly je větší režijní náklady na soubory, ale linker může odkazovat v kódu selektivněji. Část je podobná segmentu v architektuře Intel 8086. Všechna nezpracovaná data v oddílu musí být načtena souvisle. Kromě toho může soubor obrázku obsahovat řadu oddílů, například .tls nebo .reloc , které mají zvláštní účely. |
| Virtuální adresa (VA) |
Stejné jako RVA s tím rozdílem, že základní adresa souboru obrázku se neodčítá. Adresa se nazývá VA, protože Systém Windows vytvoří pro každý proces odlišný prostor VA, a to nezávisle na fyzické paměti. Pro téměř všechny účely by se měla považovat za adresu. VA není tak předvídatelná jako RVA, protože zavaděč nemusí načíst image v upřednostňovaném umístění. |
Přehled
Následující seznam popisuje spustitelný formát prostředí Microsoft PE se základem záhlaví obrázku v horní části. Oddíl z MS-DOS 2.0 Kompatibilní hlavička EXE až do nepoužívané části těsně před hlavičkou PE je MS-DOS 2.0 Oddíl a slouží pouze pro MS-DOS kompatibilitu.
MS-DOS 2.0 Kompatibilní hlavička EXE
nepoužitý
Identifikátor OEM
Informace o OEM
Posun na hlavičku PE
MS-DOS 2.0 Zástupný program a tabulka přemístění
nepoužitý
Záhlaví PE (zarovnané na hranici 8 bajtů)
Záhlaví oddílů
Stránky obrázků:
informace o importu
informace o exportu
přemístění základny
informace o zdroji
Následující seznam popisuje formát objektového modulu Microsoft COFF:
Hlavička Microsoft COFF
Záhlaví oddílů
Prvotní data:
kód
údaje
Informace o ladění
přemístění
Hlavičky souborů
- MS-DOS zástupný procedura (pouze obrázek)
- Podpis (jenom obrázek)
- Hlavička souboru COFF (objekt a obrázek)
- Volitelné záhlaví (jenom obrázek)
Hlavička souboru PE se skládá z zástupných procedur Microsoft MS-DOS, podpisu PE, hlavičky souboru COFF a volitelné hlavičky. Hlavička souboru objektu COFF se skládá z hlavičky souboru COFF a volitelné hlavičky. V obou případech za záhlavími oddílů následují hlavičky souboru.
MS-DOS zástupný procedura (pouze obrázek)
Zástupný kód MS-DOS je platná aplikace, která běží v systému MS-DOS. Je umístěn před obrázkem EXE. Linker sem umístí výchozí zástupný proceduru, která vypíše zprávu "Tento program nelze spustit v režimu DOS" při spuštění image v ms-DOS. Uživatel může zadat jinou zástupný proceduru pomocí možnosti linkeru /STUB.
V umístění 0x3c má zástupný znak posun souboru na podpis PE. Tyto informace umožňují systému Windows správně spustit soubor bitové kopie, i když má MS-DOS zástupný procedura. Tento posun souboru je umístěn v umístění 0x3c během propojení.
Podpis (jenom obrázek)
Po zástupný znak MS-DOS je při posunu souboru zadaného při posunu 0x3c 4 bajtový podpis, který soubor identifikuje jako soubor obrázku ve formátu PE. Tento podpis je "PE\0\0" (písmena "P" a "E" následovaná dvěma bajty null).
Hlavička souboru COFF (objekt a obrázek)
Na začátku souboru objektu nebo bezprostředně po podpisu souboru obrázku je standardní hlavička souboru COFF v následujícím formátu. Všimněte si, že zavaděč windows omezuje počet oddílů na 96.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
2 |
Stroj |
Číslo, které identifikuje typ cílového počítače. Další informace naleznete v tématu Typy počítačů. |
| 2 |
2 |
NumberOfSections |
Počet oddílů. To označuje velikost tabulky oddílů, která bezprostředně následuje za záhlavími. |
| 4 |
4 |
TimeDateStamp |
Nízkých 32 bitů počtu sekund od 1. ledna 1970 (hodnota běhu time_t jazyka C) označující, kdy byl soubor vytvořen. |
| 8 |
4 |
PointerToSymbolTable |
Posun souboru tabulky symbolů COFF nebo nula, pokud není k dispozici žádná tabulka symbolů COFF. Tato hodnota by měla být pro image nulová, protože informace o ladění COFF jsou zastaralé. |
| 12 |
4 |
NumberOfSymbols |
Počet položek v tabulce symbolů Tato data lze použít k vyhledání tabulky řetězců, která bezprostředně následuje za tabulkou symbolů. Tato hodnota by měla být pro image nulová, protože informace o ladění COFF jsou zastaralé. |
| 16 |
2 |
SizeOfOptionalHeader |
Velikost volitelné hlavičky, která se vyžaduje pro spustitelné soubory, ale ne pro soubory objektů. Tato hodnota by měla být nulová pro soubor objektu. Popis formátu záhlaví najdete v tématu Volitelné záhlaví (pouze obrázek). |
| 18 |
2 |
Charakteristiky |
Příznaky, které označují atributy souboru. Konkrétní hodnoty příznaku najdete v tématu Vlastnosti. |
Typy počítačů
Pole Počítač má jednu z následujících hodnot, které určují typ procesoru. Soubor obrázku lze spustit pouze na zadaném počítači nebo v systému, který emuluje zadaný počítač.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_FILE_MACHINE_UNKNOWN |
0x0 |
Předpokládá se, že obsah tohoto pole se vztahuje na jakýkoli typ počítače. |
| IMAGE_FILE_MACHINE_ALPHA |
0x184 |
Alpha AXP, 32bitový adresní prostor |
| IMAGE_FILE_MACHINE_ALPHA64 |
0x284 |
Alfa 64, 64bitový adresní prostor |
| IMAGE_FILE_MACHINE_AM33 |
0x1d3 |
Matsushita AM33 |
| IMAGE_FILE_MACHINE_AMD64 |
0x8664 |
x64 |
| IMAGE_FILE_MACHINE_ARM |
0x1c0 |
ARM little endian |
| IMAGE_FILE_MACHINE_ARM64 |
0xaa64 |
ARM64 little endian |
| IMAGE_FILE_MACHINE_ARMNT |
0x1c4 |
Palec ARM-2 malý endian |
| IMAGE_FILE_MACHINE_AXP64 |
0x284 |
AXP 64 (stejné jako alfa 64) |
| IMAGE_FILE_MACHINE_EBC |
0xebc |
Kód bajtu EFI |
| IMAGE_FILE_MACHINE_I386 |
0x14c |
Procesory Intel 386 nebo novější a kompatibilní procesory |
| IMAGE_FILE_MACHINE_IA64 |
0x200 |
Řada procesorů Intel Itanium |
| IMAGE_FILE_MACHINE_LOONGARCH32 |
0x6232 |
Řada 32bitových procesorů LoongArch |
| IMAGE_FILE_MACHINE_LOONGARCH64 |
0x6264 |
Řada 64bitových procesorů LoongArch |
| IMAGE_FILE_MACHINE_M32R |
0x9041 |
Micem M32R malý endian |
| IMAGE_FILE_MACHINE_MIPS16 |
0x266 |
MIPS16 |
| IMAGE_FILE_MACHINE_MIPSFPU |
0x366 |
MIPS s FPU |
| IMAGE_FILE_MACHINE_MIPSFPU16 |
0x466 |
MIPS16 s FPU |
| IMAGE_FILE_MACHINE_POWERPC |
0x1f0 |
Power PC little endian |
| IMAGE_FILE_MACHINE_POWERPCFP |
0x1f1 |
Power PC s podporou s plovoucí desetinou čárkou |
| IMAGE_FILE_MACHINE_R3000BE |
0x160 |
MIPS I kompatibilní s 32bitovým big endianem |
| IMAGE_FILE_MACHINE_R3000 |
0x162 |
MIPS I kompatibilní s 32bitovým endianem |
| IMAGE_FILE_MACHINE_R4000 |
0x166 |
MIPS III kompatibilní s 64bitovým malým endianem |
| IMAGE_FILE_MACHINE_R10000 |
0x168 |
MIPS IV kompatibilní s 64bitovým endianem |
| IMAGE_FILE_MACHINE_RISCV32 |
0x5032 |
RISC-V 32bitový adresní prostor |
| IMAGE_FILE_MACHINE_RISCV64 |
0x5064 |
RISC-V 64bitový adresní prostor |
| IMAGE_FILE_MACHINE_RISCV128 |
0x5128 |
RISC-V 128bitový adresní prostor |
| IMAGE_FILE_MACHINE_SH3 |
0x1a2 |
Hitachi SH3 |
| IMAGE_FILE_MACHINE_SH3DSP |
0x1a3 |
Hitachi SH3 DSP |
| IMAGE_FILE_MACHINE_SH4 |
0x1a6 |
Hitachi SH4 |
| IMAGE_FILE_MACHINE_SH5 |
0x1a8 |
Hitachi SH5 |
| IMAGE_FILE_MACHINE_THUMB |
0x1c2 |
Palec |
| IMAGE_FILE_MACHINE_WCEMIPSV2 |
0x169 |
MIPS little-endian WCE v2 |
Charakteristiky
Pole Vlastnosti obsahuje příznaky, které označují atributy souboru objektu nebo obrázku. Aktuálně jsou definovány následující příznaky:
| Vlajka | Hodnota | Popis |
|---|---|---|
| IMAGE_FILE_RELOCS_STRIPPED |
0x0001 |
Pouze image, Windows CE a Microsoft Windows NT a novější. To znamená, že soubor neobsahuje základní přemístění, a proto musí být načten na upřednostňovanou základní adresu. Pokud základní adresa není dostupná, zavaděč hlásí chybu. Výchozím chováním linkeru je odstranit základní přemístění ze spustitelných souborů (EXE). |
| IMAGE_FILE_EXECUTABLE_IMAGE |
0x0002 |
Jenom obrázek. To znamená, že soubor image je platný a lze ho spustit. Pokud tento příznak není nastavený, znamená to chybu linkeru. |
| IMAGE_FILE_LINE_NUMS_STRIPPED |
0x0004 |
Čísla řádků COFF byla odebrána. Tento příznak je zastaralý a měl by být nulový. |
| IMAGE_FILE_LOCAL_SYMS_STRIPPED |
0x0008 |
Položky tabulky symbolů COFF pro místní symboly byly odebrány. Tento příznak je zastaralý a měl by být nulový. |
| IMAGE_FILE_AGGRESSIVE_WS_TRIM |
0x0010 |
Zastaralý. Agresivně oříznout pracovní sadu. Tento příznak je zastaralý pro Systém Windows 2000 a novější a musí být nulový. |
| IMAGE_FILE_LARGE_ADDRESS_AWARE |
0x0020 |
Aplikace dokáže zpracovat > 2 GB adres. |
| 0x0040 |
Tento příznak je vyhrazen pro budoucí použití. |
|
| IMAGE_FILE_BYTES_REVERSED_LO |
0x0080 |
Little endian: nejméně významný bit (LSB) předchází nejvýznamnější bit (MSB) v paměti. Tento příznak je zastaralý a měl by být nulový. |
| IMAGE_FILE_32BIT_MACHINE |
0x0100 |
Počítač je založený na 32bitové architektuře. |
| IMAGE_FILE_DEBUG_STRIPPED |
0x0200 |
Informace o ladění se odeberou ze souboru bitové kopie. |
| IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP |
0x0400 |
Pokud je image na vyměnitelném médiu, plně ho načtěte a zkopírujte do prohození souboru. |
| IMAGE_FILE_NET_RUN_FROM_SWAP |
0x0800 |
Pokud je image na síťovém médiu, plně ji načtěte a zkopírujte do prohození souboru. |
| IMAGE_FILE_SYSTEM |
0x1000 |
Soubor obrázku je systémový soubor, nikoli uživatelský program. |
| IMAGE_FILE_DLL |
0x2000 |
Soubor obrázku je dynamická knihovna (DLL). Tyto soubory jsou považovány za spustitelné soubory pro téměř všechny účely, i když je nelze přímo spustit. |
| IMAGE_FILE_UP_SYSTEM_ONLY |
0x4000 |
Soubor by se měl spustit jenom na počítači s jednoprocesorem. |
| IMAGE_FILE_BYTES_REVERSED_HI |
0x8000 |
Big endian: MSB předchází LSB v paměti. Tento příznak je zastaralý a měl by být nulový. |
Volitelné záhlaví (jenom obrázek)
Každý soubor obrázku má volitelnou hlavičku, která poskytuje informace zavaděče. Tato hlavička je nepovinná v tom smyslu, že některé soubory (konkrétně soubory objektů) ho nemají. Pro soubory obrázků je tato hlavička povinná. Soubor objektu může mít volitelnou hlavičku, ale obecně tato hlavička nemá v souboru objektu žádnou funkci s výjimkou zvětšení jeho velikosti.
Všimněte si, že velikost volitelné hlavičky není pevná. Pole SizeOfOptionalHeader v hlavičce COFF musí být použito k ověření, že sonda souboru pro konkrétní datový adresář nepřekračuje VelikostOfOptionalHeader. Další informace naleznete v tématu COFF File Header (Object and Image).
Pole NumberOfRvaAndSizes volitelné hlavičky by také mělo být použito k zajištění, aby žádná sonda pro konkrétní položku adresáře dat nepřesahuje nepovinnou hlavičku. Kromě toho je důležité ověřit volitelné číslo magie záhlaví kvůli kompatibilitě formátu.
Volitelné číslo magie záhlaví určuje, jestli je obrázek spustitelný soubor PE32 nebo PE32+.
| Magické číslo | Formát PE |
|---|---|
| 0x10b |
PE32 |
| 0x20b |
PE32+ |
Pe32+ obrázky umožňují 64bitový adresní prostor při omezení velikosti obrázku na 2 gigabajty. Další úpravy PE32+ jsou řešeny v příslušných oddílech.
Volitelná hlavička má tři hlavní části.
| Posun (PE32/PE32+) | Velikost (PE32/PE32+) | Část Záhlaví | Popis |
|---|---|---|---|
| 0 |
28/24 |
Standardní pole |
Pole, která jsou definována pro všechny implementace COFF, včetně UNIX. |
| 28/24 |
68/88 |
Pole specifická pro Windows |
Další pole pro podporu konkrétních funkcí Windows (například subsystémů). |
| 96/112 |
Proměnná |
Datové adresáře |
Dvojice adres a velikostí pro speciální tabulky, které se nacházejí v souboru bitové kopie, a používají je operační systém (například tabulku importu a tabulku exportu). |
Volitelná standardní pole záhlaví (pouze obrázek)
Prvních osm polí volitelné hlavičky jsou standardní pole definovaná pro každou implementaci COFF. Tato pole obsahují obecné informace, které jsou užitečné pro načtení a spuštění spustitelného souboru. Pro formát PE32+ se nemění.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
2 |
Magie |
Celé číslo bez znaménka, které identifikuje stav souboru obrázku. Nejběžnějším číslem je 0x10B, který ho identifikuje jako normální spustitelný soubor. 0x107 ji identifikuje jako image ROM a 0x20B ji identifikuje jako spustitelný soubor PE32+. |
| 2 |
1 |
MajorLinkerVersion |
Číslo hlavní verze linkeru. |
| 3 |
1 |
MinorLinkerVersion |
Číslo podverze linkeru. |
| 4 |
4 |
SizeOfCode |
Velikost oddílu s kódem (text) nebo součet všech oddílů kódu, pokud existuje více oddílů. |
| 8 |
4 |
SizeOfInitializedData |
Velikost inicializovaného datového oddílu nebo součet všech těchto oddílů, pokud existuje více datových oddílů. |
| 12 |
4 |
SizeOfUninitializedData |
Velikost neinicializovaného datového oddílu (BSS) nebo součtu všech těchto oddílů, pokud existuje více oddílů BSS. |
| 16 |
4 |
AddressOfEntryPoint |
Adresa vstupního bodu vzhledem k základu image při načtení spustitelného souboru do paměti. U programových obrázků se jedná o počáteční adresu. U ovladačů zařízení se jedná o adresu inicializační funkce. Vstupní bod je volitelný pro knihovny DLL. Pokud není k dispozici žádný vstupní bod, musí být toto pole nula. |
| 20 |
4 |
BaseOfCode |
Adresa, která je relativní vzhledem k základu obrázku počáteční části kódu při načtení do paměti. |
PE32 obsahuje toto další pole, které chybí v PE32+, následující BaseOfCode.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 24 |
4 |
BaseOfData |
Adresa, která je relativní vzhledem k základu image počátečního datového oddílu při načtení do paměti. |
Volitelná záhlaví Windows-Specific polí (pouze obrázek)
Další 21 polí jsou rozšířením volitelného formátu hlavičky COFF. Obsahují další informace, které vyžaduje linker a zavaděč ve Windows.
| Posun (PE32/ PE32+) | Velikost (PE32/ PE32+) | Pole | Popis |
|---|---|---|---|
| 28/24 |
4/8 |
ImageBase |
Upřednostňovaná adresa prvního bajtu image při načtení do paměti; musí být násobkem 64 K. Výchozí hodnota pro knihovny DLL je 0x10000000. Výchozí hodnota pro windows CE EXEs je 0x00010000. Výchozí hodnota systému Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 a Windows Me je 0x00400000. |
| 32/32 |
4 |
SectionAlignment |
Zarovnání oddílů (v bajtech) při jejich načtení do paměti. Musí být větší než nebo rovno FileAlignment. Výchozí hodnota je velikost stránky pro architekturu. |
| 36/36 |
4 |
FileAlignment |
Faktor zarovnání (v bajtech), který slouží k zarovnání nezpracovaných dat oddílů v souboru obrázku. Hodnota by měla být 2 v rozmezí od 512 do 64 K (včetně). Výchozí hodnota je 512. Pokud je hodnota SectionAlignment menší než velikost stránky architektury, musí FileAlignment odpovídat SectionAlignmentu. |
| 40/40 |
2 |
MajorOperatingSystemVersion |
Číslo hlavní verze požadovaného operačního systému. |
| 42/42 |
2 |
MinorOperatingSystemVersion |
Číslo podverze požadovaného operačního systému. |
| 44/44 |
2 |
MajorImageVersion |
Číslo hlavní verze image. |
| 46/46 |
2 |
MinorImageVersion |
Číslo podverze obrázku. |
| 48/48 |
2 |
MajorSubsystemVersion |
Hlavní číslo verze subsystému. |
| 50/50 |
2 |
MinorSubsystemVersion |
Číslo podverze subsystému. |
| 52/52 |
4 |
Win32VersionValue |
Rezervovaná hodnota musí být nula. |
| 56/56 |
4 |
SizeOfImage |
Velikost obrázku (v bajtech) včetně všech hlaviček při načítání image do paměti. Musí se jednat o násobek SectionAlignmentu. |
| 60/60 |
4 |
SizeOfHeaders |
Kombinovaná velikost MS-DOS zástupných procedur, záhlaví PE a záhlaví oddílů zaokrouhlená nahoru na násobek FileAlignmentu. |
| 64/64 |
4 |
Kontrolní součet |
Kontrolní součet souboru obrázku. Algoritmus pro výpočet kontrolního součtu je začleněn do IMAGHELP.DLL. Při načítání jsou kontrolovány následující kontroly ověření: všechny ovladače, všechny knihovny DLL načtené při spuštění a všechny knihovny DLL, které jsou načteny do kritického procesu Systému Windows. |
| 68/68 |
2 |
Podsystém |
Subsystém, který je nutný ke spuštění této image. Další informace naleznete v tématu Subsystém Windows. |
| 70/70 |
2 |
DllCharacteristics |
Další informace naleznete v tématu Vlastnosti knihovny DLL dále v této specifikaci. |
| 72/72 |
4/8 |
SizeOfStackReserve |
Velikost zásobníku, který chcete rezervovat. Pouze SizeOfStackCommit je potvrzen; Zbytek se zpřístupní po jedné stránce, dokud nedosáhnete velikosti rezervy. |
| 76/80 |
4/8 |
SizeOfStackCommit |
Velikost zásobníku, který se má potvrdit. |
| 80/88 |
4/8 |
SizeOfHeapReserve |
Velikost místního prostoru haldy, která se má rezervovat. Pouze SizeOfHeapCommit je potvrzen; Zbytek se zpřístupní po jedné stránce, dokud nedosáhnete velikosti rezervy. |
| 84/96 |
4/8 |
SizeOfHeapCommit |
Velikost místa místní haldy, která se má potvrdit. |
| 88/104 |
4 |
LoaderFlags |
Rezervovaná hodnota musí být nula. |
| 92/108 |
4 |
NumberOfRvaAndSizes |
Počet položek datového adresáře ve zbývající části volitelné hlavičky. Každý popisuje umístění a velikost. |
Subsystém Windows
Následující hodnoty definované pro pole Subsystém volitelné hlavičky určují, který subsystém Windows (pokud existuje) pro spuštění image.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_SUBSYSTEM_UNKNOWN |
0 |
Neznámý subsystém |
| IMAGE_SUBSYSTEM_NATIVE |
1 |
Ovladače zařízení a nativní procesy Windows |
| IMAGE_SUBSYSTEM_WINDOWS_GUI |
2 |
Subsystém grafického uživatelského rozhraní (GUI) systému Windows |
| IMAGE_SUBSYSTEM_WINDOWS_CUI |
3 |
Subsystém znaků Windows |
| IMAGE_SUBSYSTEM_OS2_CUI |
5 |
Subsystém operačního systému/2 |
| IMAGE_SUBSYSTEM_POSIX_CUI |
7 |
Subsystém znaků Posix |
| IMAGE_SUBSYSTEM_NATIVE_WINDOWS |
8 |
Nativní ovladač Win9x |
| IMAGE_SUBSYSTEM_WINDOWS_CE_GUI |
9 |
Windows CE |
| IMAGE_SUBSYSTEM_EFI_APPLICATION |
10 |
Aplikace EFI (Extensible Firmware Interface) |
| IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER |
11 |
Ovladač EFI se spouštěcími službami |
| ovladač IMAGE_SUBSYSTEM_EFI_RUNTIME_ |
12 |
Ovladač EFI se službami za běhu |
| IMAGE_SUBSYSTEM_EFI_ROM |
13 |
Obrázek EFI ROM |
| IMAGE_SUBSYSTEM_XBOX |
14 |
XBOX |
| IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION |
16 |
Spouštěcí aplikace systému Windows. |
Vlastnosti knihovny DLL
Následující hodnoty jsou definovány pro pole DllCharacteristics volitelné hlavičky.
| Konstanta | Hodnota | Popis |
|---|---|---|
| 0x0001 |
Rezervovaná hodnota musí být nula. |
|
| 0x0002 |
Rezervovaná hodnota musí být nula. |
|
| 0x0004 |
Rezervovaná hodnota musí být nula. |
|
| 0x0008 |
Rezervovaná hodnota musí být nula. |
|
| IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA |
0x0020 |
Image dokáže zpracovat vysoce entropii 64bitový virtuální adresní prostor. |
| IMAGE_DLLCHARACTERISTICS_ DYNAMIC_BASE |
0x0040 |
Knihovnu DLL lze přemístit v době načítání. |
| IMAGE_DLLCHARACTERISTICS_ FORCE_INTEGRITY |
0x0080 |
Vynucují se kontroly integrity kódu. |
| IMAGE_DLLCHARACTERISTICS_ NX_COMPAT |
0x0100 |
Image je kompatibilní s NX. |
| IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION |
0x0200 |
Izolace s vědomím, ale neizolujte image. |
| IMAGE_DLLCHARACTERISTICS_ NO_SEH |
0x0400 |
Nepoužívá zpracování strukturovaných výjimek (SE). V tomto obrázku nelze volat žádnou obslužnou rutinu SE. |
| IMAGE_DLLCHARACTERISTICS_ NO_BIND |
0x0800 |
Nevyvazujte image. |
| IMAGE_DLLCHARACTERISTICS_APPCONTAINER |
0x1000 |
Image se musí spustit v AppContaineru. |
| IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER |
0x2000 |
Ovladač WDM. |
| IMAGE_DLLCHARACTERISTICS_GUARD_CF |
0x4000 |
Obrázek podporuje ochranu toku řízení. |
| IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE |
0x8000 |
Terminálový server s podporou. |
Volitelné adresáře dat záhlaví (jenom obrázek)
Každý datový adresář poskytuje adresu a velikost tabulky nebo řetězce, které windows používá. Všechny tyto položky datového adresáře jsou načteny do paměti, aby je systém mohl používat za běhu. Datový adresář je pole s 8 bajty, které má následující deklaraci:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
První pole VirtualAddress je ve skutečnosti RVA tabulky. RVA je adresa tabulky vzhledem k základní adrese obrázku při načtení tabulky. Druhé pole dává velikost v bajtech. Datové adresáře, které tvoří poslední část volitelné hlavičky, jsou uvedeny v následující tabulce.
Všimněte si, že počet adresářů není pevný. Než budete hledat konkrétní adresář, zkontrolujte pole NumberOfRvaAndSizes v volitelné hlavičce.
Nepředpokládá se také, že RVA v této tabulce odkazují na začátek oddílu nebo že oddíly, které obsahují konkrétní tabulky, mají konkrétní názvy.
| Posun (PE/PE32+) | Velikost | Pole | Popis |
|---|---|---|---|
| 96/112 |
8 |
Exportovat tabulku |
Adresa a velikost tabulky exportu. Další informace naleznete v oddílu .edata (pouze obrázek). |
| 104/120 |
8 |
Importovat tabulku |
Adresa a velikost tabulky importu. Další informace naleznete v oddílu .idata. |
| 112/128 |
8 |
Tabulka zdrojů |
Adresa a velikost tabulky prostředků Další informace naleznete v oddílu .rsrc. |
| 120/136 |
8 |
Tabulka výjimek |
Adresa a velikost tabulky výjimek. Další informace naleznete v oddílu .pdata. |
| 128/144 |
8 |
Tabulka certifikátů |
Adresa a velikost tabulky certifikátu atributu. Další informace najdete v |
| 136/152 |
8 |
Základní přemísťovací tabulka |
Adresa a velikost základní tabulky přemístění. Další informace naleznete v oddílu .reloc (pouze obrázek). |
| 144/160 |
8 |
Ladicí |
Počáteční adresa a velikost dat ladění. Další informace naleznete v části .debug. |
| 152/168 |
8 |
Architektura |
Rezervovaná, musí být 0. |
| 160/176 |
8 |
Global Ptr |
RVA hodnoty, která má být uložena v globálním registru ukazatele. Člen velikosti této struktury musí být nastaven na nulu. |
| 168/184 |
8 |
Tabulka TLS |
Adresa a velikost tabulky místního úložiště vlákna (TLS). Další informace najdete v části .tls. |
| 176/192 |
8 |
Načtení konfigurační tabulky |
Adresa a velikost konfigurační tabulky načtení. Další informace naleznete v tématu Struktura konfigurace načtení (pouze image). |
| 184/200 |
8 |
Vázaný import |
Adresa a velikost vázané tabulky importu. |
| 192/208 |
8 |
IAT |
Adresa a velikost tabulky importu adres. Další informace naleznete v tématu Import Address Table. |
| 200/216 |
8 |
Pozdržet popisovač importu |
Adresa a velikost popisovače importu zpoždění. Další informace najdete v tématu Delay-Load Import tabulek (pouze obrázek). |
| 208/224 |
8 |
Hlavička modulu runtime CLR |
Adresa a velikost hlavičky modulu runtime CLR. Další informace naleznete v oddílu .cormeta (pouze objekt). |
| 216/232 |
8 |
Rezervovaná hodnota musí být nula. |
Položka Tabulky certifikátů odkazuje na tabulku certifikátů atributů. Tyto certifikáty nejsou načteny do paměti jako součást image. První pole této položky, což je obvykle RVA, je místo toho ukazatelem souboru.
Tabulka oddílů (záhlaví oddílů)
Každý řádek tabulky oddílů je v podstatě záhlaví oddílu. Tato tabulka se okamžitě řídí nepovinnou hlavičkou( pokud existuje). Toto umístění je povinné, protože záhlaví souboru neobsahuje přímý ukazatel na tabulku oddílů. Místo toho je umístění tabulky oddílů určeno výpočtem umístění prvního bajtu za záhlavími. Nezapomeňte použít velikost volitelné hlavičky, jak je uvedeno v záhlaví souboru.
Počet položek v tabulce oddílů je dán polem NumberOfSections v záhlaví souboru. Položky v tabulce oddílů jsou očíslovány od jedné (1). Položky oddílu kódu a paměti dat jsou v pořadí zvoleném linkerem.
V souboru obrázku musí být virtuální autority pro oddíly přiřazeny linkerem, aby byly ve vzestupném pořadí a vedle sebe, a musí být násobkem hodnoty SectionAlignment v volitelné hlavičce.
Každé záhlaví oddílu (položka tabulky oddílu) má následující formát pro celkem 40 bajtů na položku.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
8 |
Jméno |
Řetězec s kódováním UTF-8 s 8 bajty s hodnotou null. Pokud je řetězec přesně 8 znaků dlouhý, neexistuje žádná koncová hodnota null. U delších názvů obsahuje toto pole lomítko (/), za kterým následuje reprezentace desetinného čísla ASCII, která je posunem do tabulky řetězců. Spustitelné obrázky nepoužívají tabulku řetězců a nepodporují názvy oddílů delší než 8 znaků. Dlouhé názvy v souborech objektů jsou zkráceny, pokud se vygenerují do spustitelného souboru. |
| 8 |
4 |
VirtualSize |
Celková velikost oddílu při načtení do paměti. Pokud je tato hodnota větší než SizeOfRawData, oddíl je nulový. Toto pole je platné pouze pro spustitelné obrázky a mělo by být nastaveno na nulu pro soubory objektů. |
| 12 |
4 |
VirtualAddress |
U spustitelných imagí adresa prvního bajtu oddílu vzhledem k základu image při načtení oddílu do paměti. Pro soubory objektů je toto pole adresa prvního bajtu před použitím přemístění; pro zjednodušení by kompilátory měly nastavit tuto hodnotu na nulu. V opačném případě se jedná o libovolnou hodnotu, která se odečte od posunů během přemístění. |
| 16 |
4 |
SizeOfRawData |
Velikost oddílu (pro soubory objektů) nebo velikost inicializovaných dat na disku (pro soubory obrázků). U spustitelných imagí to musí být násobek FileAlignment z volitelné hlavičky. Pokud je tato hodnota menší než VirtualSize, zbytek oddílu je vyplněný nulou. Protože je pole SizeOfRawData zaokrouhleno, ale pole VirtualSize není, je možné, aby velikost SizeOfRawData byla také větší než VirtualSize. Pokud oddíl obsahuje pouze neinicializovaná data, mělo by toto pole být nula. |
| 20 |
4 |
PointerToRawData |
Ukazatel souboru na první stránku oddílu v souboru COFF. U spustitelných imagí to musí být násobek FileAlignment z volitelné hlavičky. U souborů objektů by měla být hodnota zarovnaná na hranici se 4 bajty, aby byl nejlepší výkon. Pokud oddíl obsahuje pouze neinicializovaná data, mělo by toto pole být nula. |
| 24 |
4 |
PointerToRelocations |
Ukazatel souboru na začátek přemístění položek pro oddíl. U spustitelných imagí je tato hodnota nastavená na nulu nebo pokud neexistují žádné přemístění. |
| 28 |
4 |
PointerToLinenumbers |
Ukazatel souboru na začátek položek s číslem řádku pro oddíl. Pokud neexistují žádná čísla řádků COFF, nastaví se na nulu. Tato hodnota by měla být pro image nulová, protože informace o ladění COFF jsou zastaralé. |
| 32 |
2 |
NumberOfRelocations |
Počet položek přemístění pro oddíl. U spustitelných imagí je tato hodnota nastavená na nulu. |
| 34 |
2 |
NumberOfLinenumbers |
Počet položek řádku pro oddíl. Tato hodnota by měla být pro image nulová, protože informace o ladění COFF jsou zastaralé. |
| 36 |
4 |
Charakteristiky |
Příznaky, které popisují charakteristiky oddílu. Další informace najdete v části Příznaky oddílu. |
Příznaky oddílu
Příznaky oddílu v poli Charakteristiky hlavičky oddílu označují vlastnosti oddílu.
| Vlajka | Hodnota | Popis |
|---|---|---|
| 0x00000000 |
Vyhrazeno pro budoucí použití. |
|
| 0x00000001 |
Vyhrazeno pro budoucí použití. |
|
| 0x00000002 |
Vyhrazeno pro budoucí použití. |
|
| 0x00000004 |
Vyhrazeno pro budoucí použití. |
|
| IMAGE_SCN_TYPE_NO_PAD |
0x00000008 |
Oddíl by neměl být vycpaný na další hranici. Tento příznak je zastaralý a nahrazuje se IMAGE_SCN_ALIGN_1BYTES. To platí jenom pro soubory objektů. |
| 0x00000010 |
Vyhrazeno pro budoucí použití. |
|
| IMAGE_SCN_CNT_CODE |
0x00000020 |
Oddíl obsahuje spustitelný kód. |
| IMAGE_SCN_CNT_INITIALIZED_DATA |
0x00000040 |
Oddíl obsahuje inicializovaná data. |
| IMAGE_SCN_CNT_UNINITIALIZED_ DATA |
0x00000080 |
Oddíl obsahuje neinicializovaná data. |
| IMAGE_SCN_LNK_OTHER |
0x00000100 |
Vyhrazeno pro budoucí použití. |
| IMAGE_SCN_LNK_INFO |
0x00000200 |
Oddíl obsahuje komentáře nebo jiné informace. Oddíl .drectve má tento typ. To platí jenom pro soubory objektů. |
| 0x00000400 |
Vyhrazeno pro budoucí použití. |
|
| IMAGE_SCN_LNK_REMOVE |
0x00000800 |
Oddíl se nestane součástí obrázku. To platí jenom pro soubory objektů. |
| IMAGE_SCN_LNK_COMDAT |
0x00001000 |
Oddíl obsahuje data COMDAT. Další informace naleznete v části COMDAT (pouze objekt). To platí jenom pro soubory objektů. |
| IMAGE_SCN_GPREL |
0x00008000 |
Oddíl obsahuje data odkazovaná prostřednictvím globálního ukazatele (GP). |
| IMAGE_SCN_MEM_PURGEABLE |
0x00020000 |
Vyhrazeno pro budoucí použití. |
| IMAGE_SCN_MEM_16BIT |
0x00020000 |
Vyhrazeno pro budoucí použití. |
| IMAGE_SCN_MEM_LOCKED |
0x00040000 |
Vyhrazeno pro budoucí použití. |
| IMAGE_SCN_MEM_PRELOAD |
0x00080000 |
Vyhrazeno pro budoucí použití. |
| IMAGE_SCN_ALIGN_1BYTES |
0x00100000 |
Zarovná data na hranici 1 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_2BYTES |
0x00200000 |
Zarovná data na hranici 2 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_4BYTES |
0x00300000 |
Zarovnejte data na hranici se 4 bajty. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_8BYTES |
0x00400000 |
Zarovnejte data na hranici 8 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_16BYTES |
0x00500000 |
Zarovnejte data na hranici 16 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_32BYTES |
0x00600000 |
Zarovnejte data na hranici 32 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_64BYTES |
0x00700000 |
Zarovnejte data na hranici 64 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_128BYTES |
0x00800000 |
Zarovnejte data na hranici 128 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_256BYTES |
0x00900000 |
Zarovnejte data na hranici 256 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_512BYTES |
0x00A00000 |
Zarovnejte data na hranici 512 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_1024BYTES |
0x00B00000 |
Zarovnejte data na hranici 1024 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_2048BYTES |
0x00C00000 |
Zarovnejte data na hranici 2048 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_4096BYTES |
0x00D00000 |
Zarovnejte data na hranici 4096 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_ALIGN_8192BYTES |
0x00E00000 |
Zarovnejte data na hranici 8192 bajtů. Platné pouze pro soubory objektů. |
| IMAGE_SCN_LNK_NRELOC_OVFL |
0x01000000 |
Oddíl obsahuje rozšířené přemístění. |
| IMAGE_SCN_MEM_DISCARDABLE |
0x02000000 |
Oddíl je možné podle potřeby zahodit. |
| IMAGE_SCN_MEM_NOT_CACHED |
0x04000000 |
Oddíl nelze uložit do mezipaměti. |
| IMAGE_SCN_MEM_NOT_PAGED |
0x08000000 |
Oddíl není stránkovatelný. |
| IMAGE_SCN_MEM_SHARED |
0x10000000 |
Oddíl je možné sdílet v paměti. |
| IMAGE_SCN_MEM_EXECUTE |
0x20000000 |
Oddíl lze spustit jako kód. |
| IMAGE_SCN_MEM_READ |
0x40000000 |
Oddíl je možné přečíst. |
| IMAGE_SCN_MEM_WRITE |
0x80000000 |
Oddíl lze napsat. |
IMAGE_SCN_LNK_NRELOC_OVFL označuje, že počet přemístění oddílu překračuje 16 bitů, které jsou pro něj vyhrazeny v záhlaví oddílu. Pokud je bit nastavený a pole NumberOfRelocations v záhlaví oddílu je 0xffff, skutečný počet přemístění se uloží do 32bitového pole VirtualAddress prvního přemístění. Pokud je IMAGE_SCN_LNK_NRELOC_OVFL nastavená a v oddílu je méně než 0xffff přemístění.
Seskupené oddíly (pouze objekt)
Znak $(znak dolaru) má speciální interpretaci v názvech oddílů v souborech objektů.
Při určování oddílu obrázku, který bude obsahovat obsah oddílu objektu, linker zahodí znak $a všechny znaky, které ho následují. Proto oddíl objektu s názvem . text$X ve skutečnosti přispívá do oddílu .text na obrázku.
Znaky následující za znakem $však určují pořadí příspěvků do oddílu obrázku. Všechny příspěvky se stejným názvem oddílu objektu se přidělují na obrázku souvisle a bloky příspěvků jsou seřazené v lexikálním pořadí podle názvu oddílu objektu. Proto vše v souborech objektů s názvem oddílu .text$X skončí společně za příspěvky .text$W a před příspěvky .text$Y .
Název oddílu v souboru obrázku nikdy neobsahuje znak $.
Další obsah souboru
- Data oddílu
- Přemístění COFF (pouze objekt)
- Čísla řádků COFF (zastaralé)
- Tabulka symbolů COFF
- Pomocné záznamy symbolů
- Tabulka řetězců COFF
- Tabulka certifikátu atributu (pouze obrázek)
- Delay-Load Import tabulek (jenom obrázek)
Datové struktury, které byly dosud popsány, až do a včetně volitelné hlavičky, jsou umístěny na pevném posunu od začátku souboru (nebo z hlavičky PE, pokud je soubor obrázkem, který obsahuje MS-DOS zástupný kód).
Zbývající část objektu nebo souboru obrázku COFF obsahuje bloky dat, které nemusí nutně odpovídat žádnému konkrétnímu posunu souboru. Místo toho jsou umístění definována ukazateli v volitelném záhlaví nebo záhlaví oddílu.
Výjimkou jsou obrázky s hodnotou SectionAlignment menší než velikost stránky architektury (4 K pro Intel x86 a MIPS a 8 K pro Itanium). Popis SectionAlignment najdete v části Volitelné záhlaví (pouze obrázek). V tomto případě existují omezení posunu souboru dat oddílu, jak je popsáno v části 5.1 " Data oddílu". Další výjimkou je, že certifikát atributu a informace o ladění musí být umístěny na samém konci souboru obrázku s tabulkou certifikátu atributu bezprostředně před částí ladění, protože zavaděč je nenamapuje do paměti. Pravidlo týkající se certifikátu atributu a informací o ladění se však nevztahuje na soubory objektů.
Data oddílu
Inicializovaná data pro oddíl se skládají z jednoduchých bloků bajtů. Pro oddíly, které obsahují všechny nuly, však data oddílu nemusí být zahrnuta.
Data pro každý oddíl se nacházejí v posunu souboru, který byl dán polem PointerToRawData v záhlaví oddílu. Velikost těchto dat v souboru je označena polem SizeOfRawData. Pokud je SizeOfRawData menší než VirtualSize, zbytek se vycpe nulami.
V souboru obrázku musí být data oddílu zarovnaná na hranici určenou polem FileAlignment v volitelné hlavičce. Data oddílu se musí zobrazovat v pořadí hodnot RVA pro odpovídající oddíly (stejně jako záhlaví jednotlivých oddílů v tabulce oddílů).
Pokud je hodnota SectionAlignment v volitelném záhlaví menší než velikost stránky architektury, existují další omezení pro soubory obrázků. U těchto souborů musí umístění dat oddílu v souboru při načtení obrázku odpovídat jeho umístění v paměti, aby fyzický posun dat oddílu byl stejný jako hodnota RVA.
Přemístění COFF (pouze objekt)
Soubory objektů obsahují přemístění COFF, které určují, jak se mají data oddílu při umístění do souboru obrázku upravit a následně načíst do paměti.
Soubory obrázků neobsahují přemístění COFF, protože všechny odkazované symboly již byly přiřazeny adresy v plochém adresní prostoru. Obrázek obsahuje informace o přemístění ve formě základních přemístění v oddílu .reloc (pokud obrázek nemá atribut IMAGE_FILE_RELOCS_STRIPPED). Další informace naleznete v oddílu .reloc (pouze obrázek).
Pro každý oddíl v souboru objektu obsahuje pole záznamů s pevnou délkou přemístění COFF oddílu. Pozice a délka pole jsou zadány v záhlaví oddílu. Každý prvek pole má následující formát.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
VirtualAddress |
Adresa položky, na kterou je použito přemístění. Jedná se o posun od začátku oddílu a hodnotu pole RVA/Posun oddílu. Viz tabulka oddílů (záhlaví oddílů). Pokud má například první bajt oddílu adresu 0x10, třetí bajt má adresu 0x12. |
| 4 |
4 |
SymbolTableIndex |
Index založený na nule do tabulky symbolů. Tento symbol poskytuje adresu, která se má použít k přemístění. Pokud zadaný symbol obsahuje třídu úložiště oddílů, adresa symbolu je adresa s prvním oddílem stejného názvu. |
| 8 |
2 |
Typ |
Hodnota, která označuje druh přemístění, který by se měl provést. Platné typy přemístění závisí na typu počítače. Viz indikátory typu. |
Pokud symbol, na který odkazuje pole SymbolTableIndex, má třídu úložiště IMAGE_SYM_CLASS_SECTION, adresa symbolu je začátek oddílu. Oddíl je obvykle ve stejném souboru, s výjimkou případů, kdy je soubor objektu součástí archivu (knihovny). V takovém případě lze oddíl najít v libovolném jiném souboru objektu v archivu, který má stejný název člena archivu jako aktuální soubor objektu. (Relace s názvem člena archivu se používá při propojování importovaných tabulek, tj. oddílu .idata.)
Indikátory typu
Pole Typ záznamu o přemístění označuje, jaký druh přemístění se má provést. Pro každý typ stroje jsou definovány různé typy přemístění.
Procesory x64
Následující indikátory typu přemístění jsou definovány pro procesory x64 a kompatibilní.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_AMD64_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_AMD64_ADDR64 |
0x0001 |
64bitová virtuální autorita cíle přemístění. |
| IMAGE_REL_AMD64_ADDR32 |
0x0002 |
32bitová virtuální autorita cíle přemístění. |
| IMAGE_REL_AMD64_ADDR32NB |
0x0003 |
32bitová adresa bez základní image (RVA). |
| IMAGE_REL_AMD64_REL32 |
0x0004 |
32bitová relativní adresa z bajtu po přemístění. |
| IMAGE_REL_AMD64_REL32_1 |
0x0005 |
32bitová adresa vzhledem k bajtové vzdálenosti 1 od přemístění. |
| IMAGE_REL_AMD64_REL32_2 |
0x0006 |
32bitová adresa vzhledem k bajtové vzdálenosti 2 od přemístění. |
| IMAGE_REL_AMD64_REL32_3 |
0x0007 |
32bitová adresa vzhledem k bajtové vzdálenosti 3 od přemístění. |
| IMAGE_REL_AMD64_REL32_4 |
0x0008 |
32bitová adresa vzhledem k bajtové vzdálenosti 4 od přemístění. |
| IMAGE_REL_AMD64_REL32_5 |
0x0009 |
32bitová adresa vzhledem k bajtové vzdálenosti 5 od přemístění. |
| IMAGE_REL_AMD64_SECTION |
0x000A |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_AMD64_SECREL |
0x000B |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_AMD64_SECREL7 |
0x000C |
7bitový posun bez znaménka od základu oddílu, který obsahuje cíl. |
| IMAGE_REL_AMD64_TOKEN |
0x000D |
Tokeny CLR. |
| IMAGE_REL_AMD64_SREL32 |
0x000E |
Do objektu se vygenerovala 32bitová míněná hodnota závislé na rozpětí. |
| IMAGE_REL_AMD64_PAIR |
0x000F |
Pár, který musí okamžitě následovat za každou hodnotou závislou na rozsahu. |
| IMAGE_REL_AMD64_SSPAN32 |
0x0010 |
32bitová podepsaná hodnota závislá na rozsahu, která se použije v době propojení. |
Procesory ARM
Následující indikátory typu přemístění jsou definovány pro procesory ARM.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_ARM_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_ARM_ADDR32 |
0x0001 |
32bitová virtuální autorita cíle. |
| IMAGE_REL_ARM_ADDR32NB |
0x0002 |
32bitová hodnota RVA cíle. |
| IMAGE_REL_ARM_BRANCH24 |
0x0003 |
24bitový relativní posun do cíle. |
| IMAGE_REL_ARM_BRANCH11 |
0x0004 |
Odkaz na podprogramové volání. Odkaz se skládá ze dvou 16bitových instrukcí s 11bitovými posuny. |
| IMAGE_REL_ARM_REL32 |
0x000A |
32bitová relativní adresa z bajtu po přemístění. |
| IMAGE_REL_ARM_SECTION |
0x000E |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_ARM_SECREL |
0x000F |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_ARM_MOV32 |
0x0010 |
32bitová virtuální autorita cíle. Toto přemístění se použije pomocí instrukce MOVW pro nízké 16bitové bity následované MOVT pro vysoké 16 bitů. |
| IMAGE_REL_THUMB_MOV32 |
0x0011 |
32bitová virtuální autorita cíle. Toto přemístění se použije pomocí instrukce MOVW pro nízké 16bitové bity následované MOVT pro vysoké 16 bitů. |
| IMAGE_REL_THUMB_BRANCH20 |
0x0012 |
Instrukce je opravena s 21bitovým relativním posunem do cíle zarovnaného 2 bajtu. Nejméně významný bit posunu je vždy nula a není uložen. Toto přemístění odpovídá 32bitové 32bitové podmíněné b instrukci. |
| Nepoužitý |
0x0013 |
|
| IMAGE_REL_THUMB_BRANCH24 |
0x0014 |
Instrukce je opravena s 25bitovým relativním posunem do cíle zarovnaného 2 bajtu. Nejméně významný bit posunu je nula a není uložen. Toto přemístění odpovídá instrukce Thumb-2 B. |
| IMAGE_REL_THUMB_BLX23 |
0x0015 |
Instrukce je opravena s 25bitovým relativním posunem k cíli zarovnaným 4 bajty. Nízké 2 bity posunu jsou nulové a neukládají se. Toto přemístění odpovídá instrukce Thumb-2 BLX. |
| IMAGE_REL_ARM_PAIR |
0x0016 |
Přemístění je platné pouze v případě, že bezprostředně následuje za ARM_REFHI nebo THUMB_REFHI. Jeho SymbolTableIndex obsahuje posun, nikoli index do tabulky symbolů. |
Procesory ARM64
Následující indikátory typu přemístění jsou definovány pro procesory ARM64.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_ARM64_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_ARM64_ADDR32 |
0x0001 |
32bitová virtuální autorita cíle. |
| IMAGE_REL_ARM64_ADDR32NB |
0x0002 |
32bitová hodnota RVA cíle. |
| IMAGE_REL_ARM64_BRANCH26 |
0x0003 |
26bitové relativní přesunutí do cíle pro pokyny B a BL. |
| IMAGE_REL_ARM64_PAGEBASE_REL21 |
0x0004 |
Základ stránky cíle pro instrukci ADRP. |
| IMAGE_REL_ARM64_REL21 |
0x0005 |
12bitový relativní posun do cíle pro instrukce ADR |
| IMAGE_REL_ARM64_PAGEOFFSET_12A |
0x0006 |
Posun 12bitové stránky cíle pro pokyny ADD/ADDS (okamžité) s nulovou posunou. |
| IMAGE_REL_ARM64_PAGEOFFSET_12L |
0x0007 |
Posun 12bitové stránky cíle pro instrukční LDR (indexovaný, nepodepsaný okamžitě). |
| IMAGE_REL_ARM64_SECREL |
0x0008 |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_ARM64_SECREL_LOW12A |
0x0009 |
Bit 0:11 posunu oddílu cíle, pro pokyny ADD/ADDS (okamžité) s nulovou posun. |
| IMAGE_REL_ARM64_SECREL_HIGH12A |
0x000A |
Bit 12:23 posunu oddílu cíle, pro instrukce ADD/ADDS (okamžité) s nulovou posun. |
| IMAGE_REL_ARM64_SECREL_LOW12L |
0x000B |
Bit 0:11 posunu oddílu cíle, pro instrukce LDR (indexovaný, bez znaménka okamžitě). |
| IMAGE_REL_ARM64_TOKEN |
0x000C |
Token CLR. |
| IMAGE_REL_ARM64_SECTION |
0x000D |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_ARM64_ADDR64 |
0x000E |
64bitová virtuální autorita cíle přemístění. |
| IMAGE_REL_ARM64_BRANCH19 |
0x000F |
19bitový posun na cíl přemístění pro podmíněnou instrukci B. |
| IMAGE_REL_ARM64_BRANCH14 |
0x0010 |
14bitový posun na cíl přemístění pro pokyny TBZ a TBNZ. |
| IMAGE_REL_ARM64_REL32 |
0x0011 |
32bitová relativní adresa z bajtu po přemístění. |
Procesory Hitachi SuperH
Následující indikátory typu přemístění jsou definovány pro procesory SH3 a SH4. Přemístění specifické pro SH5 se označuje jako SHM (SH Media).
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_SH3_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_SH3_DIRECT16 |
0x0001 |
Odkaz na 16bitové umístění, které obsahuje VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT32 |
0x0002 |
32bitová VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT8 |
0x0003 |
Odkaz na 8bitové umístění, které obsahuje VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT8_WORD |
0x0004 |
Odkaz na 8bitovou instrukci, která obsahuje efektivní 16bitovou VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT8_LONG |
0x0005 |
Odkaz na 8bitovou instrukci, která obsahuje efektivní 32bitovou VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT4 |
0x0006 |
Odkaz na 8bitové umístění, jehož nízké 4 bity obsahují VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT4_WORD |
0x0007 |
Odkaz na 8bitovou instrukci, jejíž nízká 4bitová verze obsahuje efektivní 16bitovou VA cílového symbolu. |
| IMAGE_REL_SH3_DIRECT4_LONG |
0x0008 |
Odkaz na 8bitovou instrukci, jejíž nízký počet 4 bitů obsahuje efektivní 32bitovou VA cílového symbolu. |
| IMAGE_REL_SH3_PCREL8_WORD |
0x0009 |
Odkaz na 8bitovou instrukci, která obsahuje efektivní 16bitový relativní posun cílového symbolu. |
| IMAGE_REL_SH3_PCREL8_LONG |
0x000A |
Odkaz na 8bitovou instrukci, která obsahuje efektivní 32bitový relativní posun cílového symbolu. |
| IMAGE_REL_SH3_PCREL12_WORD |
0x000B |
Odkaz na 16bitovou instrukci, jejíž nízká hodnota 12 bitů obsahuje efektivní 16bitový relativní posun cílového symbolu. |
| IMAGE_REL_SH3_STARTOF_SECTION |
0x000C |
Odkaz na 32bitové umístění, které je VA oddílu, který obsahuje cílový symbol. |
| IMAGE_REL_SH3_SIZEOF_SECTION |
0x000D |
Odkaz na 32bitové umístění, které je velikost oddílu, který obsahuje cílový symbol. |
| IMAGE_REL_SH3_SECTION |
0x000E |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_SH3_SECREL |
0x000F |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_SH3_DIRECT32_NB |
0x0010 |
32bitová hodnota RVA cílového symbolu. |
| IMAGE_REL_SH3_GPREL4_LONG |
0x0011 |
Relativní gp. |
| IMAGE_REL_SH3_TOKEN |
0x0012 |
Token CLR. |
| IMAGE_REL_SHM_PCRELPT |
0x0013 |
Posun od aktuální instrukce v dlouhých slovech. Pokud není bit NOMODE nastaven, vložte inverzní funkci k bitu 32 a vyberte PTA nebo PTB. |
| IMAGE_REL_SHM_REFLO |
0x0014 |
Nízkých 16 bitů 32bitové adresy. |
| IMAGE_REL_SHM_REFHALF |
0x0015 |
Vysoký počet 16 bitů 32bitové adresy. |
| IMAGE_REL_SHM_RELLO |
0x0016 |
Nízkých 16 bitů relativní adresy. |
| IMAGE_REL_SHM_RELHALF |
0x0017 |
Vysoká 16 bitů relativní adresy. |
| IMAGE_REL_SHM_PAIR |
0x0018 |
Přemístění je platné pouze v případě, že bezprostředně následuje přemístění REFHALF, RELHALF nebo RELLO. Pole SymbolTableIndex přemístění obsahuje posun, nikoli index do tabulky symbolů. |
| IMAGE_REL_SHM_NOMODE |
0x8000 |
Přemístění ignoruje režim oddílů. |
Procesory IBM PowerPC
Pro procesory PowerPC jsou definovány následující indikátory typu přemístění.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_PPC_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_PPC_ADDR64 |
0x0001 |
64bitová virtuální autorita cíle. |
| IMAGE_REL_PPC_ADDR32 |
0x0002 |
32bitová virtuální autorita cíle. |
| IMAGE_REL_PPC_ADDR24 |
0x0003 |
Nízkých 24 bitů VA cíle. To platí jenom v případě, že je cílový symbol absolutní a dá se podepsat na původní hodnotu. |
| IMAGE_REL_PPC_ADDR16 |
0x0004 |
Nízkých 16 bitů virtuálního počítače cíle. |
| IMAGE_REL_PPC_ADDR14 |
0x0005 |
Nízkých 14 bitů virtuálního počítače cíle. To platí jenom v případě, že je cílový symbol absolutní a dá se podepsat na původní hodnotu. |
| IMAGE_REL_PPC_REL24 |
0x0006 |
24bitový posun relativní vzhledem k počítači na místo symbolu. |
| IMAGE_REL_PPC_REL14 |
0x0007 |
14bitový posun vzhledem k počítači na místo symbolu. |
| IMAGE_REL_PPC_ADDR32NB |
0x000A |
32bitová hodnota RVA cíle. |
| IMAGE_REL_PPC_SECREL |
0x000B |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_PPC_SECTION |
0x000C |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_PPC_SECREL16 |
0x000F |
16bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_PPC_REFHI |
0x0010 |
Vysoký počet 16 bitů 32bitového virtuálního počítače cíle. Používá se pro první instrukce v pořadí dvou instrukcí, které načte úplnou adresu. Za tímto přemístěním musí bezprostředně následovat přemístění PAIR, jehož SymbolTableIndex obsahuje podepsaný 16bitový posun, který se přidá do horních 16 bitů, které byly převzaty z umístění, které se přemísťuje. |
| IMAGE_REL_PPC_REFLO |
0x0011 |
Nízkých 16 bitů virtuálního počítače cíle. |
| IMAGE_REL_PPC_PAIR |
0x0012 |
Přemístění platné pouze v případě, že bezprostředně následuje přemístění REFHI nebo SECRELHI. Jeho SymbolTableIndex obsahuje posun, nikoli index do tabulky symbolů. |
| IMAGE_REL_PPC_SECRELLO |
0x0013 |
Nízkých 16 bitů 32bitového posunu cíle od začátku jeho oddílu. |
| IMAGE_REL_PPC_GPREL |
0x0015 |
16bitové přesunutí podepsaného cíle vzhledem k registru GP. |
| IMAGE_REL_PPC_TOKEN |
0x0016 |
Token CLR. |
Procesory Intel 386
Pro procesory Intel 386 a kompatibilní procesory jsou definovány následující ukazatele typu přemístění.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_I386_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_I386_DIR16 |
0x0001 |
Není podporováno. |
| IMAGE_REL_I386_REL16 |
0x0002 |
Není podporováno. |
| IMAGE_REL_I386_DIR32 |
0x0006 |
32bitová virtuální síť cíle. |
| IMAGE_REL_I386_DIR32NB |
0x0007 |
32bitová hodnota RVA cíle. |
| IMAGE_REL_I386_SEG12 |
0x0009 |
Není podporováno. |
| IMAGE_REL_I386_SECTION |
0x000A |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_I386_SECREL |
0x000B |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_I386_TOKEN |
0x000C |
Token CLR. |
| IMAGE_REL_I386_SECREL7 |
0x000D |
7bitový posun od základu oddílu, který obsahuje cíl. |
| IMAGE_REL_I386_REL32 |
0x0014 |
32bitový relativní posun do cíle. To podporuje relativní větev x86 a pokyny pro volání. |
Řada procesorů Intel Itanium (IPF)
Následující indikátory typu přemístění jsou definovány pro řadu procesorů Intel Itanium a kompatibilní procesory. Všimněte si, že přemístění podle pokynů používá posun a číslo slotu sady pro posun přemístění.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_IA64_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_IA64_IMM14 |
0x0001 |
Za přemístěním instrukce může následovat přemístění ADDEND, jehož hodnota je přidána k cílové adrese před vložením do zadaného slotu v sadě IMM14. Cíl přemístění musí být absolutní nebo musí být opraven obrázek. |
| IMAGE_REL_IA64_IMM22 |
0x0002 |
Za přemístěním instrukce může následovat přemístění ADDEND, jehož hodnota se před vložením do zadaného slotu v sadě IMM22 přidá na cílovou adresu. Cíl přemístění musí být absolutní nebo musí být opraven obrázek. |
| IMAGE_REL_IA64_IMM64 |
0x0003 |
Počet slotů tohoto přemístění musí být jeden (1). Za přemístěním může následovat přemístění ADDEND, jehož hodnota se přidá na cílovou adresu předtím, než je uložena ve všech třech slotech sady IMM64. |
| IMAGE_REL_IA64_DIR32 |
0x0004 |
32bitová virtuální síť cíle. To se podporuje jenom u imagí /LARGEADDRESSAWARE:NO. |
| IMAGE_REL_IA64_DIR64 |
0x0005 |
64bitová virtuální autorita cíle. |
| IMAGE_REL_IA64_PCREL21B |
0x0006 |
Instrukce je opravena s 25bitovým relativním posunem k 16bitovému cíli. Nízkých 4 bitů posunu je nula a neukládají se. |
| IMAGE_REL_IA64_PCREL21M |
0x0007 |
Instrukce je opravena s 25bitovým relativním posunem k 16bitovému cíli. Nízké 4 bity posunu, které jsou nula, nejsou uloženy. |
| IMAGE_REL_IA64_PCREL21F |
0x0008 |
LSB posunu tohoto přemístění musí obsahovat číslo slotu, zatímco zbytek je adresa svazku. Sada se opraví s 25bitovým relativním posunem k 16bitovému cíli. Nízkých 4 bitů posunu je nula a neukládají se. |
| IMAGE_REL_IA64_GPREL22 |
0x0009 |
Za přemístěním instrukce může následovat přemístění ADDEND, jehož hodnota se přidá na cílovou adresu, a pak 22bitový posun relativního objektu GP, který se vypočítá a použije na GPREL22 sadu. |
| IMAGE_REL_IA64_LTOFF22 |
0x000A |
Instrukce je opravena s 22bitovým posunem relativního gp na položku literálové tabulky cílového symbolu. Linker vytvoří tuto položku literálové tabulky na základě tohoto přemístění a přemístění doplňku, které by mohlo následovat. |
| IMAGE_REL_IA64_SECTION |
0x000B |
16bitový index oddílu oddílu obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_IA64_SECREL22 |
0x000C |
Instrukce je opravena s 22bitovým posunem cíle od začátku jeho oddílu. Za tímto přemístěním může následovat okamžitě přemístění ADDEND, jehož pole Hodnota obsahuje 32bitový posun bez znaménka cíle od začátku oddílu. |
| IMAGE_REL_IA64_SECREL64I |
0x000D |
Číslo slotu pro toto přemístění musí být jedno (1). Instrukce je opravena s 64bitovým posunem cíle od začátku jeho oddílu. Za tímto přemístěním může následovat okamžitě přemístění doplňku, jehož pole Hodnota obsahuje 32bitový posun bez znaménka cíle od začátku oddílu. |
| IMAGE_REL_IA64_SECREL32 |
0x000E |
Adresa dat, která se mají opravit s 32bitovým posunem cíle od začátku jeho oddílu. |
| IMAGE_REL_IA64_DIR32NB |
0x0010 |
32bitová hodnota RVA cíle. |
| IMAGE_REL_IA64_SREL14 |
0x0011 |
Použije se u 14bitového podepsaného 14bitového objektu, který obsahuje rozdíl mezi dvěma relokovatelnými cíli. Toto je deklarativní pole linkeru, které označuje, že kompilátor již tuto hodnotu vygeneroval. |
| IMAGE_REL_IA64_SREL22 |
0x0012 |
To se použije na 22bitové 22bitové bitové prostředí, které obsahuje rozdíl mezi dvěma nepřiřazené cíle. Toto je deklarativní pole linkeru, které označuje, že kompilátor již tuto hodnotu vygeneroval. |
| IMAGE_REL_IA64_SREL32 |
0x0013 |
To se použije u 32bitového 32bitového bitového bitového podpisu, který obsahuje rozdíl mezi dvěma nepřiřazenými hodnotami. Toto je deklarativní pole linkeru, které označuje, že kompilátor již tuto hodnotu vygeneroval. |
| IMAGE_REL_IA64_UREL32 |
0x0014 |
Použije se u 32bitového 32bitového objektu bez znaménka, který obsahuje rozdíl mezi dvěma nepřiřazenými hodnotami. Toto je deklarativní pole linkeru, které označuje, že kompilátor již tuto hodnotu vygeneroval. |
| IMAGE_REL_IA64_PCREL60X |
0x0015 |
60bitová oprava relativního počítače, která vždy zůstává jako instrukce BRL sady MLX. |
| IMAGE_REL_IA64_PCREL60B |
0x0016 |
60bitová oprava relativního počítače. Pokud se cílový posun vejde do podepsaného 25bitového pole, převeďte celou sadu na sadu MBB s NOP. B ve slotu 1 a 25bitové instrukce BR (se 4 nejnižšími bity všechny nuly a vyřazeny) ve slotu 2. |
| IMAGE_REL_IA64_PCREL60F |
0x0017 |
60bitová oprava relativního počítače. Pokud se cílový posun vejde do podepsaného 25bitového pole, převeďte celý svazek na sadu MFB s NOP. F ve slotu 1 a 25bitový (4 nejnižší bity všechny nuly a vyřazené) instrukce BR v slotu 2. |
| IMAGE_REL_IA64_PCREL60I |
0x0018 |
60bitová oprava relativního počítače. Pokud se cílový posun vejde do podepsaného 25bitového pole, převeďte celý svazek na sadu MIB s NOP. V slotu 1 a 25bitové (4 nejnižší bity všechny nuly a vyřazené) instrukce BR ve slotu 2. |
| IMAGE_REL_IA64_PCREL60M |
0x0019 |
60bitová oprava relativního počítače. Pokud se cílový posun vejde do podepsaného 25bitového pole, převeďte celý svazek na sadu MMB s NOP. M ve slotu 1 a 25bitové (4 nejnižší bity všechny nuly a vyřazené) instrukce BR ve slotu 2. |
| IMAGE_REL_IA64_IMMGPREL64 |
0x001a |
64bitová oprava relativního gp. |
| IMAGE_REL_IA64_TOKEN |
0x001b |
Token CLR. |
| IMAGE_REL_IA64_GPREL32 |
0x001c |
32bitová oprava relativního gp. |
| IMAGE_REL_IA64_ADDEND |
0x001F |
Přemístění je platné pouze v případě, že bezprostředně následuje jeden z následujících přemístění: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I nebo SECREL32. Jeho hodnota obsahuje dodatek, který se použije pro pokyny v rámci sady, nikoli pro data. |
Procesory MIPS
Následující indikátory typu přemístění jsou definovány pro procesory MIPS.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_MIPS_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_MIPS_REFHALF |
0x0001 |
Vysoký počet 16 bitů 32bitového virtuálního počítače cíle. |
| IMAGE_REL_MIPS_REFWORD |
0x0002 |
32bitová virtuální síť cíle. |
| IMAGE_REL_MIPS_JMPADDR |
0x0003 |
Nízkých 26 bitů virtuálního počítače cíle. To podporuje instrukce MIPS J a JAL. |
| IMAGE_REL_MIPS_REFHI |
0x0004 |
Vysoký počet 16 bitů 32bitového virtuálního počítače cíle. Používá se pro první instrukce v pořadí dvou instrukcí, které načte úplnou adresu. Za tímto přemístěním musí bezprostředně následovat přemístění PAIR, jehož SymbolTableIndex obsahuje podepsaný 16bitový posun, který se přidá do horních 16 bitů, které jsou převzaty z umístění, které se přemísťuje. |
| IMAGE_REL_MIPS_REFLO |
0x0005 |
Nízkých 16 bitů virtuálního počítače cíle. |
| IMAGE_REL_MIPS_GPREL |
0x0006 |
16bitový posun cíle vzhledem k registru GP. |
| IMAGE_REL_MIPS_LITERAL |
0x0007 |
Totéž jako IMAGE_REL_MIPS_GPREL. |
| IMAGE_REL_MIPS_SECTION |
0x000A |
16bitový index oddílu oddílu obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_MIPS_SECREL |
0x000B |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_MIPS_SECRELLO |
0x000C |
Nízkých 16 bitů 32bitového posunu cíle od začátku jeho oddílu. |
| IMAGE_REL_MIPS_SECRELHI |
0x000D |
Vysoký 16 bitů 32bitového posunu cíle od začátku jeho oddílu. Přemístění IMAGE_REL_MIPS_PAIR musí okamžitě následovat za tímto umístěním. SymbolTableIndex přemístění PAIR obsahuje podepsaný 16bitový posun, který je přidán do horních 16 bitů, které jsou převzaty z umístění, které se přemísťuje. |
| IMAGE_REL_MIPS_JMPADDR16 |
0x0010 |
Nízkých 26 bitů virtuálního počítače cíle. To podporuje instrukce MIPS16 JAL. |
| IMAGE_REL_MIPS_REFWORDNB |
0x0022 |
32bitová hodnota RVA cíle. |
| IMAGE_REL_MIPS_PAIR |
0x0025 |
Přemístění je platné pouze v případě, že bezprostředně následuje přemístění REFHI nebo SECRELHI. Jeho SymbolTableIndex obsahuje posun, nikoli index do tabulky symbolů. |
Mitsubishi M32R
Následující indikátory typu přemístění jsou definovány pro procesoryRem M32R.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_M32R_ABSOLUTE |
0x0000 |
Přemístění se ignoruje. |
| IMAGE_REL_M32R_ADDR32 |
0x0001 |
32bitová virtuální síť cíle. |
| IMAGE_REL_M32R_ADDR32NB |
0x0002 |
32bitová hodnota RVA cíle. |
| IMAGE_REL_M32R_ADDR24 |
0x0003 |
24bitová virtuální síť cíle. |
| IMAGE_REL_M32R_GPREL16 |
0x0004 |
16bitový posun cíle od registru GP. |
| IMAGE_REL_M32R_PCREL24 |
0x0005 |
24bitový posun cíle od čítače programu (PC), posunuté doleva o 2 bity a znaménko rozšířené |
| IMAGE_REL_M32R_PCREL16 |
0x0006 |
16bitový posun cíle od počítače, posunuté doleva o 2 bity a rozšíření znaménka |
| IMAGE_REL_M32R_PCREL8 |
0x0007 |
8bitové posuny cíle od počítače, posunuté doleva o 2 bity a prodloužené znaménko |
| IMAGE_REL_M32R_REFHALF |
0x0008 |
16 MSB cílového virtuálního počítače. |
| IMAGE_REL_M32R_REFHI |
0x0009 |
16 MSB cílového VA upraveného pro rozšíření znaménka LSB. Používá se pro první instrukce v sekvenci se dvěma instrukcemi, která načte úplnou 32bitovou adresu. Za tímto přemístěním musí bezprostředně následovat přemístění PAIR, jehož SymbolTableIndex obsahuje podepsaný 16bitový posun, který se přidá do horních 16 bitů, které jsou převzaty z umístění, které se přemísťuje. |
| IMAGE_REL_M32R_REFLO |
0x000A |
16 databází LSB cílového virtuálního počítače. |
| IMAGE_REL_M32R_PAIR |
0x000B |
Přemístění musí následovat po přemístění REFHI. Jeho SymbolTableIndex obsahuje posun, nikoli index do tabulky symbolů. |
| IMAGE_REL_M32R_SECTION |
0x000C |
16bitový index oddílu oddílu, který obsahuje cíl. Používá se k podpoře informací o ladění. |
| IMAGE_REL_M32R_SECREL |
0x000D |
32bitový posun cíle od začátku jeho oddílu. Používá se k podpoře ladění informací a místního úložiště statického vlákna. |
| IMAGE_REL_M32R_TOKEN |
0x000E |
Token CLR. |
Čísla řádků COFF (zastaralé)
Čísla řádků COFF se už nevytvářejí a v budoucnu nebudou spotřebována.
Čísla řádků COFF označují vztah mezi kódem a čísly řádků ve zdrojových souborech. Formát Microsoftu pro čísla řádků COFF je podobný standardní funkci COFF, ale byl rozšířen tak, aby umožňoval, aby jeden oddíl souvisel s čísly řádků ve více zdrojových souborech.
Čísla řádků COFF se skládají z pole záznamů s pevnou délkou. Umístění (posun souboru) a velikost pole jsou zadány v záhlaví oddílu. Každý záznam čísla řádku má následující formát.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Typ (*) |
Toto je sjednocení dvou polí: SymbolTableIndex a VirtualAddress. Určuje, jestli se používá SymbolTableIndex nebo RVA, závisí na hodnotě Linenumber. |
| 4 |
2 |
Linenumber |
Pokud nenízero, toto pole určuje jednořádkové číslo. Pokud je nula, pole Typ je interpretováno jako index tabulky symbolů pro funkci. |
Pole Typ je sjednocení dvou 4bajtů polí: SymbolTableIndex a VirtualAddress.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
SymbolTableIndex |
Používá se, když je číslo řádku nula: index pro položku tabulky symbolů pro funkci. Tento formát se používá k označení funkce, na kterou odkazuje skupina záznamů čísel řádků. |
| 0 |
4 |
VirtualAddress |
Používá se, pokud je číslo řádku nenulové: RVA spustitelného kódu, který odpovídá zdrojovému řádku označenému. V souboru objektu obsahuje VA v oddílu. |
Záznam s číslem řádku může buď nastavit pole Číslo řádku na nulu a odkazovat na definici funkce v tabulce symbolů, nebo může fungovat jako standardní položka čísla řádku tak, že poskytne kladné celé číslo (číslo řádku) a odpovídající adresu v kódu objektu.
Skupina položek s číslem řádku vždy začíná prvním formátem: index symbolu funkce. Pokud se jedná o první záznam čísla řádku v oddílu, je to také název symbolu COMDAT pro funkci, pokud je nastaven příznak COMDAT oddílu. Viz oddíly COMDAT (pouze objekt). Pomocný záznam funkce v tabulce symbolů má ukazatel na pole Číslo řádku, které odkazuje na stejný záznam s číslem řádku.
Za záznamem, který identifikuje funkci, následuje libovolný počet položek s číslem řádku, které poskytují skutečné informace o čísle řádku (to znamená položky s číslem řádku větší než nula). Tyto položky jsou založené na jednom vzhledem k začátku funkce a představují každý zdrojový řádek ve funkci s výjimkou prvního řádku.
Například první záznam čísla řádku pro následující příklad by zadal funkci ReverseSign (SymbolTableIndex reverseSign a Číslo řádku nastavenou na nulu). Záznamy s hodnotami 1, 2 a 3 by pak odpovídaly zdrojovým řádkům, jak je znázorněno na následujícím obrázku:
// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2: return -1 * i;
3: }
Tabulka symbolů COFF
Tabulka symbolů v této části se dědí z tradičního formátu COFF. Liší se od informací o ladění v jazyce Microsoft Visual C++. Soubor může obsahovat tabulku symbolů COFF i ladicí informace jazyka Visual C++ a obě jsou oddělené. Některé nástroje Microsoftu používají tabulku symbolů pro omezené, ale důležité účely, jako je například komunikace informací COMDAT s linkerem. Názvy oddílů a názvy souborů a symboly kódu a dat jsou uvedeny v tabulce symbolů.
Umístění tabulky symbolů je uvedeno v záhlaví COFF.
Tabulka symbolů je pole záznamů s délkou 18 bajtů. Každý záznam je standardní nebo pomocný záznam tabulky symbolů. Standardní záznam definuje symbol nebo název a má následující formát.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
8 |
Název (*) |
Název symbolu reprezentovaný sjednocením tří struktur. Pole 8 bajtů se používá, pokud název není delší než 8 bajtů. Další informace naleznete v tématu Reprezentace názvu symbolu. |
| 8 |
4 |
Hodnota |
Hodnota přidružená ke symbolu. Interpretace tohoto pole závisí na typu SectionNumber a StorageClass. Typickým významem je přemísťovatelná adresa. |
| 12 |
2 |
SectionNumber |
Celé číslo, které identifikuje oddíl, pomocí indexu založeného na jednom do tabulky oddílů. Některé hodnoty mají zvláštní význam, jak je definováno v oddílu 5.4.2, "Hodnoty čísel oddílů". |
| 14 |
2 |
Typ |
Číslo, které představuje typ. Nástroje Microsoftu nastavily toto pole na 0x20 (funkce) nebo 0x0 (ne na funkci). Další informace naleznete v tématu Reprezentace typu. |
| 16 |
1 |
StorageClass |
Výčtová hodnota, která představuje třídu úložiště. Další informace najdete v tématu Třída úložiště. |
| 17 |
1 |
NumberOfAuxSymbols |
Počet pomocných položek tabulky symbolů, které následují za tímto záznamem. |
Nulové nebo více pomocných záznamů tabulky symbolů okamžitě následují za každým standardním záznamem tabulky symbolů. Obvykle však není více než jeden pomocný záznam tabulky symbolů se řídí standardním záznamem tabulky symbolů (s výjimkou záznamů .file s dlouhými názvy souborů). Každý pomocný záznam má stejnou velikost jako standardní záznam tabulky symbolů (18 bajtů), ale nedefinuje nový symbol, pomocný záznam poskytuje další informace o posledním definovaném symbolu. Volba z několika formátů, které se mají použít, závisí na poli StorageClass. Aktuálně definované formáty pro pomocné záznamy tabulky symbolů jsou uvedeny v části 5.5 "Pomocné záznamy symbolů".
Nástroje, které čtou tabulky symbolů COFF, musí ignorovat pomocné záznamy symbolů, jejichž interpretace je neznámá. To umožňuje rozšířit formát tabulky symbolů, aby se přidaly nové pomocné záznamy bez přerušení existujících nástrojů.
Reprezentace názvu symbolu
Pole ShortName v tabulce symbolů se skládá z 8 bajtů, které obsahují samotný název, pokud není delší než 8 bajtů nebo pole ShortName dává posun do tabulky řetězců. Pokud chcete zjistit, jestli je zadaný název nebo posun, otestujte prvních 4 bajty pro rovnost na nulu.
Podle konvence se názvy považují za řetězce s kódováním UTF-8 s nulovým ukončením.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
8 |
ShortName |
Pole 8 bajtů. Pokud je název kratší než 8 bajtů, je toto pole na pravé straně vycpané s hodnotou null. |
| 0 |
4 |
Nuly |
Pole, které je nastaveno na všechny nuly, pokud je název delší než 8 bajtů. |
| 4 |
4 |
Ofset |
Posun do tabulky řetězců. |
Číselné hodnoty oddílu
Za normálních okolností je pole Hodnota oddílu v položce tabulky symbolů indexem v tabulce oddílů. Toto pole je ale celé číslo se signedem a může přijímat záporné hodnoty. Následující hodnoty, menší než jedna, mají zvláštní významy.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_SYM_UNDEFINED |
0 |
Záznam symbolu ještě nemá přiřazený oddíl. Hodnota nuly označuje, že odkaz na externí symbol je definován jinde. Hodnota bez nuly je běžný symbol s velikostí určenou hodnotou. |
| IMAGE_SYM_ABSOLUTE |
-1 |
Symbol má absolutní (nepřiřazenou) hodnotu a není to adresa. |
| IMAGE_SYM_DEBUG |
-2 |
Symbol poskytuje obecné informace o typu nebo ladění, ale neodpovídá oddílu. Nástroje Microsoftu používají toto nastavení spolu se záznamy souborů .(file třídy úložiště). |
Reprezentace typu
Pole Typ položky tabulky symbolů obsahuje 2 bajty, kde každý bajt představuje informace o typu. LSB představuje jednoduchý (základní) datový typ a MSB představuje komplexní typ, pokud existuje:
| MSB | LSB |
|---|---|
| Komplexní typ: none, pointer, function, array. |
Základní typ: celé číslo, plovoucí desetinka atd. |
Následující hodnoty jsou definovány pro základní typ, i když nástroje Společnosti Microsoft obvykle toto pole nepoužívají a nastavte LSB na hodnotu 0. Místo toho se k označení typů používají ladicí informace jazyka Visual C++. Možné hodnoty COFF jsou zde však uvedeny pro úplnost.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_SYM_TYPE_NULL |
0 |
Žádné informace o typu ani neznámý základní typ. Nástroje Microsoftu používají toto nastavení. |
| IMAGE_SYM_TYPE_VOID |
1 |
Žádný platný typ; používá se s ukazateli a funkcemi void |
| IMAGE_SYM_TYPE_CHAR |
2 |
Znak (podepsaný bajt) |
| IMAGE_SYM_TYPE_SHORT |
3 |
Celé číslo se 2 bajty |
| IMAGE_SYM_TYPE_INT |
4 |
Přirozený celočíselná typ (obvykle 4 bajty ve Windows) |
| IMAGE_SYM_TYPE_LONG |
5 |
4bajtů podepsané celé číslo |
| IMAGE_SYM_TYPE_FLOAT |
6 |
Číslo s plovoucí desetinou čárkou 4 bajtů |
| IMAGE_SYM_TYPE_DOUBLE |
7 |
Číslo s plovoucí desetinou čárkou 8 bajtů |
| IMAGE_SYM_TYPE_STRUCT |
8 |
Struktura |
| IMAGE_SYM_TYPE_UNION |
9 |
Sjednocení |
| IMAGE_SYM_TYPE_ENUM |
10 |
Výčtový typ |
| IMAGE_SYM_TYPE_MOE |
11 |
Člen výčtu (konkrétní hodnota) |
| IMAGE_SYM_TYPE_BYTE |
12 |
Bajt; unsigned 1-byte integer |
| IMAGE_SYM_TYPE_WORD |
13 |
Slovo; celé číslo bez znaménka 2 bajtů |
| IMAGE_SYM_TYPE_UINT |
14 |
Celé číslo bez znaménka přirozené velikosti (obvykle 4 bajty) |
| IMAGE_SYM_TYPE_DWORD |
15 |
Celé číslo bez znaménka 4 bajtů |
Nejvýznamnější bajt určuje, zda je symbol ukazatelem, vrácením funkce nebo polem základního typu, který je zadán v LSB. Nástroje Microsoftu používají toto pole pouze k označení, zda je symbol funkcí, takže pouze dvě výsledné hodnoty jsou 0x0 a 0x20 pro pole Typ. Další nástroje ale můžou toto pole použít ke sdělení dalších informací.
Je velmi důležité správně zadat atribut funkce. Tyto informace se vyžadují, aby přírůstkové propojení fungovalo správně. V některých architekturách se informace můžou vyžadovat pro jiné účely.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_SYM_DTYPE_NULL |
0 |
Žádný odvozený typ; symbol je jednoduchá skalární proměnná. |
| IMAGE_SYM_DTYPE_POINTER |
1 |
Symbol je ukazatel na základní typ. |
| IMAGE_SYM_DTYPE_FUNCTION |
2 |
Symbol je funkce, která vrací základní typ. |
| IMAGE_SYM_DTYPE_ARRAY |
3 |
Symbol je pole základního typu. |
Třída úložiště
Pole StorageClass tabulky symbolů označuje, jaký druh definice symbol představuje. V následující tabulce jsou uvedeny možné hodnoty. Všimněte si, že pole StorageClass je celé číslo bez znaménka 1 bajtů. Proto by měla být přijata zvláštní hodnota -1 jako ekvivalent bez znaménka 0xFF.
I když tradiční formát COFF používá mnoho hodnot třídy úložiště, nástroje Microsoftu spoléhají na formát ladění Visual C++ pro většinu symbolických informací a obecně používají pouze čtyři hodnoty třídy úložiště: EXTERNAL (2), STATIC (3), FUNCTION (101) a FILE (103). S výjimkou záhlaví druhého sloupce níže by mělo být "Hodnota" považováno za pole Hodnota záznamu symbolu (jehož interpretace závisí na počtu nalezených jako třída úložiště).
| Konstanta | Hodnota | Popis/interpretace pole Hodnota |
|---|---|---|
| IMAGE_SYM_CLASS_END_OF_FUNCTION |
-1 (0xFF) |
Speciální symbol, který představuje konec funkce pro účely ladění. |
| IMAGE_SYM_CLASS_NULL |
0 |
Žádná přiřazená třída úložiště. |
| IMAGE_SYM_CLASS_AUTOMATIC |
1 |
Automatická proměnná (stack). Pole Hodnota určuje posun rámce zásobníku. |
| IMAGE_SYM_CLASS_EXTERNAL |
2 |
Hodnota, kterou nástroje Microsoftu používají pro externí symboly. Pole Hodnota označuje velikost, pokud je číslo oddílu IMAGE_SYM_UNDEFINED (0). Pokud číslo oddílu není nula, pak pole Hodnota určuje posun v oddílu. |
| IMAGE_SYM_CLASS_STATIC |
3 |
Posun symbolu v oddílu. Pokud je pole Hodnota nula, symbol představuje název oddílu. |
| IMAGE_SYM_CLASS_REGISTER |
4 |
Proměnná registru. Pole Hodnota určuje číslo registru. |
| IMAGE_SYM_CLASS_EXTERNAL_DEF |
5 |
Symbol, který je definován externě. |
| IMAGE_SYM_CLASS_LABEL |
6 |
Popisek kódu, který je definován v rámci modulu. Pole Hodnota určuje posun symbolu v oddílu. |
| IMAGE_SYM_CLASS_UNDEFINED_LABEL |
7 |
Odkaz na popisek kódu, který není definován. |
| IMAGE_SYM_CLASS_MEMBER_OF_STRUCT |
8 |
Člen struktury. Pole Hodnota určuje n. člen. |
| IMAGE_SYM_CLASS_ARGUMENT |
9 |
Formální argument (parametr) funkce. Pole Hodnota určuje n. argument. |
| IMAGE_SYM_CLASS_STRUCT_TAG |
10 |
Položka názvu značky struktury. |
| IMAGE_SYM_CLASS_MEMBER_OF_UNION |
11 |
Člen odboru. Pole Hodnota určuje n. člen. |
| IMAGE_SYM_CLASS_UNION_TAG |
12 |
Položka název značky Unie. |
| IMAGE_SYM_CLASS_TYPE_DEFINITION |
13 |
Položka Typedef. |
| IMAGE_SYM_CLASS_UNDEFINED_STATIC |
14 |
Deklarace statických dat. |
| IMAGE_SYM_CLASS_ENUM_TAG |
15 |
Položka s výčtem názvu značky typu |
| IMAGE_SYM_CLASS_MEMBER_OF_ENUM |
16 |
Člen výčtu. Pole Hodnota určuje n. člen. |
| IMAGE_SYM_CLASS_REGISTER_PARAM |
17 |
Parametr registru. |
| IMAGE_SYM_CLASS_BIT_FIELD |
18 |
Odkaz na bitové pole. Pole Hodnota určuje n-bit v bitovém poli. |
| IMAGE_SYM_CLASS_BLOCK |
100 |
Záznam .bb (začátek bloku) nebo .eb (konec bloku). Pole Hodnota je relokovatelná adresa umístění kódu. |
| IMAGE_SYM_CLASS_FUNCTION |
101 |
Hodnota, kterou nástroje Microsoftu používají pro záznamy symbolů definující rozsah funkce: počáteční funkce (.bf), koncová funkce ( .ef ) a čáry ve funkci ( .lf). U záznamů .lf poskytuje pole Hodnota počet zdrojových řádků ve funkci. V případě záznamů .ef poskytuje pole Hodnota velikost kódu funkce. |
| IMAGE_SYM_CLASS_END_OF_STRUCT |
102 |
Konec položky struktury. |
| IMAGE_SYM_CLASS_FILE |
103 |
Hodnota, kterou nástroje Microsoftu a tradiční formát COFF používají pro záznam symbolu zdrojového souboru. Za tímto symbolem následují pomocné záznamy, které soubor pojmenují. |
| IMAGE_SYM_CLASS_SECTION |
104 |
Definice oddílu (nástroje Microsoftu místo toho používají statickou třídu úložiště). |
| IMAGE_SYM_CLASS_WEAK_EXTERNAL |
105 |
Slabý externí. Další informace naleznete v tématu Pomocný formát 3: Slabé externí. |
| IMAGE_SYM_CLASS_CLR_TOKEN |
107 |
Symbol tokenu CLR. Název je řetězec ASCII, který se skládá z šestnáctkové hodnoty tokenu. Další informace naleznete v tématu Definice tokenu CLR (pouze objekt). |
Pomocné záznamy symbolů
Záznamy tabulky pomocných symbolů vždy následují a platí pro některé standardní záznamy tabulky symbolů. Pomocný záznam může mít libovolný formát, který nástroje rozpoznají, ale pro ně musí být přiděleno 18 bajtů, aby se tabulka symbolů zachovala jako pole běžné velikosti. Nástroje Microsoftu v současné době rozpoznávají pomocné formáty pro následující typy záznamů: definice funkcí, počáteční a koncové symboly funkce (.bf a .ef), slabé externí objekty, názvy souborů a definice oddílů.
Tradiční návrh COFF zahrnuje také pomocné formáty záznamů pro pole a struktury. Nástroje Společnosti Microsoft tyto nástroje nepoužívají, ale místo toho umístěte tyto symbolické informace ve formátu ladění visual C++ v částech ladění.
Pomocný formát 1: Definice funkcí
Záznam tabulky symbolů označuje začátek definice funkce, pokud má všechny následující hodnoty: třídu úložiště EXTERNAL (2), hodnotu typu, která označuje, že se jedná o funkci (0x20) a číslo oddílu, které je větší než nula. Všimněte si, že záznam tabulky symbolů, který má číslo oddílu UNDEFINED (0), nedefinuje funkci a nemá pomocný záznam. Za záznamy symbolů definice funkce následuje pomocný záznam ve formátu popsaném níže:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
TagIndex |
Index tabulky symbolů odpovídajícího záznamu symbolu .bf (počáteční funkce). |
| 4 |
4 |
TotalSize |
Velikost spustitelného kódu pro samotnou funkci. Pokud je funkce ve své vlastní části, velikost SizeOfRawData v záhlaví oddílu je větší nebo rovna tomuto poli v závislosti na aspektech zarovnání. |
| 8 |
4 |
PointerToLinenumber |
Posun souboru první položky řádku COFF pro funkci nebo nula, pokud neexistuje. Další informace najdete v tématu Čísla řádků COFF (zastaralé). |
| 12 |
4 |
PointerToNextFunction |
Index tabulky symbolů záznamu pro další funkci. Pokud je funkce poslední v tabulce symbolů, je toto pole nastaveno na nulu. |
| 16 |
2 |
Nepoužitý |
Pomocný formát 2: Symboly .bf a .ef
Pro každou definici funkce v tabulce symbolů popisují tři položky začátek, konec a počet řádků. Každý z těchto symbolů má třídu úložiště FUNCTION (101):
Záznam symbolu s názvem .bf (počáteční funkce). Pole Hodnota se nepoužívá.
Záznam symbolu s názvem .lf (řádky ve funkci). Pole Hodnota poskytuje počet řádků ve funkci.
Záznam symbolu s názvem .ef (konec funkce). Pole Hodnota má stejné číslo jako pole Celková velikost v záznamu symbolu funkce.
Za záznamy symbolů .bf a .ef (ale ne .lf) následuje pomocný záznam s následujícím formátem:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Nepoužitý |
|
| 4 |
2 |
Linenumber |
Skutečné pořadové číslo řádku (1, 2, 3 atd.) ve zdrojovém souboru odpovídající záznamu .bf nebo .ef. |
| 6 |
6 |
Nepoužitý |
|
| 12 |
4 |
PointerToNextFunction ( pouze .bf) |
Index tabulky symbolů dalšího záznamu symbolu .bf. Pokud je funkce poslední v tabulce symbolů, je toto pole nastaveno na nulu. Nepoužívá se pro záznamy .ef. |
| 16 |
2 |
Nepoužitý |
Pomocný formát 3: Slabé externí
Slabé externí objekty jsou mechanismus pro soubory objektů, které umožňují flexibilitu v době propojení. Modul může obsahovat nevyřešený externí symbol (sym1), ale může také obsahovat pomocný záznam, který označuje, že pokud sym1 v době propojení není, použije se k překladu odkazů jiný externí symbol (sym2).
Pokud je definice sym1 propojená, je externí odkaz na symbol vyřešen normálně. Pokud definice sym1 není propojená, všechny odkazy na slabou externí pro sym1 místo toho odkazují na sym2. Vnější symbol, sym2, musí být vždy propojen; obvykle je definován v modulu, který obsahuje slabý odkaz na sym1.
Slabé externí objekty jsou reprezentovány záznamem tabulky symbolů s externí třídou úložiště, číslem oddílu UNDEF a hodnotou nuly. Za záznamem slabého externího symbolu následuje pomocný záznam s následujícím formátem:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
TagIndex |
Index tabulky symbolů sym2, symbol, který se má propojit, pokud se sym1 nenajde. |
| 4 |
4 |
Charakteristiky |
Hodnota IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY označuje, že by se nemělo provádět žádné hledání knihovny sym1. Hodnota IMAGE_WEAK_EXTERN_SEARCH_LIBRARY označuje, že se má provést hledání knihovny sym1. Hodnota IMAGE_WEAK_EXTERN_SEARCH_ALIAS označuje, že sym1 je alias pro sym2. |
| 8 |
10 |
Nepoužitý |
Všimněte si, že pole Vlastnosti není definováno v winNT. H; místo toho se použije pole Celková velikost.
Pomocný formát 4: Soubory
Tento formát se řídí záznamem tabulky symbolů se třídou úložiště FILE (103). Samotný název symbolu by měl být .file a pomocný záznam, který následuje, dává název souboru zdrojového kódu.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
18 |
Název souboru |
Řetězec ANSI, který dává název zdrojového souboru. Tato hodnota je vycpaná s hodnotou null, pokud je menší než maximální délka. |
Pomocný formát 5: Definice oddílů
Tento formát se řídí záznamem tabulky symbolů, který definuje oddíl. Takový záznam má název symbolu, který je názvem oddílu (například .text nebo .drectve) a má třídu úložiště STATIC (3). Pomocný záznam poskytuje informace o oddílu, na který odkazuje. Proto duplikuje některé informace v záhlaví oddílu.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Délka |
Velikost dat oddílu; stejné jako SizeOfRawData v záhlaví oddílu. |
| 4 |
2 |
NumberOfRelocations |
Počet položek přemístění pro oddíl. |
| 6 |
2 |
NumberOfLinenumbers |
Počet položek řádku pro oddíl. |
| 8 |
4 |
Kontrolní součet |
Kontrolní součet pro společná data. Platí, pokud je příznak IMAGE_SCN_LNK_COMDAT nastavený v záhlaví oddílu. Další informace naleznete v části COMDAT (pouze objekt). |
| 12 |
2 |
Číslo |
Index založený na jednom oddílu do tabulky oddílů přidruženého oddílu. Používá se, když je nastavení výběru COMDAT 5. |
| 14 |
1 |
Selekce |
Číslo výběru COMDAT. To platí, pokud se jedná o oddíl COMDAT. |
| 15 |
3 |
Nepoužitý |
Oddíly COMDAT (pouze objekt)
Pole Výběr v pomocném formátu definice oddílu je použitelné, pokud je oddíl oddílem COMDAT. Část COMDAT je oddíl, který lze definovat více než jedním souborem objektu. (Příznak IMAGE_SCN_LNK_COMDAT je nastavený v poli Flags oddílu záhlaví oddílu.) Pole Výběr určuje způsob, jakým linker překládá více definic oddílů COMDAT.
Prvním symbolem, který má hodnotu oddílu oddílu oddílu COMDAT, musí být symbol oddílu. Tento symbol má název oddílu, pole Hodnota rovná se nule, číslo oddílu příslušného oddílu COMDAT, pole Typ se rovná IMAGE_SYM_TYPE_NULL, pole Třída se rovná IMAGE_SYM_CLASS_STATIC a jeden pomocný záznam. Druhý symbol se nazývá "symbol COMDAT" a používá ho linker ve spojení s polem Výběr.
Hodnoty pro pole Výběr jsou uvedeny níže.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_COMDAT_SELECT_NODUPLICATES |
1 |
Pokud je tento symbol již definovaný, linker vydá chybu násobení definovaného symbolu. |
| IMAGE_COMDAT_SELECT_ANY |
2 |
Všechny oddíly, které definují stejný symbol COMDAT, mohou být propojeny; zbytek se odebere. |
| IMAGE_COMDAT_SELECT_SAME_SIZE |
3 |
Linker vybere libovolný oddíl mezi definicemi tohoto symbolu. Pokud všechny definice nemají stejnou velikost, zobrazí se chyba násobení definovaného symbolu. |
| IMAGE_COMDAT_SELECT_EXACT_MATCH |
4 |
Linker vybere libovolný oddíl mezi definicemi tohoto symbolu. Pokud se všechny definice neshodují přesně, zobrazí se chyba násobení definovaného symbolu. |
| IMAGE_COMDAT_SELECT_ASSOCIATIVE |
5 |
Oddíl je propojený, pokud je propojená určitá jiná část COMDAT. Tento další oddíl je označen polem Číslo pomocného záznamu symbolu pro definici oddílu. Toto nastavení je užitečné pro definice, které mají komponenty v několika oddílech (například kód v jednom a data v jiném), ale kde všechny musí být propojeny nebo zahozeny jako sada. Druhá část, ke které je tento oddíl přidružen, musí být oddíl COMDAT, což může být další asociativní oddíl COMDAT. Asociativní řetězec přidružení oddílu COMDAT nemůže vytvořit smyčku. Řetězec přidružení oddílu musí nakonec přijít do oddílu COMDAT, který nemá nastavenou IMAGE_COMDAT_SELECT_ASSOCIATIVE. |
| IMAGE_COMDAT_SELECT_LARGEST |
6 |
Linker vybere největší definici ze všech definic pro tento symbol. Pokud má více definic tuto velikost, volba mezi nimi je libovolná. |
Definice tokenu CLR (pouze objekt)
Tento pomocný symbol obvykle následuje IMAGE_SYM_CLASS_CLR_TOKEN. Slouží k přidružení tokenu k oboru názvů tabulky symbolů COFF.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
1 |
bAuxType |
Musí být IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1). |
| 1 |
1 |
bReserved |
Rezervovaná hodnota musí být nula. |
| 2 |
4 |
SymbolTableIndex |
Index symbolu symbolu COFF, na který odkazuje tato definice tokenu CLR. |
| 6 |
12 |
Rezervovaná hodnota musí být nula. |
Tabulka řetězců COFF
Hned za tabulkou symbolů COFF je tabulka řetězců COFF. Pozice této tabulky se nachází tak, že vezme adresu tabulky symbolů v záhlaví COFF a přidá počet symbolů vynásobených velikostí symbolu.
Na začátku tabulky řetězců COFF jsou 4 bajty, které obsahují celkovou velikost (v bajtech) zbytku tabulky řetězců. Tato velikost zahrnuje samotné pole velikosti, aby hodnota v tomto umístění byla 4, pokud by nebyly přítomny žádné řetězce.
Za velikostí jsou řetězce ukončené hodnotou null, na které odkazují symboly v tabulce symbolů COFF.
Tabulka certifikátu atributu (pouze obrázek)
Certifikáty atributů je možné přidružit k obrázku přidáním tabulky certifikátu atributu. Tabulka certifikátu atributu se skládá ze sady souvislých položek certifikátu zarovnaného s čtyřúhelníkem. Mezi původní konec souboru a začátek tabulky certifikátu atributu se vloží nula odsazení, aby bylo dosaženo tohoto zarovnání. Každá položka certifikátu atributu obsahuje následující pole.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
dwLength |
Určuje délku položky certifikátu atributu. |
| 4 |
2 |
wRevision |
Obsahuje číslo verze certifikátu. Podrobnosti najdete v následujícím textu. |
| 6 |
2 |
wCertificateType |
Určuje typ obsahu v nástroji bCertificate. Podrobnosti najdete v následujícím textu. |
| 8 |
Podívejte se na následující: |
bCertificate |
Obsahuje certifikát, například podpis Authenticode. Podrobnosti najdete v následujícím textu. |
Hodnota virtuální adresy ze položky Tabulka certifikátů v volitelném datovém adresáři záhlaví je posun souboru na první položku certifikátu atributu. K následným položkám se přistupuje tak, že od začátku položky aktuálního certifikátu atributu se zaokrouhlí nahoru na 8 bajtový násobek. To pokračuje, dokud součet zaokrouhlených hodnot dwLength se rovná hodnotě Velikost z položky Tabulka certifikátů v volitelném datovém adresáři záhlaví. Pokud se součet zaokrouhlených hodnot dwLength nerovná hodnotě Velikost, je poškozena tabulka certifikátu atributu nebo pole Velikost.
Pokud například položka tabulky certifikátu volitelného datového adresáře hlavičky obsahuje:
virtual address = 0x5000
size = 0x1000
První certifikát začíná posunem 0x5000 od začátku souboru na disku. Pokud chcete pokračovat všemi položkami certifikátu atributu, postupujte tak, že:
- Přidejte hodnotu dwLength certifikátu prvního atributu do počátečního posunu.
- Zaokrouhlí hodnotu z kroku 1 nahoru na nejbližší 8bajtů a vyhledá posun položky certifikátu druhého atributu.
- Přidejte hodnotu posunu z kroku 2 do hodnoty dwLength certifikátu druhého atributu a zaokrouhlete nahoru na nejbližší 8bajtů a určete posun položky certifikátu třetího atributu.
- Opakujte krok 3 pro každý následný certifikát, dokud se vypočítaný posun nerovná 0x6000 (0x5000 start + 0x1000 celková velikost), což znamená, že jste prošli celou tabulku.
Alternativně můžete vytvořit výčet položek certifikátu voláním funkce Win32 ImageEnumerateCertificates ve smyčce. Odkaz na referenční stránku funkce najdete v tématu Odkazy.
Položky tabulky certifikátu atributu mohou obsahovat libovolný typ certifikátu, pokud má položka správnou hodnotu dwLength, jedinečnou hodnotu wRevision a jedinečnou hodnotu wCertificateType. Nejběžnějším typem položky tabulky certifikátů je struktura WIN_CERTIFICATE, která je zdokumentovaná ve Wintrust.h a probírá se ve zbývající části této části.
Možnosti pro WIN_CERTIFICATE člen wRevision zahrnují (ale nejsou omezeny) následující.
| Hodnota | Název | Poznámky |
|---|---|---|
| 0x0100 |
WIN_CERT_REVISION_1_0 |
Verze 1, starší verze struktury Win_Certificate. Podporuje se jenom pro účely ověřování starších podpisů Authenticode. |
| 0x0200 |
WIN_CERT_REVISION_2_0 |
Verze 2 je aktuální verze struktury Win_Certificate. |
Možnosti pro člena WIN_CERTIFICATE wCertificateType zahrnují (ale nejsou omezeny) položky v následující tabulce. Všimněte si, že některé hodnoty se v současné době nepodporují.
| Hodnota | Název | Poznámky |
|---|---|---|
| 0x0001 |
WIN_CERT_TYPE_X509 |
bCertificate obsahuje certifikát X.509. Nepodporováno |
| 0x0002 |
WIN_CERT_TYPE_PKCS_SIGNED_DATA |
bCertificate obsahuje strukturu PKCS#7 SignedData. |
| 0x0003 |
WIN_CERT_TYPE_RESERVED_1 |
Rezervovaný |
| 0x0004 |
WIN_CERT_TYPE_TS_STACK_SIGNED |
Podepisování certifikátů zásobníku protokolů terminálového serveru Nepodporováno |
Člen bCertificate struktury WIN_CERTIFICATE obsahuje pole bajtů s proměnnou délkou s typem obsahu určeným typem wCertificateType. Typ podporovaný službou Authenticode je WIN_CERT_TYPE_PKCS_SIGNED_DATA, struktura PKCS#7 SignedData . Podrobnosti o formátu digitálního podpisu Authenticode naleznete v tématu Windows Authenticode Portable Executable Signature Format.
Pokud obsah bCertificate nekončí na hranici čtyřúhelníku, položka certifikátu atributu je vycpaná nulami, od konce bCertificate k další hranici čtyřúhelníku.
Hodnota dwLength je délka finalizované struktury WIN_CERTIFICATE a vypočítá se takto:
dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)
Tato délka by měla zahrnovat velikost všech odsazení, které slouží k splnění požadavku, aby každá struktura WIN_CERTIFICATE byla zarovnaná:
dwLength += (8 - (dwLength & 7)) & 7;
Velikost tabulky certifikátu zadaná v položce Tabulka certifikátů v datových adresářích volitelné hlavičky (pouze obrázek) zahrnuje odsazení.
Další informace o použití rozhraní ImageHlp API k vytvoření výčtu, přidání a odebrání certifikátů ze souborů PE naleznete v tématu ImageHlp Functions.
Data certifikátu
Jak je uvedeno v předchozí části, certifikáty v tabulce certifikátu atributu mohou obsahovat libovolný typ certifikátu. Certifikáty, které zajišťují integritu souboru PE, můžou obsahovat hodnotu hash obrázku PE.
Hodnota hash obrázku PE (nebo hodnota hash souboru) se podobá kontrolnímu součtu souboru v tom, že algoritmus hash vytvoří hodnotu hash zprávy, která souvisí s integritou souboru. Kontrolní součet je však vytvořen jednoduchým algoritmem a používá se především ke zjištění, zda blok paměti na disku zmizel špatně a hodnoty uložené tam byly poškozeny. Hodnota hash souboru je podobná kontrolnímu součtu, ve které také detekuje poškození souboru. Na rozdíl od většiny algoritmů kontrolního součtu je však velmi obtížné změnit soubor beze změny hodnoty hash souboru z původní neupravené hodnoty. Hash souboru lze tedy použít k detekci úmyslných a dokonce drobných úprav souboru, jako jsou například viry, hackeri nebo trojské koně programy.
Pokud je součástí certifikátu, musí hodnota hash obrázku vyloučit určitá pole v imagi PE, například kontrolní součet a položka tabulka certifikátů v adresářích nepovinných dat hlaviček. Důvodem je to, že přidání certifikátu změní tato pole a způsobí výpočet jiné hodnoty hash.
Funkce Win32 ImageGetDigestStream poskytuje datový proud z cílového souboru PE, se kterým se mají hashovat funkce. Tento datový proud zůstává konzistentní při přidání nebo odebrání certifikátů ze souboru PE. Na základě parametrů předaných ImageGetDigestStream je možné z výpočtu hodnoty hash vynechat další data z image PE. Odkaz na referenční stránku funkce najdete v tématu Odkazy.
Delay-Load Import tabulek (jenom obrázek)
Tyto tabulky byly přidány do obrázku, aby podporovaly jednotný mechanismus pro aplikace, které zpozdí načítání knihovny DLL do prvního volání této knihovny DLL. Rozložení tabulek odpovídá tradičním tabulkám importu popsaným v oddílu 6.4 oddílu .idata. Zde je popsáno pouze několik podrobností.
Tabulka adresářů Delay-Load
Tabulka adresářů se zpožděním je protějškem tabulky importu adresáře. Lze ho načíst prostřednictvím položky popisovače zpoždění importu v seznamu volitelných adresářů dat záhlaví (posun 200). Tabulka je uspořádaná takto:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Atributy |
Musí být nula. |
| 4 |
4 |
Jméno |
Hodnota RVA názvu knihovny DLL, která se má načíst. Název se nachází v oddílu dat jen pro čtení obrázku. |
| 8 |
4 |
Popisovač modulu |
RVA popisovače modulu (v datové části image) knihovny DLL, která se má načíst zpoždění. Používá se pro ukládání rutinou, která se dodává ke správě zpoždění načítání. |
| 12 |
4 |
Tabulka adres importu zpoždění |
RVA tabulky adres importu zpoždění při načítání. Další informace najdete v tématu Zpoždění importu tabulky adres (IAT). |
| 16 |
4 |
Pozdržet tabulku názvů importu |
RVA tabulky s názvem zpoždění a načtením, která obsahuje názvy importů, které mohou být nutné načíst. To odpovídá rozložení tabulky názvů importu. Další informace naleznete v tématu Hint/Name Table. |
| 20 |
4 |
Tabulka importu vázané prodlevy |
Hodnota RVA v tabulce adresy zpoždění a načtení vazby, pokud existuje. |
| 24 |
4 |
Unload Delay Import Table |
Hodnota RVA tabulky s odloženým načtením adresy, pokud existuje. Jedná se o přesnou kopii tabulky adres importu zpoždění. Pokud volající knihovnu DLL uvolní, měla by se tato tabulka zkopírovat zpět přes tabulku adres importu zpoždění, aby následná volání knihovny DLL nadále používala mechanismus pro převod dat správně. |
| 28 |
4 |
Časové razítko |
Časové razítko knihovny DLL, ke které byl tento obrázek vázán. |
Tabulky odkazované v této datové struktuře jsou uspořádané a seřazené stejně jako jejich protějšky pro tradiční importy. Podrobnosti najdete v části .idata.
Atributy
Zatím nejsou definovány žádné příznaky atributů. Linker nastaví toto pole na nulu na obrázku. Toto pole lze použít k rozšíření záznamu tím, že označuje přítomnost nových polí nebo lze použít k označení chování pomocných funkcí zpoždění nebo uvolnění.
Název
Název knihovny DLL, která má být načtena se zpožděním, se nachází v datové části jen pro čtení obrázku. Odkazuje se na něj prostřednictvím pole szName.
Popisovač modulu
Popisovač knihovny DLL, která má být načtena, je v datové části obrázku. Pole phmod odkazuje na popisovač. Zadaný pomocník pro odložené načtení používá toto umístění k uložení popisovače do načtené knihovny DLL.
Tabulka adres importu zpoždění
Na tabulku IAT (Delay Import Address Table) odkazuje popisovač importu zpoždění prostřednictvím pole pIAT. Pomocník pro zpoždění a načtení tyto ukazatele aktualizuje skutečnými vstupními body tak, aby se tyto bloky už ve volající smyčce nepřesuly. Ukazatele funkce jsou přístupné pomocí výrazu pINT->u1.Function.
Pozdržet tabulku názvů importu
Tabulka názvů názvů zpožděných importů (INT) obsahuje názvy importů, které mohou vyžadovat načtení. Jsou seřazeny stejným způsobem jako ukazatele funkce v IAT. Skládají se ze stejných struktur jako standardní INT a přistupují pomocí výrazu pINT->u1.AddressOfData->Name[0].
Tabulka adres pro odložení vázaného importu a časové razítko
Tabulka adres importu s vazbou na zpoždění (BIAT) je volitelná tabulka IMAGE_THUNK_DATA položek, které se používají spolu s polem časového razítka tabulky adresáře delay-load podle fáze vazby po procesu.
Odložení uvolnění tabulky adres importu
Odložené uvolnění tabulky adres importu (UIAT) je volitelná tabulka IMAGE_THUNK_DATA položek, které kód pro uvolnění používá ke zpracování explicitního požadavku na uvolnění. Skládá se z inicializovaných dat v části jen pro čtení, která je přesnou kopií původního IAT, který odkazuje na kód na bloky pro odložené načtení. Na žádosti o uvolnění lze knihovnu uvolnit, *phmod vymazat a UIAT zapsané přes IAT obnovit vše do stavu předběžného načtení.
Speciální oddíly
- Oddíl .debug
- Oddíl .drectve (pouze objekt)
- Oddíl .edata (pouze obrázek)
- Oddíl .idata
- Oddíl .pdata
- Oddíl .reloc (pouze obrázek)
- Oddíl .tls
- Struktura konfigurace načtení (pouze image)
- Oddíl .rsrc
- Oddíl .cormeta (pouze objekt)
- Oddíl .sxdata
Typické oddíly COFF obsahují kód nebo data, která linkery a zavaděče Microsoft Win32 zpracovávají bez speciálních znalostí o obsahu oddílu. Obsah je relevantní jenom pro aplikaci, která je propojená nebo spuštěná.
Některé části COFF ale mají zvláštní význam při nalezení v souborech objektů nebo souborech obrázků. Nástroje a zavaděče rozpoznávají tyto oddíly, protože mají v záhlaví oddílu nastavené speciální příznaky, protože speciální umístění v obrázku volitelné záhlaví odkazují na ně nebo protože samotný název oddílu označuje speciální funkci oddílu. (I když samotný název oddílu neuvádí speciální funkci oddílu, název oddílu je diktován konvencí, takže autoři této specifikace mohou ve všech případech odkazovat na název oddílu.)
Rezervované oddíly a jejich atributy jsou popsány v následující tabulce, za nimiž následuje podrobný popis typů oddílů, které jsou trvalé ve spustitelných souborech, a typy oddílů, které obsahují metadata pro rozšíření.
| Název sekce | Obsah | Charakteristiky |
|---|---|---|
| .Bss |
Neinicializovaná data (volný formát) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
| .cormeta |
Metadata CLR, která označují, že soubor objektu obsahuje spravovaný kód |
IMAGE_SCN_LNK_INFO |
| .data |
Inicializovaná data (volný formát) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
| .debug$F |
Vygenerované informace o ladění objektu FPO (pouze objekt, pouze architektura x86 a nyní zastaralé) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
| .debug$P |
Předkompilované typy ladění (pouze objekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
| .debug$S |
Symboly ladění (pouze objekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
| .debug$T |
Typy ladění (pouze objekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
| .drective |
Možnosti linkeru |
IMAGE_SCN_LNK_INFO |
| .edata |
Export tabulek |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
| .idata |
Import tabulek |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
| .idlsym |
Zahrnuje registrované SEH (pouze image) pro podporu atributů IDL. Informace naleznete v části Atributy IDL v odkazech na konci tohoto tématu. |
IMAGE_SCN_LNK_INFO |
| .pdata |
Informace o výjimce |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
| .rdata |
Inicializovaná data jen pro čtení |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
| .reloc |
Přemístění obrázků |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
| .rsrc |
Adresář prostředků |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
| .sbss |
Neinicializovaná data relativní vzhledem k GP (volný formát) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Příznak IMAGE_SCN_GPREL by měl být nastaven pouze pro architektury IA64; tento příznak není platný pro jiné architektury. Příznak IMAGE_SCN_GPREL je určen pouze pro soubory objektů; pokud se tento typ oddílu zobrazí v souboru obrázku, nesmí být nastaven příznak IMAGE_SCN_GPREL. |
| .sdata |
Inicializovaná data relativní vzhledem k GP (volný formát) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Příznak IMAGE_SCN_GPREL by měl být nastaven pouze pro architektury IA64; tento příznak není platný pro jiné architektury. Příznak IMAGE_SCN_GPREL je určen pouze pro soubory objektů; pokud se tento typ oddílu zobrazí v souboru obrázku, nesmí být nastaven příznak IMAGE_SCN_GPREL. |
| .srdata |
Data jen pro čtení relativní vzhledem k GP (volný formát) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Příznak IMAGE_SCN_GPREL by měl být nastaven pouze pro architektury IA64; tento příznak není platný pro jiné architektury. Příznak IMAGE_SCN_GPREL je určen pouze pro soubory objektů; pokud se tento typ oddílu zobrazí v souboru obrázku, nesmí být nastaven příznak IMAGE_SCN_GPREL. |
| .sxdata |
Registrovaná data obslužné rutiny výjimek (pouze volný formát a x86/objekt) |
IMAGE_SCN_LNK_INFO Obsahuje index symbolů každého z obslužných rutin výjimek, na které odkazuje kód v tomto souboru objektu. Symbol může být pro symbol UNDEF nebo pro symbol, který je definován v daném modulu. |
| .Text |
Spustitelný kód (volný formát) |
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ |
| .tls |
Místní úložiště s vlákny (pouze objekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
| .tls$ |
Místní úložiště s vlákny (pouze objekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
| .vsdata |
Inicializovaná data relativní vzhledem k GP (volný formát a pouze pro architektury ARM, SH4 a Thumb) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
| .xdata |
Informace o výjimce (volný formát) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
Některé zde uvedené oddíly jsou označené jako "pouze objekt" nebo "pouze obrázek", aby bylo uvedeno, že jejich speciální sémantika jsou relevantní pouze pro soubory objektů nebo soubory obrázků. Oddíl, který je označený jako "pouze obrázek", se může stále zobrazovat v souboru objektu jako způsob, jak se dostat do souboru obrázku, ale oddíl nemá pro linker žádný zvláštní význam, pouze pro zavaděč souborů obrázku.
Oddíl .debug
Oddíl .debug se používá v souborech objektů, aby obsahoval informace o ladění generované kompilátorem a v souborech obrázků, aby obsahoval všechny vygenerované ladicí informace. Tato část popisuje balení informací o ladění v souborech objektů a obrázků.
Další část popisuje formát ladicího adresáře, který může být kdekoli na obrázku. Následující části popisují "skupiny" v souborech objektů, které obsahují informace o ladění.
Výchozí hodnota linkeru je, že informace o ladění nejsou mapovány do adresního prostoru obrázku. Oddíl .debug existuje pouze v případech, kdy jsou informace o ladění mapovány v adresního prostoru.
Ladicí adresář (jenom obrázek)
Soubory obrázků obsahují volitelný ladicí adresář, který označuje, jaká forma informací o ladění se nachází a kde se nachází. Tento adresář se skládá z pole položek ladicího adresáře, jejichž umístění a velikost jsou uvedeny v volitelné hlavičce obrázku.
Ladicí adresář může být v zahoditelném oddílu .debug (pokud existuje) nebo ho můžete zahrnout do libovolného jiného oddílu v souboru obrázku nebo nemusí být vůbec v oddílu.
Každá položka adresáře ladění identifikuje umístění a velikost bloku informací o ladění. Zadaná hodnota RVA může být nulová, pokud hlavička oddílu neobsahuje informace o ladění (to znamená, že se nachází v souboru obrázku a nenamapuje se do adresního prostoru za běhu). Pokud je namapován, je RVA jeho adresa.
Položka ladicího adresáře má následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Charakteristiky |
Rezervovaná hodnota musí být nula. |
| 4 |
4 |
TimeDateStamp |
Čas a datum vytvoření dat ladění. |
| 8 |
2 |
MajorVersion |
Číslo hlavní verze formátu ladicích dat. |
| 10 |
2 |
MinorVersion |
Číslo podverze formátu ladicí data. |
| 12 |
4 |
Typ |
Formát informací o ladění Toto pole umožňuje podporu více ladicích programů. Další informace naleznete v tématu Typ ladění. |
| 16 |
4 |
SizeOfData |
Velikost dat ladění (nezahrnuje samotný ladicí adresář). |
| 20 |
4 |
AddressOfRawData |
Adresa dat ladění při načtení vzhledem k základu image. |
| 24 |
4 |
PointerToRawData |
Ukazatel souboru na ladicí data. |
Typ ladění
Pro pole Typ položky adresáře ladění jsou definovány následující hodnoty:
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_DEBUG_TYPE_UNKNOWN |
0 |
Neznámá hodnota, kterou všechny nástroje ignorují. |
| IMAGE_DEBUG_TYPE_COFF |
1 |
Informace o ladění COFF (čísla řádků, tabulka symbolů a tabulka řetězců). Tento typ informací o ladění odkazuje také na pole v hlavičce souboru. |
| IMAGE_DEBUG_TYPE_CODEVIEW |
2 |
Informace o ladění jazyka Visual C++. |
| IMAGE_DEBUG_TYPE_FPO |
3 |
Informace o vynechání ukazatele rámce Tyto informace ladicího programu říkají, jak interpretovat nestandardní rámce zásobníku, které používají registr EBP pro jiný účel než jako ukazatel rámce. |
| IMAGE_DEBUG_TYPE_MISC |
4 |
Umístění souboru DBG. |
| IMAGE_DEBUG_TYPE_EXCEPTION |
5 |
Kopie oddílu .pdata. |
| IMAGE_DEBUG_TYPE_FIXUP |
6 |
Rezervovaný. |
| IMAGE_DEBUG_TYPE_OMAP_TO_SRC |
7 |
Mapování z RVA na obrázku na RVA ve zdrojové imagi. |
| IMAGE_DEBUG_TYPE_OMAP_FROM_SRC |
8 |
Mapování z RVA ve zdrojové imagi na RVA na obrázku. |
| IMAGE_DEBUG_TYPE_BORLAND |
9 |
Vyhrazeno pro Borland. |
| IMAGE_DEBUG_TYPE_RESERVED10 |
10 |
Rezervovaný. |
| IMAGE_DEBUG_TYPE_CLSID |
11 |
Rezervovaný. |
| IMAGE_DEBUG_TYPE_REPRO |
16 |
Determinismus nebo reprodukovatelnost pe. |
| Nedefinováno |
17 |
Informace o ladění jsou vloženy do souboru PE v umístění určeném PointerToRawData. |
| Nedefinováno |
19 |
Ukládá kryptografickou hodnotu hash pro obsah souboru symbolu použitého k sestavení souboru PE/COFF. |
| IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS | 20 | Bity rozšířených charakteristik knihovny DLL. |
Pokud je pole Typ nastaveno na IMAGE_DEBUG_TYPE_FPO, je nezpracovaná data ladění pole, ve kterém každý člen popisuje rámec zásobníku funkce. Ne každá funkce v souboru obrázku musí mít definované informace o objektu FPO, i když typ ladění je FPO. U těchto funkcí, které nemají informace o objektu FPO, se předpokládá, že mají normální rámce zásobníku. Formát informací o FPO je následující:
#define FRAME_FPO 0
#define FRAME_TRAP 1
#define FRAME_TSS 2
typedef struct _FPO_DATA {
DWORD ulOffStart; // offset 1st byte of function code
DWORD cbProcSize; // # bytes in function
DWORD cdwLocals; // # bytes in locals/4
WORD cdwParams; // # bytes in params/4
WORD cbProlog : 8; // # bytes in prolog
WORD cbRegs : 3; // # regs saved
WORD fHasSEH : 1; // TRUE if SEH in func
WORD fUseBP : 1; // TRUE if EBP has been allocated
WORD reserved : 1; // reserved for future use
WORD cbFrame : 2; // frame type
} FPO_DATA;
Přítomnost položky typu IMAGE_DEBUG_TYPE_REPRO označuje, že soubor PE je sestaven způsobem, jak dosáhnout determinismu nebo reprodukovatelnosti. Pokud se vstup nezmění, je zaručeno, že výstupní soubor PE bude bitově identický bez ohledu na to, kdy nebo kde se pe vytváří. Různá pole s datem a časem v souboru PE jsou vyplněna částmi nebo všemi bity z počítané hodnoty hash, která jako vstup používá obsah souboru PE, a proto již nepředstavuje skutečné datum a čas, kdy se vytvoří soubor PE nebo související konkrétní data v rámci pe. Nezpracovaná data této položky ladění můžou být prázdná nebo můžou obsahovat počítanou hodnotu hash před hodnotou čtyř bajtů, která představuje délku hodnoty hash.
Pokud je pole Typ nastaveno na IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, ladit nezpracovaná data obsahují bity rozšířených charakteristik knihovny DLL, kromě těch, které by mohly být nastaveny v volitelné hlavičce obrázku. Viz Vlastnosti knihovny DLL v části Nepovinná hlavička Windows-Specific pole (pouze obrázek).
Rozšířené charakteristiky knihovny DLL
Následující hodnoty jsou definovány pro bity rozšířených charakteristik knihovny DLL.
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT | 0x0001 | Obrázek je kompatibilní se stínovým zásobníkem CET (Control-Flow Enforcement Technology). |
| IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT | 0x0040 | Všechny cíle větví ve všech oddílech kódu obrázku jsou opatřeny poznámkami s pokyny pro integritu toku řízení vpřed, jako jsou pokyny pro sledování větví (IBT) x86 CET-Indirect Branch Tracking (IBT) nebo BTI (Branch Target Identification). Tento bit nepoužívá systém Windows. |
.debug$F (pouze objekt)
Data v této části byla nahrazena v jazyce Visual C++ verze 7.0 a novější rozsáhlejší sadou dat, která se vygenerují do pododdílu .debug$S .
Soubory objektů mohou obsahovat oddíly .debug$F, jejichž obsah je jeden nebo více FPO_DATA záznamů (informace o vynechání ukazatele rámce). Viz "IMAGE_DEBUG_TYPE_FPO" v ladicím typu.
Linker rozpozná tyto záznamy .debug$F . Pokud se generují informace o ladění, linker seřadí FPO_DATA záznamy podle procedury RVA a vygeneruje pro ně položku ladicího adresáře.
Kompilátor by neměl generovat záznamy FPO pro procedury, které mají standardní formát rámce.
.debug$S (pouze objekt)
Tato část obsahuje informace o ladění visual C++ (symbolické informace).
.debug$P (pouze objekt)
Tato část obsahuje informace o ladění jazyka Visual C++ (předkompilované informace). Jedná se o sdílené typy mezi všemi objekty, které byly zkompilovány pomocí předkompilované hlavičky vygenerované s tímto objektem.
.debug$T (pouze objekt)
Tato část obsahuje informace o ladění jazyka Visual C++ (informace o typu).
Podpora linkeru pro informace o ladění microsoftu
Pokud chcete podporovat informace o ladění, linker:
Shromažďuje všechna relevantní data ladění z oddílů .debug$F, debug$S, .debug$P a .debug$T .
Zpracovává tato data spolu s informacemi o ladění vygenerovanými linkerem do souboru PDB a vytvoří položku ladicího adresáře, která na ni odkazuje.
Oddíl .drectve (pouze objekt)
Oddíl je oddíl direktivy, pokud má IMAGE_SCN_LNK_INFO příznak nastavený v záhlaví oddílu a má název oddílu .drectve . Linker odebere oddíl .drectve po zpracování informací, takže se oddíl nezobrazí v souboru obrázku, který je propojen.
Oddíl .drectve se skládá z řetězce textu, který lze kódovat jako ANSI nebo UTF-8. Pokud značka pořadí bajtů UTF-8 (BOM, předpona se třemi bajty, která se skládá z 0xEF, 0xBB a 0xBF), řetězec direktivy se interpretuje jako ANSI. Řetězec direktivy je řada možností linkeru, které jsou oddělené mezerami. Každá možnost obsahuje pomlčka, název možnosti a libovolný příslušný atribut. Pokud možnost obsahuje mezery, musí být tato možnost uzavřena v uvozovkách. Oddíl .drectve nesmí obsahovat přemístění ani čísla řádků.
Oddíl .edata (pouze obrázek)
Oddíl exportu dat s názvem .edata obsahuje informace o symbolech, ke kterým mají ostatní obrázky přístup prostřednictvím dynamického propojení. Exportované symboly se obvykle nacházejí v knihovnách DLL, ale knihovny DLL mohou také importovat symboly.
Níže je popsán přehled obecné struktury oddílu exportu. Popsané tabulky jsou obvykle v souboru v uvedeném pořadí souvislé (i když to není povinné). K exportu symbolů jako ordinaly se vyžaduje pouze tabulka adresářů exportu a tabulka adres exportu. (Pořadový řádek je export, ke kterému přistupuje přímo index tabulky adres exportu.) Tabulka ukazatelů názvů, pořadová tabulka a tabulka názvů exportu existují, aby podporovala použití názvů exportu.
| Název tabulky | Popis |
|---|---|
| Export tabulky adresářů |
Tabulka s pouhým jedním řádkem (na rozdíl od ladicího adresáře) Tato tabulka označuje umístění a velikosti ostatních tabulek exportu. |
| Export tabulky adres |
Pole RVA exportovaných symbolů. Jedná se o skutečné adresy exportovaných funkcí a dat v rámci spustitelného kódu a datových oddílů. Jiné soubory obrázků můžou importovat symbol pomocí indexu do této tabulky (pořadové číslo), případně pomocí veřejného názvu, který odpovídá pořadové sadě, pokud je definován veřejný název. |
| Tabulka ukazatelů názvu |
Pole ukazatelů na názvy veřejných exportů seřazené vzestupně. |
| Pořadová tabulka |
Pole pořadových řad, které odpovídají členům tabulky ukazatelů názvů. Korespondence je na pozici; proto tabulka ukazatelů názvu a pořadová tabulka musí mít stejný počet členů. Každý pořadový řádek je index do tabulky adres exportu. |
| Export tabulky názvů |
Řada řetězců ASCII ukončených hodnotou null. Členové tabulky ukazatele názvu do této oblasti. Tyto názvy jsou veřejné názvy, kterými jsou symboly importovány a exportovány; nemusí být nutně stejné jako soukromé názvy, které se používají v souboru obrázku. |
Když jiný soubor obrázku naimportuje symbol podle názvu, zavaděč Win32 vyhledá v tabulce ukazatelů názvu odpovídající řetězec. Pokud se najde odpovídající řetězec, je přidružený pořadový řádek identifikován vyhledáním odpovídajícího člena v pořadové tabulce (to znamená člen řadové tabulky se stejným indexem jako ukazatel řetězce nalezený v tabulce ukazatelů názvů). Výsledný pořadový řádek je index do tabulky adres exportu, který dává skutečné umístění požadovaného symbolu. Ke každému symbolu exportu může přistupovat řadový symbol.
Pokud jiný soubor obrázku naimportuje symbol podle řad, není nutné hledat v tabulce ukazatelů názvů odpovídající řetězec. Přímé použití pořadového pořadí je proto efektivnější. Název exportu je ale jednodušší zapamatovat a nevyžaduje, aby uživatel znal index tabulky pro symbol.
Exportovat tabulku adresáře
Informace o symbolu exportu začínají tabulkou adresáře exportu, která popisuje zbývající informace o symbolech exportu. Tabulka adresáře exportu obsahuje informace o adrese, které slouží k překladu importů do vstupních bodů v rámci tohoto obrázku.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Export příznaků |
Vyhrazeno musí být 0. |
| 4 |
4 |
Časové a časové razítko |
Čas a datum vytvoření dat exportu. |
| 8 |
2 |
Hlavní verze |
Číslo hlavní verze. Hlavní a podverze může nastavit uživatel. |
| 10 |
2 |
Podverze |
Číslo podverze. |
| 12 |
4 |
Název RVA |
Adresa řetězce ASCII, který obsahuje název knihovny DLL. Tato adresa je relativní vzhledem k základu image. |
| 16 |
4 |
Pořadová základna |
Počáteční pořadové číslo pro exporty v tomto obrázku. Toto pole určuje počáteční pořadové číslo pro tabulku adres exportu. Obvykle je nastavená na hodnotu 1. |
| 20 |
4 |
Položky tabulky adres |
Počet položek v tabulce adres exportu. |
| 24 |
4 |
Počet ukazatelů na název |
Počet položek v tabulce ukazatelů názvu. Toto je také počet položek v pořadové tabulce. |
| 28 |
4 |
Export adresní tabulka RVA |
Adresa tabulky adres exportu vzhledem k základu image. |
| 32 |
4 |
Název ukazatele RVA |
Adresa tabulky ukazatelů názvu exportu vzhledem k základu image. Velikost tabulky je daná polem Počet ukazatelů názvů. |
| 36 |
4 |
Pořadová tabulka RVA |
Adresa pořadové tabulky vzhledem k základu image. |
Exportovat tabulku adres
Tabulka exportních adres obsahuje adresu exportovaných vstupních bodů a exportovaných dat a absolutních hodnot. Pořadové číslo se používá jako index do tabulky adres exportu.
Každá položka v tabulce adresy exportu je pole, které používá jeden ze dvou formátů v následující tabulce. Pokud zadaná adresa není v oddílu exportu (jak je definováno adresou a délkou uvedenou v volitelné hlavičce), jedná se o exportní RVA, což je skutečná adresa v kódu nebo datech. V opačném případě je pole RVA pro předávání, které pojmenovává symbol v jiné knihovně DLL.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Export RVA |
Adresa exportovaného symbolu při načtení do paměti vzhledem k základu image. Například adresa exportované funkce. |
| 0 |
4 |
Předávání RVA |
Ukazatel na řetězec ASCII ukončený hodnotou null v oddílu exportu. Tento řetězec musí být v rozsahu, který je dán položkou adresáře dat tabulky exportu. Viz volitelné adresáře dat hlaviček (pouze obrázek). Tento řetězec poskytuje název knihovny DLL a název exportu (například MYDLL.expfunc) nebo název knihovny DLL a pořadové číslo exportu (například MYDLL.#27). |
Služba předávání RVA exportuje definici z jiného obrázku, takže se zdá, jako by byla exportována aktuálním obrázkem. Symbol je tedy současně importován a exportován.
Například v Kernel32.dll v systému Windows XP se export s názvem "HeapAlloc" přepošle do řetězce NTDLL. RtlAllocateHeap." To umožňuje aplikacím používat modul specifický pro systém Windows XP Ntdll.dll bez toho, aby do něj ve skutečnosti obsahovaly odkazy na import. Tabulka importu aplikace odkazuje pouze na Kernel32.dll. Aplikace proto není specifická pro systém Windows XP a může běžet v jakémkoli systému Win32.
Tabulka ukazatelů na název exportu
Tabulka ukazatelů názvu exportu je pole adres (RVA) do tabulky názvů exportu. Ukazatele jsou 32 bitů a jsou relativní vzhledem k základu image. Ukazatele jsou uspořádané lexicky tak, aby umožňovaly binární vyhledávání.
Název exportu je definován pouze v případě, že tabulka ukazatele názvu exportu obsahuje ukazatel na něj.
Export řadové tabulky
Pořadová tabulka exportu je pole 16bitových nestranných indexů do tabulky adres exportu. Ordinaly jsou zkreslené podle ordinálového základního pole tabulky adresáře exportu. Jinými slovy, pořadová základna musí být odečtena od ordinalů, aby bylo možné získat skutečné indexy do tabulky adres exportu.
Tabulka ukazatelů názvu exportu a tabulka s pořadovou sadou exportu tvoří dvě paralelní pole oddělená tak, aby umožňovala zarovnání přirozeného pole. Tyto dvě tabulky fungují jako jedna tabulka, ve které sloupec Ukazatel názvu exportu odkazuje na veřejný (exportovaný) název a sloupec Export Ordinal dává odpovídající pořadové číslo pro tento veřejný název. Člen tabulky ukazatele názvu exportu a člen tabulky exportu jsou přidruženy stejnou pozicí (index) v příslušných polích.
Když se tedy prohledává tabulka ukazatelů názvu exportu a na pozici i se najde odpovídající řetězec, algoritmus pro vyhledání RVA symbolu a předsudek je:
i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];
rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;
Při hledání symbolu podle (zkreslené) řadové, algoritmus pro vyhledání RVA a názvu symbolu je:
ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);
rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];
Tabulka názvů exportu
Tabulka názvů exportu obsahuje skutečná řetězcová data, na která odkazuje tabulka ukazatele názvu exportu. Řetězce v této tabulce jsou veřejné názvy, které mohou ostatní obrázky použít k importu symbolů. Tyto veřejné názvy exportu nemusí být nutně stejné jako názvy privátních symbolů, které symboly mají ve vlastním souboru obrázku a zdrojovém kódu, i když mohou být.
Každý exportovaný symbol má pořadovou hodnotu, což je pouze index do tabulky exportní adresy. Použití názvů exportu je však volitelné. Některé, všechny nebo žádné z exportovaných symbolů můžou mít názvy exportu. Pro exportované symboly, které mají názvy exportu, odpovídající položky v tabulce ukazatelů názvů exportu a exportují pořadové tabulky spolupracují a přidružují každý název k pořadové sadě.
Struktura tabulky názvů exportu je řada řetězců ASCII s nulovým ukončením s proměnnou délkou.
Oddíl .idata
Všechny soubory obrázků, které importují symboly, včetně prakticky všech spustitelných souborů (EXE), mají oddíl .idata. Typické rozložení souborů pro informace o importu:
Tabulka adresářů
Položka adresáře null
Knihovna DLL1 – import vyhledávací tabulky
Nula
KNIHOVNA DLL2 – Import vyhledávací tabulky
Nula
KNIHOVNA DLL3 – Import vyhledávací tabulky
Nula
tabulka Hint-Name
Importovat tabulku adresářů
Informace o importu začínají tabulkou adresáře importu, která popisuje zbývající informace o importu. Tabulka adresářů importu obsahuje informace o adrese, které slouží k vyřešení odkazů oprav na vstupní body v obrázku knihovny DLL. Tabulka adresáře importu se skládá z pole položek importu adresáře, jedna položka pro každou knihovnu DLL, na kterou obrázek odkazuje. Poslední položka adresáře je prázdná (vyplněná hodnotami null), která označuje konec tabulky adresáře.
Každá položka adresáře importu má následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Import vyhledávací tabulky RVA (charakteristiky) |
Hodnota RVA vyhledávací tabulky importu. Tato tabulka obsahuje název nebo pořadové číslo pro každý import. (Název "Charakteristiky" se používá v winnt.h, ale už toto pole nepopisuje.) |
| 4 |
4 |
Časové a časové razítko |
Razítko nastavené na nulu, dokud se obrázek neváže. Po vázání obrázku je toto pole nastaveno na časové a datové razítko knihovny DLL. |
| 8 |
4 |
Řetězec přeposílání |
Index prvního odkazu služby pro předávání. |
| 12 |
4 |
Název RVA |
Adresa řetězce ASCII, který obsahuje název knihovny DLL. Tato adresa je relativní vzhledem k základu image. |
| 16 |
4 |
Import Address Table RVA (Thunk Table) |
Hodnota RVA tabulky importu adres. Obsah této tabulky je shodný s obsahem vyhledávací tabulky importu, dokud nebude obrázek vázán. |
Import vyhledávací tabulky
Vyhledávací tabulka importu je matice 32bitových čísel pro PE32 nebo pole 64bitových čísel pro PE32+. Každá položka používá formát bitového pole, který je popsán v následující tabulce. V tomto formátu je bit 31 nejvýznamnější bit pro PE32 a bit 63 je nejvýznamnější bit pro PE32+. Kolekce těchto položek popisuje všechny importy z dané knihovny DLL. Poslední položka je nastavena na nulu (NULL), která označuje konec tabulky.
| Bity | Velikost | Bitové pole | Popis |
|---|---|---|---|
| 31/63 |
1 |
Ordinal/Name Flag |
Pokud je tento bit nastavený, naimportujte ho podle řad. V opačném případě importujte podle názvu. Bit je maskovaný jako 0x80000000 pro PE32, 0x8000000000000000 pro PE32+. |
| 15-0 |
16 |
Řadová číslovka |
16bitové pořadové číslo. Toto pole se používá pouze v případě, že je pole bitové části příznaku ordinal/Name 1 (import by ordinal). Bity 30-15 nebo 62-15 musí být 0. |
| 30-0 |
31 |
RVA tabulky hint/name |
31bitová RVA položky tabulky nápovědy/názvu. Toto pole se používá jenom v případě, že je 0 (import podle názvu). U bitů PE32+ 62-31 musí být nula. |
Tabulka nápovědy/názvu
Jedna tabulka nápovědy/názvu stačí pro celý oddíl importu. Každá položka v tabulce nápovědy a názvu má následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
2 |
Náznak |
Index do tabulky ukazatele názvu exportu Nejprve se pokusíte o shodu s touto hodnotou. Pokud selže, binární vyhledávání se provede v tabulce s ukazatelem názvu exportu knihovny DLL. |
| 2 |
proměnná |
Jméno |
Řetězec ASCII obsahující název, který se má importovat. Jedná se o řetězec, který se musí shodovat s veřejným názvem v knihovně DLL. V tomto řetězci se rozlišují malá a velká písmena a ukončuje se bajtů s hodnotou null. |
| * |
0 nebo 1 |
Podložka |
Koncový bajt nulového bajtů, který se zobrazí za koncovým bajtem null, v případě potřeby zarovná další položku na sudé hranici. |
Importovat tabulku adres
Struktura a obsah tabulky adres importu jsou stejné jako struktura a obsah vyhledávací tabulky importu, dokud nebude soubor vázán. Během vytváření vazby se položky v tabulce adres importu přepíší 32bitovou (pro PE32) nebo 64bitovou (pro PE32+) adresy importovaných symbolů. Tyto adresy jsou skutečnými adresami paměti symbolů, i když se technicky vzato nazývají "virtuální adresy". Zavaděč obvykle zpracovává vazbu.
Oddíl .pdata
Oddíl .pdata obsahuje pole položek tabulky funkcí, které se používají pro zpracování výjimek. Odkazuje na položku tabulky výjimek v adresáři dat obrázku. Položky musí být seřazeny podle adres funkce (první pole v každé struktuře) před vygenerováním do konečného obrázku. Cílová platforma určuje, která ze tří variant formátu položky tabulky funkcí popsaná níže.
U 32bitových obrázků MIPS mají položky tabulky funkcí následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Počáteční adresa |
VA odpovídající funkce. |
| 4 |
4 |
Koncová adresa |
VA konce funkce. |
| 8 |
4 |
Obslužná rutina výjimky |
Ukazatel na obslužnou rutinu výjimky, která se má spustit. |
| 12 |
4 |
Data obslužné rutiny |
Ukazatel na další informace, které se mají předat obslužné rutině. |
| 16 |
4 |
Koncová adresa prologu |
VA konce prologu funkce. |
U platforem ARM, PowerPC, SH3 a SH4 pro Windows CE mají položky tabulky funkcí následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Počáteční adresa |
VA odpovídající funkce. |
| 4 |
8 bitů |
Délka prologu |
Počet instrukcí v prologu funkce. |
| 4 |
22 bitů |
Délka funkce |
Počet instrukcí ve funkci. |
| 4 |
1 bit |
32bitový příznak |
V případě nastavení se funkce skládá z 32bitových instrukcí. Pokud je tato funkce jasná, skládá se z 16bitových instrukcí. |
| 4 |
1 bit |
Příznak výjimky |
Pokud je nastavena, existuje obslužná rutina výjimky pro funkci. Jinak neexistuje žádná obslužná rutina výjimky. |
Pro platformy x64 a Itanium mají položky tabulky funkcí následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Počáteční adresa |
Hodnota RVA odpovídající funkce. |
| 4 |
4 |
Koncová adresa |
Hodnota RVA konce funkce. |
| 8 |
4 |
Unwind Information |
RVA informací o odvíjení. |
Oddíl .reloc (pouze obrázek)
Základní tabulka přemístění obsahuje položky pro všechna přemístění základu na obrázku. Pole Základní přemístění tabulky v volitelných adresářích dat záhlaví poskytuje počet bajtů v základní tabulce přemístění. Další informace najdete v tématu
Zavaděč není nutný ke zpracování přemístění základu, které linker přeloží, pokud není možné načíst bitovou kopii do základu image, která je zadaná v hlavičce PE.
Základní přemísťování bloku
Každý základní blok přemístění začíná následující strukturou:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Stránka RVA |
Základ obrázku plus stránka RVA se přidá do každého posunu a vytvoří VA, kde se musí použít základní přemístění. |
| 4 |
4 |
Velikost bloku |
Celkový počet bajtů v základním bloku přemístění, včetně polí Stránka RVA a Velikost bloku a pole Typ/Posun, která následují. |
Po poli Velikost bloku následuje libovolný počet položek pole Typ nebo Posun. Každá položka je WORD (2 bajty) a má následující strukturu:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 bity |
Typ |
Uložená ve vysokých 4 bitech wordu, což je hodnota označující typ základního přemístění, který se má použít. Další informace naleznete v tématu Základní typy přemístění. |
| 0 |
12 bitů |
Ofset |
Uloženo ve zbývajících 12 bitech wordu, posun od počáteční adresy, která byla zadána v poli Page RVA bloku. Tento posun určuje, kde se má použít základní přemístění. |
Pokud chcete použít přemístění základny, vypočítá se rozdíl mezi upřednostňovanou základní adresou a základnou, ve které je obrázek skutečně načten. Pokud je image načtena na upřednostňovanou základnu, je rozdíl nulový, a proto není nutné použít přemístění základu.
Typy přemístění základny
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMAGE_REL_BASED_ABSOLUTE |
0 |
Přemístění základny se přeskočí. Tento typ lze použít k vycpávku bloku. |
| IMAGE_REL_BASED_HIGH |
1 |
Přemístění základny přidá do 16bitového pole při posunu vysoký 16 bitů rozdílu. 16bitové pole představuje vysokou hodnotu 32bitového slova. |
| IMAGE_REL_BASED_LOW |
2 |
Přemístění základny přidá nízké 16 bitů rozdílu k 16bitovému poli při posunu. 16bitové pole představuje nízkou polovinu 32bitového slova. |
| IMAGE_REL_BASED_HIGHLOW |
3 |
Základní přemístění použije všech 32 bitů rozdílu u 32bitového pole při posunu. |
| IMAGE_REL_BASED_HIGHADJ |
4 |
Přemístění základny přidá do 16bitového pole při posunu vysoký 16 bitů rozdílu. 16bitové pole představuje vysokou hodnotu 32bitového slova. Nízkých 16 bitů 32bitové hodnoty jsou uloženy v 16bitovém slově, které následuje za tímto základním přemístěním. To znamená, že toto přemístění základny zabírá dva sloty. |
| IMAGE_REL_BASED_MIPS_JMPADDR |
5 |
Interpretace přemístění závisí na typu stroje. Pokud je typ stroje MIPS, základní přemístění se vztahuje na pokyn skoku MIPS. |
| IMAGE_REL_BASED_ARM_MOV32 |
5 |
Toto přemístění je smysluplné pouze v případě, že je typ počítače ARM nebo Thumb. Základní přemístění použije 32bitovou adresu symbolu v po sobě jdoucím páru instrukcí MOVW/MOVT. |
| IMAGE_REL_BASED_RISCV_HIGH20 |
5 |
Toto přemístění je smysluplné pouze v případě, že typ počítače je RISC-V. Přemístění základny se vztahuje na vysoké 20 bitů 32bitové absolutní adresy. |
| 6 |
Rezervovaná hodnota musí být nula. |
|
| IMAGE_REL_BASED_THUMB_MOV32 |
7 |
Toto přemístění je smysluplné pouze v případě, že je typ stroje Thumb. Základní přemístění použije 32bitovou adresu symbolu na po sobě jdoucí dvojici instrukcí MOVW/MOVT. |
| IMAGE_REL_BASED_RISCV_LOW12I |
7 |
Toto přemístění je smysluplné pouze v případě, že typ počítače je RISC-V. Přemístění základny se vztahuje na nízké 12 bity 32bitové absolutní adresy vytvořené v RISC-V I-type instrukce formátu. |
| IMAGE_REL_BASED_RISCV_LOW12S |
8 |
Toto přemístění je smysluplné pouze v případě, že typ počítače je RISC-V. Základní přemístění se vztahuje na nízké 12 bity 32bitové absolutní adresy vytvořené ve formátu instrukce typu S RISC-V. |
| IMAGE_REL_BASED_LOONGARCH32_MARK_LA |
8 |
Toto přemístění je smysluplné pouze v případě, že typ stroje je 32bitový LoongArch. Přemístění základny se vztahuje na 32bitovou absolutní adresu vytvořenou ve dvou po sobě jdoucích pokynech. |
| IMAGE_REL_BASED_LOONGARCH64_MARK_LA |
8 |
Toto přemístění je smysluplné pouze v případě, že typ stroje je 64bitový LoongArch. Základní přemístění se vztahuje na 64bitovou absolutní adresu vytvořenou čtyřmi po sobě jdoucími instrukcemi. |
| IMAGE_REL_BASED_MIPS_JMPADDR16 |
9 |
Přemístění je smysluplné pouze v případě, že typ stroje je MIPS. Základní přemístění se vztahuje na instrukce MIPS16 jump. |
| IMAGE_REL_BASED_DIR64 |
10 |
Základní přemístění použije rozdíl u 64bitového pole při posunu. |
Oddíl .tls
Oddíl .tls poskytuje přímou podporu PE a COFF pro místní úložiště statického vlákna (TLS). TLS je speciální třída úložiště, kterou Systém Windows podporuje, ve kterém datový objekt není automatická proměnná (stack), ale je místní pro každé jednotlivá vlákna, která spouští kód. Každé vlákno tak může udržovat jinou hodnotu proměnné deklarované pomocí protokolu TLS.
Mějte na paměti, že jakékoli množství dat TLS je možné podporovat pomocí rozhraní API volání TlsAlloc, TlsFree, TlsSetValue a TlsGetValue. Implementace PE nebo COFF je alternativním přístupem k používání rozhraní API a má výhodu jednodušší z hlediska programátorů na vysoké úrovni. Tato implementace umožňuje definovat a inicializovat data PROTOKOLU TLS podobně jako běžné statické proměnné v programu. Například v jazyce Visual C++ lze statickou proměnnou TLS definovat následujícím způsobem bez použití rozhraní API systému Windows:
__declspec (thread) int tlsFlag = 1;
Pro podporu tohoto programovacího konstruktoru určuje část PE a COFF .tls následující informace: inicializační data, rutiny zpětného volání pro inicializaci a ukončení jednotlivých vláken a index TLS, které jsou vysvětleny v následující diskuzi.
Poznámka:
Před systémem Windows Vista lze staticky deklarované datové objekty TLS použít pouze v staticky načtených souborech obrázků. Tento fakt zneužívá statická data TLS v knihovně DLL, pokud nevíte, že knihovna DLL nebo cokoli staticky propojeného s ní nebude nikdy dynamicky načtena pomocí funkce LoadLibrary API. Od systému Windows Vista však byla vylepšena zavaděč windows, která lépe podporovala dynamické načítání knihoven DLL se statickým protokolem TLS. Tato změna znamená, že knihovny DLL se staticky deklarovanými datovými objekty TLS se teď dají spolehlivěji používat, i když se načítají dynamicky pomocí LoadLibrary. Zavaděč je schopen přidělit sloty TLS pro tyto knihovny DLL v době načítání a zmírnit omezení, která existují v dřívějších verzích Windows.
Poznámka:
Odkazy na 32bitové posuny a násobitele indexů 4 se vztahují na systémy s 32bitovými architekturami. V systému založeném na 64bitových architekturách je podle potřeby upravte.
Spustitelný kód přistupuje ke statickému datovému objektu TLS pomocí následujícího postupu:
V době propojení linker nastaví pole Adresa indexu v adresáři TLS. Toto pole odkazuje na umístění, kde program očekává přijetí indexu TLS.
Knihovna runtime Microsoftu usnadňuje tento proces definováním image paměti adresáře TLS a zadáním speciálního názvu "__tls_used" (platformy Intel x86) nebo "_tls_used" (jiné platformy). Linker vyhledá tuto image paměti a použije data tam k vytvoření adresáře TLS. Další kompilátory, které podporují protokol TLS a pracují s linkerem Microsoftu, musí používat stejnou techniku.
Při vytvoření vlákna zavaděč předá adresu pole TLS vlákna umístěním adresy bloku prostředí vlákna (TEB) do registru FS (pro x86) nebo GS (pro x64). Ukazatel na pole TLS je na posunu 0x2C od začátku TEB. Toto chování je specifické pro Intel x86.
Zavaděč přiřadí hodnotu indexu TLS k místu, které bylo označeno polem Adresa indexu.
Spustitelný kód načte index TLS a také umístění pole TLS.
Kód používá index TLS a umístění pole TLS (vynásobení indexu hodnotou 4 a jeho použití jako posun na pole) k získání adresy datové oblasti TLS pro daný program a modul. Každé vlákno má vlastní datovou oblast TLS, ale to je pro program transparentní, což nemusí vědět, jak se data přidělují pro jednotlivá vlákna.
K individuálnímu datovému objektu TLS se přistupuje jako k určitému pevnému posunu do oblasti dat TLS.
Pole TLS je pole adres, které systém udržuje pro každé vlákno. Každá adresa v tomto poli poskytuje umístění dat PROTOKOLU TLS pro daný modul (EXE nebo DLL) v rámci programu. Index TLS označuje, který člen pole se má použít. Index je číslo (smysluplné pouze pro systém), které identifikuje modul.
Adresář TLS
Adresář TLS má následující formát:
| Posun (PE32/ PE32+) | Velikost (PE32/ PE32+) | Pole | Popis |
|---|---|---|---|
| 0 |
4/8 |
Nezpracovaná data – Spuštění VA |
Počáteční adresa šablony TLS. Šablona je blok dat, která se používají k inicializaci dat TLS. Systém kopíruje všechna tato data při každém vytvoření vlákna, takže nesmí být poškozena. Všimněte si, že tato adresa není RVA; je to adresa, pro kterou by mělo být základní přemístění v oddílu .reloc. |
| 4/8 |
4/8 |
Nezpracovaná data – ukončení VA |
Adresa posledního bajtu protokolu TLS s výjimkou nulové výplně. Stejně jako u pole VA Zahájení nezpracovaných dat se jedná o VA, nikoli o RVA. |
| 8/16 |
4/8 |
Adresa indexu |
Umístění pro příjem indexu TLS, který zavaděč přiřadí. Toto umístění je v běžném datovém oddílu, takže může mít symbolický název, který je přístupný pro program. |
| 12/24 |
4/8 |
Adresa zpětných volání |
Ukazatel na pole funkcí zpětného volání PROTOKOLU TLS. Pole je ukončeno hodnotou null, takže pokud není podporována žádná funkce zpětného volání, toto pole odkazuje na 4 bajty nastavené na nulu. Informace o prototypu těchto funkcí najdete v tématu Funkce zpětného volání PROTOKOLU TLS. |
| 16/32 |
4 |
Velikost nulové výplně |
Velikost vbajch Celková velikost šablony by měla být stejná jako celková velikost dat TLS v souboru obrázku. Nulová výplň je množství dat, která přicházejí po inicializovaných nenulových datech. |
| 20/36 |
4 |
Charakteristiky |
Čtyři bity [23:20] popisují informace o zarovnání. Možné hodnoty jsou definovány jako IMAGE_SCN_ALIGN_*, které slouží také k popisu zarovnání oddílu v souborech objektů. Ostatní 28bitové verze jsou vyhrazeny pro budoucí použití. |
Funkce zpětného volání PROTOKOLU TLS
Program může poskytovat jednu nebo více funkcí zpětného volání PROTOKOLU TLS, které podporují další inicializaci a ukončení datových objektů TLS. Typickým použitím takové funkce zpětného volání by bylo volání konstruktorů a destruktorů pro objekty.
I když obvykle neexistuje více než jedna funkce zpětného volání, zpětné volání je implementováno jako pole, aby bylo možné přidat další funkce zpětného volání, pokud je to žádoucí. Pokud existuje více než jedna funkce zpětného volání, volá se každá funkce v pořadí, ve kterém se její adresa zobrazí v poli. Ukazatel null ukončí pole. Je naprosto platné mít prázdný seznam (nepodporuje se žádná zpětná volání), v takovém případě má pole zpětného volání přesně jeden člen-nulový ukazatel.
Prototyp funkce zpětného volání (odkazovaný ukazatelem typu PIMAGE_TLS_CALLBACK) má stejné parametry jako funkce vstupního bodu knihovny DLL:
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
PVOID DllHandle,
DWORD Reason,
PVOID Reserved
);
Rezervovaný parametr by měl být nastaven na nulu. Parametr Reason může mít následující hodnoty:
| Nastavení | Hodnota | Popis |
|---|---|---|
| DLL_PROCESS_ATTACH |
1 |
Spustil se nový proces, včetně prvního vlákna. |
| DLL_THREAD_ATTACH |
2 |
Vytvořilo se nové vlákno. Toto oznámení se odeslalo pro všechny, ale pro první vlákno. |
| DLL_THREAD_DETACH |
3 |
Vlákno se chystá ukončit. Toto oznámení se odeslalo pro všechny, ale pro první vlákno. |
| DLL_PROCESS_DETACH |
0 |
Proces se chystá ukončit, včetně původního vlákna. |
Struktura konfigurace načtení (pouze image)
Struktura konfigurace zatížení (IMAGE_LOAD_CONFIG_DIRECTORY) se dříve používala ve velmi omezených případech v samotném operačním systému Windows NT k popisu různých funkcí, které jsou příliš obtížné nebo příliš velké, aby bylo možné popsat v hlavičce souboru nebo volitelné hlavičce image. Aktuální verze linkeru společnosti Microsoft a systému Windows XP a novějších verzí systému Windows používají novou verzi této struktury pro 32bitové systémy x86, které obsahují vyhrazenou technologii SEH. Poskytuje seznam bezpečných strukturovaných obslužných rutin výjimek, které operační systém používá při odesílání výjimek. Pokud se adresa obslužné rutiny nachází v rozsahu VA obrázku a je označena jako vyhrazená funkce SEH (to znamená, že IMAGE_DLLCHARACTERISTICS_NO_SEH je v poli DllCharacteristics volitelné hlavičky, jak je popsáno výše), musí být obslužná rutina v seznamu známých bezpečných obslužných rutin pro tuto image. Jinak operační systém aplikaci ukončí. To pomáhá zabránit zneužití "zneužití obslužné rutiny výjimky x86", které bylo použito v minulosti k převzetí kontroly nad operačním systémem.
Linker Microsoftu automaticky poskytuje výchozí strukturu konfigurace zatížení, která zahrnuje vyhrazená data SEH. Pokud uživatelský kód již poskytuje strukturu konfigurace zatížení, musí obsahovat nová vyhrazená pole SEH. Jinak linker nemůže zahrnout vyhrazená data SEH a obrázek není označený jako obsahující rezervované SEH.
Načtení konfiguračního adresáře
Položka adresáře dat pro předem rezervovanou strukturu konfigurace zatížení SEH musí určit konkrétní velikost konfigurační struktury zatížení, protože zavaděč operačního systému vždy očekává, že bude určitou hodnotou. V tomto ohledu je velikost skutečně pouze kontrolou verzí. Kvůli kompatibilitě se systémem Windows XP a staršími verzemi systému Windows musí být velikost 64 pro image x86.
Rozložení konfigurace načtení
Struktura konfigurace zatížení má následující rozložení pro 32bitové a 64bitové soubory PE:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Charakteristiky |
Příznaky, které označují atributy souboru, aktuálně nepoužívané. |
| 4 |
4 |
TimeDateStamp |
Hodnota data a časového razítka Hodnota je reprezentována v počtu sekund, které uplynuly od půlnoci (00:00:00), 1. ledna 1970, Univerzální koordinovaný čas podle systémových hodin. Časové razítko lze vytisknout pomocí funkce času modulu runtime jazyka C (CRT). |
| 8 |
2 |
MajorVersion |
Číslo hlavní verze. |
| 10 |
2 |
MinorVersion |
Číslo podverze. |
| 12 |
4 |
GlobalFlagsClear |
Globální zavaděč má pro tento proces jasné příznaky, protože zavaděč spustí proces. |
| 16 |
4 |
GlobalFlagsSet |
Globální příznak zavaděče, který se má pro tento proces nastavit při spuštění procesu. |
| 20 |
4 |
CriticalSectionDefaultTimeout |
Výchozí hodnota časového limitu, která se použije pro kritické části tohoto procesu, které jsou opuštěné. |
| 24 |
4/8 |
DeCommitFreeBlockThreshold |
Paměť, která musí být uvolněna před vrácením do systému v bajtech. |
| 28/32 |
4/8 |
DeCommitTotalFreeThreshold |
Celková velikost volné paměti v bajtech. |
| 32/40 |
4/8 |
LockPrefixTable |
[pouze x86] VA seznamu adres, kde se používá předpona LOCK, aby je bylo možné nahradit NOP na počítačích s jedním procesorem. |
| 36/48 |
4/8 |
MaximumAllocationSize |
Maximální velikost přidělení vbajch |
| 40/56 |
4/8 |
VirtualMemoryThreshold |
Maximální velikost virtuální paměti v bajtech |
| 44/64 |
4/8 |
ProcessAffinityMask |
Nastavení tohoto pole na nenulovou hodnotu je ekvivalentní volání SetProcessAffinityMask s touto hodnotou během spouštění procesu (pouze.exe) |
| 48/72 |
4 |
ProcessHeapFlags |
Příznaky haldy procesu, které odpovídají prvnímu argumentu funkce HeapCreate. Tyto příznaky platí pro haldu procesu, která se vytvoří během spuštění procesu. |
| 52/76 |
2 |
CSDVersion |
Identifikátor verze aktualizace Service Pack. |
| 54/78 |
2 |
DependentLoadFlags |
Výchozí příznaky zatížení používané při překladu staticky propojených importů modulu. |
| 56/80 |
4/8 |
Upravit seznam |
Vyhrazeno pro použití systémem. |
| 60/88 |
4/8 |
SecurityCookie |
Ukazatel na soubor cookie, který používá implementace Visual C++ nebo GS. |
| 64/96 |
4/8 |
TABULKA SEHandlerTable |
[pouze x86] VA seřazené tabulky RVA pro každou platnou jedinečnou obslužnou rutinu SE na obrázku. |
| 68/104 |
4/8 |
SEHandlerCount |
[pouze x86] Počet jedinečných obslužných rutin v tabulce |
| 72/112 |
4/8 |
GuardCFCheckFunctionPointer |
VA, kde je uložený ukazatel kontrolní ochrany toku řízení. |
| 76/120 |
4/8 |
GuardCFDispatchFunctionPointer |
VA, kde je uložený ukazatel dispečerské funkce ochrany toku řízení. |
| 80/128 |
4/8 |
GuardCFFunctionTable |
VA seřazené tabulky RVA každé funkce ochrany toku řízení na obrázku. |
| 84/136 |
4/8 |
GuardCFFunctionCount |
Počet jedinečných RVA v tabulce výše. |
| 88/144 |
4 |
GuardFlags |
Příznaky související s tokem toku řízení |
| 92/148 |
12 |
CodeIntegrity |
Informace o integritě kódu |
| 104/160 |
4/8 |
GuardAddressTakenIatEntryTable |
VA, ve které je uložená adresa ochrany toku řízení, je uložená tabulka IAT. |
| 108/168 |
4/8 |
GuardAddressTakenIatEntryCount |
Počet jedinečných RVA v tabulce výše. |
| 112/176 |
4/8 |
GuardLongJumpTargetTable |
Tabulka VA, ve které je uložená cílová tabulka toku řízení toku s dlouhým přeskakovacím objektem. |
| 116/184 |
4/8 |
GuardLongJumpTargetCount |
Počet jedinečných RVA v tabulce výše. |
Pole GuardFlags obsahuje kombinaci jednoho nebo více následujících příznaků a dílčích polí:
Modul provádí kontroly integrity toku řízení pomocí podpory poskytované systémem.
#define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100Modul provádí tok řízení a zapisuje kontroly integrity.
#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200Modul obsahuje platná metadata cíle toku řízení.
#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400Modul nevyužívá soubor cookie zabezpečení /GS.
#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800Modul podporuje IAT jen pro čtení se zpožděním načítání.
#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000Tabulka importu delayload ve vlastním oddílu .didat (s ničím jiným v ní), kterou lze volně znovu chránit.
#define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000Modul obsahuje potlačené informace o exportu. To také odvodí, že adresa pořízená tabulkou IAT se nachází také v konfiguraci načtení.
#define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000Modul umožňuje potlačení exportů.
#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000Modul obsahuje informace o cíli longjmp.
#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000Maska pro dílčí pole, které obsahuje kroky položek tabulky funkcí Control Flow Guard (to znamená dodatečný počet bajtů na položku tabulky).
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000
Kromě toho hlavička winnt.h sady Windows SDK definuje toto makro pro množství bitů, aby se hodnota GuardFlags posunula doprava, aby ospravedlňovala tabulku funkcí Control Flow Guard:
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28
Oddíl .rsrc
Prostředky se indexují podle víceúrovňové binární stromové struktury. Obecný návrh může obsahovat 2**31 úrovní. Podle konvence ale Systém Windows používá tři úrovně:
- Jazyk názvu typu
Řada tabulek adresářů prostředků souvisí se všemi úrovněmi následujícím způsobem: Za každou tabulkou adresáře následuje řada položek adresáře, které poskytují název nebo identifikátor (ID) pro danou úroveň (typ, název nebo jazyk) a adresu popisu dat nebo jiné tabulky adresáře. Pokud adresa odkazuje na popis dat, data jsou listem ve stromu. Pokud adresa odkazuje na jinou tabulku adresáře, pak tato tabulka uvádí položky adresáře na další úrovni dolů.
ID typu, názvu a jazyka listu jsou určena cestou, která se přes tabulky adresářů dostane do listu. První tabulka určuje ID typu, druhou tabulku (na kterou odkazuje položka adresáře v první tabulce) určuje ID názvu a třetí tabulka určuje ID jazyka.
Obecná struktura oddílu .rsrc je:
| Údaje | Popis |
|---|---|
| Tabulky adresářů prostředků (a položky adresáře zdrojů) |
Řada tabulek, jedna pro každou skupinu uzlů ve stromu. Všechny uzly nejvyšší úrovně (Typu) jsou uvedeny v první tabulce. Položky v této tabulce odkazují na tabulky druhé úrovně. Každý strom druhé úrovně má stejné ID typu, ale jiná ID názvů. Stromy třetí úrovně mají stejné ID typu a názvu, ale různá ID jazyka. Za každou jednotlivou tabulkou bezprostředně následuje položky adresáře, ve kterých má každá položka název nebo číselný identifikátor a ukazatel na popis dat nebo tabulku na další nižší úrovni. |
| Řetězce adresáře prostředků |
Dvoubajtů zarovnané řetězce Unicode, které slouží jako řetězcová data odkazovaná položkami adresáře. |
| Popis dat o zdrojích |
Pole záznamů, na které odkazují tabulky, které popisují skutečnou velikost a umístění dat prostředků. Tyto záznamy jsou listy ve stromu popisu prostředku. |
| Data o zdrojích |
Nezpracovaná data oddílu zdroje Velikost a informace o umístění v poli Popisy dat zdrojů oddělují jednotlivé oblasti dat zdrojů. |
Tabulka adresářů prostředků
Každá tabulka adresářů prostředků má následující formát. Tato datová struktura by měla být považována za záhlaví tabulky, protože tabulka se ve skutečnosti skládá z položek adresáře (popsaných v části 6.9.2, "Položky adresáře zdrojů") a této struktuře:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Charakteristiky |
Příznaky prostředků. Toto pole je vyhrazeno pro budoucí použití. Aktuálně je nastavená na nulu. |
| 4 |
4 |
Časové a časové razítko |
Čas vytvoření dat prostředků kompilátorem prostředků. |
| 8 |
2 |
Hlavní verze |
Číslo hlavní verze nastavené uživatelem. |
| 10 |
2 |
Podverze |
Číslo podverze nastavené uživatelem. |
| 12 |
2 |
Počet položek názvu |
Počet položek adresáře bezprostředně za tabulkou, která používá řetězce k identifikaci položek Typu, Název nebo Jazyk (v závislosti na úrovni tabulky). |
| 14 |
2 |
Počet položek ID |
Počet položek adresáře bezprostředně za položkami Název, které používají číselná ID pro položky Typu, Název nebo Jazyk. |
Položky adresáře prostředků
Položky adresáře tvoří řádky tabulky. Každá položka adresáře prostředků má následující formát. Určuje, jestli je položka Název nebo ID označená tabulkou adresáře prostředků, která určuje, kolik položek Název a ID následuje (pamatujte, že všechny položky Název předchází všem položkám ID tabulky). Všechny položky tabulky jsou seřazené vzestupně: položky názvu podle řetězce citlivého na velká a malá písmena a položky ID podle číselné hodnoty. Posuny jsou relativní vzhledem k adrese v IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Další informace najdete v tématu Peering Inside the PE: A Tour of the Win32 Portable Executable File Format for more information.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Posun názvu |
Posun řetězce, který poskytuje položku Typ, Název nebo ID jazyka v závislosti na úrovni tabulky. |
| 0 |
4 |
ID celého čísla |
32bitové celé číslo, které identifikuje položku Typ, Název nebo ID jazyka. |
| 4 |
4 |
Posun zadávání dat |
Vysoký bit 0. Adresa položky dat o zdroji (list). |
| 4 |
4 |
Posun podadresáře |
Vysoký bit 1. Nižších 31 bitů je adresa jiné tabulky adresáře prostředků (další úroveň dolů). |
Řetězec adresáře prostředků
Oblast řetězce adresáře prostředků se skládá z řetězců Unicode, které jsou zarovnané slovem. Tyto řetězce se ukládají po poslední položce adresáře prostředků a před první položkou dat o zdroji. Tím se minimalizuje dopad těchto řetězců s proměnnou délkou na zarovnání položek adresáře s pevnou velikostí. Každý řetězec adresáře prostředků má následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
2 |
Délka |
Velikost řetězce, nikoli samotné pole délky. |
| 2 |
proměnná |
Řetězec unicode |
Data řetězce Unicode s proměnlivou délkou, zarovnaná slovem. |
Zadávání dat o zdrojích
Každá položka Data zdroje popisuje skutečnou jednotku nezpracovaných dat v oblasti Data zdroje. Položka Data zdroje má následující formát:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Data RVA |
Adresa jednotky dat prostředků v oblasti Data zdroje. |
| 4 |
4 |
Velikost |
Velikost v bajtech dat o zdrojích, na která odkazuje pole Data RVA. |
| 8 |
4 |
Znaková stránka |
Znaková stránka, která slouží k dekódování hodnot bodů kódu v datech prostředků. Obvykle by znakovou stránkou byla znaková stránka Unicode. |
| 12 |
4 |
Vyhrazeno musí být 0. |
Oddíl .cormeta (pouze objekt)
Metadata CLR jsou uložená v této části. Slouží k označení, že soubor objektu obsahuje spravovaný kód. Formát metadat není zdokumentovaný, ale lze jej předat rozhraním CLR pro zpracování metadat.
Oddíl .sxdata
Platné obslužné rutiny výjimek objektu jsou uvedeny v oddílu .sxdata daného objektu. Oddíl je označen IMAGE_SCN_LNK_INFO. Obsahuje index symbolu COFF každé platné obslužné rutiny s použitím 4 bajtů na index.
Kompilátor navíc označí objekt COFF jako registrovaný SEH tím, že vygeneruje absolutní symbol "@feat.00" s LSB pole hodnoty nastaveným na 1. Objekt COFF bez registrovaných obslužných rutin SEH by měl symbol "@feat.00", ale žádný oddíl .sxdata .
Formát souboru archivu (knihovna)
- Archivovat podpis souboru
- Archivní záhlaví členů
- První člen linkeru
- Druhý člen linkeru
- Člen Longnames
Archivní formát COFF poskytuje standardní mechanismus pro ukládání kolekcí souborů objektů. Tyto kolekce se běžně označují jako knihovny v programovací dokumentaci.
Prvních 8 bajtů archivu se skládá z podpisu souboru. Zbytek archivu se skládá z řady členů archivu, jak je znázorněno níže:
První a druhý člen jsou "členové linkeru". Každý z těchto členů má svůj vlastní formát, jak je popsáno v části Typ názvu importu. Linker obvykle umístí informace do těchto členů archivu. Členové linkeru obsahují adresář archivu.
Třetí člen je člen "longnames". Tento volitelný člen se skládá z řady řetězců ASCII s ukončenou hodnotou null, ve kterých je každý řetězec názvem jiného člena archivu.
Zbytek archivu se skládá ze standardních členů (objekt-soubor). Každý z těchto členů obsahuje obsah jednoho souboru objektu v celém rozsahu.
Záhlaví člena archivu předchází každému členu. Následující seznam ukazuje obecnou strukturu archivu:
| Podpis :"!<arch>\n" |
|---|
| Záhlaví |
|---|
| 1. člen linkeru |
| Záhlaví |
|---|
| 2. člen linkeru |
| Záhlaví |
|---|
| Člen Longnames |
| Záhlaví |
|---|
| Obsah souboru OBJ 1 (formát COFF) |
| Záhlaví |
|---|
| Obsah souboru OBJ 2 (formát COFF) |
...
| Záhlaví |
|---|
| Obsah souboru OBJ N (formát COFF) |
Archivovat podpis souboru
Podpis archivního souboru identifikuje typ souboru. Jakýkoli nástroj (například linker), který přebírá soubor archivu jako vstup, může zkontrolovat typ souboru přečtením tohoto podpisu. Podpis se skládá z následujících znaků ASCII, ve kterých je každý znak níže reprezentován doslova, s výjimkou znaku nového řádku (\n):
!<arch>\n
Hlavička winnt.h sady Windows SDK definuje následující makra:
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_END "`\n"
#define IMAGE_ARCHIVE_PAD "\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
#define IMAGE_ARCHIVE_HYBRIDMAP_MEMBER "/<HYBRIDMAP>/ "
Archivní záhlaví členů
Každému členu (linkeru, longnames nebo členu souboru objektu) předchází záhlaví. Záhlaví člena archivu má následující formát, ve kterém každé pole je textový řetězec ASCII, který je vlevo za bloku a vložen s mezerami na konci pole. V žádném z těchto polí není žádný ukončovací znak null.
Záhlaví každého člena začíná na první sudé adrese za koncem předchozího archivního člena, jeden bajt '\n' (IMAGE_ARCHIVE_PAD) může být vložen za člen archivu, aby následující člen začal na sudé adrese.
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
16 |
Jméno |
Název člena archivu s lomítkem (/) připojeným k ukončení názvu. Pokud je prvním znakem lomítko, název má speciální interpretaci, jak je popsáno v následující tabulce. |
| 16 |
12 |
Rande |
Datum a čas vytvoření člena archivu: Toto je desítkové vyjádření počtu sekund od 1. 1. 1970 UCT ASCII. |
| 28 |
6 |
ID uživatele |
Desítkové vyjádření ID uživatele ASCII. Toto pole neobsahuje smysluplnou hodnotu na platformách Windows, protože nástroje Microsoftu generují všechny prázdné hodnoty. |
| 34 |
6 |
ID skupiny |
Desítkové znázornění ID skupiny v ASCII Toto pole neobsahuje smysluplnou hodnotu na platformách Windows, protože nástroje Microsoftu generují všechny prázdné hodnoty. |
| 40 |
8 |
Režim |
Osmičkové vyjádření režimu souboru člena ASCII. Toto je hodnota ST_MODE z _wstat funkce runtime jazyka C. |
| 48 |
10 |
Velikost |
Desetinné číslo ASCII celkové velikosti člena archivu, nikoli velikost záhlaví. |
| 58 |
2 |
Konec záhlaví |
Dva bajty (0x60 0x0A) v řetězci jazyka C "\n" (IMAGE_ARCHIVE_END). |
Pole Název má jeden z formátů zobrazených v následující tabulce. Jak už jsme zmínili dříve, každý z těchto řetězců je zamyšlený a vyplněný koncovými mezerami v poli s 16 bajty:
| Pole Obsah názvu | Popis |
|---|---|
| Jméno/ |
Název člena archivu. |
| / |
Archivní člen je jedním ze dvou členů linkeru. Oba členové linkeru mají tento název. |
| // |
Člen archivu je člen longnames, který se skládá z řady řetězců ASCII ukončených hodnotou null. Člen longnames je třetí archivní člen a je volitelný. |
| /n |
Název člena archivu se nachází na posunu n v rámci členu longnames. Číslo n je desítkové vyjádření posunu. Například: /26 označuje, že název člena archivu je umístěn 26 bajtů nad začátek obsahu člena longnames. |
První člen linkeru
Název prvního člena linkeru je "/" (IMAGE_ARCHIVE_LINKER_MEMBER). První člen linkeru je součástí zpětné kompatibility. Není používán aktuálními linkery, ale jeho formát musí být správný. Tento člen linkeru poskytuje adresář názvů symbolů, stejně jako druhý člen linkeru. Informace pro každý symbol označují, kde najít člena archivu, který obsahuje symbol.
První člen linkeru má následující formát. Tyto informace se zobrazí za záhlavím:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Počet symbolů |
Unsigned long that contains the number of indexed symbols. Toto číslo je uloženo ve formátu big-endian. Každý člen souboru objektu obvykle definuje jeden nebo více externích symbolů. |
| 4 |
4 * n |
Odnože |
Pole odsazení souboru na záhlaví členů archivu, ve kterém se n rovná poli Počet symbolů. Každé číslo v poli je nepodepsané dlouhé uložené ve formátu big-endian. Pro každý symbol, který je pojmenován v řetězcové tabulce, odpovídající prvek v poli posunů dává umístění člena archivu, který obsahuje symbol. |
| * |
* |
Tabulka řetězců |
Řada řetězců ukončených hodnotou null, které pojmenují všechny symboly v adresáři. Každý řetězec začíná hned za znakem null v předchozím řetězci. Počet řetězců musí být roven hodnotě pole Počet symbolů. |
Prvky v poli posunů musí být uspořádány ve vzestupném pořadí. Tato skutečnost znamená, že symboly v tabulce řetězců musí být uspořádány podle pořadí členů archivu. Například všechny symboly v prvním členu objektu by musely být uvedeny před symboly v druhém souboru objektu.
Druhý člen linkeru
Stejně jako první člen linkeru má druhý člen linkeru název "/" (IMAGE_ARCHIVE_LINKER_MEMBER). I když oba členy linkeru poskytují adresář symbolů a členů archivu, které je obsahují, druhý člen linkeru se používá v předvolbě pro první ze všech aktuálních linkerů. Druhý člen linkeru obsahuje názvy symbolů v lexikálním pořadí, což umožňuje rychlejší vyhledávání podle názvu.
Druhý člen má následující formát. Tyto informace se zobrazí za záhlavím:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
4 |
Počet členů |
Nepodepsaný dlouhý, který obsahuje počet členů archivu. |
| 4 |
4 * m |
Odnože |
Pole odsazení souboru na záhlaví členů archivu uspořádané ve vzestupném pořadí. Každý posun je bez znaménka dlouhý . Číslo m se rovná hodnotě pole Počet členů. |
| * |
4 |
Počet symbolů |
Nepodepsaný dlouhý, který obsahuje počet indexovaných symbolů. Každý člen souboru objektu obvykle definuje jeden nebo více externích symbolů. |
| * |
2 * n |
Indexy |
Pole 1 indexů (bez znaménka krátké), které mapují názvy symbolů na posuny členů archivu. Číslo n se rovná poli Počet symbolů. Pro každý symbol, který je pojmenován v řetězcové tabulce, odpovídající prvek v poli Indexy dává index do pole posunů. Pole posunů zase dává umístění člena archivu, který obsahuje symbol. |
| * |
* |
Tabulka řetězců |
Řada řetězců ukončených hodnotou null, které pojmenují všechny symboly v adresáři. Každý řetězec začíná hned za bajtem null v předchozím řetězci. Počet řetězců musí být roven hodnotě pole Počet symbolů. Tato tabulka obsahuje seznam všech názvů symbolů ve vzestupném lexikálním pořadí. |
Člen Longnames
Název člena longnames je "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Člen longnames je řada řetězců názvů členů archivu. Název se zobrazí jenom v případech, kdy v poli Název není dostatek místa (16 bajtů). Člen longnames je volitelný. Může být prázdný pouze se záhlavím nebo může být zcela chybějící bez záhlaví.
Řetězce jsou ukončeny s hodnotou null. Každý řetězec začíná hned za bajtem null v předchozím řetězci.
Importovat formát knihovny
Tradiční knihovny importu, to znamená knihovny, které popisují exporty z jednoho obrázku pro použití jiným, obvykle se řídí rozložením popsaným v části 7 , Archiv (Knihovna) Formát souboru. Hlavním rozdílem je, že členy knihovny importu obsahují pseudoobjektové soubory místo skutečných souborů, ve kterých každý člen obsahuje příspěvky oddílů potřebné k vytvoření importovaných tabulek popsaných v části 6.4, Oddíl .idata Linker generuje tento archiv při vytváření exportovací aplikace.
Příspěvky oddílu pro import lze odvodit z malé sady informací. Linker může buď vygenerovat úplné podrobné informace do knihovny importu pro každého člena v době vytvoření knihovny, nebo zapsat pouze kanonické informace do knihovny a nechat aplikaci, která ji později použije, vygenerovat potřebná data za běhu.
V knihovně importu s dlouhým formátem obsahuje jeden člen následující informace:
- Záhlaví člena archivu
- Hlavička souboru
- Záhlaví oddílů
- Data odpovídající jednotlivým záhlavím oddílů
- Tabulka symbolů COFF
- Řetězce
Naproti tomu krátká knihovna importu je napsaná takto:
- Záhlaví člena archivu
- Záhlaví importu
- Řetězec názvu importu s ukončenou hodnotou null
- Řetězec názvu knihovny DLL s ukončenou hodnotou null
Jedná se o dostatečné informace, které přesně rekonstruuje celý obsah člena v době jejího použití.
Importovat hlavičku
Záhlaví importu obsahuje následující pole a posuny:
| Ofset | Velikost | Pole | Popis |
|---|---|---|---|
| 0 |
2 |
Sig1 |
Musí být IMAGE_FILE_MACHINE_UNKNOWN. Další informace naleznete v tématu Typy počítačů. |
| 2 |
2 |
Sig2 |
Musí být 0xFFFF. |
| 4 |
2 |
Verze |
Verze struktury. |
| 6 |
2 |
Stroj |
Číslo, které identifikuje typ cílového počítače. Další informace naleznete v tématu Typy počítačů. |
| 8 |
4 |
Time-Date razítko |
Čas a datum vytvoření souboru. |
| 12 |
4 |
Velikost dat |
Velikost řetězců, které následují za záhlavím. |
| 16 |
2 |
Pořadové číslo/Nápověda |
Buď řadový, nebo tip pro import, určený hodnotou v poli Typ názvu. |
| 18 |
2 bity |
Typ |
Typ importu. Konkrétní hodnoty a popisy najdete v tématu Typ importu. |
| 3 bity |
Typ názvu |
Typ názvu importu. Další informace najdete v tématu Typ názvu importu. |
|
| 11 bitů |
Rezervovaný |
Vyhrazeno musí být 0. |
Za touto strukturou následují dva řetězce ukončené hodnotou null, které popisují název importovaného symbolu a knihovnu DLL, ze které přišla.
Typ importu
Pro pole Typ v hlavičce importu jsou definovány následující hodnoty:
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMPORT_OBJECT_CODE |
0 |
Spustitelný kód. |
| IMPORT_OBJECT_DATA |
1 |
Data. |
| IMPORT_OBJECT_CONST |
2 |
Zadáno jako CONST v souboru .def. |
Tyto hodnoty slouží k určení, které příspěvky oddílů musí vygenerovat nástroj, který knihovnu používá, pokud musí přistupovat k těmto datům.
Typ názvu importu
Název symbolu importu ukončený hodnotou null bezprostředně následuje za přidruženou hlavičkou importu. Následující hodnoty jsou definovány pro pole Typ názvu v záhlaví importu. Označují, jak se má název použít k vygenerování správných symbolů představujících import:
| Konstanta | Hodnota | Popis |
|---|---|---|
| IMPORT_OBJECT_ORDINAL | 0 | Import je podle řad. To znamená, že hodnota v poli Pořadové číslo/Tip záhlaví importu je pořadový řádek importu. Pokud tato konstanta není zadaná, pole Ordinal/Hint by se mělo vždy interpretovat jako nápověda importu. |
| IMPORT_OBJECT_NAME | 1 | Název importu je stejný jako název veřejného symbolu. |
| IMPORT_OBJECT_NAME_NOPREFIX | 2 | Název importu je název veřejného symbolu, ale přeskočí úvodní znak ?, @nebo volitelně _. |
| IMPORT_OBJECT_NAME_UNDECORATE | 3 | Název importu je název veřejného symbolu, ale přeskočí úvodní znak ?, @nebo volitelně _, a zkrátí se na první @. |
Příloha A: Výpočet hodnoty hash obrázků Authenticode PE
Očekává se použití několika certifikátů atributů k ověření integrity imagí. Nejběžnější je ale podpis Authenticode. Podpis Authenticode lze použít k ověření, že příslušné části souboru obrázku PE nebyly žádným způsobem změněny z původního formuláře souboru. K provedení této úlohy obsahují podpisy Authenticode něco, co se označuje jako hodnota hash obrázku PE.
Co je hodnota hash image Authenticode PE?
Hodnota hash obrázku Authenticode PE nebo hodnota hash souboru je podobná kontrolnímu součtu souboru v tom, že vytváří malou hodnotu, která souvisí s integritou souboru. Kontrolní součet je vytvořen jednoduchým algoritmem a používá se především k detekci selhání paměti. To znamená, že se používá ke zjištění, zda blok paměti na disku zmizel špatně a hodnoty uložené tam byly poškozeny. Hodnota hash souboru je podobná kontrolnímu součtu, ve které také detekuje poškození souboru. Na rozdíl od většiny algoritmů kontrolního součtu je však velmi obtížné upravit soubor tak, aby byl stejný jako původní (nezměněný) tvar hash souboru. To znamená, že kontrolní součet je určen k detekci jednoduchých selhání paměti, které vedou k poškození, ale hodnotu hash souboru lze použít k detekci úmyslných a dokonce drobných úprav souboru, jako jsou například viry, hackery nebo programy trojského koně.
V podpisu Authenticode je hodnota hash souboru digitálně podepsána pomocí privátního klíče známého pouze podepisující znaménko souboru. Uživatel softwaru může ověřit integritu souboru tím, že vypočítá hodnotu hash souboru a porovná ji s hodnotou podepsané hodnoty hash obsaženou v digitálním podpisu Authenticode. Pokud se hodnoty hash souboru neshodují, část souboru, na kterou se vztahuje hodnota hash obrázku PE, byla upravena.
Co je popsáno v hodnotě hash obrázků Authenticode PE?
Do výpočtu hodnoty hash obrázku pe není možné ani žádoucí zahrnout všechna data souboru obrázku. Někdy jednoduše představuje nežádoucí vlastnosti (například informace o ladění nelze odebrat z veřejně vydaných souborů); někdy je prostě nemožné. Například není možné zahrnout všechny informace do souboru obrázku v podpisu Authenticode, pak vložit podpis Authenticode, který obsahuje hodnotu hash obrázku PE do obrázku PE, a později může vygenerovat stejnou hodnotu hash obrázku PE zahrnutím všech dat souboru obrázku do výpočtu znovu, protože soubor teď obsahuje podpis Authenticode, který tam původně nebyl.
Proces generování hodnoty hash image Authenticode PE
Tato část popisuje, jak se vypočítá hodnota hash obrázku PE a jaké části image PE je možné upravit bez zneplatnění podpisu Authenticode.
Poznámka:
Hodnotu hash obrázku PE pro určitý soubor lze zahrnout do samostatného souboru katalogu bez zahrnutí certifikátu atributu do souboru hash. To je relevantní, protože je možné zneplatnit hodnotu hash obrázku PE v souboru katalogu podepsaného službou Authenticode úpravou image PE, která ve skutečnosti neobsahuje podpis Authenticode.
Všechna data v oddílech obrázku PE, která jsou uvedena v tabulce oddílů, jsou v celé hodnotě hash s výjimkou následujících rozsahů vyloučení:
Pole CheckSum souboru polí specifických pro Windows volitelné hlavičky. Tento kontrolní součet zahrnuje celý soubor (včetně všech certifikátů atributů v souboru). Ve všech pravděpodobnostech se kontrolní součet bude lišit od původní hodnoty po vložení podpisu Authenticode.
Informace související s certifikáty atributů Oblasti obrázku PE, které souvisí s podpisem Authenticode, nejsou zahrnuty do výpočtu hodnoty hash obrázku PE, protože podpisy Authenticode je možné přidat nebo odebrat z obrázku, aniž by to mělo vliv na celkovou integritu obrázku. To není problém, protože existují scénáře uživatelů, které závisí na opětovném podepisování imagí PE nebo přidání časového razítka. Authenticode vyloučí z výpočtu hodnoty hash následující informace:
Pole Tabulka certifikátů volitelných adresářů dat hlaviček.
Tabulka certifikátů a odpovídající certifikáty, na které odkazuje pole Tabulka certifikátů uvedené bezprostředně nahoře.
Pokud chcete vypočítat hodnotu hash obrázku PE, Authenticode seřídí oddíly zadané v tabulce oddílů podle rozsahu adres a potom zatřiďuje výslednou posloupnost bajtů a předává rozsahy vyloučení.
Informace po konci poslední části Oblast za posledním oddílem (definovaná nejvyšším posunem) není hashována. Tato oblast obvykle obsahuje informace o ladění. Informace o ladění lze obecně považovat za poradce pro ladicí programy; nemá vliv na skutečnou integritu spustitelného programu. Po doručení produktu je zcela možné odebrat ladicí informace z obrázku a ovlivnit funkčnost programu. Ve skutečnosti se to někdy provádí jako míra ukládání disku. Je třeba poznamenat, že ladicí informace obsažené v zadaných oddílech bitové kopie PE nelze odebrat bez zneplatnění podpisu Authenticode.
K experimentování s vytvářením a ověřováním podpisů Authenticode můžete použít nástroje makecert a podepisovací nástroje poskytované v sadě Windows Platform SDK. Další informace najdete níže v referenčních informacích.
Odkazy
Soubory ke stažení a nástroje pro Windows (včetně sady Windows SDK)
Vytváření, zobrazování a správa certifikátů
Návod k podepisování kóduKernel-Mode (.doc)
Formát přenosného spustitelného podpisu systému Windows Authenticode (.docx)
funkce ImageHlp