Sdílet prostřednictvím


Formát PE

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ů

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 tabulce certifikátu atributu (pouze obrázek).a0>
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

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:

  1. Přidejte hodnotu dwLength certifikátu prvního atributu do počátečního posunu.
  2. Zaokrouhlí hodnotu z kroku 1 nahoru na nejbližší 8bajtů a vyhledá posun položky certifikátu druhého atributu.
  3. 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.
  4. 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

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 Volitelné adresáře dat hlavičky (pouze obrázek).a0> Základní přemísťovací tabulka je rozdělená na bloky. Každý blok představuje základní přemístění stránky 4K. Každý blok musí začínat na 32bitové hranici.

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:

  1. 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.

  2. 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.

  3. Zavaděč přiřadí hodnotu indexu TLS k místu, které bylo označeno polem Adresa indexu.

  4. Spustitelný kód načte index TLS a také umístění pole TLS.

  5. 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.

  6. 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 0x00000100

  • Modul provádí tok řízení a zapisuje kontroly integrity.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • Modul obsahuje platná metadata cíle toku řízení.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • Modul nevyužívá soubor cookie zabezpečení /GS.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • Modul podporuje IAT jen pro čtení se zpožděním načítání.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • Tabulka 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 0x00002000

  • Modul 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 0x00004000

  • Modul umožňuje potlačení exportů.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • Modul obsahuje informace o cíli longjmp.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Maska 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)

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)

SignTool

Formát přenosného spustitelného podpisu systému Windows Authenticode (.docx)

funkce ImageHlp