Dela via


PE-format

Den här specifikationen beskriver strukturen för körbara filer (bild) och objektfiler under Windows-serien med operativsystem. Dessa filer kallas bärbara körbara filer (PE) respektive COFF-filer (Common Object File Format).

Not

Detta dokument tillhandahålls för att underlätta utvecklingen av verktyg och program för Windows, men är inte garanterat en fullständig specifikation i alla avseenden. Microsoft förbehåller sig rätten att ändra det här dokumentet utan föregående meddelande.

Den här revisionen av Microsoft Portable Executable och Common Object File Format Specification ersätter alla tidigare revisioner av den här specifikationen.

Allmänna begrepp

Det här dokumentet anger strukturen för körbara filer (bild) och objektfiler under Microsoft Windows-serien med operativsystem. Dessa filer kallas bärbara körbara filer (PE) respektive COFF-filer (Common Object File Format). Namnet "Bärbar körbar" refererar till det faktum att formatet inte är arkitekturspecifikt.

Vissa begrepp som visas i den här specifikationen beskrivs i följande tabell:

Namn Beskrivning
attributcertifikat
Ett certifikat som används för att associera verifierbara instruktioner med en bild. Ett antal olika verifierbara instruktioner kan associeras med en fil. en av de mest användbara är en instruktion från en programvarutillverkare som anger vad meddelandets sammanfattning av avbildningen förväntas vara. En meddelandesammandrag liknar en kontrollsumma förutom att det är extremt svårt att förfalska. Därför är det mycket svårt att ändra en fil så att den får samma sammanfattade meddelande som den ursprungliga filen. Instruktionen kan verifieras som gjord av tillverkaren med hjälp av krypteringsscheman för offentliga eller privata nycklar. Det här dokumentet beskriver information om andra attributcertifikat än för att tillåta att de infogas i bildfiler.
datum/tid-stämpel
En stämpel som används för olika ändamål på flera platser i en PE- eller COFF-fil. I de flesta fall är formatet för varje stämpel detsamma som det som används av tidsfunktionerna i C-körningsbiblioteket. Undantag finns i beskrivningen av IMAGE_DEBUG_TYPE_REPRO i Felsökningstyp. Om stämpelvärdet är 0 eller 0xFFFFFFFF representerar det inte en verklig eller meningsfull datum-/tidsstämpel.
filpekare
Platsen för ett objekt i själva filen innan det bearbetas av länkaren (när det gäller objektfiler) eller inläsaren (om det gäller bildfiler). Det här är med andra ord en position i filen som lagras på disken.
Länkare
En referens till den länkare som tillhandahålls med Microsoft Visual Studio.
objektfil
En fil som ges som indata till länkaren. Länkaren skapar en bildfil som i sin tur används som indata av inläsaren. Termen "objektfil" innebär inte nödvändigtvis någon anslutning till objektorienterad programmering.
reserverad, måste vara 0
En beskrivning av ett fält som anger att värdet för fältet måste vara noll för generatorer och att konsumenterna måste ignorera fältet.
Relativ virtuell adress (RVA)
I en bildfil är detta adressen till ett objekt när det har lästs in i minnet, med basadressen för bildfilen subtraherad från den. RVA för ett objekt skiljer sig nästan alltid från dess position i filen på disken (filpekare).
I en objektfil är en RVA mindre meningsfull eftersom minnesplatser inte har tilldelats. I det här fallet skulle en RVA vara en adress i ett avsnitt (beskrivs senare i den här tabellen), som en flytt senare tillämpas på under länkningen. För enkelhetens skull bör en kompilator bara ange den första RVA:en i varje avsnitt till noll.
sektion
Den grundläggande enheten med kod eller data i en PE- eller COFF-fil. Till exempel kan all kod i en objektfil kombineras i ett enda avsnitt eller (beroende på kompilatorns beteende) kan varje funktion uppta ett eget avsnitt. Med fler avsnitt finns det mer filkostnader, men länkaren kan länka in kod mer selektivt. Ett avsnitt liknar ett segment i Intel 8086-arkitekturen. Alla rådata i ett avsnitt måste läsas in sammanhängande. Dessutom kan en bildfil innehålla ett antal avsnitt, till exempel .tls eller .reloc , som har särskilda syften.
Virtuell adress (VA)
Samma som RVA, förutom att basadressen för bildfilen inte subtraheras. Adressen kallas va eftersom Windows skapar ett distinkt VA-utrymme för varje process, oberoende av fysiskt minne. I nästan alla syften bör en va betraktas som en adress. En VA är inte lika förutsägbar som en RVA eftersom inläsaren kanske inte läser in avbildningen på önskad plats.

Överblick

I följande lista beskrivs det körbara Microsoft PE-formatet, med basen för bildrubriken överst. Avsnittet från det MS-DOS 2.0-kompatibla EXE-huvudet till det oanvända avsnittet precis innan PE-huvudet är avsnittet MS-DOS 2.0 och används endast för MS-DOS kompatibilitet.

  • MS-DOS 2.0-kompatibel EXE-rubrik

  • oanvänd

  • OEM-identifierare

    OEM-information

    Förskjutning till PE-rubrik

  • MS-DOS 2.0 Stub-program och flytttabell

  • oanvänd

  • PE-huvud (justerat efter 8 bytes gräns)

  • Avsnittsrubriker

  • Bildsidor:

    importinformation

    exportinformation

    basflyttar

    resursinformation

I följande lista beskrivs Microsoft COFF-objektmodulformatet:

  • Microsoft COFF-huvud

  • Avsnittsrubriker

  • Rådata:

    kod

    data

    felsökningsinformation

    Omlokaliseringar

Filhuvuden

PE-filrubriken består av en Microsoft-MS-DOS stub, PE-signaturen, COFF-filrubriken och ett valfritt huvud. Ett COFF-objektfilhuvud består av ett COFF-filhuvud och ett valfritt huvud. I båda fallen följs filrubrikerna omedelbart av avsnittsrubriker.

MS-DOS Stub (endast bild)

Den MS-DOS stub är ett giltigt program som körs under MS-DOS. Den placeras längst fram i EXE-avbildningen. Länkaren placerar en standard stub här, som skriver ut meddelandet "Det här programmet kan inte köras i DOS-läge" när avbildningen körs i MS-DOS. Användaren kan ange en annan stub med hjälp av alternativet /STUB-länkare.

På plats 0x3c har stub-filen förskjuten till PE-signaturen. Med den här informationen kan Windows köra avbildningsfilen korrekt, även om den har en MS-DOS stub. Den här filförskjutningen placeras på plats 0x3c under länkningen.

Signatur (endast bild)

Efter MS-DOS stub, vid den filförskjutning som anges vid förskjutning 0x3c, är en 4-bytes signatur som identifierar filen som en PE-formatbildfil. Den här signaturen är "PE\0\0" (bokstäverna "P" och "E" följt av två null-byte).

COFF-filhuvud (objekt och bild)

I början av en objektfil, eller omedelbart efter signaturen för en bildfil, är en COFF-standardfilrubrik i följande format. Observera att Windows-inläsaren begränsar antalet avsnitt till 96.

Uppväga Storlek Fält Beskrivning
0
2
Maskin
Det nummer som identifierar typen av måldator. Mer information finns i Machine Types.
2
2
NumberOfSections
Antalet avsnitt. Detta anger storleken på avsnittstabellen, som omedelbart följer rubrikerna.
4
4
TimeDateStamp
De låga 32 bitarna av antalet sekunder sedan 00:00 1 januari 1970 (ett C-körningsvärde time_t värde), vilket anger när filen skapades.
8
4
PointerToSymbolTable
Filförskjutningen för COFF-symboltabellen eller noll om det inte finns någon COFF-symboltabell. Det här värdet ska vara noll för en bild eftersom COFF-felsökningsinformationen är inaktuell.
12
4
NumberOfSymbols
Antalet poster i symboltabellen. Dessa data kan användas för att hitta strängtabellen, som omedelbart följer symboltabellen. Det här värdet ska vara noll för en bild eftersom COFF-felsökningsinformationen är inaktuell.
16
2
SizeOfOptionalHeader
Storleken på det valfria huvudet, som krävs för körbara filer men inte för objektfiler. Det här värdet ska vara noll för en objektfil. En beskrivning av rubrikformatet finns i Valfritt huvud (endast bild).
18
2
Karakteristika
Flaggorna som anger filens attribut. Specifika flaggvärden finns i Egenskaper.

Datortyper

Fältet Dator har något av följande värden, som anger CPU-typ. En avbildningsfil kan endast köras på den angivna datorn eller på ett system som emulerar den angivna datorn.

Konstant Värde Beskrivning
IMAGE_FILE_MACHINE_UNKNOWN
0x0
Innehållet i det här fältet antas vara tillämpligt på alla typer av datorer
IMAGE_FILE_MACHINE_ALPHA
0x184
Alpha AXP, 32-bitars adressutrymme
IMAGE_FILE_MACHINE_ALPHA64
0x284
Alfa 64- och 64-bitars adressutrymme
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33
IMAGE_FILE_MACHINE_AMD64
0x8664
x64
IMAGE_FILE_MACHINE_ARM
0x1c0
ARM lite endian
IMAGE_FILE_MACHINE_ARM64
0xaa64
ARM64 liten endian
IMAGE_FILE_MACHINE_ARMNT
0x1c4
ARM Tumme-2 lite endian
IMAGE_FILE_MACHINE_AXP64
0x284
AXP 64 (samma som Alpha 64)
IMAGE_FILE_MACHINE_EBC
0xebc
EFI-bytekod
IMAGE_FILE_MACHINE_I386
0x14c
Intel 386 eller senare processorer och kompatibla processorer
IMAGE_FILE_MACHINE_IA64
0x200
Intel Itanium-processorfamilj
IMAGE_FILE_MACHINE_LOONGARCH32
0x6232
LoongArch 32-bitars processorfamilj
IMAGE_FILE_MACHINE_LOONGARCH64
0x6264
LoongArch 64-bitars processorfamilj
IMAGE_FILE_MACHINE_M32R
0x9041
Mitsubishi M32R little endian
IMAGE_FILE_MACHINE_MIPS16
0x266
MIPS16
IMAGE_FILE_MACHINE_MIPSFPU
0x366
MIPS med FPU
IMAGE_FILE_MACHINE_MIPSFPU16
0x466
MIPS16 med FPU
IMAGE_FILE_MACHINE_POWERPC
0x1f0
Power PC little endian
IMAGE_FILE_MACHINE_POWERPCFP
0x1f1
Power PC med stöd för flyttals
IMAGE_FILE_MACHINE_R4000
0x166
MIPS lite endian
IMAGE_FILE_MACHINE_RISCV32
0x5032
RISC-V 32-bitars adressutrymme
IMAGE_FILE_MACHINE_RISCV64
0x5064
RISC-V 64-bitars adressutrymme
IMAGE_FILE_MACHINE_RISCV128
0x5128
RISC-V 128-bitars adressutrymme
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
Tumme
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS little-endian WCE v2

Karakteristika

Fältet Egenskaper innehåller flaggor som anger attribut för objektet eller bildfilen. Följande flaggor är för närvarande definierade:

Flagga Värde Beskrivning
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Endast avbildning, Windows CE och Microsoft Windows NT och senare. Detta anger att filen inte innehåller basflyttar och därför måste läsas in på önskad basadress. Om basadressen inte är tillgänglig rapporterar inläsaren ett fel. Standardbeteendet för länkaren är att ta bort basflyttar från körbara filer (EXE).
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
Endast bild. Detta anger att avbildningsfilen är giltig och kan köras. Om den här flaggan inte har angetts indikerar den ett länkfel.
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004
COFF-radnummer har tagits bort. Den här flaggan är inaktuell och bör vara noll.
IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008
COFF-symboltabellposter för lokala symboler har tagits bort. Den här flaggan är inaktuell och bör vara noll.
IMAGE_FILE_AGGRESSIVE_WS_TRIM
0x0010
Föråldrad. Aggressivt trimma arbetsuppsättning. Den här flaggan är inaktuell för Windows 2000 och senare och måste vara noll.
IMAGE_FILE_LARGE_ADDRESS_ MEDVETEN
0x0020
Programmet kan hantera > 2 GB-adresser.
0x0040
Den här flaggan är reserverad för framtida användning.
IMAGE_FILE_BYTES_REVERSED_LO
0x0080
Lite endian: den minst signifikanta biten (LSB) föregår den viktigaste biten (MSB) i minnet. Den här flaggan är inaktuell och bör vara noll.
IMAGE_FILE_32BIT_MACHINE
0x0100
Datorn baseras på en 32-bitars ordarkitektur.
IMAGE_FILE_DEBUG_STRIPPED
0x0200
Felsökningsinformation tas bort från bildfilen.
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP
0x0400
Om avbildningen finns på flyttbara medier läser du in den fullständigt och kopierar den till växlingsfilen.
IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800
Om avbildningen finns på nätverksmedia läser du in den fullständigt och kopierar den till växlingsfilen.
IMAGE_FILE_SYSTEM
0x1000
Avbildningsfilen är en systemfil, inte ett användarprogram.
IMAGE_FILE_DLL
0x2000
Bildfilen är ett DLL-bibliotek (Dynamic Link Library). Sådana filer anses vara körbara filer i nästan alla syften, även om de inte kan köras direkt.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000
Filen ska endast köras på en uniprocessordator.
IMAGE_FILE_BYTES_REVERSED_HI
0x8000
Stor endian: MSB föregår LSB i minnet. Den här flaggan är inaktuell och bör vara noll.

Valfritt huvud (endast bild)

Varje bildfil har ett valfritt huvud som ger information till inläsaren. Det här huvudet är valfritt i den meningen att vissa filer (specifikt objektfiler) inte har det. För bildfiler krävs det här huvudet. En objektfil kan ha ett valfritt huvud, men i allmänhet har den här rubriken ingen funktion i en objektfil förutom för att öka dess storlek.

Observera att storleken på den valfria rubriken inte är fast. Fältet SizeOfOptionalHeader i COFF-huvudet måste användas för att verifiera att en avsökning i filen för en viss datakatalog inte går längre än SizeOfOptionalHeader. Mer information finns i COFF-filhuvud (objekt och bild).

Fältet NumberOfRvaAndSizes i det valfria huvudet bör också användas för att säkerställa att ingen avsökning för en viss datakatalogpost överskrider det valfria huvudet. Dessutom är det viktigt att verifiera det valfria huvudmaginumret för formatkompatibilitet.

Det valfria huvudmaginumret avgör om en bild är en PE32- eller PE32+-körbar fil.

Magiskt nummer PE-format
0x10b
PE32
0x20b
PE32+

PE32+ bilder tillåter ett 64-bitars adressutrymme samtidigt som bildstorleken begränsas till 2 gigabyte. Andra PE32+-ändringar behandlas i respektive avsnitt.

Själva den valfria rubriken har tre huvuddelar.

Förskjutning (PE32/PE32+) Storlek (PE32/PE32+) Rubrikdel Beskrivning
0
28/24
Standardfält
Fält som har definierats för alla implementeringar av COFF, inklusive UNIX.
28/24
68/88
Windows-specifika fält
Ytterligare fält som stöder specifika funktioner i Windows (till exempel undersystem).
96/112
Variabel
Datakataloger
Adress-/storlekspar för särskilda tabeller som finns i avbildningsfilen och som används av operativsystemet (till exempel importtabellen och exporttabellen).

Valfria standardfält för sidhuvud (endast bild)

De första åtta fälten i den valfria rubriken är standardfält som definieras för varje implementering av COFF. De här fälten innehåller allmän information som är användbar för att läsa in och köra en körbar fil. De är oförändrade för PE32+-formatet.

Uppväga Storlek Fält Beskrivning
0
2
Trolleri
Det osignerade heltal som identifierar status för bildfilen. Det vanligaste talet är 0x10B, som identifierar det som en vanlig körbar fil. 0x107 identifierar den som en ROM-avbildning och 0x20B identifierar den som en PE32+ körbar fil.
2
1
MajorLinkerVersion
Länkarens huvudversionsnummer.
3
1
MinorLinkerVersion
Linker-delversionsnumret.
4
4
SizeOfCode
Storleken på kodavsnittet (text) eller summan av alla kodavsnitt om det finns flera avsnitt.
8
4
SizeOfInitializedData
Storleken på det initierade dataavsnittet eller summan av alla sådana avsnitt om det finns flera dataavsnitt.
12
4
SizeOfUninitializedData
Storleken på det onitialiserade dataavsnittet (BSS) eller summan av alla sådana avsnitt om det finns flera BSS-avsnitt.
16
4
AddressOfEntryPoint
Adressen till startpunkten i förhållande till avbildningsbasen när den körbara filen läses in i minnet. För programbilder är detta startadressen. För enhetsdrivrutiner är detta adressen till initieringsfunktionen. En startpunkt är valfri för DLL:er. När det inte finns någon startpunkt måste det här fältet vara noll.
20
4
BaseOfCode
Den adress som är relativ till avbildningsbasen i början av kodavsnittet när den läses in i minnet.

PE32 innehåller det här ytterligare fältet, som saknas i PE32+, efter BaseOfCode.

Uppväga Storlek Fält Beskrivning
24
4
BaseOfData
Den adress som är relativ till bildbasen i avsnittet början av data när den läses in i minnet.

Valfritt sidhuvud Windows-Specific fält (endast bild)

De följande 21 fälten är ett tillägg till det valfria COFF-rubrikformatet. De innehåller ytterligare information som krävs av länkaren och inläsaren i Windows.

Förskjutning (PE32/ PE32+) Storlek (PE32/ PE32+) Fält Beskrivning
28/24
4/8
ImageBase
Den föredragna adressen för den första byte av avbildningen när den läses in i minnet. måste vara en multipel av 64 K. Standardvärdet för DLL:er är 0x10000000. Standardvärdet för Windows CE EXEs är 0x00010000. Standardvärdet för Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 och Windows Me är 0x00400000.
32/32
4
SectionAlignment
Justeringen (i byte) av avsnitt när de läses in i minnet. Den måste vara större än eller lika med FileAlignment. Standardvärdet är sidstorleken för arkitekturen.
36/36
4
FileAlignment
Justeringsfaktorn (i byte) som används för att justera rådata för avsnitt i bildfilen. Värdet ska vara en effekt på 2 mellan 512 och 64 K, inklusive. Standardvärdet är 512. Om SectionAlignment är mindre än arkitekturens sidstorlek måste FileAlignment matcha SectionAlignment.
40/40
2
MajorOperatingSystemVersion
Huvudversionsnumret för det nödvändiga operativsystemet.
42/42
2
MinorOperatingSystemVersion
Delversionsnumret för det nödvändiga operativsystemet.
44/44
2
MajorImageVersion
Huvudversionsnumret för avbildningen.
46/46
2
MinorImageVersion
Avbildningens delversionsnummer.
48/48
2
MajorSubsystemVersion
Huvudversionsnumret för undersystemet.
50/50
2
MinorSubsystemVersion
Delsystemets delversionsnummer.
52/52
4
Win32VersionValue
Reserverad, måste vara noll.
56/56
4
SizeOfImage
Storleken (i byte) på bilden, inklusive alla rubriker, när bilden läses in i minnet. Det måste vara en multipel av SectionAlignment.
60/60
4
SizeOfHeaders
Den kombinerade storleken på en MS-DOS stub, PE-rubrik och avsnittsrubriker avrundade upp till en multipel av FileAlignment.
64/64
4
Kontrollsumma
Kontrollsumman för bildfilen. Algoritmen för att beräkna kontrollsumman ingår i IMAGHELP.DLL. Följande kontrolleras för validering vid inläsning: alla drivrutiner, alla DLL-filer som läses in vid starttiden och eventuella DLL-filer som läses in i en kritisk Windows-process.
68/68
2
Delsystem
Det undersystem som krävs för att köra den här avbildningen. Mer information finns i Windows-undersystem.
70/70
2
DllCharacteristics
Mer information finns i DLL-egenskaper senare i den här specifikationen.
72/72
4/8
SizeOfStackReserve
Storleken på stacken som ska reserveras. Endast SizeOfStackCommit har checkats in. resten görs tillgängligt en sida i taget tills reservstorleken har nåtts.
76/80
4/8
SizeOfStackCommit
Storleken på stacken som ska checkas in.
80/88
4/8
SizeOfHeapReserve
Storleken på det lokala heaputrymmet som ska reserveras. Endast SizeOfHeapCommit har checkats in. resten görs tillgängligt en sida i taget tills reservstorleken har nåtts.
84/96
4/8
SizeOfHeapCommit
Storleken på det lokala heaputrymme som ska checkas in.
88/104
4
LoaderFlags
Reserverad, måste vara noll.
92/108
4
NumberOfRvaAndSizes
Antalet datakatalogposter i resten av det valfria huvudet. Var och en beskriver en plats och storlek.
Windows-undersystem

Följande värden som definierats för fältet Undersystem i det valfria huvudet avgör vilket Windows-undersystem (om det finns något) som krävs för att köra avbildningen.

Konstant Värde Beskrivning
IMAGE_SUBSYSTEM_UNKNOWN
0
Ett okänt undersystem
IMAGE_SUBSYSTEM_NATIVE
1
Enhetsdrivrutiner och interna Windows-processer
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
Undersystemet windows grafiskt användargränssnitt (GUI)
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
Undersystemet Windows-tecken
IMAGE_SUBSYSTEM_OS2_CUI
5
Undersystemet OS/2-tecken
IMAGE_SUBSYSTEM_POSIX_CUI
7
Posix-teckenundersystemet
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
8
Intern Win9x-drivrutin
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Ett EFI-program (Extensible Firmware Interface)
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER
11
En EFI-drivrutin med starttjänster
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER
12
En EFI-drivrutin med körningstjänster
IMAGE_SUBSYSTEM_EFI_ROM
13
En EFI ROM-avbildning
IMAGE_SUBSYSTEM_XBOX
14
XBOX
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
Windows-startprogram.
DLL-egenskaper

