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
- MS-DOS Stub (endast bild)
- signatur (endast avbildning)
- COFF-filhuvud (objekt och bild)
- valfritt sidhuvud (endast bild)
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
- avsnittsdata
- COFF-flyttningar (endast objekt)
- COFF-radnummer (inaktuella)
- COFF-symboltabell
- extra symbolposter
- COFF-strängtabell
- attributcertifikattabellen (endast avbildning)
- Delay-Load importera tabeller (endast avbildning)
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:
- Lägg till det första attributcertifikatets dwLength-värde i startförskjutningen.
- Avrunda värdet från steg 1 upp till närmaste 8 byte-multipel för att hitta förskjutningen av den andra attributcertifikatposten.
- 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.
- 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
- felsökningsavsnittet
- .drectve-avsnittet (endast objekt)
- avsnittet .edata (endast bild)
- avsnittet .idata
- avsnittet .pdata
- .reloc-avsnittet (endast bild)
- avsnittet .tls
- konfigurationsstrukturen för belastning (endast avbildning)
- avsnittet .rsrc
- .cormeta-avsnittet (endast objekt)
- avsnittet .sxdata
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:
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.
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.
Inläsaren tilldelar värdet för TLS-indexet till den plats som angavs i fältet Indexadress.
Den körbara koden hämtar TLS-indexet och även platsen för TLS-matrisen.
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.
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)
- Arkivera filsignatur
- Arkivera medlemshuvuden
- First Linker-medlem
- second linker member
- Longnames Member
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)
Windows Authenticode Portable Executable Signature Format (.docx)