Följande värden definieras för fältet DllCharacteristics i det valfria huvudet.

Konstant Värde Beskrivning
0x0001
Reserverad, måste vara noll.
0x0002
Reserverad, måste vara noll.
0x0004
Reserverad, måste vara noll.
0x0008
Reserverad, måste vara noll.
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
Bilden kan hantera ett 64-bitars virtuellt adressutrymme med hög entropi.
IMAGE_DLLCHARACTERISTICS_
DYNAMIC_BASE
0x0040
DLL kan flyttas vid belastningstillfället.
IMAGE_DLLCHARACTERISTICS_
FORCE_INTEGRITY
0x0080
Kodintegritetskontroller tillämpas.
IMAGE_DLLCHARACTERISTICS_
NX_COMPAT
0x0100
Avbildningen är NX-kompatibel.
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION
0x0200
Isoleringsmedveten, men isolera inte bilden.
IMAGE_DLLCHARACTERISTICS_ NO_SEH
0x0400
Använder inte hantering av strukturerade undantag (SE). Ingen SE-hanterare kan anropas i den här avbildningen.
IMAGE_DLLCHARACTERISTICS_ NO_BIND
0x0800
Bind inte bilden.
IMAGE_DLLCHARACTERISTICS_APPCONTAINER
0x1000
Avbildningen måste köras i en AppContainer.
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER
0x2000
En WDM-drivrutin.
IMAGE_DLLCHARACTERISTICS_GUARD_CF
0x4000
Avbildningen har stöd för Control Flow Guard.
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE
0x8000
TerminalServern är medveten.

Valfria huvuddatakataloger (endast avbildning)

Varje datakatalog ger adressen och storleken på en tabell eller sträng som Används i Windows. Dessa datakatalogposter läses alla in i minnet så att systemet kan använda dem vid körning. En datakatalog är ett fält med 8 byte som har följande deklaration:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

Det första fältet, VirtualAddress, är faktiskt RVA för tabellen. RVA är adressen till tabellen i förhållande till basadressen för bilden när tabellen läses in. Det andra fältet ger storleken i byte. Datakatalogerna, som utgör den sista delen av det valfria huvudet, visas i följande tabell.

Observera att antalet kataloger inte har åtgärdats. Innan du letar efter en specifik katalog kontrollerar du fältet NumberOfRvaAndSizes i det valfria huvudet.

Anta inte heller att RVA:erna i den här tabellen pekar på början av ett avsnitt eller att de avsnitt som innehåller specifika tabeller har specifika namn.

Förskjutning (PE/PE32+) Storlek Fält Beskrivning
96/112
8
Exportera tabell
Exporttabellens adress och storlek. Mer information finns i avsnittet .edata (endast bild).
104/120
8
Importera tabell
Importtabellens adress och storlek. Mer information finns i avsnittet .idata.
112/128
8
Resurstabell
Resurstabellens adress och storlek. Mer information finns i avsnittet .rsrc.
120/136
8
Undantagstabell
Undantagstabellens adress och storlek. Mer information finns i avsnittet .pdata.
128/144
8
Certifikattabell
Attributcertifikattabellens adress och storlek. Mer information finns i Attributcertifikattabellen (endast bild).
136/152
8
Tabell för basflytt
Basflytttabellens adress och storlek. Mer information finns i .reloc-avsnittet (endast bild).
144/160
8
Felsöka
Startadressen och storleken för felsökningsdata. Mer information finns i felsökningsavsnittet.
152/168
8
Arkitektur
Reserverad, måste vara 0
160/176
8
Global Ptr
RVA för det värde som ska lagras i det globala pekarregistret. Storleksmedlemmen i den här strukturen måste vara inställd på noll.
168/184
8
TLS-tabell
TLS-tabelladressen (Thread Local Storage) och storleken. Mer information finns i avsnittet .tls.
176/192
8
Läs in konfigurationstabell
Inläsningskonfigurationstabellens adress och storlek. Mer information finns i Inläsningskonfigurationsstrukturen (endast avbildning).
184/200
8
Bunden import
Den bundna importtabellens adress och storlek.
192/208
8
IAT
Adress och storlek för importadresstabellen. Mer information finns i importadresstabellen.
200/216
8
Fördröj importbeskrivning
Fördröjningen av importbeskrivningens adress och storlek. Mer information finns i Delay-Load Importera tabeller (endast avbildning).
208/224
8
CLR Runtime-huvud
CLR-körningshuvudets adress och storlek. Mer information finns i .cormeta-avsnittet (endast objekt).
216/232
8
Reserverad, måste vara noll

Posten Certifikattabell pekar på en tabell med attributcertifikat. Dessa certifikat läses inte in i minnet som en del av avbildningen. Därför är det första fältet i den här posten, som normalt är en RVA, en filpekare i stället.

Avsnittstabell (avsnittsrubriker)

Varje rad i avsnittstabellen är i själva verket ett avsnittshuvud. Den här tabellen följer omedelbart den valfria rubriken, om någon. Den här positioneringen krävs eftersom filhuvudet inte innehåller någon direktpekare till avsnittstabellen. I stället bestäms platsen för avsnittstabellen genom att beräkna platsen för den första byte efter rubrikerna. Se till att använda storleken på det valfria huvudet enligt beskrivningen i filhuvudet.

Antalet poster i avsnittstabellen anges av fältet NumberOfSections i filhuvudet. Poster i avsnittstabellen numreras från en (1). Posterna i kod- och dataminnesavsnittet är i den ordning som länkaren väljer.

I en bildfil måste de virtuella datorerna för avsnitt tilldelas av länkaren så att de är i stigande ordning och intill varandra, och de måste vara en multipel av värdet SectionAlignment i det valfria huvudet.

Varje avsnittsrubrik (avsnittstabellpost) har följande format för totalt 40 byte per post.

Uppväga Storlek Fält Beskrivning
0
8
Namn
En 8 byte, null-vadderad UTF-8-kodad sträng. Om strängen är exakt 8 tecken lång finns det ingen avslutande null. För längre namn innehåller det här fältet ett snedstreck (/) som följs av en ASCII-representation av ett decimaltal som är en förskjutning i strängtabellen. Körbara bilder använder inte en strängtabell och stöder inte avsnittsnamn som är längre än 8 tecken. Långa namn i objektfiler trunkeras om de skickas till en körbar fil.
8
4
VirtualSize
Den totala storleken på avsnittet när det läses in i minnet. Om det här värdet är större än SizeOfRawData är avsnittet nollfyllt. Det här fältet är endast giltigt för körbara bilder och ska vara inställt på noll för objektfiler.
12
4
VirtualAddress
För körbara bilder är adressen för den första byte i avsnittet i förhållande till bildbasen när avsnittet läses in i minnet. För objektfiler är det här fältet adressen för den första byte innan omlokaliseringen tillämpas. för enkelhetens skull bör kompilatorerna ställa in detta på noll. Annars är det ett godtyckligt värde som subtraheras från förskjutningar under omlokaliseringen.
16
4
SizeOfRawData
Storleken på avsnittet (för objektfiler) eller storleken på de initierade data på disken (för bildfiler). För körbara avbildningar måste det här vara en multipel av FileAlignment från det valfria huvudet. Om detta är mindre än VirtualSize är resten av avsnittet nollfyllt. Eftersom fältet SizeOfRawData avrundas men fältet VirtualSize inte är det, är det möjligt att SizeOfRawData också är större än VirtualSize. När ett avsnitt endast innehåller onitialiserade data ska det här fältet vara noll.
20
4
PointerToRawData
Filpekaren till den första sidan i avsnittet i COFF-filen. För körbara avbildningar måste det här vara en multipel av FileAlignment från det valfria huvudet. För objektfiler bör värdet justeras på en 4-bytesgräns för bästa prestanda. När ett avsnitt endast innehåller onitialiserade data ska det här fältet vara noll.
24
4
PointerToRelocations
Filpekaren till början av flyttposter för avsnittet. Detta är inställt på noll för körbara avbildningar eller om det inte finns några flyttningar.
28
4
PointerToLinenumbers
Filpekaren till början av radnummerposter för avsnittet. Detta är inställt på noll om det inte finns några COFF-radnummer. Det här värdet ska vara noll för en bild eftersom COFF-felsökningsinformationen är inaktuell.
32
2
NumberOfRelocations
Antalet flyttposter för avsnittet. Detta är inställt på noll för körbara avbildningar.
34
2
NumberOfLinenumbers
Antalet radnummerposter för avsnittet. Det här värdet ska vara noll för en bild eftersom COFF-felsökningsinformationen är inaktuell.
36
4
Karakteristika
Flaggorna som beskriver avsnittets egenskaper. Mer information finns i avsnittsflaggor.

 

Avsnittsflaggor

Avsnittsflaggor i fältet Egenskaper i avsnittsrubriken anger avsnittets egenskaper.

Flagga Värde Beskrivning
0x00000000
Reserverad för framtida användning.
0x00000001
Reserverad för framtida användning.
0x00000002
Reserverad för framtida användning.
0x00000004
Reserverad för framtida användning.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
Avsnittet ska inte vara vadderat till nästa gräns. Den här flaggan är föråldrad och ersätts av IMAGE_SCN_ALIGN_1BYTES. Detta är endast giltigt för objektfiler.
0x00000010
Reserverad för framtida användning.
IMAGE_SCN_CNT_CODE
0x00000020
Avsnittet innehåller körbar kod.
IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040
Avsnittet innehåller initierade data.
IMAGE_SCN_CNT_UNINITIALIZED_ DATA
0x00000080
Avsnittet innehåller onitialiserade data.
IMAGE_SCN_LNK_OTHER
0x00000100
Reserverad för framtida användning.
IMAGE_SCN_LNK_INFO
0x00000200
Avsnittet innehåller kommentarer eller annan information. Drectve-avsnittet har den här typen. Detta är endast giltigt för objektfiler.
0x00000400
Reserverad för framtida användning.
IMAGE_SCN_LNK_REMOVE
0x00000800
Avsnittet blir inte en del av avbildningen. Detta är endast giltigt för objektfiler.
IMAGE_SCN_LNK_COMDAT
0x00001000
Avsnittet innehåller COMDAT-data. Mer information finns i COMDAT-avsnitt (endast objekt). Detta är endast giltigt för objektfiler.
IMAGE_SCN_GPREL
0x00008000
Avsnittet innehåller data som refereras via den globala pekaren (GP).
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Reserverad för framtida användning.
IMAGE_SCN_MEM_16BIT
0x00020000
Reserverad för framtida användning.
IMAGE_SCN_MEM_LOCKED
0x00040000
Reserverad för framtida användning.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Reserverad för framtida användning.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
Justera data på en gräns på 1 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
Justera data på en gräns på 2 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_4BYTES
0x00300000
Justera data på en 4-bytesgräns. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_8BYTES
0x00400000
Justera data på en gräns på 8 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_16BYTES
0x00500000
Justera data på en gräns på 16 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_32BYTES
0x00600000
Justera data på en gräns på 32 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_64BYTES
0x00700000
Justera data på en gräns på 64 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_128BYTES
0x00800000
Justera data på en gräns på 128 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_256BYTES
0x00900000
Justera data på en gräns på 256 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_512BYTES
0x00A00000
Justera data på en gräns på 512 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_1024BYTES
0x00B00000
Justera data på en gräns på 1 024 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_2048BYTES
0x00C00000
Justera data på en gräns på 2 048 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_4096BYTES
0x00D00000
Justera data på en gräns på 4 096 byte. Gäller endast för objektfiler.
IMAGE_SCN_ALIGN_8192BYTES
0x00E00000
Justera data på en gräns på 8 192 byte. Gäller endast för objektfiler.
IMAGE_SCN_LNK_NRELOC_OVFL
0x01000000
Avsnittet innehåller utökade omlokaliseringar.
IMAGE_SCN_MEM_DISCARDABLE
0x02000000
Avsnittet kan tas bort efter behov.
IMAGE_SCN_MEM_NOT_CACHED
0x04000000
Avsnittet kan inte cachelagras.
IMAGE_SCN_MEM_NOT_PAGED
0x08000000
Avsnittet kan inte användas.
IMAGE_SCN_MEM_SHARED
0x10000000
Avsnittet kan delas i minnet.
IMAGE_SCN_MEM_EXECUTE
0x20000000
Avsnittet kan köras som kod.
IMAGE_SCN_MEM_READ
0x40000000
Avsnittet kan läsas.
IMAGE_SCN_MEM_WRITE
0x80000000
Avsnittet kan skrivas till.

 

IMAGE_SCN_LNK_NRELOC_OVFL anger att antalet omlokaliseringar för avsnittet överskrider de 16 bitar som är reserverade för det i avsnittsrubriken. Om biten har angetts och fältet NumberOfRelocations i avsnittsrubriken är 0xffff lagras det faktiska omlokaliseringsantalet i fältet 32-bitars VirtualAddress i den första omlokaliseringen. Det är ett fel om IMAGE_SCN_LNK_NRELOC_OVFL har angetts och det finns färre än 0xffff flyttningar i avsnittet.

Grupperade avsnitt (endast objekt)

$-tecknet (dollartecken) har en särskild tolkning i avsnittsnamn i objektfiler.

När du fastställer det bildavsnitt som ska innehålla innehållet i ett objektavsnitt tar länkaren bort "$" och alla tecken som följer det. Det innebär att ett objektavsnitt med namnet .text$X bidrar faktiskt till avsnittet .text i bilden.

Tecknen som följer "$" avgör dock ordningen på bidragen till bildavsnittet. Alla bidrag med samma objektavsnittsnamn allokeras sammanhängande i bilden och bidragsblocken sorteras i lexikal ordning efter objektavsnittsnamn. Därför hamnar allt i objektfiler med avsnittsnamnet .text$X ihop, efter att .text$W bidrag och före bidragen .text$Y.

Avsnittsnamnet i en bildfil innehåller aldrig ett $-tecken.

Annat innehåll i filen

De datastrukturer som beskrivits hittills, fram till och med det valfria huvudet, finns alla vid en fast förskjutning från början av filen (eller från PE-huvudet om filen är en bild som innehåller en MS-DOS stub).

Resten av ett COFF-objekt eller en bildfil innehåller datablock som inte nödvändigtvis har någon specifik filförskjutning. Platserna definieras i stället av pekare i det valfria huvudet eller ett avsnittshuvud.

Ett undantag gäller för bilder med ett SectionAlignment-värde som är mindre än arkitekturens sidstorlek (4 K för Intel x86 och MIPS och 8 K för Itanium). En beskrivning av SectionAlignment finns i valfritt huvud (endast bild). I det här fallet finns det begränsningar för filförskjutningen av avsnittsdata, enligt beskrivningen i avsnitt 5.1, "Avsnittsdata". Ett annat undantag är att attributcertifikat och felsökningsinformation måste placeras i slutet av en bildfil, med attributcertifikattabellen omedelbart före felsökningsavsnittet, eftersom inläsaren inte mappar dessa till minnet. Regeln om attributcertifikat och felsökningsinformation gäller dock inte för objektfiler.

Avsnittsdata

Initierade data för ett avsnitt består av enkla byteblock. För avsnitt som innehåller alla nollor behöver avsnittsdata dock inte inkluderas.

Data för varje avsnitt finns på den filförskjutning som angavs av fältet PointerToRawData i avsnittsrubriken. Storleken på dessa data i filen anges av fältet SizeOfRawData. Om SizeOfRawData är mindre än VirtualSize, är resten vadderat med nollor.

I en bildfil måste avsnittsdata justeras på en gräns enligt vad som anges i fältet FileAlignment i det valfria huvudet. Avsnittsdata måste visas i ordning efter RVA-värdena för motsvarande avsnitt (liksom de enskilda avsnittsrubrikerna i avsnittstabellen).

Det finns ytterligare begränsningar för bildfiler om värdet SectionAlignment i det valfria huvudet är mindre än arkitekturens sidstorlek. För sådana filer måste platsen för avsnittsdata i filen matcha dess plats i minnet när bilden läses in, så att den fysiska förskjutningen för avsnittsdata är densamma som RVA.

COFF-flyttningar (endast objekt)

Objektfiler innehåller COFF-flyttningar, som anger hur avsnittsdata ska ändras när de placeras i bildfilen och därefter läses in i minnet.

Bildfiler innehåller inte COFF-flyttningar eftersom alla refererade symboler redan har tilldelats adresser i ett platt adressutrymme. En bild innehåller flyttinformation i form av basflyttar i avsnittet .reloc (såvida inte avbildningen har attributet IMAGE_FILE_RELOCS_STRIPPED). Mer information finns i .reloc-avsnittet (endast bild).

För varje avsnitt i en objektfil innehåller en matris med poster med fast längd avsnittets COFF-flyttningar. Matrisens position och längd anges i avsnittsrubriken. Varje element i matrisen har följande format.

Uppväga Storlek Fält Beskrivning
0
4
VirtualAddress
Adressen till det objekt som omlokaliseringen tillämpas på. Det här är förskjutningen från början av avsnittet, plus värdet för avsnittets RVA/Offset-fält. Se avsnittstabell (avsnittsrubriker). Om den första byte i avsnittet till exempel har en adress på 0x10, har den tredje byte-adressen 0x12.
4
4
SymbolTableIndex
Ett nollbaserat index i symboltabellen. Den här symbolen ger den adress som ska användas för omlokaliseringen. Om den angivna symbolen har avsnittslagringsklassen är symbolens adress adressen med det första avsnittet med samma namn.
8
2
Typ
Ett värde som anger vilken typ av omlokalisering som ska utföras. Giltiga omlokaliseringstyper beror på datortyp. Se typindikatorer.

 

Om symbolen som anges i fältet SymbolTableIndex har lagringsklassen IMAGE_SYM_CLASS_SECTION, är symbolens adress början på avsnittet. Avsnittet finns vanligtvis i samma fil, förutom när objektfilen är en del av ett arkiv (bibliotek). I så fall finns avsnittet i alla andra objektfiler i arkivet som har samma arkivmedlemsnamn som den aktuella objektfilen. (Relationen med namnet på arkivmedlemmen används i länkningen av importtabeller, dvs. avsnittet .idata.)

Typindikatorer

Fältet Typ i flyttposten anger vilken typ av omlokalisering som ska utföras. Olika omlokaliseringstyper definieras för varje typ av dator.

x64-processorer

Följande indikatorer för omlokaliseringstyp definieras för x64 och kompatibla processorer.

Konstant Värde Beskrivning
IMAGE_REL_AMD64_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_AMD64_ADDR64
0x0001
64-bitars VA för omlokaliseringsmålet.
IMAGE_REL_AMD64_ADDR32
0x0002
32-bitars VA för omlokaliseringsmålet.
IMAGE_REL_AMD64_ADDR32NB
0x0003
32-bitarsadressen utan en avbildningsbas (RVA).
IMAGE_REL_AMD64_REL32
0x0004
Den 32-bitars relativa adressen från bytet efter omlokaliseringen.
IMAGE_REL_AMD64_REL32_1
0x0005
32-bitarsadressen i förhållande till byteavstånd 1 från omlokaliseringen.
IMAGE_REL_AMD64_REL32_2
0x0006
32-bitarsadressen i förhållande till byteavstånd 2 från omlokaliseringen.
IMAGE_REL_AMD64_REL32_3
0x0007
32-bitarsadressen i förhållande till byteavstånd 3 från omlokaliseringen.
IMAGE_REL_AMD64_REL32_4
0x0008
32-bitarsadressen i förhållande till byteavstånd 4 från omlokaliseringen.
IMAGE_REL_AMD64_REL32_5
0x0009
32-bitarsadressen i förhållande till byteavstånd 5 från omlokaliseringen.
IMAGE_REL_AMD64_SECTION
0x000A
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_AMD64_SECREL
0x000B
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_AMD64_SECREL7
0x000C
En 7-bitars osignerad förskjutning från basen av avsnittet som innehåller målet.
IMAGE_REL_AMD64_TOKEN
0x000D
CLR-token.
IMAGE_REL_AMD64_SREL32
0x000E
Ett 32-bitars signerat span-beroende värde som genereras till objektet.
IMAGE_REL_AMD64_PAIR
0x000F
Ett par som omedelbart måste följa varje span-beroende värde.
IMAGE_REL_AMD64_SSPAN32
0x0010
Ett 32-bitars signerat span-beroende värde som tillämpas vid länktid.

 

ARM-processorer

Följande indikatorer för omlokaliseringstyp definieras för ARM-processorer.

Konstant Värde Beskrivning
IMAGE_REL_ARM_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_ARM_ADDR32
0x0001
Målets 32-bitars VA.
IMAGE_REL_ARM_ADDR32NB
0x0002
Målets 32-bitars RVA.
IMAGE_REL_ARM_BRANCH24
0x0003
24-bitars relativ förskjutning till målet.
IMAGE_REL_ARM_BRANCH11
0x0004
Referensen till ett subrutinanrop. Referensen består av två 16-bitars instruktioner med 11-bitars förskjutningar.
IMAGE_REL_ARM_REL32
0x000A
Den 32-bitars relativa adressen från bytet efter omlokaliseringen.
IMAGE_REL_ARM_SECTION
0x000E
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_ARM_SECREL
0x000F
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_ARM_MOV32
0x0010
Målets 32-bitars VA. Den här omlokaliseringen tillämpas med hjälp av en MOVW-instruktion för de låga 16 bitarna följt av en MOVT för de höga 16 bitarna.
IMAGE_REL_THUMB_MOV32
0x0011
Målets 32-bitars VA. Den här omlokaliseringen tillämpas med hjälp av en MOVW-instruktion för de låga 16 bitarna följt av en MOVT för de höga 16 bitarna.
IMAGE_REL_THUMB_BRANCH20
0x0012
Instruktionen är fast med 21-bitars relativ förskjutning till det justerade målet på 2 byte. Den minst betydande biten av förskjutningen är alltid noll och lagras inte. Den här omlokaliseringen motsvarar en Tum-2 32-bitars villkorsstyrd B-instruktion.
Oanvänd
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
Instruktionen är fast med 25-bitars relativ förskjutning till det justerade målet på 2 byte. Den minst betydande biten av förskjutningen är noll och lagras inte. Den här omlokaliseringen motsvarar en Tum-2 B-instruktion.
IMAGE_REL_THUMB_BLX23
0x0015
Instruktionen är fast med 25-bitars relativ förskjutning till det 4-bytesjusterade målet. De låga 2 bitarna av förskjutningen är noll och lagras inte.
Den här omlokaliseringen motsvarar en Thumb-2 BLX-instruktion.
IMAGE_REL_ARM_PAIR
0x0016
Omlokaliseringen är endast giltig när den omedelbart följer en ARM_REFHI eller THUMB_REFHI. Dess SymbolTableIndex innehåller en förskjutning och inte ett index i symboltabellen.

 

ARM64-processorer

Följande indikatorer för omlokaliseringstyp definieras för ARM64-processorer.

Konstant Värde Beskrivning
IMAGE_REL_ARM64_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_ARM64_ADDR32
0x0001
Målets 32-bitars VA.
IMAGE_REL_ARM64_ADDR32NB
0x0002
Målets 32-bitars RVA.
IMAGE_REL_ARM64_BRANCH26
0x0003
26-bitars relativ förskjutning till målet, för B- och BL-instruktioner.
IMAGE_REL_ARM64_PAGEBASE_REL21
0x0004
Sidbasen för målet för ADRP-instruktion.
IMAGE_REL_ARM64_REL21
0x0005
Den 12-bitars relativa förskjutningen till målet för instruktions-ADR
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
12-bitarssidans förskjutning av målet för instruktioner ADD/ADDS (omedelbar) med noll skift.
IMAGE_REL_ARM64_PAGEOFFSET_12L
0x0007
12-bitarssidans förskjutning av målet för instruktions-LDR (indexerad, osignerad omedelbar).
IMAGE_REL_ARM64_SECREL
0x0008
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
Bit 0:11 i avsnittets förskjutning av målet, för instruktioner ADD/ADDS (omedelbar) med noll skift.
IMAGE_REL_ARM64_SECREL_HIGH12A
0x000A
Bit 12:23 i avsnittsförskjutning av målet, för instruktioner ADD/ADDS (omedelbar) med noll skift.
IMAGE_REL_ARM64_SECREL_LOW12L
0x000B
Bit 0:11 i avsnittsförskjutning av målet för instruktions-LDR (indexerad, osignerad omedelbar).
IMAGE_REL_ARM64_TOKEN
0x000C
CLR-token.
IMAGE_REL_ARM64_SECTION
0x000D
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_ARM64_ADDR64
0x000E
64-bitars VA för omlokaliseringsmålet.
IMAGE_REL_ARM64_BRANCH19
0x000F
19-bitarsförskjutningen till omlokaliseringsmålet för villkorsstyrd B-instruktion.
IMAGE_REL_ARM64_BRANCH14
0x0010
14-bitarsförskjutningen till omlokaliseringsmålet för instruktioner för TBZ och TBNZ.
IMAGE_REL_ARM64_REL32
0x0011
Den 32-bitars relativa adressen från bytet efter omlokaliseringen.
Hitachi SuperH-processorer

Följande indikatorer för omlokaliseringstyp definieras för SH3- och SH4-processorer. SH5-specifika omlokaliseringar anges som SHM (SH Media).

Konstant Värde Beskrivning
IMAGE_REL_SH3_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_SH3_DIRECT16
0x0001
En referens till den 16-bitars plats som innehåller VA för målsymbolen.
IMAGE_REL_SH3_DIRECT32
0x0002
Målsymbolens 32-bitars VA.
IMAGE_REL_SH3_DIRECT8
0x0003
En referens till den 8-bitars plats som innehåller VA för målsymbolen.
IMAGE_REL_SH3_DIRECT8_WORD
0x0004
En referens till 8-bitars instruktionen som innehåller målsymbolens effektiva 16-bitars VA.
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
En referens till 8-bitars instruktionen som innehåller målsymbolens effektiva 32-bitars VA.
IMAGE_REL_SH3_DIRECT4
0x0006
En referens till den 8-bitars plats vars låga 4 bitar innehåller VA för målsymbolen.
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
En referens till 8-bitars instruktionen vars låga 4 bitar innehåller målsymbolens effektiva 16-bitars VA.
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
En referens till 8-bitars instruktionen vars låga 4 bitar innehåller målsymbolens effektiva 32-bitars VA.
IMAGE_REL_SH3_PCREL8_WORD
0x0009
En referens till 8-bitars instruktionen som innehåller den effektiva 16-bitars relativa förskjutningen av målsymbolen.
IMAGE_REL_SH3_PCREL8_LONG
0x000A
En referens till 8-bitars instruktionen som innehåller den effektiva 32-bitars relativa förskjutningen av målsymbolen.
IMAGE_REL_SH3_PCREL12_WORD
0x000B
En referens till 16-bitars instruktionen vars låga 12 bitar innehåller den effektiva 16-bitars relativa förskjutningen av målsymbolen.
IMAGE_REL_SH3_STARTOF_SECTION
0x000C
En referens till en 32-bitars plats som är VA för avsnittet som innehåller målsymbolen.
IMAGE_REL_SH3_SIZEOF_SECTION
0x000D
En referens till den 32-bitars plats som är storleken på det avsnitt som innehåller målsymbolen.
IMAGE_REL_SH3_SECTION
0x000E
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_SH3_SECREL
0x000F
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
Målsymbolens 32-bitars RVA.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
GP-släkting.
IMAGE_REL_SH3_TOKEN
0x0012
CLR-token.
IMAGE_REL_SHM_PCRELPT
0x0013
Förskjutningen från den aktuella instruktionen i longwords. Om NOMODE-biten inte har angetts infogar du inversen av den låga biten vid bit 32 för att välja PTA eller PTB.
IMAGE_REL_SHM_REFLO
0x0014
De låga 16 bitarna av 32-bitarsadressen.
IMAGE_REL_SHM_REFHALF
0x0015
De höga 16 bitarna av 32-bitarsadressen.
IMAGE_REL_SHM_RELLO
0x0016
De låga 16 bitarna av den relativa adressen.
IMAGE_REL_SHM_RELHALF
0x0017
De höga 16 bitarna av den relativa adressen.
IMAGE_REL_SHM_PAIR
0x0018
Omlokaliseringen är endast giltig när den omedelbart följer en REFHALF-, RELHALF- eller RELLO-flytt. Fältet SymbolTableIndex i omlokaliseringen innehåller en förskjutning och inte ett index i symboltabellen.
IMAGE_REL_SHM_NOMODE
0x8000
Omlokaliseringen ignorerar avsnittsläget.

 

IBM PowerPC-processorer

Följande indikatorer för omlokaliseringstyp definieras för PowerPC-processorer.

Konstant Värde Beskrivning
IMAGE_REL_PPC_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_PPC_ADDR64
0x0001
Målets 64-bitars VA.
IMAGE_REL_PPC_ADDR32
0x0002
Målets 32-bitars VA.
IMAGE_REL_PPC_ADDR24
0x0003
De låga 24 bitarna av målets VA. Detta är endast giltigt när målsymbolen är absolut och kan signeras till det ursprungliga värdet.
IMAGE_REL_PPC_ADDR16
0x0004
De låga 16 bitarna av målets VA.
IMAGE_REL_PPC_ADDR14
0x0005
De låga 14 bitarna av målets VA. Detta är endast giltigt när målsymbolen är absolut och kan signeras till det ursprungliga värdet.
IMAGE_REL_PPC_REL24
0x0006
En 24-bitars PC-relativ förskjutning till symbolens plats.
IMAGE_REL_PPC_REL14
0x0007
En 14-bitars PC-relativ förskjutning till symbolens plats.
IMAGE_REL_PPC_ADDR32NB
0x000A
Målets 32-bitars RVA.
IMAGE_REL_PPC_SECREL
0x000B
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_PPC_SECTION
0x000C
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_PPC_SECREL16
0x000F
16-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_PPC_REFHI
0x0010
De höga 16 bitarna av målets 32-bitars VA. Detta används för den första instruktionen i en tvåinstruktionssekvens som läser in en fullständig adress. Den här omlokaliseringen måste omedelbart följas av en PAIR-flytt vars SymbolTableIndex innehåller en signerad 16-bitars förskjutning som läggs till i de övre 16 bitar som togs från den plats som flyttas.
IMAGE_REL_PPC_REFLO
0x0011
De låga 16 bitarna av målets VA.
IMAGE_REL_PPC_PAIR
0x0012
En flytt som endast är giltig när den omedelbart följer en REFHI- eller SECRELHI-flytt. Dess SymbolTableIndex innehåller en förskjutning och inte ett index i symboltabellen.
IMAGE_REL_PPC_SECRELLO
0x0013
De låga 16 bitarna av 32-bitars förskjutningen av målet från början av avsnittet.
IMAGE_REL_PPC_GPREL
0x0015
Den 16-bitars signerade förskjutningen av målet i förhållande till GP-registret.
IMAGE_REL_PPC_TOKEN
0x0016
CLR-token.

 

Intel 386-processorer

Följande indikatorer för omlokaliseringstyp definieras för Intel 386 och kompatibla processorer.

Konstant Värde Beskrivning
IMAGE_REL_I386_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_I386_DIR16
0x0001
Stöds inte.
IMAGE_REL_I386_REL16
0x0002
Stöds inte.
IMAGE_REL_I386_DIR32
0x0006
Målets 32-bitars VA.
IMAGE_REL_I386_DIR32NB
0x0007
Målets 32-bitars RVA.
IMAGE_REL_I386_SEG12
0x0009
Stöds inte.
IMAGE_REL_I386_SECTION
0x000A
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_I386_SECREL
0x000B
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_I386_TOKEN
0x000C
CLR-token.
IMAGE_REL_I386_SECREL7
0x000D
En 7-bitars förskjutning från basen av avsnittet som innehåller målet.
IMAGE_REL_I386_REL32
0x0014
32-bitars relativ förskjutning till målet. Detta stöder x86-relativ gren och samtalsinstruktioner.

 

Intel Itanium Processor Family (IPF)

Följande indikatorer för omlokaliseringstyp definieras för Intel Itanium-processorfamiljen och kompatibla processorer. Observera att flytt av instruktioner använder paketets förskjutnings- och facknummer för omlokaliseringsförskjutningen.

Konstant Värde Beskrivning
IMAGE_REL_IA64_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_IA64_IMM14
0x0001
Instruktionsflytten kan följas av en ADDEND-flytt vars värde läggs till i måladressen innan den infogas i det angivna facket i IMM14-paketet. Flyttmålet måste vara absolut eller så måste avbildningen vara fast.
IMAGE_REL_IA64_IMM22
0x0002
Instruktionsflytten kan följas av en ADDEND-flytt vars värde läggs till i måladressen innan den infogas i det angivna facket i IMM22-paketet. Flyttmålet måste vara absolut eller så måste avbildningen vara fast.
IMAGE_REL_IA64_IMM64
0x0003
Facknumret för den här omlokaliseringen måste vara ett (1). Omlokaliseringen kan följas av en ADDEND-flytt vars värde läggs till i måladressen innan den lagras på alla tre platserna i IMM64-paketet.
IMAGE_REL_IA64_DIR32
0x0004
Målets 32-bitars VA. Detta stöds endast för /LARGEADDRESSAWARE:NO-avbildningar.
IMAGE_REL_IA64_DIR64
0x0005
Målets 64-bitars VA.
IMAGE_REL_IA64_PCREL21B
0x0006
Instruktionen är fast med den 25-bitars relativa förskjutningen till det 16-bitars justerade målet. De låga 4 bitarna av förskjutningen är noll och lagras inte.
IMAGE_REL_IA64_PCREL21M
0x0007
Instruktionen är fast med den 25-bitars relativa förskjutningen till det 16-bitars justerade målet. De låga 4 bitarna av förskjutningen, som är noll, lagras inte.
IMAGE_REL_IA64_PCREL21F
0x0008
LSB:erna för den här flyttens förskjutning måste innehålla facknumret medan resten är paketadressen. Paketet är fast med den 25-bitars relativa förskjutningen till det 16-bitars justerade målet. De låga 4 bitarna av förskjutningen är noll och lagras inte.
IMAGE_REL_IA64_GPREL22
0x0009
Instruktionsflytten kan följas av en ADDEND-flytt vars värde läggs till i måladressen och sedan en 22-bitars GP-relativ förskjutning som beräknas och tillämpas på GPREL22-paketet.
IMAGE_REL_IA64_LTOFF22
0x000A
Instruktionen korrigeras med den 22-bitars GP-relativa förskjutningen till målsymbolens literaltabellpost. Länkaren skapar den här literaltabellposten baserat på den här omlokaliseringen och den ADDEND-omlokalisering som kan följa.
IMAGE_REL_IA64_SECTION
0x000B
Avsnittets 16-bitars avsnittsindex innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_IA64_SECREL22
0x000C
Instruktionen har åtgärdats med 22-bitars förskjutningen av målet från början av avsnittet. Den här omlokaliseringen kan omedelbart följas av en ADDEND-omlokalisering, vars värdefält innehåller den 32-bitars osignerade förskjutningen av målet från början av avsnittet.
IMAGE_REL_IA64_SECREL64I
0x000D
Facknumret för den här omlokaliseringen måste vara ett (1). Instruktionen har åtgärdats med 64-bitars förskjutningen av målet från början av avsnittet. Den här omlokaliseringen kan omedelbart följas av en ADDEND-flytt vars värdefält innehåller den 32-bitars osignerade förskjutningen av målet från början av avsnittet.
IMAGE_REL_IA64_SECREL32
0x000E
Adressen för data som ska åtgärdas med 32-bitars förskjutningen av målet från början av avsnittet.
IMAGE_REL_IA64_DIR32NB
0x0010
Målets 32-bitars RVA.
IMAGE_REL_IA64_SREL14
0x0011
Detta tillämpas på en signerad 14-bitars omedelbart som innehåller skillnaden mellan två flyttbara mål. Det här är ett deklarativt fält för länkaren som anger att kompilatorn redan har genererat det här värdet.
IMAGE_REL_IA64_SREL22
0x0012
Detta tillämpas på en signerad 22-bitars omedelbart som innehåller skillnaden mellan två flyttbara mål. Det här är ett deklarativt fält för länkaren som anger att kompilatorn redan har genererat det här värdet.
IMAGE_REL_IA64_SREL32
0x0013
Detta tillämpas på en signerad 32-bitars omedelbart som innehåller skillnaden mellan två flyttbara värden. Det här är ett deklarativt fält för länkaren som anger att kompilatorn redan har genererat det här värdet.
IMAGE_REL_IA64_UREL32
0x0014
Detta tillämpas på en osignerad 32-bitars omedelbart som innehåller skillnaden mellan två flyttbara värden. Det här är ett deklarativt fält för länkaren som anger att kompilatorn redan har genererat det här värdet.
IMAGE_REL_IA64_PCREL60X
0x0015
En 60-bitars PC-relativ korrigering som alltid förblir som en BRL-instruktion i ett MLX-paket.
IMAGE_REL_IA64_PCREL60B
0x0016
En 60-bitars PC-relativ korrigering. Om målförskjutningen passar i ett signerat 25-bitarsfält konverterar du hela paketet till ett MBB-paket med NOP. B i fack 1 och en 25-bitars BR-instruktion (med de 4 lägsta bitarna alla noll och tappade) i fack 2.
IMAGE_REL_IA64_PCREL60F
0x0017
En 60-bitars PC-relativ korrigering. Om målförskjutningen passar i ett signerat 25-bitarsfält konverterar du hela paketet till ett MFB-paket med NOP. F i fack 1 och en 25-bitars (4 lägsta bitar alla noll och tappade) BR instruktion i fack 2.
IMAGE_REL_IA64_PCREL60I
0x0018
En 60-bitars PC-relativ korrigering. Om målförskjutningen passar i ett signerat 25-bitarsfält konverterar du hela paketet till ett MIB-paket med NOP. Jag i fack 1 och en 25-bitars (4 lägsta bitar alla noll och tappade) BR instruktion i fack 2.
IMAGE_REL_IA64_PCREL60M
0x0019
En 60-bitars PC-relativ korrigering. Om målförskjutningen passar i ett signerat 25-bitarsfält konverterar du hela paketet till ett MMB-paket med NOP. M i fack 1 och en 25-bitars (4 lägsta bitar alla noll och tappade) BR instruktion i fack 2.
IMAGE_REL_IA64_IMMGPREL64
0x001a
En 64-bitars GP-relativ korrigering.
IMAGE_REL_IA64_TOKEN
0x001b
En CLR-token.
IMAGE_REL_IA64_GPREL32
0x001c
En 32-bitars GP-relativ korrigering.
IMAGE_REL_IA64_ADDEND
0x001F
Omlokaliseringen är endast giltig när den omedelbart följer någon av följande omlokaliseringar: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I eller SECREL32. Dess värde innehåller tillägget som ska tillämpas på instruktioner i ett paket, inte för data.

 

MIPS-processorer

Följande indikatorer för omlokaliseringstyp definieras för MIPS-processorer.

Konstant Värde Beskrivning
IMAGE_REL_MIPS_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_MIPS_REFHALF
0x0001
De höga 16 bitarna av målets 32-bitars VA.
IMAGE_REL_MIPS_REFWORD
0x0002
Målets 32-bitars VA.
IMAGE_REL_MIPS_JMPADDR
0x0003
De låga 26 bitarna av målets VA. Detta stöder MIPS J- och JAL-instruktionerna.
IMAGE_REL_MIPS_REFHI
0x0004
De höga 16 bitarna av målets 32-bitars VA. Detta används för den första instruktionen i en tvåinstruktionssekvens som läser in en fullständig adress. Den här omlokaliseringen måste omedelbart följas av en PAIR-flytt vars SymbolTableIndex innehåller en signerad 16-bitars förskjutning som läggs till i de övre 16 bitar som tas från den plats som flyttas.
IMAGE_REL_MIPS_REFLO
0x0005
De låga 16 bitarna av målets VA.
IMAGE_REL_MIPS_GPREL
0x0006
En 16-bitars signerad förskjutning av målet i förhållande till GP-registret.
IMAGE_REL_MIPS_LITERAL
0x0007
Samma som IMAGE_REL_MIPS_GPREL.
IMAGE_REL_MIPS_SECTION
0x000A
Avsnittets 16-bitars avsnittsindex innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_MIPS_SECREL
0x000B
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_MIPS_SECRELLO
0x000C
De låga 16 bitarna av 32-bitars förskjutningen av målet från början av avsnittet.
IMAGE_REL_MIPS_SECRELHI
0x000D
De höga 16 bitarna av 32-bitars förskjutningen av målet från början av avsnittet. En IMAGE_REL_MIPS_PAIR omlokalisering måste omedelbart följa den här. SymbolTableIndex för PAIR-flyttningen innehåller en signerad 16-bitars förskjutning som läggs till i de övre 16 bitarna som tas från den plats som flyttas.
IMAGE_REL_MIPS_JMPADDR16
0x0010
De låga 26 bitarna av målets VA. Detta stöder MIPS16 JAL-instruktionen.
IMAGE_REL_MIPS_REFWORDNB
0x0022
Målets 32-bitars RVA.
IMAGE_REL_MIPS_PAIR
0x0025
Omlokaliseringen är endast giltig när den omedelbart följer en REFHI- eller SECRELHI-flytt. Dess SymbolTableIndex innehåller en förskjutning och inte ett index i symboltabellen.

 

Mitsubishi M32R

Följande indikatorer för omlokaliseringstyp definieras för Mitsubishi M32R-processorer.

Konstant Värde Beskrivning
IMAGE_REL_M32R_ABSOLUTE
0x0000
Omlokaliseringen ignoreras.
IMAGE_REL_M32R_ADDR32
0x0001
Målets 32-bitars VA.
IMAGE_REL_M32R_ADDR32NB
0x0002
Målets 32-bitars RVA.
IMAGE_REL_M32R_ADDR24
0x0003
Målets 24-bitars VA.
IMAGE_REL_M32R_GPREL16
0x0004
Målets 16-bitars förskjutning från GP-registret.
IMAGE_REL_M32R_PCREL24
0x0005
Målets 24-bitars förskjutning från programräknaren (PC), skiftade åt vänster med 2 bitar och sign-extended
IMAGE_REL_M32R_PCREL16
0x0006
Målets 16-bitars förskjutning från datorn, skiftade åt vänster med 2 bitar och sign-extended
IMAGE_REL_M32R_PCREL8
0x0007
Målets 8-bitars förskjutning från datorn, skiftade åt vänster med 2 bitar och sign-extended
IMAGE_REL_M32R_REFHALF
0x0008
Mål-VA:ets 16 MSB.
IMAGE_REL_M32R_REFHI
0x0009
Mål-VA:ets 16 MSB, justerade för LSB-teckentillägget. Detta används för den första instruktionen i en tvåinstruktionssekvens som läser in en fullständig 32-bitars adress. Den här omlokaliseringen måste omedelbart följas av en PAIR-flytt vars SymbolTableIndex innehåller en signerad 16-bitars förskjutning som läggs till i de övre 16 bitar som tas från den plats som flyttas.
IMAGE_REL_M32R_REFLO
0x000A
Mål-VA:ets 16 LSB.
IMAGE_REL_M32R_PAIR
0x000B
Omlokaliseringen måste följa REFHI-omlokaliseringen. Dess SymbolTableIndex innehåller en förskjutning och inte ett index i symboltabellen.
IMAGE_REL_M32R_SECTION
0x000C
16-bitarsavsnittsindexet för avsnittet som innehåller målet. Detta används för att stödja felsökningsinformation.
IMAGE_REL_M32R_SECREL
0x000D
32-bitars förskjutningen av målet från början av avsnittet. Detta används för felsökning av information och lokal statisk trådlagring.
IMAGE_REL_M32R_TOKEN
0x000E
CLR-token.

 

COFF-radnummer (inaktuella)

COFF-radnummer produceras inte längre och kommer i framtiden inte att förbrukas.

COFF-radnummer anger relationen mellan kod och radnummer i källfiler. Microsoft-formatet för COFF-radnummer liknar standard-COFF, men det har utökats så att ett enda avsnitt kan relatera till radnummer i flera källfiler.

COFF-radnummer består av en matris med poster med fast längd. Platsen (filförskjutning) och storleken på matrisen anges i avsnittsrubriken. Varje radnummerpost har följande format.

Uppväga Storlek Fält Beskrivning
0
4
Typ (*)
Det här är en union med två fält: SymbolTableIndex och VirtualAddress. Om SymbolTableIndex eller RVA används beror på värdet för Linenumber.
4
2
Radnummer
När det inte är noll anger det här fältet ett enbaserat radnummer. När noll tolkas fältet Typ som ett symboltabellindex för en funktion.

 

Fältet Typ är en union av två fält med 4 byte: SymbolTableIndex och VirtualAddress.

Uppväga Storlek Fält Beskrivning
0
4
SymbolTableIndex
Används när Linenumber är noll: index till symboltabellpost för en funktion. Det här formatet används för att ange den funktion som en grupp med radnummerposter refererar till.
0
4
VirtualAddress
Används när Linenumber inte är noll: RVA för den körbara kod som motsvarar den angivna källraden. I en objektfil innehåller detta VA i avsnittet .

 

En radnummerpost kan antingen ange fältet Radnummer till noll och peka på en funktionsdefinition i symboltabellen eller fungera som en standardpost för radnummer genom att ge ett positivt heltal (radnummer) och motsvarande adress i objektkoden.

En grupp med radnummerposter börjar alltid med det första formatet: indexet för en funktionssymbol. Om det här är den första radnummerposten i avsnittet är det även COMDAT-symbolnamnet för funktionen om avsnittets COMDAT-flagga har angetts. Se COMDAT-avsnitt (endast objekt). Funktionens extra post i symboltabellen har en pekare till fältet Linenumber som pekar på samma radnummerpost.

En post som identifierar en funktion följs av valfritt antal radnummerposter som ger faktisk radnummerinformation (det vill: poster med radnummer större än noll). Dessa poster är enbaserade, i förhållande till början av funktionen, och representerar varje källrad i funktionen förutom den första raden.

Till exempel skulle den första radnummerposten i följande exempel ange funktionen ReverseSign (SymbolTableIndex för ReverseSign och Linenumber inställt på noll). Sedan skulle poster med linenumbervärdena 1, 2 och 3 följa, vilket motsvarar källrader enligt följande:

// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2:  return -1 * i;
3: }

COFF-symboltabell

Symboltabellen i det här avsnittet ärvs från det traditionella COFF-formatet. Det skiljer sig från felsökningsinformation för Microsoft Visual C++. En fil kan innehålla både en COFF-symboltabell och felsökningsinformation för Visual C++ och de två hålls åtskilda. Vissa Microsoft-verktyg använder symboltabellen för begränsade men viktiga syften, till exempel kommunikation av COMDAT-information till länkaren. Avsnittsnamn och filnamn samt kod- och datasymboler visas i symboltabellen.

Platsen för symboltabellen anges i COFF-huvudet.

Symboltabellen är en matris med poster, var och en 18 byte lång. Varje post är antingen en standardpost eller en extra symboltabellpost. En standardpost definierar en symbol eller ett namn och har följande format.

Uppväga Storlek Fält Beskrivning
0
8
Namn (*)
Symbolens namn, representerat av en union med tre strukturer. En matris med 8 byte används om namnet inte är längre än 8 byte. Mer information finns i symbolnamnsrepresentation.
8
4
Värde
Värdet som är associerat med symbolen. Tolkningen av det här fältet beror på SectionNumber och StorageClass. En typisk betydelse är den flyttbara adressen.
12
2
SectionNumber
Det signerade heltal som identifierar avsnittet med hjälp av ett enbaserat index i avsnittstabellen. Vissa värden har särskild betydelse, enligt definitionen i avsnitt 5.4.2, "Avsnittsnummervärden".
14
2
Typ
Ett tal som representerar typ. Microsoft-verktyg anger det här fältet till 0x20 (funktion) eller 0x0 (inte en funktion). Mer information finns i Typrepresentation.
16
1
StorageClass
Ett uppräknat värde som representerar lagringsklassen. Mer information finns i Storage Class.
17
1
NumberOfAuxSymbols
Antalet poster i extra symboltabellen som följer den här posten.

 

Noll eller fler extra symboltabellposter följer omedelbart varje standardpost i symboltabellen. Men vanligtvis följer inte mer än en extra symboltabellpost en standardpost i symboltabellen (förutom .file-poster med långa filnamn). Varje extra post har samma storlek som en standardpost i symboltabellen (18 byte), men i stället för att definiera en ny symbol ger extraposten ytterligare information om den sista symbolen som definierats. Vilket av flera format som ska användas beror på fältet StorageClass. För närvarande visas definierade format för extra symboltabellposter i avsnitt 5.5, "Extra symbolposter".

Verktyg som läser COFF-symboltabeller måste ignorera extra symbolposter vars tolkning är okänd. Detta gör att symboltabellformatet kan utökas för att lägga till nya extra poster, utan att bryta befintliga verktyg.

Symbolnamnsrepresentation

Fältet ShortName i en symboltabell består av 8 byte som innehåller själva namnet, om det inte är längre än 8 byte eller om fältet ShortName ger en förskjutning i strängtabellen. För att avgöra om själva namnet eller en förskjutning anges testar du de första 4 byteen för likhet till noll.

Enligt konventionen behandlas namnen som nollslutna UTF-8-kodade strängar.

Uppväga Storlek Fält Beskrivning
0
8
ShortName
En matris med 8 byte. Den här matrisen är vadderad med null till höger om namnet är mindre än 8 byte långt.
0
4
Nollor
Ett fält som är inställt på alla nollor om namnet är längre än 8 byte.
4
4
Uppväga
En förskjutning i strängtabellen.

 

Avsnittsnummervärden

Normalt är fältet Avsnittsvärde i en symboltabellpost ett enbaserat index i avsnittstabellen. Det här fältet är dock ett signerat heltal och kan ta negativa värden. Följande värden, mindre än ett, har särskilda betydelser.

Konstant Värde Beskrivning
IMAGE_SYM_UNDEFINED
0
Symbolposten har ännu inte tilldelats något avsnitt. Värdet noll anger att en referens till en extern symbol definieras någon annanstans. Ett värde som inte är noll är en vanlig symbol med en storlek som anges av värdet.
IMAGE_SYM_ABSOLUTE
-1
Symbolen har ett absolut (icke-flyttbart) värde och är inte en adress.
IMAGE_SYM_DEBUG
-2
Symbolen innehåller allmän typ eller felsökningsinformation men motsvarar inte ett avsnitt. Microsoft-verktyg använder den här inställningen tillsammans med .file-poster (FIL för lagringsklass).

 

Typrepresentation

Fältet Typ för en symboltabellpost innehåller 2 byte, där varje byte representerar typinformation. LSB representerar den enkla datatypen (bas) och MSB representerar den komplexa typen, om någon:

MSB LSB
Komplex typ: ingen, pekare, funktion, matris.
Bastyp: heltal, flyttal och så vidare.

 

Följande värden definieras för bastyp, även om Microsoft-verktyg vanligtvis inte använder det här fältet och anger LSB till 0. I stället används felsökningsinformation för Visual C++ för att ange typer. De möjliga COFF-värdena visas dock här för fullständighet.

Konstant Värde Beskrivning
IMAGE_SYM_TYPE_NULL
0
Ingen typinformation eller okänd bastyp. Microsoft-verktyg använder den här inställningen
IMAGE_SYM_TYPE_VOID
1
Ingen giltig typ. används med tomrumspekare och funktioner
IMAGE_SYM_TYPE_CHAR
2
Ett tecken (signerad byte)
IMAGE_SYM_TYPE_SHORT
3
Ett 2 byte signerat heltal
IMAGE_SYM_TYPE_INT
4
En naturlig heltalstyp (normalt 4 byte i Windows)
IMAGE_SYM_TYPE_LONG
5
Ett 4 byte signerat heltal
IMAGE_SYM_TYPE_FLOAT
6
Ett 4 bytes flyttalsnummer
IMAGE_SYM_TYPE_DOUBLE
7
Ett flyttalsnummer på 8 byte
IMAGE_SYM_TYPE_STRUCT
8
En struktur
IMAGE_SYM_TYPE_UNION
9
En union
IMAGE_SYM_TYPE_ENUM
10
En uppräkningstyp
IMAGE_SYM_TYPE_MOE
11
En medlem av uppräkning (ett specifikt värde)
IMAGE_SYM_TYPE_BYTE
12
En byte; osignerat heltal på 1 byte
IMAGE_SYM_TYPE_WORD
13
Ett ord; osignerat heltal med 2 byte
IMAGE_SYM_TYPE_UINT
14
Ett osignerat heltal av naturlig storlek (normalt 4 byte)
IMAGE_SYM_TYPE_DWORD
15
Ett osignerat heltal på 4 byte

 

Den viktigaste byte anger om symbolen är en pekare till, funktionsretur eller matris av bastypen som anges i LSB. Microsoft-verktyg använder endast det här fältet för att ange om symbolen är en funktion, så att de enda två resulterande värdena är 0x0 och 0x20 för fältet Typ. Andra verktyg kan dock använda det här fältet för att förmedla mer information.

Det är mycket viktigt att ange funktionsattributet korrekt. Den här informationen krävs för att inkrementell länkning ska fungera korrekt. För vissa arkitekturer kan informationen krävas för andra ändamål.

Konstant Värde Beskrivning
IMAGE_SYM_DTYPE_NULL
0
Ingen härledd typ. symbolen är en enkel skalär variabel.
IMAGE_SYM_DTYPE_POINTER
1
Symbolen är en pekare till bastyp.
IMAGE_SYM_DTYPE_FUNCTION
2
Symbolen är en funktion som returnerar en bastyp.
IMAGE_SYM_DTYPE_ARRAY
3
Symbolen är en matris av bastyp.

 

Lagringsklass

Fältet StorageClass i symboltabellen anger vilken typ av definition en symbol representerar. I följande tabell visas möjliga värden. Observera att fältet StorageClass är ett osignerat heltal på 1 byte. Det särskilda värdet -1 bör därför anses innebära dess osignerade motsvarighet, 0xFF.

Även om det traditionella COFF-formatet använder många lagringsklassvärden förlitar sig Microsoft-verktyg på Visual C++-felsökningsformat för mest symbolisk information och använder vanligtvis endast fyra lagringsklassvärden: EXTERNAL (2), STATIC (3), FUNCTION (101) och FILE (103). Förutom i den andra kolumnrubriken nedan ska "Värde" anses betyda fältet Värde för symbolposten (vars tolkning beror på det tal som hittas som lagringsklass).

Konstant Värde Beskrivning/tolkning av fältet Värde
IMAGE_SYM_CLASS_END_OF_FUNCTION
-1 (0xFF)
En särskild symbol som representerar slutet av funktionen för felsökning.
IMAGE_SYM_CLASS_NULL
0
Ingen tilldelad lagringsklass.
IMAGE_SYM_CLASS_AUTOMATIC
1
Variabeln automatisk (stack). Fältet Värde anger stackramens förskjutning.
IMAGE_SYM_CLASS_EXTERNAL
2
Ett värde som Microsoft-verktyg använder för externa symboler. Fältet Värde anger storleken om avsnittsnumret är IMAGE_SYM_UNDEFINED (0). Om avsnittsnumret inte är noll anger fältet Värde förskjutningen i avsnittet.
IMAGE_SYM_CLASS_STATIC
3
Symbolens förskjutning i avsnittet. Om fältet Värde är noll representerar symbolen ett avsnittsnamn.
IMAGE_SYM_CLASS_REGISTER
4
En registervariabel. Fältet Värde anger registernumret.
IMAGE_SYM_CLASS_EXTERNAL_DEF
5
En symbol som definieras externt.
IMAGE_SYM_CLASS_LABEL
6
En kodetikett som definieras i modulen. Fältet Värde anger symbolens förskjutning i avsnittet.
IMAGE_SYM_CLASS_UNDEFINED_LABEL
7
En referens till en kodetikett som inte har definierats.
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
8
Strukturmedlemmen. Fältet Värde anger den n:e medlemmen.
IMAGE_SYM_CLASS_ARGUMENT
9
Ett formellt argument (parameter) för en funktion. Fältet Värde anger det n:e argumentet.
IMAGE_SYM_CLASS_STRUCT_TAG
10
Posten för taggnamn för struktur.
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11
En fackföreningsmedlem. Fältet Värde anger den n:e medlemmen.
IMAGE_SYM_CLASS_UNION_TAG
12
Posten Union tag-name.
IMAGE_SYM_CLASS_TYPE_DEFINITION
13
En Typedef-post.
IMAGE_SYM_CLASS_UNDEFINED_STATIC
14
En statisk datadeklaration.
IMAGE_SYM_CLASS_ENUM_TAG
15
En taggnamnspost av uppräknad typ.
IMAGE_SYM_CLASS_MEMBER_OF_ENUM
16
En medlem i en uppräkning. Fältet Värde anger den n:e medlemmen.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
En registerparameter.
IMAGE_SYM_CLASS_BIT_FIELD
18
En bitfältsreferens. Fältet Värde anger den n:e biten i bitfältet.
IMAGE_SYM_CLASS_BLOCK
100
En .bb-post (början av blocket) eller .eb (slutet av blocket). Fältet Värde är den flyttbara adressen för kodplatsen.
IMAGE_SYM_CLASS_FUNCTION
101
Ett värde som Microsoft-verktyg använder för symbolposter som definierar omfattningen av en funktion: begin function (.bf ), end function ( .ef ) och rader i funktionen ( .lf ). För .lf-poster ger fältet Värde antalet källrader i funktionen. För .ef-poster ger fältet Värde storleken på funktionskoden.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
En post i slutet av strukturen.
IMAGE_SYM_CLASS_FILE
103
Ett värde som Microsoft-verktyg, samt traditionellt COFF-format, använder för källfilssymbolposten. Symbolen följs av extra poster som namnger filen.
IMAGE_SYM_CLASS_SECTION
104
En definition av ett avsnitt (Microsoft-verktyg använder static storage-klassen i stället).
IMAGE_SYM_CLASS_WEAK_EXTERNAL
105
En svag extern. Mer information finns i Extra format 3: Svaga externa.
IMAGE_SYM_CLASS_CLR_TOKEN
107
En CLR-tokensymbol. Namnet är en ASCII-sträng som består av det hexadecimala värdet för token. Mer information finns i CLR-tokendefinition (endast objekt).

 

Extra symbolposter

Poster i extra symboltabeller följer och gäller alltid för en standardtabellpost. En extra post kan ha valfritt format som verktygen kan känna igen, men 18 byte måste allokeras för dem så att symboltabellen bibehålls som en matris med normal storlek. För närvarande känner Microsoft-verktyg igen extra format för följande typer av poster: funktionsdefinitioner, funktions-start- och slutsymboler (.bf och .ef), svaga externa objekt, filnamn och avsnittsdefinitioner.

Den traditionella COFF-designen innehåller även extra postformat för matriser och strukturer. Microsoft-verktyg använder inte dessa, utan placerar i stället den symboliska informationen i Visual C++-felsökningsformatet i felsökningsavsnitten.

Extraformat 1: Funktionsdefinitioner

En symboltabellpost markerar början av en funktionsdefinition om den innehåller följande: en lagringsklass av EXTERNAL (2), ett typvärde som anger att det är en funktion (0x20) och ett avsnittsnummer som är större än noll. Observera att en symboltabellpost som har ett avsnittsnummer undefined (0) inte definierar funktionen och inte har någon extra post. Funktionsdefinitionssymbolposter följs av en extra post i det format som beskrivs nedan:

Uppväga Storlek Fält Beskrivning
0
4
TagIndex
Symboltabellindexet för motsvarande symbolpost .bf (begin function).
4
4
Totalsize
Storleken på den körbara koden för själva funktionen. Om funktionen finns i ett eget avsnitt är SizeOfRawData i avsnittsrubriken större eller lika med det här fältet, beroende på justeringsöverväganden.
8
4
PointerToLinenumber
Filförskjutningen för den första COFF-radnummerposten för funktionen eller noll om ingen finns. Mer information finns i COFF-radnummer (inaktuella).
12
4
PointerToNextFunction
Symboltabellindexet för posten för nästa funktion. Om funktionen är den sista i symboltabellen är det här fältet inställt på noll.
16
2
Oanvänd

 

Extraformat 2: .bf- och .ef-symboler

För varje funktionsdefinition i symboltabellen beskriver tre objekt början, slutet och antalet rader. Var och en av dessa symboler har lagringsklassen FUNCTION (101):

En symbolpost med namnet .bf (begin function). Fältet Värde används inte.

En symbolpost med namnet .lf (rader i funktionen). Fältet Värde ger antalet rader i funktionen.

En symbolpost med namnet .ef (funktionsslut). Fältet Värde har samma tal som fältet Total storlek i funktionsdefinitionssymbolposten.

Symbolposterna .bf och .ef (men inte .lf-poster) följs av en extra post med följande format:

Uppväga Storlek Fält Beskrivning
0
4
Oanvänd
4
2
Radnummer
Det faktiska ordningstalsradsnumret (1, 2, 3 och så vidare) i källfilen, som motsvarar posten .bf eller .ef.
6
6
Oanvänd
12
4
PointerToNextFunction ( endast .bf)
Symboltabellindexet för nästa .bf-symbolpost. Om funktionen är den sista i symboltabellen är det här fältet inställt på noll. Den används inte för .ef-poster.
16
2
Oanvänd

 

Extra format 3: Svaga externa

"Svaga externa objekt" är en mekanism för objektfiler som ger flexibilitet vid länktid. En modul kan innehålla en olöst extern symbol (sym1), men den kan också innehålla en extra post som anger att om sym1 inte finns vid länktid används en annan extern symbol (sym2) för att matcha referenser i stället.

Om en definition av sym1 är länkad matchas en extern referens till symbolen normalt. Om en definition av sym1 inte är länkad refererar alla referenser till den svaga externa för sym1 till sym2 i stället. Den externa symbolen, sym2, måste alltid vara länkad. vanligtvis definieras den i modulen som innehåller den svaga referensen till sym1.

Svaga externa objekt representeras av en symboltabellpost med extern lagringsklass, UNDEF-avsnittsnummer och ett värde på noll. Den svaga externa symbolposten följs av en extra post med följande format:

Uppväga Storlek Fält Beskrivning
0
4
TagIndex
Symboltabellindexet för sym2, symbolen som ska länkas om sym1 inte hittas.
4
4
Karakteristika
Värdet IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY anger att ingen bibliotekssökning efter sym1 ska utföras.
Värdet IMAGE_WEAK_EXTERN_SEARCH_LIBRARY anger att en bibliotekssökning efter sym1 ska utföras.
Värdet IMAGE_WEAK_EXTERN_SEARCH_ALIAS anger att sym1 är ett alias för sym2.
8
10
Oanvänd

 

Observera att fältet Egenskaper inte har definierats i WINNT. H; i stället används fältet Total storlek.

Extraformat 4: Filer

Det här formatet följer en symboltabellpost med lagringsklassen FILE (103). Själva symbolnamnet ska vara .file och den extra post som följer den ger namnet på en källkodsfil.

Uppväga Storlek Fält Beskrivning
0
18
Filnamn
En ANSI-sträng som ger namnet på källfilen. Detta är vadderat med null om det är mindre än den maximala längden.

 

Extraformat 5: Avsnittsdefinitioner

Det här formatet följer en symboltabellpost som definierar ett avsnitt. En sådan post har ett symbolnamn som är namnet på ett avsnitt (till exempel .text eller .drectve) och har lagringsklassen STATIC (3). Extraposten innehåller information om det avsnitt som den refererar till. Därför duplicerar den en del av informationen i avsnittsrubriken.

Uppväga Storlek Fält Beskrivning
0
4
Längd
Storleken på avsnittsdata; samma som SizeOfRawData i avsnittsrubriken.
4
2
NumberOfRelocations
Antalet flyttposter för avsnittet.
6
2
NumberOfLinenumbers
Antalet radnummerposter för avsnittet.
8
4
Kontrollsumma
Kontrollsumman för gemensamma data. Det är tillämpligt om flaggan IMAGE_SCN_LNK_COMDAT anges i avsnittsrubriken. Mer information finns i COMDAT-avsnitt (endast objekt).
12
2
Nummer
Ett baserat index i avsnittstabellen för det associerade avsnittet. Detta används när COMDAT-markeringsinställningen är 5.
14
1
Urval
COMDAT-markeringsnumret. Detta gäller om avsnittet är ett COMDAT-avsnitt.
15
3
Oanvänd

 

COMDAT-avsnitt (endast objekt)

Fältet Urval i avsnittet definition extraformat är tillämpligt om avsnittet är ett COMDAT-avsnitt. Ett COMDAT-avsnitt är ett avsnitt som kan definieras av mer än en objektfil. (Flaggan IMAGE_SCN_LNK_COMDAT anges i fältet Avsnittsflaggor i avsnittsrubriken.) Fältet Urval avgör hur länkaren löser flera definitioner av COMDAT-avsnitt.

Den första symbolen som har avsnittsvärdet för COMDAT-avsnittet måste vara avsnittssymbolen. Den här symbolen har namnet på avsnittet, fältet Värde lika med noll, avsnittsnumret för COMDAT-avsnittet i fråga, fältet Typ lika med IMAGE_SYM_TYPE_NULL, fältet Klass lika med IMAGE_SYM_CLASS_STATIC och en extra post. Den andra symbolen kallas "COMDAT-symbolen" och används av länkaren tillsammans med fältet Markering.

Värdena för fältet Markering visas nedan.

Konstant Värde Beskrivning
IMAGE_COMDAT_SELECT_NODUPLICATES
1
Om den här symbolen redan har definierats utfärdar länkaren felet "multiplicerad definierad symbol".
IMAGE_COMDAT_SELECT_ANY
2
Alla avsnitt som definierar samma COMDAT-symbol kan länkas. resten tas bort.
IMAGE_COMDAT_SELECT_SAME_SIZE
3
Länkaren väljer ett godtyckligt avsnitt bland definitionerna för den här symbolen. Om alla definitioner inte har samma storlek utfärdas ett "multiplicerat definierat symbolfel".
IMAGE_COMDAT_SELECT_EXACT_MATCH
4
Länkaren väljer ett godtyckligt avsnitt bland definitionerna för den här symbolen. Om alla definitioner inte matchar exakt utfärdas ett "multiplicerat definierat symbolfel".
IMAGE_COMDAT_SELECT_ASSOCIATIVE
5
Avsnittet är länkat om ett visst annat COMDAT-avsnitt är länkat. Det andra avsnittet anges av fältet Nummer i extra symbolposten för avsnittsdefinitionen. Den här inställningen är användbar för definitioner som har komponenter i flera avsnitt (till exempel kod i en och data i en annan), men där alla måste länkas eller ignoreras som en uppsättning. Det andra avsnittet som det här avsnittet är associerat med måste vara ett COMDAT-avsnitt, som kan vara ett annat associativt COMDAT-avsnitt. En associativ COMDAT-sektions avsnittsassociationkedja kan inte bilda en loop. Avsnittsassociationskedjan måste så småningom komma till ett COMDAT-avsnitt som inte har IMAGE_COMDAT_SELECT_ASSOCIATIVE angivet.
IMAGE_COMDAT_SELECT_LARGEST
6
Länkaren väljer den största definitionen bland alla definitioner för den här symbolen. Om flera definitioner har den här storleken är valet mellan dem godtyckligt.

 

CLR-tokendefinition (endast objekt)

Denna extra symbol följer vanligtvis IMAGE_SYM_CLASS_CLR_TOKEN. Den används för att associera en token med COFF-symboltabellens namnområde.

Uppväga Storlek Fält Beskrivning
0
1
bAuxType
Måste vara IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1).
1
1
bReserved
Reserverad, måste vara noll.
2
4
SymbolTableIndex
Symbolindexet för COFF-symbolen som den här CLR-tokendefinitionen refererar till.
6
12
Reserverad, måste vara noll.

 

COFF-strängtabell

Omedelbart efter COFF-symboltabellen är COFF-strängtabellen. Tabellens position hittas genom att ta symboltabelladressen i COFF-huvudet och lägga till antalet symboler multiplicerat med storleken på en symbol.

I början av COFF-strängtabellen finns 4 byte som innehåller den totala storleken (i byte) för resten av strängtabellen. Den här storleken inkluderar själva storleksfältet, så att värdet på den här platsen skulle vara 4 om inga strängar fanns.

Följande storlek är null-avslutade strängar som pekas på av symboler i COFF-symboltabellen.

Attributcertifikattabellen (endast bild)

Attributcertifikat kan associeras med en bild genom att lägga till en attributcertifikattabell. Attributcertifikattabellen består av en uppsättning sammanhängande, fyrordsjusterade attributcertifikatposter. Noll utfyllnad infogas mellan den ursprungliga änden av filen och början av attributcertifikattabellen för att uppnå den här justeringen. Varje attributcertifikatpost innehåller följande fält.

Uppväga Storlek Fält Beskrivning
0
4
dwLength
Anger längden på attributcertifikatposten.
4
2
wRevision
Innehåller certifikatets versionsnummer. Mer information finns i följande text.
6
2
wCertificateType
Anger typ av innehåll i bCertificate. Mer information finns i följande text.
8
Se följande
bCertificate
Innehåller ett certifikat, till exempel en Authenticode-signatur. Mer information finns i följande text.

 

Det virtuella adressvärdet från posten Certifikattabell i den valfria huvuddatakatalogen är en filförskjutning till den första attributcertifikatposten. Efterföljande poster nås genom att flytta postens dwLength-byte, avrundade upp till en 8-bytes multipel, från början av den aktuella attributcertifikatposten. Detta fortsätter tills summan av de avrundade dwLength-värdena är lika med storleksvärdet från posten Certifikattabell i den valfria huvuddatakatalogen. Om summan av de avrundade dwLength-värdena inte är lika med värdet Storlek skadas antingen attributcertifikattabellen eller fältet Storlek.

Om till exempel den valfria huvuddatakatalogens certifikattabellpost innehåller:

virtual address = 0x5000
size = 0x1000

Det första certifikatet börjar vid förskjutning 0x5000 från början av filen på disken. Så här går du vidare med alla attributcertifikatposter:

  1. Lägg till det första attributcertifikatets dwLength-värde i startförskjutningen.
  2. Avrunda värdet från steg 1 upp till närmaste 8 byte-multipel för att hitta förskjutningen av den andra attributcertifikatposten.
  3. Lägg till förskjutningsvärdet från steg 2 till den andra attributcertifikatpostens dwLength-värde och avrunda upp till närmaste 8 byte-multipel för att fastställa förskjutningen av den tredje attributcertifikatposten.
  4. Upprepa steg 3 för varje efterföljande certifikat tills den beräknade förskjutningen är lika med 0x6000 (0x5000 start + 0x1000 total storlek), vilket indikerar att du har gått igenom hela tabellen.

Du kan också räkna upp certifikatposterna genom att anropa funktionen Win32 ImageEnumerateCertificates i en loop. En länk till funktionens referenssida finns i Referenser.

Attributcertifikattabellposter kan innehålla valfri certifikattyp, så länge posten har rätt dwLength-värde, ett unikt wRevision-värde och ett unikt wCertificateType-värde. Den vanligaste typen av certifikattabellpost är en WIN_CERTIFICATE struktur, som dokumenteras i Wintrust.h och beskrivs i resten av det här avsnittet.

Alternativen för WIN_CERTIFICATE wRevision medlem inkluderar (men är inte begränsade till) följande.

Värde Namn Anteckningar
0x0100
WIN_CERT_REVISION_1_0
Version 1, äldre version av Win_Certificate-strukturen. Det stöds endast för att verifiera äldre Authenticode-signaturer
0x0200
WIN_CERT_REVISION_2_0
Version 2 är den aktuella versionen av Win_Certificate struktur.

 

Alternativen för WIN_CERTIFICATE wCertificateType medlem inkluderar (men är inte begränsade till) objekten i följande tabell. Observera att vissa värden inte stöds för närvarande.

Värde Namn Anteckningar
0x0001
WIN_CERT_TYPE_X509
bCertificate innehåller ett X.509-certifikat
Stöds inte
0x0002
WIN_CERT_TYPE_PKCS_SIGNED_DATA
bCertificate innehåller en PKCS#7 SignedData-struktur
0x0003
WIN_CERT_TYPE_RESERVED_1
Reserverad
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Certifikatsignering för Terminal Server Protocol Stack
Stöds inte

 

WIN_CERTIFICATE-strukturens bCertificate-medlem innehåller en bytematris med variabel längd med den innehållstyp som anges av wCertificateType. Typen som stöds av Authenticode är WIN_CERT_TYPE_PKCS_SIGNED_DATA, en PKCS#7 SignedData struktur. Mer information om formatet authenticode digital signatur finns i Windows Authenticode Portable Executable Signature Format.

Om bCertificate innehållet inte slutar på en quadword-gräns, är attributcertifikatposten vadderad med nollor, från slutet av bCertificate till nästa kvaddordsgräns.

Värdet dwLength är längden på den färdiga WIN_CERTIFICATE strukturen och beräknas som:

dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)

Den här längden bör innehålla storleken på alla utfyllnad som används för att uppfylla kravet att varje WIN_CERTIFICATE struktur är fyrordsjusterad:

dwLength += (8 - (dwLength & 7)) & 7;

-certifikattabellens storleksom anges i tabellen certifikat i valfria rubrikdatakataloger (endast avbildning)– innehåller utfyllnad.

Mer information om hur du använder ImageHlp-API:et för att räkna upp, lägga till och ta bort certifikat från PE-filer finns i ImageHlp Functions.

Certifikatdata

Som anges i föregående avsnitt kan certifikaten i attributcertifikattabellen innehålla valfri certifikattyp. Certifikat som säkerställer en PE-fils integritet kan innehålla en PE-avbildningshash.

En PE-avbildningshash (eller filhash) liknar en filkontrollsumma eftersom hash-algoritmen genererar en meddelandesammandrag som är relaterad till en fils integritet. En kontrollsumma skapas dock av en enkel algoritm och används främst för att identifiera om ett minnesblock på disken har gått dåligt och de värden som lagras där har skadats. En filhash liknar en kontrollsumma eftersom den även identifierar filskada. Men till skillnad från de flesta kontrollsummaalgoritmer är det mycket svårt att ändra en fil utan att ändra filhashen från dess ursprungliga oförändrade värde. En filhash kan därför användas för att identifiera avsiktliga och till och med subtila ändringar i en fil, till exempel de som introduceras av virus, hackare eller trojanska hästprogram.

När det ingår i ett certifikat måste avbildningssammandraget undanta vissa fält i PE-avbildningen, till exempel checksumman och certifikattabellposten i valfria huvuddatakataloger. Det beror på att åtgärden att lägga till ett certifikat ändrar dessa fält och skulle göra att ett annat hash-värde beräknas.

Funktionen Win32 ImageGetDigestStream tillhandahåller en dataström från en PE-målfil som du kan hash-funktioner med. Den här dataströmmen förblir konsekvent när certifikat läggs till eller tas bort från en PE-fil. Baserat på de parametrar som skickas till ImageGetDigestStreamkan andra data från PE-avbildningen utelämnas från hash-beräkningen. En länk till funktionens referenssida finns i Referenser.

Delay-Load importera tabeller (endast bild)

Dessa tabeller lades till i avbildningen för att stödja en enhetlig mekanism för program för att fördröja inläsningen av en DLL tills det första anropet till DLL:en. Layouten för tabellerna matchar den för de traditionella importtabeller som beskrivs i avsnitt 6.4 avsnittet .idata. Här beskrivs bara några få detaljer.

Katalogtabellen Delay-Load

Katalogtabellen för fördröjningsbelastning är motsvarigheten till importkatalogtabellen. Den kan hämtas via posten Delay Import Descriptor (Fördröj importdeskriptor) i listan över valfria huvuddatakataloger (förskjutning 200). Tabellen är ordnad på följande sätt:

Uppväga Storlek Fält Beskrivning
0
4
Attribut
Måste vara noll.
4
4
Namn
RVA för namnet på den DLL som ska läsas in. Namnet finns i avsnittet skrivskyddade data i bilden.
8
4
Modulhandtag
RVA för modulhandtaget (i dataavsnittet i avbildningen) av DLL:en som ska fördröjas. Den används för lagring av den rutin som tillhandahålls för att hantera fördröjningsinläsning.
12
4
Fördröja importadresstabellen
RVA för importadresstabellen för fördröjningsbelastning. Mer information finns i IAT (Delay Import Address Table).
16
4
Fördröja importnamntabellen
RVA för tabellen med namn på fördröjningsbelastning, som innehåller namnen på de importer som kan behöva läsas in. Detta matchar layouten för tabellen med importnamn. Mer information finns i tabell med tips/namn.
20
4
Importtabell för bindningsfördröjning
RVA för den bundna adresstabellen för fördröjningsbelastning, om den finns.
24
4
Ta bort fördröjningsimporttabell
RVA för adresstabellen för att ta bort fördröjningsbelastning, om den finns. Det här är en exakt kopia av tabellen med fördröjningsimportadresser. Om anroparen tar bort DLL:n bör den här tabellen kopieras tillbaka över tabellen för fördröjningsimportadress så att efterföljande anrop till DLL:n fortsätter att använda thunking-mekanismen korrekt.
28
4
Tidstämpel
Tidsstämpeln för den DLL som den här avbildningen har bundits till.

 

Tabellerna som refereras i den här datastrukturen ordnas och sorteras precis som deras motsvarigheter är för traditionell import. Mer information finns i avsnittet .idata.

Attribut

Ännu har inga attributflaggor definierats. Länkaren anger det här fältet till noll i bilden. Det här fältet kan användas för att utöka posten genom att ange förekomsten av nya fält, eller så kan det användas för att indikera beteenden för funktionerna för fördröjning eller avlastning av hjälpfunktioner.

Namn

Namnet på DLL:en som ska fördröjas finns i det skrivskyddade dataavsnittet i bilden. Det refereras via fältet szName.

Modulhandtag

Handtaget för DLL:en som ska fördröjas finns i dataavsnittet i bilden. Phmod-fältet pekar på handtaget. Den angivna fördröjningshjälpen använder den här platsen för att lagra handtaget till den inlästa DLL:en.

Fördröja importadresstabellen

Tabellen för fördröjningsimportadress (IAT) refereras av fördröjningsimportbeskrivningen via pIAT-fältet. Hjälpverktyget för fördröjningsbelastning uppdaterar dessa pekare med de verkliga startpunkterna så att thunks inte längre finns i anropsloopen. Funktionspekarna används med hjälp av uttrycket pINT->u1.Function.

Fördröja importnamntabellen

INT (Delay Import Name Table) innehåller namnen på de importer som kan kräva inläsning. De sorteras på samma sätt som funktionspekarna i IAT. De består av samma strukturer som standard-INT och används med hjälp av uttrycket pINT->u1.AddressOfData->Name[0].

Fördröj bunden importadresstabell och tidsstämpel

BIAT (Delay Bound Import Address Table) är en valfri tabell med IMAGE_THUNK_DATA objekt som används tillsammans med tidsstämpelfältet i katalogtabellen för fördröjningsbelastning av en bindningsfas efter processen.

Ta bort importadresstabell för fördröjning

Fördröjningen av importadresstabellen (UIAT) är en valfri tabell med IMAGE_THUNK_DATA objekt som avlastningskoden använder för att hantera en explicit avlastningsbegäran. Den består av initierade data i det skrivskyddade avsnittet som är en exakt kopia av den ursprungliga IAT som hänvisade koden till thunks för fördröjningsbelastning. På avlastningsbegäran kan biblioteket frisläsas, *phmod rensas och UIAT skrivs över IAT för att återställa allt till dess förinläsningstillstånd.

Specialavsnitt

Typiska COFF-avsnitt innehåller kod eller data som länkare och Microsoft Win32-inläsare bearbetar utan särskild kunskap om avsnittsinnehållet. Innehållet är endast relevant för det program som länkas eller körs.

Vissa COFF-avsnitt har dock särskilda betydelser när de hittas i objektfiler eller bildfiler. Verktyg och inläsare känner igen dessa avsnitt eftersom de har särskilda flaggor inställda i avsnittsrubriken, eftersom särskilda platser i bildens valfria rubrik pekar på dem, eller för att själva avsnittsnamnet anger en särskild funktion i avsnittet. (Även om själva avsnittsnamnet inte anger en särskild funktion i avsnittet, dikteras avsnittsnamnet av konventionen, så författarna till den här specifikationen kan referera till ett avsnittsnamn i alla fall.)

De reserverade avsnitten och deras attribut beskrivs i tabellen nedan, följt av detaljerade beskrivningar för de avsnittstyper som sparas i körbara filer och de avsnittstyper som innehåller metadata för tillägg.

Avsnittsnamn Innehåll Karakteristika
.Bss
Onitialiserade data (kostnadsfritt format)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.cormeta
CLR-metadata som anger att objektfilen innehåller hanterad kod
IMAGE_SCN_LNK_INFO
.data
Initierade data (kostnadsfritt format)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.debug$F
Genererad felsökningsinformation för FPO (endast objekt, endast x86-arkitektur och nu föråldrad)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$P
Förkompilerade felsökningstyper (endast objekt)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$S
Felsöka symboler (endast objekt)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$T
Felsökningstyper (endast objekt)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.drective
Alternativ för länkare
IMAGE_SCN_LNK_INFO
.edata
Exportera tabeller
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.idata
Importera tabeller
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.idlsym
Innehåller registrerad SEH (endast avbildning) för att stödja IDL-attribut. Mer information finns i "IDL-attribut" i Referenser i slutet av det här avsnittet.
IMAGE_SCN_LNK_INFO
.pdata
Undantagsinformation
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.rdata
Skrivskyddade initierade data
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.reloc
Bildflyttar
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.rsrc
Resurskatalog
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.sbss
GP-relativa onitialiserade data (kostnadsfritt format)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Flaggan IMAGE_SCN_GPREL ska endast anges för IA64-arkitekturer. den här flaggan är inte giltig för andra arkitekturer. Flaggan IMAGE_SCN_GPREL gäller endast objektfiler. När den här avsnittstypen visas i en bildfil får flaggan IMAGE_SCN_GPREL inte anges.
.sdata
GP-relativa initierade data (kostnadsfritt format)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Flaggan IMAGE_SCN_GPREL ska endast anges för IA64-arkitekturer. den här flaggan är inte giltig för andra arkitekturer. Flaggan IMAGE_SCN_GPREL gäller endast objektfiler. När den här avsnittstypen visas i en bildfil får flaggan IMAGE_SCN_GPREL inte anges.
.srdata
GP-relativa skrivskyddade data (kostnadsfritt format)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Flaggan IMAGE_SCN_GPREL ska endast anges för IA64-arkitekturer. den här flaggan är inte giltig för andra arkitekturer. Flaggan IMAGE_SCN_GPREL gäller endast objektfiler. När den här avsnittstypen visas i en bildfil får flaggan IMAGE_SCN_GPREL inte anges.
.sxdata
Registrerade undantagshanterardata (endast kostnadsfritt format och x86/objekt)
IMAGE_SCN_LNK_INFO Innehåller symbolindexet för var och en av undantagshanterarna som refereras till av koden i objektfilen. Symbolen kan vara för en UNDEF-symbol eller en som definieras i modulen.
.SMS
Körbar kod (kostnadsfritt format)
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
.tls
Trådlokal lagring (endast objekt)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.tls$
Trådlokal lagring (endast objekt)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.vsdata
GP-relativa initierade data (kostnadsfritt format och endast för ARM-, SH4- och Thumb-arkitekturer)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.xdata
Undantagsinformation (kostnadsfritt format)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

 

Vissa av avsnitten som anges här är markerade med "endast objekt" eller "endast bild" för att indikera att deras särskilda semantik endast är relevanta för objektfiler eller bildfiler. Ett avsnitt som är markerat som "endast bild" kan fortfarande visas i en objektfil som ett sätt att komma in i bildfilen, men avsnittet har ingen särskild betydelse för länkaren, bara för bildfilinläsaren.

Avsnittet .debug

Avsnittet .debug används i objektfiler för att innehålla kompilatorgenererad felsökningsinformation och i bildfiler för att innehålla all felsökningsinformation som genereras. I det här avsnittet beskrivs paketering av felsökningsinformation i objekt- och bildfiler.

I nästa avsnitt beskrivs formatet för felsökningskatalogen, som kan finnas var som helst i bilden. Följande avsnitt beskriver "grupper" i objektfiler som innehåller felsökningsinformation.

Standardvärdet för länkaren är att felsökningsinformation inte mappas till bildens adressutrymme. Det finns bara ett felsökningsavsnitt när felsökningsinformation mappas i adressutrymmet.

Felsökningskatalog (endast avbildning)

Bildfiler innehåller en valfri felsökningskatalog som anger vilken form av felsökningsinformation som finns och var den finns. Den här katalogen består av en matris med felsökningskatalogposter vars plats och storlek anges i den valfria bildrubriken.

Felsökningskatalogen kan finnas i ett felsökningsavsnitt som kan ignoreras (om en sådan finns) eller inkluderas i något annat avsnitt i bildfilen eller inte vara i ett avsnitt alls.

Varje post i felsökningskatalogen identifierar platsen och storleken på ett block med felsökningsinformation. Den angivna RVA:n kan vara noll om felsökningsinformationen inte omfattas av ett avsnittshuvud (d.s. att den finns i bildfilen och inte mappas till körningsadressutrymmet). Om den mappas är RVA dess adress.

En felsökningskatalogpost har följande format:

Uppväga Storlek Fält Beskrivning
0
4
Karakteristika
Reserverad, måste vara noll.
4
4
TimeDateStamp
Tid och datum då felsökningsdata skapades.
8
2
MajorVersion
Huvudversionsnumret för felsökningsdataformatet.
10
2
MinorVersion
Delversionsnumret för felsökningsdataformatet.
12
4
Typ
Formatet för felsökningsinformation. Det här fältet ger stöd för flera felsökningsprogram. Mer information finns i Felsökningstyp.
16
4
SizeOfData
Storleken på felsökningsdata (inte själva felsökningskatalogen).
20
4
AddressOfRawData
Adressen för felsökningsdata när de läses in, i förhållande till avbildningsbasen.
24
4
PointerToRawData
Filpekaren till felsökningsdata.

 

Felsökningstyp

Följande värden definieras för fältet Typ i posten för felsökningskatalogen:

Konstant Värde Beskrivning
IMAGE_DEBUG_TYPE_UNKNOWN
0
Ett okänt värde som ignoreras av alla verktyg.
IMAGE_DEBUG_TYPE_COFF
1
Felsökningsinformationen för COFF (radnummer, symboltabell och strängtabell). Den här typen av felsökningsinformation pekas också på av fält i filhuvudena.
IMAGE_DEBUG_TYPE_CODEVIEW
2
Felsökningsinformation för Visual C++.
IMAGE_DEBUG_TYPE_FPO
3
Information om utelämnande av rampekare (FPO). Den här informationen talar om för felsökaren hur man tolkar icke-standardstaplar, som använder EBP-registret för ett annat syfte än som en bildrutepekare.
IMAGE_DEBUG_TYPE_MISC
4
Platsen för DBG-filen.
IMAGE_DEBUG_TYPE_EXCEPTION
5
En kopia av avsnittet .pdata.
IMAGE_DEBUG_TYPE_FIXUP
6
Reserverad.
IMAGE_DEBUG_TYPE_OMAP_TO_SRC
7
Mappningen från en RVA i avbildning till en RVA i källbilden.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
Mappningen från en RVA i källbilden till en RVA i avbildningen.
IMAGE_DEBUG_TYPE_BORLAND
9
Reserverad för Borland.
IMAGE_DEBUG_TYPE_RESERVED10
10
Reserverad.
IMAGE_DEBUG_TYPE_CLSID
11
Reserverad.
IMAGE_DEBUG_TYPE_REPRO
16
PE determinism eller reproducerbarhet.
Odefinierad
17
Felsökningsinformationen bäddas in i PE-filen på den plats som anges av PointerToRawData.
Odefinierad
19
Lagrar kryptoshash för innehållet i symbolfilen som används för att skapa PE/COFF-filen.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Utökade DLL-egenskaper bitar.

 

Om fältet Typ är inställt på IMAGE_DEBUG_TYPE_FPO är felsökningsrådata en matris där varje medlem beskriver stackramen för en funktion. Alla funktioner i bildfilen måste inte ha FPO-information definierad för den, även om felsökningstypen är FPO. De funktioner som inte har information om FPO antas ha normala stackramar. Formatet för FPO-information är följande:

#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;

Förekomsten av en post av typen IMAGE_DEBUG_TYPE_REPRO anger att PE-filen är inbyggd på ett sätt som ger determinism eller reproducerbarhet. Om indata inte ändras kommer PE-utdatafilen garanterat att vara bit-för-bit identisk oavsett när eller var PE skapas. Olika datum-/tidsstämpelfält i PE-filen fylls med delar eller alla bitar från ett beräknat hashvärde som använder PE-filinnehåll som indata och därför inte längre representerar det faktiska datumet och tiden när en PE-fil eller relaterade specifika data i PE skapas. Rådata för den här felsökningsposten kan vara tomma eller innehålla ett beräknat hashvärde som föregås av ett värde på fyra byte som representerar hashvärdets längd.

Om fältet Typ är inställt på IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS innehåller felsökningsrådata utökade DLL-egenskapsbitar, utöver dem som kan anges i bildens valfria rubrik. Se DLL-egenskaper i avsnittet valfritt sidhuvud Windows-Specific fält (endast bild).

Utökade DLL-egenskaper

Följande värden definieras för de utökade DLL-egenskapsbitarna.

Konstant Värde Beskrivning
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 Bilden är CET(Control-flow Enforcement Technology) Shadow Stack kompatibel.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Alla grenmål i alla bildkodavsnitt kommenteras med instruktioner för skydd mot integritetsskydd för framåtkantskontroll, till exempel x86 CET-Indirect Branch Tracking (IBT) eller BTI-instruktioner (ARM Branch Target Identification). Den här biten används inte av Windows.

.debug$F (endast objekt)

Data i det här avsnittet har ersatts i Visual C++ version 7.0 och senare av en mer omfattande uppsättning data som skickas till en .debug$S underavsnitt.

Objektfiler kan innehålla .debug$F-avsnitt vars innehåll är en eller flera FPO_DATA poster (information om utelämnande av rampekare). Se "IMAGE_DEBUG_TYPE_FPO" i Felsökningstyp.

Länkaren känner igen dessa .debug$F poster. Om felsökningsinformation genereras sorterar länkaren de FPO_DATA posterna efter procedur RVA och genererar en felsökningskatalogpost för dem.

Kompilatorn bör inte generera FPO-poster för procedurer som har ett standardramformat.

.debug$S (endast objekt)

Det här avsnittet innehåller felsökningsinformation för Visual C++ (symbolisk information).

.debug$P (endast objekt)

Det här avsnittet innehåller felsökningsinformation för Visual C++ (förkompilerad information). Dessa är delade typer mellan alla objekt som kompilerats med hjälp av det förkompilerade huvudet som genererades med det här objektet.

.debug$T (endast objekt)

Det här avsnittet innehåller felsökningsinformation för Visual C++ (typinformation).

Linker-stöd för Microsoft-felsökningsinformation

Länkaren stöder felsökningsinformation:

  • Samlar in alla relevanta felsökningsdata från avsnitten .debug$F, debug$S, .debug$Poch .debug$T.

  • Bearbetar dessa data tillsammans med den länkningsgenererade felsökningsinformationen i PDB-filen och skapar en felsökningskatalogpost som refererar till den.

Drectve-avsnittet (endast objekt)

Ett avsnitt är ett direktivavsnitt om flaggan IMAGE_SCN_LNK_INFO anges i avsnittsrubriken och har .drectve avsnittsnamn. Länkaren tar bort ett .drectve- avsnitt efter bearbetning av informationen, så avsnittet visas inte i bildfilen som länkas.

Ett .drectve- avsnitt består av en textsträng som kan kodas som ANSI eller UTF-8. Om UTF-8 byteordningsmarkören (BOM, ett prefix med tre byte som består av 0xEF, 0xBB och 0xBF) inte finns tolkas direktivsträngen som ANSI. Direktivsträngen är en serie länkalternativ som avgränsas med blanksteg. Varje alternativ innehåller ett bindestreck, alternativnamnet och ett lämpligt attribut. Om ett alternativ innehåller blanksteg måste alternativet omges av citattecken. Avsnittet .drectve får inte ha flyttningar eller radnummer.

Avsnittet .edata (endast bild)

Avsnittet exportera data med namnet .edata innehåller information om symboler som andra bilder kan komma åt via dynamisk länkning. Exporterade symboler finns vanligtvis i DLL:er, men DLL:er kan också importera symboler.

En översikt över den allmänna strukturen i exportavsnittet beskrivs nedan. Tabellerna som beskrivs är vanligtvis sammanhängande i filen i den ordning som visas (även om detta inte krävs). Endast exportkatalogtabellen och exportadresstabellen krävs för att exportera symboler som ordningstal. (En ordningstal är en export som nås direkt av dess exportadresstabellindex.) Namnpekartabellen, ordningstabellen och exportnamntabellen finns för att stödja användning av exportnamn.

Tabellnamn Beskrivning
Exportera katalogtabell
En tabell med bara en rad (till skillnad från felsökningskatalogen). Den här tabellen anger platserna och storlekarna för de andra exporttabellerna.
Exportera adresstabell
En matris med RVA:er med exporterade symboler. Det här är de faktiska adresserna för de exporterade funktionerna och data i de körbara kod- och dataavsnitten. Andra bildfiler kan importera en symbol med hjälp av ett index till den här tabellen (en ordningstal) eller, om du vill, med hjälp av det offentliga namn som motsvarar ordningstalet om ett offentligt namn har definierats.
Namnpekartabell
En matris med pekare till de offentliga exportnamnen, sorterade i stigande ordning.
Ordningstabell
En matris med ordningstalen som motsvarar medlemmar i namnpekartabellen. Korrespondensen är efter position; Därför måste namnpekartabellen och ordningstabellen ha samma antal medlemmar. Varje ordningstal är ett index i exportadresstabellen.
Exportera namntabell
En serie null-avslutade ASCII-strängar. Medlemmar i namnpekartabellen pekar i det här området. Dessa namn är de offentliga namn genom vilka symbolerna importeras och exporteras. de är inte nödvändigtvis samma som de privata namn som används i bildfilen.

 

När en annan bildfil importerar en symbol efter namn söker Win32-inläsaren i namnpekartabellen efter en matchande sträng. Om en matchande sträng hittas identifieras den associerade ordningstalet genom att söka upp motsvarande medlem i ordningstabellen (det vill: medlemmen i ordningstabellen med samma index som strängpekaren som finns i namnpekartabellen). Den resulterande ordningstalet är ett index i exportadresstabellen, vilket ger den önskade symbolens faktiska plats. Varje exportsymbol kan nås med en ordningstal.

När en annan bildfil importerar en symbol med ordningstal är det inte nödvändigt att söka i namnpekartabellen efter en matchande sträng. Direkt användning av en ordningstal är därför mer effektiv. Ett exportnamn är dock lättare att komma ihåg och kräver inte att användaren känner till tabellindexet för symbolen.

Exportera katalogtabell

Informationen om exportsymbolen börjar med exportkatalogtabellen, som beskriver resten av exportsymbolinformationen. Exportkatalogtabellen innehåller adressinformation som används för att matcha importer till startpunkterna i den här bilden.

Uppväga Storlek Fält Beskrivning
0
4
Exportera flaggor
Reserverad, måste vara 0.
4
4
Tids-/datumstämpel
Tid och datum då exportdata skapades.
8
2
Huvudversion
Huvudversionsnumret. Huvud- och delversionsnumren kan anges av användaren.
10
2
Delversion
Delversionsnumret.
12
4
Namn RVA
Adressen till ASCII-strängen som innehåller namnet på DLL:en. Den här adressen är relativ till avbildningsbasen.
16
4
Ordningsbas
Startordningsnumret för exporter i den här avbildningen. Det här fältet anger det inledande ordningstalet för exportadresstabellen. Den är vanligtvis inställd på 1.
20
4
Posterna i adresstabellen
Antalet poster i exportadresstabellen.
24
4
Antal namnpekare
Antalet poster i namnpekartabellen. Det här är också antalet poster i ordningstabellen.
28
4
Exportera adresstabell RVA
Adressen till exportadresstabellen i förhållande till bildbasen.
32
4
Namnpekare RVA
Adressen till pekartabellen för exportnamn i förhållande till bildbasen. Tabellstorleken anges av fältet Antal namnpekare.
36
4
RVA för ordningstabell
Adressen till ordningstabellen i förhållande till bildbasen.

 

Exportera adresstabell

Exportadresstabellen innehåller adressen till exporterade startpunkter och exporterade data och absoluta tal. Ett ordningstal används som ett index i exportadresstabellen.

Varje post i exportadresstabellen är ett fält som använder ett av två format i följande tabell. Om den angivna adressen inte finns i exportavsnittet (enligt definitionen av den adress och längd som anges i det valfria huvudet) är fältet en export-RVA, som är en faktisk adress i kod eller data. Annars är fältet en vidarebefordrare RVA, som namnger en symbol i en annan DLL.

Uppväga Storlek Fält Beskrivning
0
4
Exportera RVA
Adressen till den exporterade symbolen när den läses in i minnet, i förhållande till bildbasen. Till exempel adressen för en exporterad funktion.
0
4
Vidarebefordrare RVA
Pekaren till en null-avslutad ASCII-sträng i exportavsnittet. Den här strängen måste ligga inom det intervall som anges av exporttabellens datakatalogpost. Se valfria huvuddatakataloger (endast avbildning). Den här strängen ger DLL-namnet och namnet på exporten (till exempel "MYDLL.expfunc") eller DLL-namnet och ordningstalet för exporten (till exempel "MYDLL.#27").

 

En vidarebefordrare RVA exporterar en definition från en annan bild, vilket gör att den visas som om den exporterades av den aktuella avbildningen. Symbolen importeras och exporteras därmed samtidigt.

I Kernel32.dll i Windows XP vidarebefordras till exempel exporten med namnet "HeapAlloc" till strängen "NTDLL. RtlAllocateHeap." Detta gör att program kan använda den Windows XP-specifika modulen Ntdll.dll utan att faktiskt innehålla importreferenser till den. Programmets importtabell refererar endast till Kernel32.dll. Därför är programmet inte specifikt för Windows XP och kan köras på alla Win32-system.

Exportera namnpekartabell

Pekartabellen för exportnamn är en matris med adresser (RVAs) i tabellen med exportnamn. Pekarna är 32 bitar vardera och är relativa till bildbasen. Pekarna sorteras lexikalt för att tillåta binära sökningar.

Ett exportnamn definieras endast om pekartabellen för exportnamn innehåller en pekare till den.

Exportera ordningstalstabell

Exportordningstabellen är en matris med 16-bitars opartiska index i exportadresstabellen. Ordningstalen påverkas av fältet Ordningstalsbas i exportkatalogtabellen. Med andra ord måste ordningsbasen subtraheras från ordningstalen för att få sanna index till exportadresstabellen.

Tabellen exportnamnpekare och exportordningstabellen utgör två parallella matriser som är avgränsade för att tillåta naturlig fältjustering. Dessa två tabeller fungerar i själva verket som en tabell, där kolumnen Exportnamnpekare pekar på ett offentligt (exporterat) namn och kolumnen Exportordinal ger motsvarande ordningstal för det offentliga namnet. En medlem i pekartabellen för exportnamn och en medlem i exportordningstabellen associeras genom att ha samma position (index) i sina respektive matriser.

När tabellen med exportnamnpekare genomsöks och en matchande sträng hittas vid position i är algoritmen för att hitta symbolens RVA och den partiska ordningsordningen:

i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];

rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;

När du söker efter en symbol efter (partisk) ordningstal är algoritmen för att hitta symbolens RVA och namn:

ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);

rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];

Exportera namntabell

Tabellen exportnamn innehåller de faktiska strängdata som pekar på av tabellen med exportnamnspekaren. Strängarna i den här tabellen är offentliga namn som andra bilder kan använda för att importera symbolerna. Dessa offentliga exportnamn är inte nödvändigtvis samma som de privata symbolnamn som symbolerna har i sin egen bildfil och källkod, även om de kan vara det.

Varje exporterad symbol har ett ordningstalsvärde, vilket bara är indexet i exportadresstabellen. Det är dock valfritt att använda exportnamn. Vissa, alla eller ingen av de exporterade symbolerna kan ha exportnamn. För exporterade symboler som har exportnamn fungerar motsvarande poster i tabellen exportnamnpekare och exportordningstabellen tillsammans för att associera varje namn med en ordningstal.

Strukturen i tabellen med exportnamn är en serie null-avslutade ASCII-strängar med variabel längd.

Avsnittet .idata

Alla bildfiler som importerar symboler, inklusive praktiskt taget alla körbara (EXE)-filer, har ett .idata-avsnitt. En typisk fillayout för importinformationen följer:

  • Katalogtabell

    Null-katalogpost

  • DLL1 Importera uppslagstabell

    Noll

  • DLL2 Importera uppslagstabell

    Noll

  • DLL3 Importera uppslagstabell

    Noll

  • Hint-Name tabell

Importera katalogtabell

Importinformationen börjar med importkatalogtabellen, som beskriver resten av importinformationen. Importkatalogtabellen innehåller adressinformation som används för att matcha korrigeringsreferenser till startpunkterna i en DLL-avbildning. Importkatalogtabellen består av en matris med importkatalogposter, en post för varje DLL som bilden refererar till. Den sista katalogposten är tom (fylld med null-värden), vilket anger slutet på katalogtabellen.

Varje importkatalogpost har följande format:

Uppväga Storlek Fält Beskrivning
0
4
Importera RVA för uppslagstabell (egenskaper)
RVA för importuppslagstabellen. Den här tabellen innehåller ett namn eller en ordningstal för varje import. (Namnet "Egenskaper" används i Winnt.h, men beskriver inte längre det här fältet.)
4
4
Tids-/datumstämpel
Den stämpel som är inställd på noll tills bilden är bunden. När avbildningen har bundits anges det här fältet till tids-/datastämpeln för DLL:en.
8
4
Vidarebefordrarkedja
Indexet för den första vidarebefordrarreferensen.
12
4
Namn RVA
Adressen till en ASCII-sträng som innehåller namnet på DLL:en. Den här adressen är relativ till avbildningsbasen.
16
4
Importera adresstabell RVA (thunktabell)
RVA för importadresstabellen. Innehållet i den här tabellen är identiskt med innehållet i importuppslagstabellen tills bilden är bunden.

 

Importera uppslagstabell

En importuppslagstabell är en matris med 32-bitars tal för PE32 eller en matris med 64-bitarsnummer för PE32+. Varje post använder det bitfältsformat som beskrivs i följande tabell. I det här formatet är bit 31 den viktigaste biten för PE32 och bit 63 är den viktigaste biten för PE32+. Samlingen av dessa poster beskriver alla importer från en viss DLL. Den sista posten är inställd på noll (NULL) för att ange slutet av tabellen.

Bitar Storlek Bitfält Beskrivning
31/63
1
Ordningstal/namnflagga
Om den här biten har angetts importerar du med ordningstal. Annars importerar du efter namn. Biten maskeras som 0x80000000 för PE32, 0x8000000000000000 för PE32+.
15-0
16
Ordningstal
Ett 16-bitars ordningstal. Det här fältet används endast om bitfältet Ordinal/Name Flag är 1 (importera efter ordning). Bitar 30-15 eller 62-15 måste vara 0.
30-0
31
Hint/Name Table RVA
En 31-bitars RVA för en tabellpost för tips/namn. Det här fältet används endast om bitfältet Ordinal/Name Flag är 0 (importera efter namn). För PE32+ bitar måste 62-31 vara noll.

 

Tabell för tips/namn

En tabell med tips/namn räcker för hela importavsnittet. Varje post i tabellen tips/namn har följande format:

Uppväga Storlek Fält Beskrivning
0
2
Antydan
Ett index i pekartabellen för exportnamn. En matchning görs först med det här värdet. Om det misslyckas utförs en binär sökning i DLL:s pekartabell för exportnamn.
2
variabel
Namn
En ASCII-sträng som innehåller namnet som ska importeras. Det här är strängen som måste matchas med det offentliga namnet i DLL:en. Den här strängen är skiftlägeskänslig och avslutas med en null-byte.
*
0 eller 1
Block
En avslutande noll-pad byte som visas efter avslutande null byte, om det behövs, för att justera nästa post på en jämn gräns.

 

Importadresstabell

Strukturen och innehållet i importadresstabellen är identiska med importuppslagstabellens tills filen är bunden. Under bindningen skrivs posterna i importadresstabellen över med 32-bitarsadresserna (för PE32) eller 64-bitarsadresserna (för PE32+) för de symboler som importeras. Dessa adresser är symbolernas faktiska minnesadresser, även om de tekniskt sett fortfarande kallas "virtuella adresser". Inläsaren bearbetar vanligtvis bindningen.

Avsnittet .pdata

Avsnittet .pdata innehåller en matris med funktionstabellposter som används för undantagshantering. Det pekas på av undantagstabellposten i avbildningsdatakatalogen. Posterna måste sorteras enligt funktionsadresserna (det första fältet i varje struktur) innan de skickas till den slutliga bilden. Målplattformen avgör vilken av de tre funktionstabellformatvariationerna som beskrivs nedan.

För 32-bitars MIPS-bilder har funktionstabellposter följande format:

Uppväga Storlek Fält Beskrivning
0
4
Startadress
VA för motsvarande funktion.
4
4
Slutadress
VA i slutet av funktionen.
8
4
Undantagshanterare
Pekaren till undantagshanteraren som ska köras.
12
4
Hanterar data
Pekaren till ytterligare information som ska skickas till hanteraren.
16
4
Slutadress för Prolog
VA i slutet av funktionens prolog.

 

För PLATTFORMARna ARM, PowerPC, SH3 och SH4 Windows CE har funktionstabellposter följande format:

Uppväga Storlek Fält Beskrivning
0
4
Startadress
VA för motsvarande funktion.
4
8 bitar
Längd på prolog
Antalet instruktioner i funktionens prolog.
4
22 bitar
Funktionslängd
Antalet instruktioner i funktionen.
4
1 bit
32-bitars flagga
Om den anges består funktionen av 32-bitars instruktioner. Om det är klart består funktionen av 16-bitars instruktioner.
4
1 bit
Undantagsflagga
Om det anges finns det en undantagshanterare för funktionen. Annars finns det ingen undantagshanterare.

 

För x64- och Itanium-plattformar har funktionstabellposter följande format:

Uppväga Storlek Fält Beskrivning
0
4
Startadress
RVA för motsvarande funktion.
4
4
Slutadress
RVA för slutet av funktionen.
8
4
Varva ned information
RVA för avspolningsinformationen.

 

Avsnittet .reloc (endast bild)

Basflytttabellen innehåller poster för alla basflyttar i avbildningen. Fältet Base Relocation Table (Basflytttabell) i de valfria huvuddatakatalogerna ger antalet byte i basflytttabellen. Mer information finns i valfria huvuddatakataloger (endast avbildning). Basflytttabellen är uppdelad i block. Varje block representerar basflyttarna för en 4K-sida. Varje block måste starta på en 32-bitarsgräns.

Inläsaren krävs inte för att bearbeta basflyttar som löses av länkaren, såvida inte belastningsavbildningen inte kan läsas in på avbildningsbasen som anges i PE-huvudet.

Blockering av basflytt

Varje block för basflytt börjar med följande struktur:

Uppväga Storlek Fält Beskrivning
0
4
Sid-RVA
Avbildningsbasen plus sidanS RVA läggs till i varje förskjutning för att skapa den VA där basflytten måste tillämpas.
4
4
Blockstorlek
Det totala antalet byte i basflyttblocket, inklusive fälten Sid-RVA och Blockstorlek och fälten Typ/Förskjutning som följer.

 

Fältet Blockstorlek följs sedan av valfritt antal posterna Typ eller Förskjutningsfält. Varje post är en WORD (2 byte) och har följande struktur:

Uppväga Storlek Fält Beskrivning
0
4 bitar
Typ
Lagras i de höga 4 bitarna i WORD, ett värde som anger vilken typ av basflytt som ska tillämpas. Mer information finns i Base Relocation Types.
0
12 bitar
Uppväga
Lagrad i de återstående 12 bitarna av WORD, en förskjutning från startadressen som angavs i sid-RVA-fältet för blocket. Den här förskjutningen anger var basflytten ska tillämpas.

 

För att tillämpa en basflytt beräknas skillnaden mellan den önskade basadressen och basen där avbildningen faktiskt läses in. Om avbildningen läses in på önskad bas är skillnaden noll och därför behöver inte basflyttarna tillämpas.

Basflytttyper

Konstant Värde Beskrivning
IMAGE_REL_BASED_ABSOLUTE
0
Basflytten hoppas över. Den här typen kan användas för att fylla ett block.
IMAGE_REL_BASED_HIGH
1
Basflytten lägger till de höga 16 bitarna av skillnaden till 16-bitarsfältet vid förskjutning. 16-bitarsfältet representerar det höga värdet för ett 32-bitars ord.
IMAGE_REL_BASED_LOW
2
Basflytten lägger till de låga 16 bitarna av skillnaden till 16-bitarsfältet vid förskjutning. 16-bitarsfältet representerar den låga halvan av ett 32-bitars ord.
IMAGE_REL_BASED_HIGHLOW
3
Basflytten tillämpar alla 32 bitar av skillnaden på 32-bitarsfältet vid förskjutning.
IMAGE_REL_BASED_HIGHADJ
4
Basflytten lägger till de höga 16 bitarna av skillnaden till 16-bitarsfältet vid förskjutning. 16-bitarsfältet representerar det höga värdet för ett 32-bitars ord. De låga 16 bitarna av 32-bitarsvärdet lagras i det 16-bitars ord som följer den här basflytten. Det innebär att den här basflytten upptar två platser.
IMAGE_REL_BASED_MIPS_JMPADDR
5
Omlokaliseringstolkningen är beroende av datortypen.
När datortypen är MIPS gäller basflytten för en MIPS-hoppinstruktion.
IMAGE_REL_BASED_ARM_MOV32
5
Den här omlokaliseringen är bara meningsfull när datortypen är ARM eller Tumme. Basflytten tillämpar 32-bitarsadressen för en symbol i ett efterföljande MOVW/MOVT-instruktionspar.
IMAGE_REL_BASED_RISCV_HIGH20
5
Den här omlokaliseringen är bara meningsfull när datortypen är RISC-V. Basflytten gäller för de höga 20 bitarna av en 32-bitars absolut adress.
6
Reserverad, måste vara noll.
IMAGE_REL_BASED_THUMB_MOV32
7
Den här omlokaliseringen är bara meningsfull när datortypen är Tumme. Basflytten tillämpar 32-bitarsadressen för en symbol på ett efterföljande MOVW/MOVT-instruktionspar.
IMAGE_REL_BASED_RISCV_LOW12I
7
Den här omlokaliseringen är bara meningsfull när datortypen är RISC-V. Basflytten gäller för de låga 12 bitarna av en 32-bitars absolut adress som bildas i RISC-V instruktionsformat av I-typ.
IMAGE_REL_BASED_RISCV_LOW12S
8
Den här omlokaliseringen är bara meningsfull när datortypen är RISC-V. Basflytten gäller för de låga 12 bitarna av en 32-bitars absolut adress som bildas i RISC-V instruktionsformat av S-typ.
IMAGE_REL_BASED_LOONGARCH32_MARK_LA
8
Den här omlokaliseringen är bara meningsfull när maskintypen är LoongArch 32-bitars. Basflytten gäller för en 32-bitars absolut adress som bildas i två på varandra följande instruktioner.
IMAGE_REL_BASED_LOONGARCH64_MARK_LA
8
Den här omlokaliseringen är bara meningsfull när datortypen är LoongArch 64-bitars. Basflytten gäller för en 64-bitars absolut adress som bildas i fyra instruktioner i följd.
IMAGE_REL_BASED_MIPS_JMPADDR16
9
Omlokaliseringen är bara meningsfull när datortypen är MIPS. Basflytten gäller för en MIPS16-hoppinstruktion.
IMAGE_REL_BASED_DIR64
10
Basflytten tillämpar skillnaden på 64-bitarsfältet vid förskjutning.

 

Avsnittet .tls

Avsnittet .tls innehåller direkt PE- och COFF-stöd för statisk trådlokal lagring (TLS). TLS är en särskild lagringsklass som Windows stöder där ett dataobjekt inte är en automatisk (stack)-variabel, men ändå är lokal för varje enskild tråd som kör koden. Därför kan varje tråd behålla ett annat värde för en variabel som deklareras med hjälp av TLS.

Observera att all mängd TLS-data kan stödjas med hjälp av API-anropen TlsAlloc, TlsFree, TlsSetValue och TlsGetValue. PE- eller COFF-implementeringen är en alternativ metod för att använda API:et och har fördelen att vara enklare ur programmeringsspråkets synvinkel. Den här implementeringen gör att TLS-data kan definieras och initieras på samma sätt som vanliga statiska variabler i ett program. I Visual C++kan till exempel en statisk TLS-variabel definieras på följande sätt, utan att använda Windows-API:et:

__declspec (thread) int tlsFlag = 1;

För att stödja den här programmeringskonstruktionen anger avsnittet PE och COFF .tls följande information: initieringsdata, återanropsrutiner för initiering och avslutning per tråd samt TLS-indexet, som beskrivs i följande diskussion.

Not

Före Windows Vista kan statiskt deklarerade TLS-dataobjekt endast användas i statiskt inlästa bildfiler. Detta faktum gör det otillförlitligt att använda statiska TLS-data i en DLL om du inte vet att DLL:n, eller något statiskt kopplat till den, aldrig kommer att läsas in dynamiskt med funktionen LoadLibrary API. Från och med Windows Vista gjordes dock förbättringar av Windows-inläsaren för att bättre stödja dynamisk inläsning av DLL:er med statisk TLS. Den här ändringen innebär att DLL:er med statiskt deklarerade TLS-dataobjekt nu kan användas mer tillförlitligt, även om de läses in dynamiskt med LoadLibrary. Inläsaren kan allokera TLS-platser för sådana DLL:er vid belastningstillfället, vilket minskar de begränsningar som finns i tidigare versioner av Windows.

 

Not

Referenser till 32-bitars förskjutningar och indexmultiplikatorer på 4 gäller för system med 32-bitarsarkitekturer. Justera dem efter behov i ett system baserat på 64-bitarsarkitekturer.

Körbar kod får åtkomst till ett statiskt TLS-dataobjekt genom följande steg:

  1. Vid länktid anger länkaren fältet Adress för index i TLS-katalogen. Det här fältet pekar på en plats där programmet förväntar sig att ta emot TLS-indexet.

    Microsofts körningsbibliotek underlättar den här processen genom att definiera en minnesbild av TLS-katalogen och ge den specialnamnet "__tls_used" (Intel x86-plattformar) eller "_tls_used" (andra plattformar). Länkaren söker efter den här minnesbilden och använder data där för att skapa TLS-katalogen. Andra kompilatorer som stöder TLS och arbetar med Microsoft Linker måste använda samma teknik.

  2. När en tråd skapas kommunicerar inläsaren adressen till trådens TLS-matris genom att placera adressen till trådmiljöblocket (TEB) i FS-registret (för x86) eller GS (för x64). En pekare till TLS-matrisen är vid förskjutningen av 0x2C från början av TEB. Det här beteendet är Intel x86-specifikt.

  3. Inläsaren tilldelar värdet för TLS-indexet till den plats som angavs i fältet Indexadress.

  4. Den körbara koden hämtar TLS-indexet och även platsen för TLS-matrisen.

  5. Koden använder TLS-indexet och TLS-matrisplatsen (multiplicerar indexet med 4 och använder det som en förskjutning till matrisen) för att hämta adressen till TLS-dataområdet för det angivna programmet och modulen. Varje tråd har ett eget TLS-dataområde, men detta är transparent för programmet, som inte behöver veta hur data allokeras för enskilda trådar.

  6. Ett enskilt TLS-dataobjekt nås som en fast förskjutning i TLS-dataområdet.

TLS-matrisen är en matris med adresser som systemet underhåller för varje tråd. Varje adress i den här matrisen ger platsen för TLS-data för en viss modul (EXE eller DLL) i programmet. TLS-indexet anger vilken medlem i matrisen som ska användas. Indexet är ett tal (endast meningsfullt för systemet) som identifierar modulen.

TLS-katalogen

TLS-katalogen har följande format:

Förskjutning (PE32/ PE32+) Storlek (PE32/ PE32+) Fält Beskrivning
0
4/8
Start-VA för rådata
Startadressen för TLS-mallen. Mallen är ett datablock som används för att initiera TLS-data. Systemet kopierar alla dessa data varje gång en tråd skapas, så den får inte vara skadad. Observera att den här adressen inte är en RVA. det är en adress som det ska finnas en basflytt för i avsnittet .reloc.
4/8
4/8
Va för rådataslut
Adressen för TLS:s sista byte, förutom nollfyllningen. Precis som med fältet Raw Data Start VA är detta en VA, inte en RVA.
8/16
4/8
Indexadress
Platsen för att ta emot TLS-indexet, som inläsaren tilldelar. Den här platsen finns i ett vanligt dataavsnitt, så den kan ges ett symboliskt namn som är tillgängligt för programmet.
12/24
4/8
Adress för återanrop
Pekaren till en matris med återanropsfunktioner för TLS. Matrisen är null-avslutad, så om ingen återanropsfunktion stöds pekar det här fältet på 4 byte inställt på noll. Information om prototypen för dessa funktioner finns i TLS Callback Functions.
16/32
4
Storlek på nollfyllning
Storleken i byte för mallen, utöver de initierade data som avgränsas av fälten Raw Data Start VA och Raw Data End VA. Den totala mallstorleken ska vara samma som den totala storleken på TLS-data i bildfilen. Nollfyllningen är mängden data som kommer efter de initierade icke-nolldata.
20/36
4
Karakteristika
De fyra bitarna [23:20] beskriver justeringsinformation. Möjliga värden är de som definieras som IMAGE_SCN_ALIGN_*, som också används för att beskriva justeringen av avsnittet i objektfiler. De övriga 28 bitarna är reserverade för framtida användning.

 

Återanropsfunktioner för TLS

Programmet kan tillhandahålla en eller flera återanropsfunktioner för TLS för att stödja ytterligare initiering och avslutning för TLS-dataobjekt. En vanlig användning för en sådan återanropsfunktion är att anropa konstruktorer och destruktörer för objekt.

Även om det vanligtvis inte finns fler än en återanropsfunktion implementeras ett återanrop som en matris för att göra det möjligt att lägga till ytterligare återanropsfunktioner om så önskas. Om det finns fler än en återanropsfunktion anropas varje funktion i den ordning dess adress visas i matrisen. En null-pekare avslutar matrisen. Det är helt giltigt att ha en tom lista (ingen motringning stöds), i vilket fall motringningsmatrisen har exakt en medlems-en null-pekare.

Prototypen för en återanropsfunktion (som pekas på av en pekare av typen PIMAGE_TLS_CALLBACK) har samma parametrar som en DLL-startpunktsfunktion:

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

Den reserverade parametern ska vara inställd på noll. Parametern Reason kan ha följande värden:

Inställning Värde Beskrivning
DLL_PROCESS_ATTACH
1
En ny process har startat, inklusive den första tråden.
DLL_THREAD_ATTACH
2
En ny tråd har skapats. Det här meddelandet skickas för alla utom den första tråden.
DLL_THREAD_DETACH
3
En tråd är på väg att avslutas. Det här meddelandet skickas för alla utom den första tråden.
DLL_PROCESS_DETACH
0
En process håller på att avslutas, inklusive den ursprungliga tråden.

 

Konfigurationsstrukturen för inläsning (endast avbildning)

Belastningskonfigurationsstrukturen (IMAGE_LOAD_CONFIG_DIRECTORY) användes tidigare i mycket begränsade fall i själva Windows NT-operativsystemet för att beskriva olika funktioner som är för svåra eller för stora för att beskrivas i filhuvudet eller den valfria rubriken på avbildningen. Aktuella versioner av Microsoft Linker och Windows XP och senare versioner av Windows använder en ny version av den här strukturen för 32-bitars x86-baserade system som innehåller reserverad SEH-teknik. Detta ger en lista över säkra strukturerade undantagshanterare som operativsystemet använder under undantagssändning. Om hanteringsadressen finns i en avbildnings VA-intervall och är markerad som reserverad SEH-medveten (d.v.s. IMAGE_DLLCHARACTERISTICS_NO_SEH är tydlig i fältet DllCharacteristics i det valfria huvudet, enligt beskrivningen tidigare), måste hanteraren finnas i listan över kända säkra hanterare för avbildningen. Annars avslutar operativsystemet programmet. Detta hjälper till att förhindra "x86-undantagshanterarkapning" som tidigare har använts för att ta kontroll över operativsystemet.

Microsoft Linker tillhandahåller automatiskt en standardkonfigurationsstruktur för belastning för att inkludera reserverade SEH-data. Om användarkoden redan innehåller en belastningskonfigurationsstruktur måste den innehålla de nya reserverade SEH-fälten. I annat fall kan inte länkaren inkludera reserverade SEH-data och avbildningen är inte markerad som innehåller reserverad SEH.

Läs in konfigurationskatalog

Datakatalogposten för en förreserverad SEH-belastningskonfigurationsstruktur måste ange en viss storlek på belastningskonfigurationsstrukturen eftersom operativsystemets inläsare alltid förväntar sig att det ska vara ett visst värde. I det avseendet är storleken egentligen bara en versionskontroll. För kompatibilitet med Windows XP och tidigare versioner av Windows måste storleken vara 64 för x86-avbildningar.

Läs in konfigurationslayout

Konfigurationsstrukturen för belastning har följande layout för 32-bitars- och 64-bitars PE-filer:

Uppväga Storlek Fält Beskrivning
0
4
Karakteristika
Flaggor som anger attribut för filen, som för närvarande inte används.
4
4
TimeDateStamp
Datum- och tidsstämpelvärde. Värdet representeras i antalet sekunder som har förflutit sedan midnatt (00:00:00), 1 januari 1970, universell koordinerad tid, enligt systemklockan. Tidsstämpeln kan skrivas ut med hjälp av tidsfunktionen C runtime (CRT).
8
2
MajorVersion
Huvudversionsnummer.
10
2
MinorVersion
Delversionsnummer.
12
4
GlobalFlagsClear
De globala inläsningsflaggor som ska rensas för den här processen när inläsaren startar processen.
16
4
GlobalFlagsSet
De globala inläsningsflaggor som ska anges för den här processen när inläsaren startar processen.
20
4
CriticalSectionDefaultTimeout
Standardvärdet för timeout som ska användas för den här processens kritiska avsnitt som överges.
24
4/8
DeCommitFreeBlockThreshold
Minne som måste frigöras innan det returneras till systemet, i byte.
28/32
4/8
DeCommitTotalFreeThreshold
Total mängd ledigt minne i byte.
32/40
4/8
LockPrefixTable
[endast x86] VA för en lista med adresser där LOCK-prefixet används så att de kan ersättas med NOP på enstaka processordatorer.
36/48
4/8
MaximumAllocationSize
Maximal allokeringsstorlek i byte.
40/56
4/8
VirtualMemoryThreshold
Maximal storlek på virtuellt minne i byte.
44/64
4/8
ProcessAffinityMask
Att ange det här fältet till ett värde som inte är noll motsvarar att anropa SetProcessAffinityMask med det här värdet under processens start ( endast.exe)
48/72
4
ProcessHeapFlags
Bearbeta heapflaggor som motsvarar det första argumentet i funktionen HeapCreate. Dessa flaggor gäller för den process heap som skapas under processens start.
52/76
2
CSDVersion
Versionsidentifieraren för Service Pack.
54/78
2
DependentLoadFlags
Standardinläsningsflaggor som används när operativsystemet löser statiskt länkade importer av en modul.
56/80
4/8
EditList
Reserverad för användning av systemet.
60/88
4/8
SecurityCookie
En pekare till en cookie som används av Visual C++ eller GS-implementering.
64/96
4/8
SEHandlerTable
[endast x86] VA för den sorterade tabellen med RVA:er för varje giltig, unik SE-hanterare i avbildningen.
68/104
4/8
SEHandlerCount
[endast x86] Antalet unika hanterare i tabellen.
72/112
4/8
GuardCFCheckFunctionPointer
Den VA där kontrollflödesskyddets kontrollfunktionspekare lagras.
76/120
4/8
GuardCFDispatchFunctionPointer
DEN VA där kontrollflödesskyddets dispatch-function-pekare lagras.
80/128
4/8
GuardCFFunctionTable
VA för den sorterade tabellen med RVA:er för varje Control Flow Guard-funktion i bilden.
84/136
4/8
GuardCFFunctionCount
Antalet unika RVA:er i tabellen ovan.
88/144
4
GuardFlags
Kontrollera Flow Guard-relaterade flaggor.
92/148
12
CodeIntegrity
Kodintegritetsinformation.
104/160
4/8
GuardAddressTakenIatEntryTable
Va-adressen där Control Flow Guard-adressen tog IAT-tabellen lagras.
108/168
4/8
GuardAddressTakenIatEntryCount
Antalet unika RVA:er i tabellen ovan.
112/176
4/8
GuardLongJumpTargetTable
VA:en där kontrollflödesskyddets måltabell för längdhopp lagras.
116/184
4/8
GuardLongJumpTargetCount
Antalet unika RVA:er i tabellen ovan.

 

Fältet GuardFlags innehåller en kombination av en eller flera av följande flaggor och underfält:

  • Modulen utför kontrollflödesintegritetskontroller med hjälp av stöd från systemet.

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • Modulen utför kontrollflödes- och skrivintegritetskontroller.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • Modulen innehåller giltiga målmetadata för kontrollflöde.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • Modulen använder inte /GS-säkerhetscookien.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • Modulen stöder skrivskyddad fördröjningsbelastning i IAT.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • Delayload import table in its own .didat section (with nothing else in it) that can be freely reprotected.

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • Modulen innehåller undertryckt exportinformation. Detta härleder också att den adress som tas IAT-tabellen också finns i belastningskonfigurationen.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • Modulen möjliggör undertryckning av exporter.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • Modulen innehåller longjmp-målinformation.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Maskera för det underfält som innehåller steg för kontrollflödesfunktionens tabellposter (dvs. det ytterligare antalet byte per tabellpost).

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

Dessutom definierar Windows SDK winnt.h-huvudet det här makrot för mängden bitar för att högerförskjuta GuardFlags-värdet för att högerjustera tabellsteget i control Flow Guard-funktionstabellen:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

Avsnittet .rsrc

Resurser indexeras av en binärsorterad trädstruktur på flera nivåer. Den allmänna designen kan innehålla 2**31 nivåer. Enligt konventionen använder Windows dock tre nivåer:

Typnamnsspråk

En serie resurskatalogtabeller relaterar alla nivåer på följande sätt: Varje katalogtabell följs av en serie katalogposter som ger namnet eller identifieraren (ID) för den nivån (typ, namn eller språknivå) och en adress för antingen en databeskrivning eller en annan katalogtabell. Om adressen pekar på en databeskrivning är data ett löv i trädet. Om adressen pekar på en annan katalogtabell visar tabellen katalogposter på nästa nivå nedåt.

Ett lövs typ-, namn- och språk-ID bestäms av sökvägen som tas via katalogtabeller för att nå bladet. Den första tabellen bestämmer typ-ID, den andra tabellen (som pekas på av katalogposten i den första tabellen) bestämmer namn-ID och den tredje tabellen bestämmer Språk-ID.

Den allmänna strukturen i avsnittet .rsrc är:

Data Beskrivning
Resurskatalogtabeller (och resurskatalogposter)
En serie tabeller, en för varje grupp med noder i trädet. Alla noder på den översta nivån (typ) visas i den första tabellen. Poster i den här tabellen pekar på tabeller på andra nivån. Varje träd på andra nivån har samma typ-ID men olika namn-ID:t. Träd på tredje nivån har samma typ- och namn-ID:t men olika språk-ID:t.
Varje enskild tabell följs omedelbart av katalogposter, där varje post har ett namn eller en numerisk identifierare och en pekare till en databeskrivning eller en tabell på nästa lägre nivå.
Resurskatalogsträngar
Två bytesjusterade Unicode-strängar, som fungerar som strängdata som pekas på av katalogposter.
Beskrivning av resursdata
En matris med poster som pekas på av tabeller och som beskriver resursdatas faktiska storlek och plats. Dessa poster är bladen i resursbeskrivningsträdet.
Resursdata
Rådata för resursavsnittet. Storleks- och platsinformationen i fältet Resursdatabeskrivningar avgränsar de enskilda regionerna för resursdata.

 

Resurskatalogtabell

Varje resurskatalogtabell har följande format. Den här datastrukturen bör betraktas som rubriken för en tabell eftersom tabellen faktiskt består av katalogposter (beskrivs i avsnitt 6.9.2, "Resurskatalogposter") och den här strukturen:

Uppväga Storlek Fält Beskrivning
0
4
Karakteristika
Resursflaggor. Det här fältet är reserverat för framtida användning. Den är för närvarande inställd på noll.
4
4
Tids-/datumstämpel
Den tid då resursdata skapades av resurskompilatorn.
8
2
Huvudversion
Huvudversionsnumret som anges av användaren.
10
2
Delversion
Delversionsnumret som anges av användaren.
12
2
Antal namnposter
Antalet katalogposter direkt efter tabellen som använder strängar för att identifiera posterna Typ, Namn eller Språk (beroende på tabellens nivå).
14
2
Antal ID-poster
Antalet katalogposter omedelbart efter de namnposter som använder numeriska ID:n för posterna Typ, Namn eller Språk.

 

Resurskatalogposter

Katalogposterna utgör raderna i en tabell. Varje resurskatalogpost har följande format. Om posten är en namn- eller ID-post anges av resurskatalogtabellen, vilket anger hur många namn- och ID-poster som följer den (kom ihåg att alla namnposter föregår alla ID-poster för tabellen). Alla poster för tabellen sorteras i stigande ordning: Namnposterna efter skiftlägeskänslig sträng och ID-posterna efter numeriskt värde. Förskjutningar är relativa till adressen i IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Mer information finns i Peering Inside the PE: A Tour of the Win32 Portable Executable File Format .

Uppväga Storlek Fält Beskrivning
0
4
Namnförskjutning
Förskjutningen av en sträng som ger posten Typ, Namn eller Språk-ID, beroende på tabellnivå.
0
4
Heltals-ID
Ett 32-bitars heltal som identifierar posten Typ, Namn eller Språk-ID.
4
4
Förskjutning av datainmatning
Hög bit 0. Adress för en resursdatapost (ett löv).
4
4
Förskjutning av underkatalog
Hög bit 1. De lägre 31 bitarna är adressen till en annan resurskatalogtabell (nästa nivå nedåt).

 

Resurskatalogsträng

Resurskatalogsträngsområdet består av Unicode-strängar som är ordjusterade. Dessa strängar lagras tillsammans efter den senaste resurskatalogposten och före den första resursdataposten. Detta minimerar effekten av dessa strängar med variabel längd på justeringen av katalogposterna med fast storlek. Varje resurskatalogsträng har följande format:

Uppväga Storlek Fält Beskrivning
0
2
Längd
Storleken på strängen, inklusive själva längdfältet.
2
variabel
Unicode-sträng
Unicode-strängdata med variabellängd, ordjusterade.

 

Inmatning av resursdata

Varje resursdatapost beskriver en faktisk enhet med rådata i området Resursdata. En resursdatapost har följande format:

Uppväga Storlek Fält Beskrivning
0
4
Data-RVA
Adressen till en resursenhetsdata i området Resursdata.
4
4
Storlek
Storleken, i byte, på resursdata som pekas på av fältet Data RVA.
8
4
Kodsida
Den kodsida som används för att avkoda kodpunktsvärden i resursdata. Vanligtvis skulle kodsidan vara Unicode-kodsidan.
12
4
Reserverad, måste vara 0.

 

Cormeta-avsnittet (endast objekt)

CLR-metadata lagras i det här avsnittet. Den används för att indikera att objektfilen innehåller hanterad kod. Metadataformatet är inte dokumenterat, men kan överlämnas till CLR-gränssnitten för hantering av metadata.

Avsnittet .sxdata

Giltiga undantagshanterare för ett objekt visas i avsnittet .sxdata i objektet. Avsnittet är markerat IMAGE_SCN_LNK_INFO. Den innehåller COFF-symbolindexet för varje giltig hanterare med 4 byte per index.

Kompilatorn markerar dessutom ett COFF-objekt som registrerad SEH genom att sända den absoluta symbolen "@feat.00" med LSB för värdefältet inställt på 1. Ett COFF-objekt utan registrerade SEH-hanterare skulle ha symbolen "@feat.00", men inget .sxdata-avsnittet.

Arkivfilformat (bibliotek)

COFF-arkivformatet tillhandahåller en standardmekanism för lagring av samlingar av objektfiler. Dessa samlingar kallas ofta bibliotek i programmeringsdokumentationen.

De första 8 byteen i ett arkiv består av filsignaturen. Resten av arkivet består av en serie arkivmedlemmar enligt följande:

  • De första och andra medlemmarna är "länkmedlemmar". Var och en av dessa medlemmar har sitt eget format enligt beskrivningen i avsnittet Import Name Type. Vanligtvis placerar en länkare information i dessa arkivmedlemmar. Länkmedlemmarna innehåller katalogen i arkivet.

  • Den tredje medlemmen är "longnames"-medlemmen. Den här valfria medlemmen består av en serie null-avslutade ASCII-strängar där varje sträng är namnet på en annan arkivmedlem.

  • Resten av arkivet består av standardmedlemmar (objektfil). Var och en av dessa medlemmar innehåller innehållet i en objektfil i sin helhet.

Ett arkivmedlemshuvud föregår varje medlem. I följande lista visas den allmänna strukturen för ett arkiv:

Signatur :"!<båge>\n"
Rubrik
Första Linker-medlem
Rubrik
2.Linker-medlem
Rubrik
Longnames-medlem
Rubrik
Innehållet i OBJ-fil 1
(COFF-format)
Rubrik
Innehållet i OBJ-fil 2
(COFF-format)

...

Rubrik
Innehållet i OBJ-fil N
(COFF-format)

Arkivfilsignatur

Arkivfilsignaturen identifierar filtypen. Alla verktyg (till exempel en länkare) som tar en arkivfil som indata kan kontrollera filtypen genom att läsa den här signaturen. Signaturen består av följande ASCII-tecken, där varje tecken nedan representeras bokstavligen, med undantag för det nya (\n) tecknet:

!<arch>\n

Rubriken Windows SDK winnt.h definierar följande makron:

#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>/   "

Arkivera medlemshuvuden

Varje medlem (länkare, longnames eller objektfilsmedlem) föregås av en rubrik. Ett arkivmedlemshuvud har följande format, där varje fält är en ASCII-textsträng som lämnas berättigad och vadderad med blanksteg i slutet av fältet. Det finns inget avslutande null-tecken i något av dessa fält.

Varje medlemshuvud börjar på den första jämna adressen efter slutet av den tidigare arkivmedlemmen, en byte "\n" (IMAGE_ARCHIVE_PAD) kan infogas efter en arkivmedlem för att göra följande medlem starta på en jämn adress.

Uppväga Storlek Fält Beskrivning
0
16
Namn
Namnet på arkivmedlemmen med ett snedstreck (/) som läggs till för att avsluta namnet. Om det första tecknet är ett snedstreck har namnet en särskild tolkning, enligt beskrivningen i följande tabell.
16
12
Datum
Datum och tid då arkivmedlemmen skapades: Detta är ASCII-decimalrepresentationen av antalet sekunder sedan 1/1/1970 UCT.
28
6
Användar-ID
En ASCII-decimalrepresentation av användar-ID:t. Det här fältet innehåller inget meningsfullt värde på Windows-plattformar eftersom Microsoft-verktyg genererar alla tomma värden.
34
6
Grupp-ID
En ASCII-decimalrepresentation av grupp-ID:t. Det här fältet innehåller inget meningsfullt värde på Windows-plattformar eftersom Microsoft-verktyg genererar alla tomma värden.
40
8
Läge
En ASCII-oktal representation av medlemmens filläge. Det här är det ST_MODE värdet från C-körningsfunktionen _wstat.
48
10
Storlek
En ASCII-decimalrepresentation av den totala storleken på arkivmedlemmen, inte med rubrikens storlek.
58
2
Slutet av sidhuvud
De två byteen (0x60 0x0A) i C-strängen "'\n" (IMAGE_ARCHIVE_END).

Fältet Namn har ett av formaten som visas i följande tabell. Som tidigare nämnts lämnas var och en av dessa strängar befogad och vadderad med avslutande blanksteg inom ett fält på 16 byte:

Fältet Namninnehåll Beskrivning
Namn/
Namnet på arkivmedlemmen.
/
Arkivmedlemmen är en av de två länkarna. Båda länkmedlemmarna har det här namnet.
//
Arkivmedlemmen är longnames-medlemmen, som består av en serie null-avslutade ASCII-strängar. Longnames-medlemmen är den tredje arkivmedlemmen och är valfri.
/n
Namnet på arkivmedlemmen finns vid offset n inom longnames-medlemmen. Talet n är decimalrepresentationen av förskjutningen. Till exempel: "/26" anger att namnet på arkivmedlemmen finns 26 byte efter början av longnames-medlemsinnehållet.

 

First Linker-medlem

Namnet på den första länkmedlemmen är "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Den första länkmedlemmen ingår för bakåtkompatibilitet. Det används inte av aktuella länkare, men dess format måste vara korrekt. Den här länkmedlemmen tillhandahåller en katalog med symbolnamn, liksom den andra länkmedlemmen. För varje symbol anger informationen var du hittar den arkivmedlem som innehåller symbolen.

Den första länkmedlemmen har följande format. Den här informationen visas efter rubriken:

Uppväga Storlek Fält Beskrivning
0
4
Antal symboler
Lång osignerad som innehåller antalet indexerade symboler. Det här talet lagras i stor endianskt format. Varje objektfilmedlem definierar vanligtvis en eller flera externa symboler.
4
4 * n
Förskjutningar
En matris med filförskjutningar till arkivmedlemshuvuden, där n är lika med fältet Antal symboler. Varje tal i matrisen är en osignerad lång lagrad i storslutsformat. För varje symbol som namnges i strängtabellen ger motsvarande element i förskjutningsmatrisen platsen för den arkivmedlem som innehåller symbolen.
*
*
Strängtabell
En serie null-avslutade strängar som namnger alla symboler i katalogen. Varje sträng börjar omedelbart efter null-tecknet i föregående sträng. Antalet strängar måste vara lika med värdet för fältet Antal symboler.

 

Elementen i förskjutningsmatrisen måste ordnas i stigande ordning. Detta innebär att symbolerna i strängtabellen måste ordnas enligt ordningen för arkivmedlemmar. Till exempel måste alla symboler i den första objektfilsmedlemmen visas före symbolerna i den andra objektfilen.

Second Linker-medlem

Precis som den första linkermedlemmen har den andra länkmedlemmen namnet "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Även om båda länkmedlemmarna tillhandahåller en katalog med symboler och arkivmedlemmar som innehåller dem, används den andra länkmedlemmen i stället för den första av alla aktuella länkare. Den andra länkmedlemmen innehåller symbolnamn i lexikal ordning, vilket möjliggör snabbare sökning efter namn.

Den andra medlemmen har följande format. Den här informationen visas efter rubriken:

Uppväga Storlek Fält Beskrivning
0
4
Antal medlemmar
En osignerad lång som innehåller antalet arkivmedlemmar.
4
4 * m
Förskjutningar
En matris med filförskjutningar till arkivmedlemshuvuden, ordnade i stigande ordning. Varje förskjutning är en osignerad lång . Talet m är lika med värdet för fältet Antal medlemmar.
*
4
Antal symboler
En lång osignerad som innehåller antalet indexerade symboler. Varje objektfilmedlem definierar vanligtvis en eller flera externa symboler.
*
2 * n
Index
En matris med 1-baserade index (osignerad kort ) som mappar symbolnamn till arkivmedlemsförskjutningar. Talet n är lika med fältet Antal symboler. För varje symbol som namnges i strängtabellen ger motsvarande element i matrisen Index ett index i förskjutningsmatrisen. Förskjutningsmatrisen ger i sin tur platsen för den arkivmedlem som innehåller symbolen.
*
*
Strängtabell
En serie null-avslutade strängar som namnger alla symboler i katalogen. Varje sträng börjar omedelbart efter null-bytet i föregående sträng. Antalet strängar måste vara lika med värdet för fältet Antal symboler. Den här tabellen visar alla symbolnamn i stigande lexikal ordning.

 

Longnames-medlem

Namnet på longnames-medlemmen är "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Longnames-medlemmen är en serie strängar med arkivmedlemsnamn. Ett namn visas bara här när det inte finns tillräckligt med utrymme i fältet Namn (16 byte). Longnames-medlemmen är valfri. Den kan vara tom med bara en rubrik, eller så kan den vara helt frånvarande utan ens en rubrik.

Strängarna är null-avslutade. Varje sträng börjar omedelbart efter null-bytet i föregående sträng.

Importera biblioteksformat

Traditionella importbibliotek, d.v.s. bibliotek som beskriver exporterna från en bild för användning av en annan, följer vanligtvis layouten som beskrivs i avsnitt 7, Arkivfilformat (bibliotek). Den primära skillnaden är att importbiblioteksmedlemmar innehåller pseudoobjektfiler i stället för verkliga filer, där varje medlem innehåller de avsnittsbidrag som krävs för att skapa importtabellerna som beskrivs i avsnitt 6.4, avsnittet .idata Länkaren genererar det här arkivet när du skapar det exporterande programmet.

Avsnittsbidragen för en import kan härledas från en liten uppsättning information. Länkaren kan antingen generera fullständig, utförlig information till importbiblioteket för varje medlem när biblioteket skapas eller skriva endast den kanoniska informationen till biblioteket och låta programmet som senare använder det generera nödvändiga data i farten.

I ett importbibliotek med långt format innehåller en enskild medlem följande information:

  • Arkivmedlemshuvud
  • Filhuvud
  • Avsnittsrubriker
  • Data som motsvarar var och en av avsnittsrubrikerna
  • COFF-symboltabell
  • Strängar

Däremot skrivs ett kort importbibliotek på följande sätt:

  • Arkivmedlemshuvud
  • Importera sidhuvud
  • Null-avslutad importnamnssträng
  • Null-avslutad DLL-namnsträng

Detta är tillräcklig information för att korrekt rekonstruera hela innehållet i medlemmen vid tidpunkten för dess användning.

Importhuvud

Importhuvudet innehåller följande fält och förskjutningar:

Uppväga Storlek Fält Beskrivning
0
2
Sig1
Måste vara IMAGE_FILE_MACHINE_UNKNOWN. Mer information finns i Machine Types.
2
2
Sig2
Måste vara 0xFFFF.
4
2
Version
Strukturversionen.
6
2
Maskin
Det nummer som identifierar typen av måldator. Mer information finns i Machine Types.
8
4
Time-Date stämpel
Tid och datum då filen skapades.
12
4
Datastorlek
Storleken på strängarna som följer rubriken.
16
2
Ordningstal/tips
Antingen ordningstalet eller tipset för importen, som bestäms av värdet i fältet Namntyp.
18
2 bitar
Typ
Importtypen. Specifika värden och beskrivningar finns i importtyp.
3 bitar
Namntyp
Typ av importnamn. Mer information finns i importnamnstyp.
11 bitar
Reserverad
Reserverad, måste vara 0.

 

Den här strukturen följs av två null-avslutade strängar som beskriver den importerade symbolens namn och den DLL som den kom från.

Importtyp

Följande värden definieras för fältet Typ i importhuvudet:

Konstant Värde Beskrivning
IMPORT_OBJECT_CODE
0
Körbar kod.
IMPORT_OBJECT_DATA
1
Data.
IMPORT_OBJECT_CONST
2
Anges som CONST i .def-filen.

Dessa värden används för att avgöra vilka avsnittsbidrag som måste genereras av verktyget som använder biblioteket om det måste komma åt dessa data.

Typ av importnamn

Det null-avslutade importsymbolnamnet följer omedelbart dess associerade importrubrik. Följande värden definieras för fältet Namntyp i importhuvudet. De anger hur namnet ska användas för att generera rätt symboler som representerar importen:

Konstant Värde Beskrivning
IMPORT_OBJECT_ORDINAL 0 Importen sker efter ordningstal. Detta anger att värdet i fältet Ordinal/Hint i importhuvudet är importens ordningstal. Om den här konstanten inte anges ska fältet Ordning/tips alltid tolkas som importens tips.
IMPORT_OBJECT_NAME 1 Importnamnet är identiskt med det offentliga symbolnamnet.
IMPORT_OBJECT_NAME_NOPREFIX 2 Importnamnet är det offentliga symbolnamnet, men hoppar över det inledande namnet ?, @eller eventuellt _.
IMPORT_OBJECT_NAME_UNDECORATE 3 Importnamnet är det offentliga symbolnamnet, men hoppar över inledande ?, @eller eventuellt _, och trunkerar vid första @.

Bilaga A: Beräkna autentiserad PE-bildhash

Flera attributcertifikat förväntas användas för att verifiera bildernas integritet. Det vanligaste är dock Authenticode-signaturen. En Authenticode-signatur kan användas för att kontrollera att relevanta avsnitt i en PE-bildfil inte har ändrats på något sätt från filens ursprungliga formulär. För att utföra den här uppgiften innehåller Authenticode-signaturer något som kallas pe-avbildningshash

Vad är en Authenticode PE Image Hash?

Autentisera PE-avbildningshashen, eller filhashen för kort, liknar en filkontrollsumma eftersom den genererar ett litet värde som relaterar till en fils integritet. En kontrollsumma skapas av en enkel algoritm och används främst för att identifiera minnesfel. Den används alltså för att identifiera om ett minnesblock på disken har gått dåligt och att de värden som lagras där har skadats. En filhash liknar en kontrollsumma eftersom den även identifierar filskada. Men till skillnad från de flesta kontrollsummaalgoritmer är det mycket svårt att ändra en fil så att den har samma filhash som dess ursprungliga (oförändrade) formulär. En kontrollsumma är alltså avsedd att identifiera enkla minnesfel som leder till skador, men en filhash kan användas för att identifiera avsiktliga och till och med subtila ändringar i en fil, till exempel de som introduceras av virus, hackare eller trojanska hästprogram.

I en Authenticode-signatur signeras filhashen digitalt med hjälp av en privat nyckel som endast är känd för filens undertecknare. En programvarukonsument kan verifiera filens integritet genom att beräkna hash-värdet för filen och jämföra den med värdet för signerad hash som finns i den digitala Authenticode-signaturen. Om filhasharna inte matchar har en del av filen som omfattas av PE-avbildningshashen ändrats.

Vad är täckt i en Authenticode PE-avbildningshash?

Det är inte möjligt eller önskvärt att inkludera alla bildfildata i beräkningen av PE-avbildningshashen. Ibland visas helt enkelt oönskade egenskaper (till exempel går det inte att ta bort felsökningsinformation från offentligt publicerade filer). ibland är det helt enkelt omöjligt. Det går till exempel inte att inkludera all information i en bildfil i en Authenticode-signatur och sedan infoga Authenticode-signaturen som innehåller PE-bildhashen i PE-avbildningen och senare kunna generera en identisk PE-bildhash genom att inkludera alla bildfildata i beräkningen igen, eftersom filen nu innehåller den Authenticode-signatur som inte ursprungligen fanns där.

Process för att generera autentiserad PE-avbildningshash

I det här avsnittet beskrivs hur en PE-bildhash beräknas och vilka delar av PE-avbildningen som kan ändras utan att authenticode-signaturen ogiltigförklaras.

Not

PE-avbildningshashen för en specifik fil kan ingå i en separat katalogfil utan att inkludera ett attributcertifikat i den hashade filen. Detta är relevant eftersom det blir möjligt att ogiltigförklara PE-avbildningshashen i en Authenticode-signerad katalogfil genom att ändra en PE-avbildning som faktiskt inte innehåller en Authenticode-signatur.

Alla data i avsnitt i PE-avbildningen som anges i avsnittstabellen hashas i sin helhet förutom följande undantagsintervall:

  • Fältet CheckSum för filen i de Windows-specifika fälten i det valfria huvudet. Den här kontrollsumman innehåller hela filen (inklusive eventuella attributcertifikat i filen). Med all sannolikhet skiljer sig kontrollsumman från det ursprungliga värdet när du har infogat Authenticode-signaturen.

  • Information som rör attributcertifikat. De områden i PE-avbildningen som är relaterade till Authenticode-signaturen ingår inte i beräkningen av PE-bildhash eftersom Authenticode-signaturer kan läggas till eller tas bort från en bild utan att bildens övergripande integritet påverkas. Det här är inget problem eftersom det finns användarscenarier som är beroende av att pe-avbildningar signeras igen eller att en tidsstämpel läggs till. Authenticode undantar följande information från hashberäkningen:

    • Fältet Certifikattabell i de valfria huvuddatakatalogerna.

    • Certifikattabellen och motsvarande certifikat som pekas på av fältet Certifikattabell som visas omedelbart ovan.

    För att beräkna PE-avbildningshashen beställer Authenticode de avsnitt som anges i avsnittstabellen efter adressintervall och hashar sedan den resulterande sekvensen av byte och skickar över undantagsintervallen.

  • Information efter slutet av det sista avsnittet. Området efter det sista avsnittet (definierat av högsta förskjutning) hashas inte. Det här området innehåller ofta felsökningsinformation. Felsökningsinformation kan i allmänhet betraktas som rådgivning för felsökningsprogram. det påverkar inte den faktiska integriteten för det körbara programmet. Det är bokstavligen möjligt att ta bort felsökningsinformation från en bild när en produkt har levererats och inte påverka programmets funktioner. I själva verket görs detta ibland som ett diskbesparande mått. Det är värt att notera att felsökningsinformation som finns i de angivna avsnitten i PE-avbildningen inte kan tas bort utan att Authenticode-signaturen ogiltigförklaras.

Du kan använda verktygen makecert och signtool i Windows Platform SDK för att experimentera med att skapa och verifiera Authenticode-signaturer. Mer information finns i Referens nedan.

Referenser

Nedladdningar och verktyg för Windows (inklusive Windows SDK)

Skapa, visa och hantera certifikat

Kernel-Mode genomgång av kodsignering (.doc)

SignTool

Windows Authenticode Portable Executable Signature Format (.docx)

ImageHlp Functions