Condividi tramite


Formato PE

Questa specifica descrive la struttura dei file eseguibili (immagine) e dei file oggetto nella famiglia di sistemi operativi Windows. Questi file sono denominati rispettivamente file PE (Portable Executable) e COMMON Object File Format (COFF).

Nota

Questo documento viene fornito per facilitare lo sviluppo di strumenti e applicazioni per Windows, ma non è garantito che sia una specifica completa in tutti i confronti. Microsoft si riserva il diritto di modificare il documento senza preavviso.

Questa revisione di Microsoft Portable Executable e Common Object File Format Specification sostituisce tutte le revisioni precedenti di questa specifica.

Concetti generali

Questo documento specifica la struttura dei file eseguibili (immagine) e dei file oggetto nella famiglia di sistemi operativi Microsoft Windows. Questi file sono denominati rispettivamente file PE (Portable Executable) e COMMON Object File Format (COFF). Il nome "Portable Executable" si riferisce al fatto che il formato non è specifico dell'architettura.

Alcuni concetti visualizzati in questa specifica sono descritti nella tabella seguente:

Nome Descrizione
certificato attributo
Certificato utilizzato per associare istruzioni verificabili a un'immagine. Una serie di istruzioni verificabili diverse può essere associata a un file; uno dei più utili è un'istruzione da parte di un produttore di software che indica quale digest del messaggio dell'immagine deve essere. Un digest del messaggio è simile a un checksum, ad eccezione del fatto che è estremamente difficile da forgiare. Pertanto, è molto difficile modificare un file per avere lo stesso digest del messaggio del file originale. L'istruzione può essere verificata come eseguita dal produttore usando schemi di crittografia a chiave pubblica o privata. Questo documento descrive i dettagli sui certificati degli attributi diversi da consentire l'inserimento nei file di immagine.
data/ora
Timbro utilizzato per scopi diversi in diverse posizioni in un file PE o COFF. Nella maggior parte dei casi, il formato di ogni stamp è uguale a quello usato dalle funzioni temporali nella libreria di runtime C. Per le eccezioni, vedere il descrittore di IMAGE_DEBUG_TYPE_REPRO in Tipo di debug. Se il valore del timbro è 0 o 0xFFFFFFFF, non rappresenta un indicatore di data/ora reale o significativo.
puntatore file
Posizione di un elemento all'interno del file stesso, prima di essere elaborato dal linker (nel caso dei file oggetto) o dal caricatore (nel caso dei file di immagine). In altre parole, si tratta di una posizione all'interno del file archiviato su disco.
Linker
Riferimento al linker fornito con Microsoft Visual Studio.
file oggetto
File assegnato come input al linker. Il linker produce un file di immagine, che a sua volta viene usato come input dal caricatore. Il termine "file oggetto" non implica necessariamente alcuna connessione alla programmazione orientata agli oggetti.
riservato, deve essere 0
Descrizione di un campo che indica che il valore del campo deve essere zero per i generatori e i consumer devono ignorare il campo.
Indirizzo virtuale relativo (RVA)
In un file di immagine questo è l'indirizzo di un elemento dopo il caricamento in memoria, con l'indirizzo di base del file di immagine sottratto da esso. L'RVA di un elemento è quasi sempre diverso dalla posizione all'interno del file su disco (puntatore file).
In un file oggetto, un'appliance virtuale di controllo di accesso è meno significativa perché i percorsi di memoria non vengono assegnati. In questo caso, un RVA è un indirizzo all'interno di una sezione (descritta più avanti in questa tabella), a cui viene successivamente applicata una rilocazione durante il collegamento. Per semplicità, un compilatore deve semplicemente impostare la prima RVA in ogni sezione su zero.
sezione
Unità di base di codice o dati all'interno di un file PE o COFF. Ad esempio, tutto il codice in un file oggetto può essere combinato all'interno di una singola sezione o (a seconda del comportamento del compilatore) ogni funzione può occupare la propria sezione. Con altre sezioni, il sovraccarico del file è maggiore, ma il linker è in grado di collegarsi in modo più selettivo nel codice. Una sezione è simile a un segmento nell'architettura Intel 8086. Tutti i dati non elaborati in una sezione devono essere caricati in modo contiguo. Inoltre, un file di immagine può contenere una serie di sezioni, ad esempio .tls o .reloc , che hanno scopi speciali.
Indirizzo virtuale (VA)
Uguale a RVA, ad eccezione del fatto che l'indirizzo di base del file di immagine non viene sottratto. L'indirizzo viene chiamato VA perché Windows crea uno spazio va distinto per ogni processo, indipendentemente dalla memoria fisica. Per quasi tutti gli scopi, un VA deve essere considerato solo un indirizzo. Un'appliance virtuale di valutazione non è prevedibile come un'appliance virtuale di rete perché il caricatore potrebbe non caricare l'immagine nella posizione preferita.

Panoramica

L'elenco seguente descrive il formato eseguibile di Microsoft PE, con la base dell'intestazione dell'immagine nella parte superiore. La sezione dall'intestazione EXE compatibile MS-DOS 2.0 fino alla sezione inutilizzata appena prima dell'intestazione PE è la sezione MS-DOS 2.0 e viene usata solo per la compatibilità MS-DOS.

  • Intestazione EXE compatibile con MS-DOS 2.0

  • inutilizzato

  • Identificatore OEM

    Informazioni OEM

    Offset dell'intestazione PE

  • Programma stub MS-DOS 2.0 e tabella di rilocazione

  • inutilizzato

  • Intestazione PE (allineata al limite a 8 byte)

  • Intestazioni di sezione

  • Pagine immagine:

    importare informazioni

    esportare informazioni

    rilocazione di base

    informazioni sulle risorse

L'elenco seguente descrive il formato del modulo a oggetti COFF Microsoft:

  • Intestazione MICROSOFT COFF

  • Intestazioni di sezione

  • Dati non elaborati:

    codice

    data

    informazioni di debug

    Rilocazioni

Intestazioni di file

L'intestazione del file PE è costituita da uno stub Microsoft MS-DOS, dalla firma PE, dall'intestazione del file COFF e da un'intestazione facoltativa. Un'intestazione di file di oggetto COFF è costituita da un'intestazione di file COFF e da un'intestazione facoltativa. In entrambi i casi, le intestazioni del file sono seguite immediatamente dalle intestazioni di sezione.

Stub MS-DOS (solo immagine)

Lo stub MS-DOS è un'applicazione valida eseguita in MS-DOS. Viene posizionato sulla parte anteriore dell'immagine EXE. Il linker inserisce qui uno stub predefinito, che stampa il messaggio "Impossibile eseguire questo programma in modalità DOS" quando l'immagine viene eseguita in MS-DOS. L'utente può specificare uno stub diverso usando l'opzione del linker /STUB.

Nel percorso 0x3c, lo stub ha l'offset del file alla firma PE. Queste informazioni consentono a Windows di eseguire correttamente il file di immagine, anche se ha uno stub MS-DOS. Questo offset di file viene posizionato nella posizione 0x3c durante il collegamento.

Firma (solo immagine)

Dopo lo stub MS-DOS, in corrispondenza dell'offset del file specificato in corrispondenza dell'offset 0x3c, è una firma a 4 byte che identifica il file come file di immagine di formato PE. Questa firma è "PE\0\0" (le lettere "P" e "E" seguite da due byte Null).

Intestazione file COFF (oggetto e immagine)

All'inizio di un file oggetto, o immediatamente dopo la firma di un file di immagine, è un'intestazione di file COFF standard nel formato seguente. Si noti che il caricatore di Windows limita il numero di sezioni a 96.

Contropartita Dimensione Campo Descrizione
0
2
Macchina
Numero che identifica il tipo di computer di destinazione. Per altre informazioni, vedere Tipi di computer.
2
2
NumberOfSections
Numero di sezioni. Indica la dimensione della tabella della sezione che segue immediatamente le intestazioni.
4
4
TimeDateStamp
I 32 bit bassi del numero di secondi dalle 00:00 del 1° gennaio 1970 (un valore di runtime C time_t), che indica quando è stato creato il file.
8
4
PointerToSymbolTable
Offset del file della tabella dei simboli COFF oppure zero se non è presente alcuna tabella dei simboli COFF. Questo valore deve essere zero per un'immagine perché le informazioni di debug COFF sono deprecate.
12
4
NumberOfSymbols
Numero di voci nella tabella dei simboli. Questi dati possono essere usati per individuare la tabella di stringhe che segue immediatamente la tabella dei simboli. Questo valore deve essere zero per un'immagine perché le informazioni di debug COFF sono deprecate.
16
2
SizeOfOptionalHeader
Dimensioni dell'intestazione facoltativa, necessaria per i file eseguibili, ma non per i file oggetto. Questo valore deve essere zero per file oggetto. Per una descrizione del formato di intestazione, vedere Intestazione facoltativa (solo immagine).
18
2
Caratteristiche
Flag che indicano gli attributi del file. Per valori di flag specifici, vedere Caratteristiche.

Tipi di computer

Il campo Computer ha uno dei valori seguenti, che specificano il tipo di CPU. Un file di immagine può essere eseguito solo nel computer specificato o in un sistema che emula il computer specificato.

Costante valore Descrizione
IMAGE_FILE_MACHINE_UNKNOWN
0x0
Si presuppone che il contenuto di questo campo sia applicabile a qualsiasi tipo di computer
IMAGE_FILE_MACHINE_ALPHA
0x184
Alpha AXP, spazio indirizzi a 32 bit
IMAGE_FILE_MACHINE_ALPHA64
0x284
Alfa 64, spazio indirizzi a 64 bit
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33
IMAGE_FILE_MACHINE_AMD64
0x8664
x64
IMAGE_FILE_MACHINE_ARM
0x1c0
ARM little endian
IMAGE_FILE_MACHINE_ARM64
0xaa64
ARM64 little endian
IMAGE_FILE_MACHINE_ARMNT
0x1c4
Arm Thumb-2 little endian
IMAGE_FILE_MACHINE_AXP64
0x284
AXP 64 (uguale a Alpha 64)
IMAGE_FILE_MACHINE_EBC
0xebc
Codice byte EFI
IMAGE_FILE_MACHINE_I386
0x14c
Processori Intel 386 o versioni successive e processori compatibili
IMAGE_FILE_MACHINE_IA64
0x200
Famiglia di processori Intel Itanium
IMAGE_FILE_MACHINE_LOONGARCH32
0x6232
Famiglia di processori LoongArch a 32 bit
IMAGE_FILE_MACHINE_LOONGARCH64
0x6264
Famiglia di processori LoongArch a 64 bit
IMAGE_FILE_MACHINE_M32R
0x9041
Kamishi M32R little endian
IMAGE_FILE_MACHINE_MIPS16
0x266
MIPS16
IMAGE_FILE_MACHINE_MIPSFPU
0x366
MIPS con FPU
IMAGE_FILE_MACHINE_MIPSFPU16
0x466
MIPS16 con FPU
IMAGE_FILE_MACHINE_POWERPC
0x1f0
Power PC little endian
IMAGE_FILE_MACHINE_POWERPCFP
0x1f1
Power PC con supporto a virgola mobile
IMAGE_FILE_MACHINE_R4000
0x166
MIPS little endian
IMAGE_FILE_MACHINE_RISCV32
0x5032
Spazio indirizzi RISC-V a 32 bit
IMAGE_FILE_MACHINE_RISCV64
0x5064
Spazio indirizzi RISC-V a 64 bit
IMAGE_FILE_MACHINE_RISCV128
0x5128
Spazio indirizzi RISC-V a 128 bit
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
Pollice
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS little-endian WCE v2

Caratteristiche

Il campo Caratteristiche contiene flag che indicano gli attributi dell'oggetto o del file di immagine. Sono attualmente definiti i flag seguenti:

Flag valore Descrizione
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Solo immagine, Windows CE e Microsoft Windows NT e versioni successive. Ciò indica che il file non contiene rilocazione di base e deve pertanto essere caricato in corrispondenza dell'indirizzo di base preferito. Se l'indirizzo di base non è disponibile, il caricatore segnala un errore. Il comportamento predefinito del linker consiste nello rimuovere le rilozioni di base dai file eseguibili (EXE).
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
Solo immagine. Ciò indica che il file di immagine è valido e può essere eseguito. Se questo flag non è impostato, indica un errore del linker.
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004
I numeri di riga COFF sono stati rimossi. Questo flag è deprecato e deve essere zero.
IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008
Le voci della tabella dei simboli COFF per i simboli locali sono state rimosse. Questo flag è deprecato e deve essere zero.
IMAGE_FILE_AGGRESSIVE_WS_TRIM
0x0010
Obsoleta. Tagliare in modo aggressivo il working set. Questo flag è deprecato per Windows 2000 e versioni successive e deve essere zero.
IMAGE_FILE_LARGE_ADDRESS_ AWARE
0x0020
L'applicazione può gestire > indirizzi da 2 GB.
0x0040
Questo flag è riservato per uso futuro.
IMAGE_FILE_BYTES_REVERSED_LO
0x0080
Little endian: il bit meno significativo (LSB) precede il bit più significativo (MSB) in memoria. Questo flag è deprecato e deve essere zero.
IMAGE_FILE_32BIT_MACHINE
0x0100
Il computer si basa su un'architettura di parole a 32 bit.
IMAGE_FILE_DEBUG_STRIPPED
0x0200
Le informazioni di debug vengono rimosse dal file di immagine.
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP
0x0400
Se l'immagine è su supporti rimovibili, caricarla completamente e copiarla nel file di scambio.
IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800
Se l'immagine si trova su supporti di rete, caricarla completamente e copiarla nel file di scambio.
IMAGE_FILE_SYSTEM
0x1000
Il file di immagine è un file di sistema, non un programma utente.
IMAGE_FILE_DLL
0x2000
Il file di immagine è una libreria a collegamento dinamico (DLL). Tali file sono considerati file eseguibili per quasi tutti gli scopi, anche se non possono essere eseguiti direttamente.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000
Il file deve essere eseguito solo in un computer uniprocessore.
IMAGE_FILE_BYTES_REVERSED_HI
0x8000
Big endian: msb precede l'LSB in memoria. Questo flag è deprecato e deve essere zero.

Intestazione facoltativa (solo immagine)

Ogni file di immagine ha un'intestazione facoltativa che fornisce informazioni al caricatore. Questa intestazione è facoltativa nel senso che alcuni file (in particolare, i file oggetto) non lo hanno. Per i file di immagine, questa intestazione è obbligatoria. Un file oggetto può avere un'intestazione facoltativa, ma in genere questa intestazione non ha alcuna funzione in un file oggetto, tranne per aumentarne le dimensioni.

Si noti che le dimensioni dell'intestazione facoltativa non sono fisse. Il campo SizeOfOptionalHeader nell'intestazione COFF deve essere utilizzato per verificare che un probe nel file per una determinata directory di dati non vada oltre SizeOfOptionalHeader. Per altre informazioni, vedere Intestazione file COFF (oggetto e immagine).

Il campo NumberOfRvaAndSizes dell'intestazione facoltativa deve essere usato anche per garantire che nessun probe per una determinata voce di directory dati vada oltre l'intestazione facoltativa. Inoltre, è importante convalidare il numero magic di intestazione facoltativo per la compatibilità del formato.

Il numero magic dell'intestazione facoltativo determina se un'immagine è un eseguibile PE32 o PE32+.

Numero magico Formato PE
0x10b
PE32
0x20b
PE32+

Le immagini PE32+ consentono uno spazio indirizzi a 64 bit, limitando al tempo stesso le dimensioni dell'immagine a 2 gigabyte. Le altre modifiche PE32+ vengono affrontate nelle rispettive sezioni.

L'intestazione facoltativa ha tre parti principali.

Offset (PE32/PE32+) Dimensioni (PE32/PE32+) Parte intestazione Descrizione
0
28/24
Campi standard
Campi definiti per tutte le implementazioni di COFF, incluso UNIX.
28/24
68/88
Campi specifici di Windows
Campi aggiuntivi per supportare funzionalità specifiche di Windows (ad esempio, sottosistemi).
96/112
Variabile
Directory dei dati
Coppie di indirizzi/dimensioni per tabelle speciali presenti nel file di immagine e usate dal sistema operativo , ad esempio la tabella di importazione e la tabella di esportazione.

Campi standard intestazione facoltativi (solo immagine)

I primi otto campi dell'intestazione facoltativa sono campi standard definiti per ogni implementazione di COFF. Questi campi contengono informazioni generali utili per il caricamento e l'esecuzione di un file eseguibile. Sono invariati per il formato PE32+.

Contropartita Dimensione Campo Descrizione
0
2
Magia
Intero senza segno che identifica lo stato del file di immagine. Il numero più comune è 0x10B, che lo identifica come un normale file eseguibile. 0x107 lo identifica come immagine ROM e 0x20B lo identifica come eseguibile PE32+.
2
1
MajorLinkerVersion
Numero di versione principale del linker.
3
1
MinorLinkerVersion
Numero di versione secondaria del linker.
4
4
SizeOfCode
Dimensioni della sezione del codice (testo) o della somma di tutte le sezioni di codice se sono presenti più sezioni.
8
4
SizeOfInitializedData
Dimensioni della sezione dei dati inizializzati o somma di tutte le sezioni di questo tipo se sono presenti più sezioni di dati.
12
4
SizeOfUninitializedData
Dimensioni della sezione dei dati non inizializzati (BSS) o della somma di tutte queste sezioni se sono presenti più sezioni BSS.
16
4
AddressOfEntryPoint
Indirizzo del punto di ingresso relativo alla base dell'immagine quando il file eseguibile viene caricato in memoria. Per le immagini del programma, questo è l'indirizzo iniziale. Per i driver di dispositivo, si tratta dell'indirizzo della funzione di inizializzazione. Un punto di ingresso è facoltativo per le DLL. Quando non è presente alcun punto di ingresso, questo campo deve essere zero.
20
4
BaseOfCode
Indirizzo relativo alla base dell'immagine della sezione iniziale del codice quando viene caricato in memoria.

PE32 contiene questo campo aggiuntivo, assente in PE32+, che segue BaseOfCode.

Contropartita Dimensione Campo Descrizione
24
4
BaseOfData
Indirizzo relativo alla base dell'immagine della sezione iniziale dei dati quando viene caricata in memoria.

Campi specifici dell'intestazione facoltativa di Windows (solo immagine)

I 21 campi successivi sono un'estensione del formato di intestazione facoltativo COFF. Contengono informazioni aggiuntive richieste dal linker e dal caricatore in Windows.

Offset (PE32/ PE32+) Dimensioni (PE32/ PE32+) Campo Descrizione
28/24
4/8
ImageBase
Indirizzo preferito del primo byte dell'immagine quando viene caricato in memoria; deve essere un multiplo di 64 K. Il valore predefinito per le DLL è 0x10000000. Il valore predefinito per gli exes di Windows CE è 0x00010000. Il valore predefinito per Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 e Windows Me è 0x00400000.
32/32
4
SectionAlignment
Allineamento (in byte) delle sezioni quando vengono caricate in memoria. Deve essere maggiore o uguale a FileAlignment. Il valore predefinito è la dimensione della pagina per l'architettura.
36/36
4
FileAlignment
Fattore di allineamento (in byte) usato per allineare i dati non elaborati delle sezioni nel file di immagine. Il valore deve essere una potenza di 2 tra 512 e 64 K, inclusi. Il valore predefinito è 512. Se SectionAlignment è minore delle dimensioni della pagina dell'architettura, FileAlignment deve corrispondere a SectionAlignment.
40/40
2
MajorOperatingSystemVersion
Numero di versione principale del sistema operativo richiesto.
42/42
2
MinorOperatingSystemVersion
Numero di versione secondaria del sistema operativo richiesto.
44/44
2
MajorImageVersion
Numero di versione principale dell'immagine.
46/46
2
MinorImageVersion
Numero di versione secondaria dell'immagine.
48/48
2
MajorSubsystemVersion
Numero di versione principale del sottosistema.
50/50
2
MinorSubsystemVersion
Numero di versione secondaria del sottosistema.
52/52
4
Win32VersionValue
Riservato, deve essere zero.
56/56
4
SizeOfImage
Dimensioni (in byte) dell'immagine, incluse tutte le intestazioni, perché l'immagine viene caricata in memoria. Deve essere un multiplo di SectionAlignment.
60/60
4
SizeOfHeaders
Dimensioni combinate di uno stub MS-DOS, intestazione PE e intestazioni di sezione arrotondate fino a un multiplo di FileAlignment.
64/64
4
Checksum
Checksum del file di immagine. L'algoritmo per il calcolo del checksum viene incorporato in IMAGHELP.DLL. Di seguito viene verificata la convalida in fase di caricamento: tutti i driver, qualsiasi DLL caricata in fase di avvio e qualsiasi DLL caricata in un processo windows critico.
68/68
2
Sottosistema
Sottosistema necessario per eseguire l'immagine. Per altre informazioni, vedere Sottosistema Windows.
70/70
2
DllCharacteristics
Per altre informazioni, vedere Caratteristiche dll più avanti in questa specifica.
72/72
4/8
SizeOfStackReserve
Dimensioni dello stack da riservare. Viene eseguito il commit solo di SizeOfStackCommit; il resto viene reso disponibile una pagina alla volta fino a quando non viene raggiunta la dimensione della riserva.
76/80
4/8
SizeOfStackCommit
Dimensioni dello stack di cui eseguire il commit.
80/88
4/8
SizeOfHeapReserve
Dimensioni dello spazio dell'heap locale da riservare. Viene eseguito il commit solo di SizeOfHeapCommit; il resto viene reso disponibile una pagina alla volta fino a quando non viene raggiunta la dimensione della riserva.
84/96
4/8
SizeOfHeapCommit
Dimensioni dello spazio dell'heap locale di cui eseguire il commit.
88/104
4
LoaderFlags
Riservato, deve essere zero.
92/108
4
NumberOfRvaAndSizes
Numero di voci della directory dati nella parte restante dell'intestazione facoltativa. Ognuna descrive una posizione e una dimensione.
Sottosistema Windows

I valori seguenti definiti per il campo Sottosistema dell'intestazione facoltativa determinano il sottosistema Windows (se presente) necessario per eseguire l'immagine.

Costante valore Descrizione
IMAGE_SUBSYSTEM_UNKNOWN
0
Sottosistema sconosciuto
IMAGE_SUBSYSTEM_NATIVE
1
Driver di dispositivo e processi nativi di Windows
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
Sottosistema interfaccia utente grafica (GUI) di Windows
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
Sottosistema di caratteri Windows
IMAGE_SUBSYSTEM_OS2_CUI
5
Sottosistema di caratteri os/2
IMAGE_SUBSYSTEM_POSIX_CUI
7
Sottosistema di caratteri Posix
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
8
Driver Win9x nativo
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Un'applicazione EFI (Extensible Firmware Interface)
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER
11
Un driver EFI con servizi di avvio
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER
12
Un driver EFI con servizi di runtime
IMAGE_SUBSYSTEM_EFI_ROM
13
Un'immagine ROM EFI
IMAGE_SUBSYSTEM_XBOX
14
XBOX
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
Applicazione di avvio di Windows.
Caratteristiche DLL

I valori seguenti sono definiti per il campo DllCharacteristics dell'intestazione facoltativa.

Costante valore Descrizione
0x0001
Riservato, deve essere zero.
0x0002
Riservato, deve essere zero.
0x0004
Riservato, deve essere zero.
0x0008
Riservato, deve essere zero.
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
L'immagine può gestire uno spazio indirizzi virtuale a entropia a 64 bit elevato.
IMAGE_DLLCHARACTERISTICS_
DYNAMIC_BASE
0x0040
La DLL può essere rilocata in fase di caricamento.
IMAGE_DLLCHARACTERISTICS_
FORCE_INTEGRITY
0x0080
Vengono applicati i controlli di integrità del codice.
IMAGE_DLLCHARACTERISTICS_
NX_COMPAT
0x0100
L'immagine è compatibile con NX.
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION
0x0200
Riconoscimento dell'isolamento, ma non isolare l'immagine.
IMAGE_DLLCHARACTERISTICS_ NO_SEH
0x0400
Non usa la gestione dell'eccezione strutturata (SE). In questa immagine non è possibile chiamare alcun gestore SE.
IMAGE_DLLCHARACTERISTICS_ NO_BIND
0x0800
Non associare l'immagine.
IMAGE_DLLCHARACTERISTICS_APPCONTAINER
0x1000
L'immagine deve essere eseguita in un AppContainer.
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER
0x2000
Driver WDM.
IMAGE_DLLCHARACTERISTICS_GUARD_CF
0x4000
L'immagine supporta Control Flow Guard.
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE
0x8000
Compatibile con Terminal Server.

Directory dati intestazione facoltative (solo immagine)

Ogni directory di dati fornisce l'indirizzo e le dimensioni di una tabella o di una stringa usata da Windows. Queste voci della directory di dati vengono tutte caricate in memoria in modo che il sistema possa usarle in fase di esecuzione. Una directory dati è un campo a 8 byte con la dichiarazione seguente:

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

Il primo campo VirtualAddress è in realtà l'RVA della tabella. L'RVA è l'indirizzo della tabella rispetto all'indirizzo di base dell'immagine quando viene caricata la tabella. Il secondo campo restituisce le dimensioni in byte. Le directory dati, che costituiscono l'ultima parte dell'intestazione facoltativa, sono elencate nella tabella seguente.

Si noti che il numero di directory non è fisso. Prima di cercare una directory specifica, controllare il campo NumberOfRvaAndSizes nell'intestazione facoltativa.

Inoltre, non presupporre che le RVA in questa tabella puntino all'inizio di una sezione o che le sezioni che contengono tabelle specifiche abbiano nomi specifici.

Offset (PE/PE32+) Dimensione Campo Descrizione
96/112
8
Esporta tabella
Indirizzo e dimensioni della tabella di esportazione. Per altre informazioni, vedere sezione .edata (solo immagine).
104/120
8
Importa tabella
Indirizzo e dimensioni della tabella di importazione. Per altre informazioni, vedere La sezione .idata.
112/128
8
Tabella risorse
Indirizzo e dimensioni della tabella delle risorse. Per altre informazioni, vedere La sezione .rsrc.
120/136
8
Tabella eccezioni
Indirizzo e dimensioni della tabella delle eccezioni. Per altre informazioni, vedere La sezione .pdata.
128/144
8
Tabella dei certificati
Indirizzo e dimensioni della tabella dei certificati dell'attributo. Per altre informazioni, vedere Tabella dei certificati attributo (solo immagine).
136/152
8
Tabella di rilocazione di base
Indirizzo e dimensioni della tabella di rilocazione di base. Per altre informazioni, vedere la sezione .reloc (solo immagine).
144/160
8
Debug
Indirizzo e dimensioni iniziali dei dati di debug. Per altre informazioni, vedere La sezione .debug.
152/168
8
Architettura
Riservato, deve essere 0
160/176
8
Ptr globale
RVA del valore da archiviare nel registro del puntatore globale. Il membro delle dimensioni di questa struttura deve essere impostato su zero.
168/184
8
Tabella TLS
L'indirizzo e le dimensioni della tabella di archiviazione locale del thread (TLS). Per altre informazioni, vedere la sezione .tls.
176/192
8
Load Config Table
Indirizzo e dimensioni della tabella di configurazione del carico. Per altre informazioni, vedere La struttura di configurazione del caricamento (solo immagine).
184/200
8
Importazione associata
Indirizzo e dimensioni della tabella di importazione associati.
192/208
8
IAT
Indirizzo e dimensioni della tabella degli indirizzi di importazione. Per altre informazioni, vedere Importa tabella indirizzi.
200/216
8
Descrittore di importazione ritardata
Indirizzo e dimensioni del descrittore di importazione ritardato. Per altre informazioni, vedere Tabelle di importazione con caricamento ritardato (solo immagine).
208/224
8
Intestazione del runtime CLR
Indirizzo e dimensioni dell'intestazione del runtime CLR. Per altre informazioni, vedere la sezione .cormeta (solo oggetto).
216/232
8
Riservato, deve essere zero

La voce Tabella certificati punta a una tabella di certificati di attributo. Questi certificati non vengono caricati in memoria come parte dell'immagine. Di conseguenza, il primo campo di questa voce, che in genere è un RVA, è invece un puntatore di file.

Tabella sezione (intestazioni di sezione)

Ogni riga della tabella di sezione è, in effetti, un'intestazione di sezione. Questa tabella segue immediatamente l'intestazione facoltativa, se presente. Questa posizione è necessaria perché l'intestazione del file non contiene un puntatore diretto alla tabella di sezione. La posizione della tabella di sezione viene invece determinata calcolando la posizione del primo byte dopo le intestazioni. Assicurarsi di usare le dimensioni dell'intestazione facoltativa come specificato nell'intestazione del file.

Il numero di voci nella tabella delle sezioni viene assegnato dal campo NumberOfSections nell'intestazione del file. Le voci nella tabella delle sezioni sono numerate a partire da una (1). Le voci della sezione relativa al codice e alla memoria dei dati sono nell'ordine scelto dal linker.

In un file di immagine, le VA per le sezioni devono essere assegnate dal linker in modo che siano in ordine crescente e adiacenti e che siano multiple del valore SectionAlignment nell'intestazione facoltativa.

Ogni intestazione di sezione (voce della tabella di sezione) ha il formato seguente, per un totale di 40 byte per voce.

Contropartita Dimensione Campo Descrizione
0
8
Nome
Stringa con codifica UTF-8 con riempimento Null a 8 byte. Se la stringa è lunga esattamente 8 caratteri, non è presente alcuna terminazione null. Per i nomi più lunghi, questo campo contiene una barra (/) seguita da una rappresentazione ASCII di un numero decimale che rappresenta un offset nella tabella di stringhe. Le immagini eseguibili non usano una tabella di stringhe e non supportano nomi di sezione più lunghi di 8 caratteri. I nomi lunghi nei file oggetto vengono troncati se vengono generati in un file eseguibile.
8
4
VirtualSize
Dimensioni totali della sezione quando vengono caricate in memoria. Se questo valore è maggiore di SizeOfRawData, la sezione viene riempita a zero. Questo campo è valido solo per le immagini eseguibili e deve essere impostato su zero per i file oggetto.
12
4
VirtualAddress
Per le immagini eseguibili, l'indirizzo del primo byte della sezione rispetto alla base dell'immagine quando la sezione viene caricata in memoria. Per i file oggetto, questo campo è l'indirizzo del primo byte prima che venga applicata la rilocazione; per semplicità, i compilatori devono impostare questo valore su zero. In caso contrario, è un valore arbitrario sottratto dagli offset durante la rilocazione.
16
4
SizeOfRawData
Dimensioni della sezione (per i file oggetto) o le dimensioni dei dati inizializzati sul disco (per i file di immagine). Per le immagini eseguibili, questo deve essere un multiplo di FileAlignment dall'intestazione facoltativa. Se è minore di VirtualSize, il resto della sezione è pieno zero. Poiché il campo SizeOfRawData viene arrotondato ma il campo VirtualSize non è, è possibile che SizeOfRawData sia maggiore di VirtualSize. Quando una sezione contiene solo dati non inizializzati, questo campo deve essere zero.
20
4
PointerToRawData
Puntatore al file alla prima pagina della sezione all'interno del file COFF. Per le immagini eseguibili, questo deve essere un multiplo di FileAlignment dall'intestazione facoltativa. Per i file oggetto, il valore deve essere allineato su un limite di 4 byte per ottenere prestazioni ottimali. Quando una sezione contiene solo dati non inizializzati, questo campo deve essere zero.
24
4
PointerToRelocations
Puntatore al file all'inizio delle voci di rilocazione per la sezione. Questo valore è impostato su zero per le immagini eseguibili o se non sono presenti rilocazione.
28
4
PointerToLinenumbers
Puntatore di file all'inizio delle voci del numero di riga per la sezione. Questo valore è impostato su zero se non sono presenti numeri di riga COFF. Questo valore deve essere zero per un'immagine perché le informazioni di debug COFF sono deprecate.
32
2
NumberOfRelocations
Numero di voci di rilocazione per la sezione. Questo valore è impostato su zero per le immagini eseguibili.
34
2
NumberOfLinenumbers
Numero di voci di numero di riga per la sezione. Questo valore deve essere zero per un'immagine perché le informazioni di debug COFF sono deprecate.
36
4
Caratteristiche
Flag che descrivono le caratteristiche della sezione. Per altre informazioni, vedere Flag di sezione.

 

Flag di sezione

I flag di sezione nel campo Caratteristiche dell'intestazione di sezione indicano le caratteristiche della sezione.

Flag valore Descrizione
0x00000000
Riservato a un uso futuro.
0x00000001
Riservato a un uso futuro.
0x00000002
Riservato a un uso futuro.
0x00000004
Riservato a un uso futuro.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
La sezione non deve essere riempita fino al limite successivo. Questo flag è obsoleto e viene sostituito da IMAGE_SCN_ALIGN_1BYTES. Questa opzione è valida solo per i file oggetto.
0x00000010
Riservato a un uso futuro.
IMAGE_SCN_CNT_CODE
0x00000020
La sezione contiene codice eseguibile.
IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040
La sezione contiene dati inizializzati.
IMAGE_SCN_CNT_UNINITIALIZED_ DATI
0x00000080
La sezione contiene dati non inizializzati.
IMAGE_SCN_LNK_OTHER
0x00000100
Riservato a un uso futuro.
IMAGE_SCN_LNK_INFO
0x00000200
La sezione contiene commenti o altre informazioni. La sezione .drectve ha questo tipo. Questa opzione è valida solo per i file oggetto.
0x00000400
Riservato a un uso futuro.
IMAGE_SCN_LNK_REMOVE
0x00000800
La sezione non diventerà parte dell'immagine. Questa opzione è valida solo per i file oggetto.
IMAGE_SCN_LNK_COMDAT
0x00001000
La sezione contiene dati COMDAT. Per altre informazioni, vedere Sezioni COMDAT (solo oggetto). Questa opzione è valida solo per i file oggetto.
IMAGE_SCN_GPREL
0x00008000
La sezione contiene i dati a cui viene fatto riferimento tramite il puntatore globale (GP).
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Riservato a un uso futuro.
IMAGE_SCN_MEM_16BIT
0x00020000
Riservato a un uso futuro.
IMAGE_SCN_MEM_LOCKED
0x00040000
Riservato a un uso futuro.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Riservato a un uso futuro.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
Allineare i dati su un limite di 1 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
Allineare i dati su un limite di 2 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_4BYTES
0x00300000
Allineare i dati su un limite a 4 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_8BYTES
0x00400000
Allineare i dati su un limite di 8 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_16BYTES
0x00500000
Allineare i dati su un limite di 16 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_32BYTES
0x00600000
Allineare i dati su un limite di 32 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_64BYTES
0x00700000
Allineare i dati su un limite di 64 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_128BYTES
0x00800000
Allineare i dati su un limite di 128 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_256BYTES
0x00900000
Allineare i dati su un limite di 256 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_512BYTES
0x00A00000
Allineare i dati su un limite di 512 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_1024BYTES
0x00B00000
Allineare i dati su un limite di 1024 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_2048BYTES
0x00C00000
Allineare i dati su un limite di 2048 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_4096BYTES
0x00D00000
Allineare i dati su un limite di 4096 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_8192BYTES
0x00E00000
Allineare i dati su un limite di 8192 byte. Valido solo per i file oggetto.
IMAGE_SCN_LNK_NRELOC_OVFL
0x01000000
La sezione contiene rilocazione estesa.
IMAGE_SCN_MEM_DISCARDABLE
0x02000000
La sezione può essere rimossa in base alle esigenze.
IMAGE_SCN_MEM_NOT_CACHED
0x04000000
La sezione non può essere memorizzata nella cache.
IMAGE_SCN_MEM_NOT_PAGED
0x08000000
La sezione non è paginabile.
IMAGE_SCN_MEM_SHARED
0x10000000
La sezione può essere condivisa in memoria.
IMAGE_SCN_MEM_EXECUTE
0x20000000
La sezione può essere eseguita come codice.
IMAGE_SCN_MEM_READ
0x40000000
La sezione può essere letta.
IMAGE_SCN_MEM_WRITE
0x80000000
La sezione può essere scritta in .

 

IMAGE_SCN_LNK_NRELOC_OVFL indica che il numero di rilocazione per la sezione supera i 16 bit riservati nell'intestazione di sezione. Se il bit è impostato e il campo NumberOfRelocations nell'intestazione della sezione è 0xffff, il conteggio effettivo delle rilocazione viene archiviato nel campo VirtualAddress a 32 bit del primo rilocazione. Si tratta di un errore se IMAGE_SCN_LNK_NRELOC_OVFL è impostato e nella sezione sono presenti meno di 0xffff rilocazione.

Sezioni raggruppate (solo oggetto)

Il carattere "$" (segno di dollaro) ha un'interpretazione speciale nei nomi di sezione nei file oggetto.

Quando si determina la sezione dell'immagine che conterrà il contenuto di una sezione dell'oggetto, il linker rimuove i caratteri "$" e tutti i caratteri che lo seguono. Di conseguenza, una sezione dell'oggetto denominata .text$X contribuisce effettivamente alla sezione .text nell'immagine.

Tuttavia, i caratteri che seguono "$" determinano l'ordinamento dei contributi alla sezione image. Tutti i contributi con lo stesso nome di sezione oggetto vengono allocati in modo contiguo nell'immagine e i blocchi di contributi vengono ordinati in ordine lessicale in base al nome della sezione oggetto. Pertanto, tutti gli elementi nei file oggetto con nome di sezione .text$X finiscono insieme, dopo i contributi .text$W e prima dei contributi .text$Y .

Il nome della sezione in un file di immagine non contiene mai un carattere "$".

Altri contenuti del file

Le strutture di dati descritte finora, fino a e includendo l'intestazione facoltativa, si trovano tutti in corrispondenza di un offset fisso dall'inizio del file (o dall'intestazione PE se il file è un'immagine che contiene uno stub MS-DOS).

Il resto di un oggetto COFF o di un file di immagine contiene blocchi di dati che non sono necessariamente in corrispondenza di un offset di file specifico. Le posizioni vengono invece definite dai puntatori nell'intestazione facoltativa o in un'intestazione di sezione.

Un'eccezione è per le immagini con un valore SectionAlignment minore delle dimensioni della pagina dell'architettura (4 K per Intel x86 e per MIPS e 8 K per Itanium). Per una descrizione di SectionAlignment, vedere Intestazione facoltativa (solo immagine). In questo caso, esistono vincoli sull'offset di file dei dati della sezione, come descritto nella sezione 5.1 "Dati sezione". Un'altra eccezione è che il certificato dell'attributo e le informazioni di debug devono essere posizionate alla fine di un file di immagine, con la tabella dei certificati dell'attributo immediatamente precedente alla sezione di debug, perché il caricatore non esegue il mapping di questi elementi in memoria. La regola relativa al certificato dell'attributo e alle informazioni di debug non si applica tuttavia ai file oggetto.

Dati sezione

I dati inizializzati per una sezione sono costituiti da semplici blocchi di byte. Tuttavia, per le sezioni che contengono tutti gli zeri, i dati della sezione non devono essere inclusi.

I dati per ogni sezione si trovano in corrispondenza dell'offset del file fornito dal campo PointerToRawData nell'intestazione di sezione. Le dimensioni di questi dati nel file sono indicate dal campo SizeOfRawData. Se SizeOfRawData è minore di VirtualSize, il resto viene riempito con zeri.

In un file di immagine i dati della sezione devono essere allineati su un limite come specificato dal campo FileAlignment nell'intestazione facoltativa. I dati della sezione devono essere visualizzati in ordine dei valori RVA per le sezioni corrispondenti , come per le singole intestazioni di sezione nella tabella delle sezioni.

Esistono restrizioni aggiuntive per i file di immagine se il valore SectionAlignment nell'intestazione facoltativa è minore delle dimensioni della pagina dell'architettura. Per tali file, il percorso dei dati della sezione nel file deve corrispondere alla posizione in memoria quando viene caricata l'immagine, in modo che l'offset fisico per i dati di sezione corrisponda a quello dell'RVA.

Rilocazione COFF (solo oggetto)

I file oggetto contengono rilocazione COFF, che specificano il modo in cui i dati della sezione devono essere modificati quando vengono inseriti nel file di immagine e successivamente caricati in memoria.

I file di immagine non contengono rilocazione COFF, perché tutti i simboli a cui si fa riferimento sono già stati assegnati indirizzi in uno spazio indirizzi flat. Un'immagine contiene informazioni di rilocazione sotto forma di rilocazione di base nella sezione .reloc (a meno che l'immagine non abbia l'attributo IMAGE_FILE_RELOCS_STRIPPED). Per altre informazioni, vedere la sezione .reloc (solo immagine).

Per ogni sezione di un file oggetto, una matrice di record a lunghezza fissa contiene le rilocazione COFF della sezione. La posizione e la lunghezza della matrice vengono specificate nell'intestazione di sezione. Ogni elemento della matrice ha il formato seguente.

Contropartita Dimensione Campo Descrizione
0
4
VirtualAddress
Indirizzo dell'elemento a cui viene applicata la rilocazione. Si tratta dell'offset dall'inizio della sezione, più il valore del campo RVA/Offset della sezione. Vedere La tabella delle sezioni (intestazioni di sezione).See Section Table (Section Headers). Ad esempio, se il primo byte della sezione ha un indirizzo di 0x10, il terzo byte ha un indirizzo di 0x12.
4
4
SymbolTableIndex
Indice in base zero nella tabella dei simboli. Questo simbolo fornisce l'indirizzo da utilizzare per la rilocazione. Se il simbolo specificato ha una classe di archiviazione della sezione, l'indirizzo del simbolo è l'indirizzo con la prima sezione dello stesso nome.
8
2
Digitare
Valore che indica il tipo di rilocazione da eseguire. I tipi di rilocazione validi dipendono dal tipo di computer. Vedere Indicatori di tipo.

 

Se il simbolo a cui fa riferimento il campo SymbolTableIndex ha la classe di archiviazione IMAGE_SYM_CLASS_SECTION, l'indirizzo del simbolo è l'inizio della sezione. La sezione si trova in genere nello stesso file, tranne quando il file oggetto fa parte di un archivio (libreria). In tal caso, la sezione è disponibile in qualsiasi altro file oggetto nell'archivio con lo stesso nome del membro archivio del file oggetto corrente. La relazione con il nome del membro archivio viene usata nel collegamento di tabelle di importazione, ovvero nella sezione .idata.

Indicatori di tipo

Il campo Tipo del record di rilocazione indica il tipo di rilocazione da eseguire. Diversi tipi di rilocazione sono definiti per ogni tipo di computer.

Processori x64

I seguenti indicatori di tipo di rilocazione sono definiti per i processori x64 e compatibili.

Costante valore Descrizione
IMAGE_REL_AMD64_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_AMD64_ADDR64
0x0001
Va a 64 bit dell'obiettivo di rilocazione.
IMAGE_REL_AMD64_ADDR32
0x0002
Va a 32 bit dell'obiettivo di rilocazione.
IMAGE_REL_AMD64_ADDR32NB
0x0003
Indirizzo a 32 bit senza una base di immagini (RVA).
IMAGE_REL_AMD64_REL32
0x0004
Indirizzo relativo a 32 bit dal byte dopo la rilocazione.
IMAGE_REL_AMD64_REL32_1
0x0005
Indirizzo a 32 bit relativo alla distanza di byte 1 dalla rilocazione.
IMAGE_REL_AMD64_REL32_2
0x0006
Indirizzo a 32 bit relativo alla distanza di byte 2 dalla rilocazione.
IMAGE_REL_AMD64_REL32_3
0x0007
Indirizzo a 32 bit relativo alla distanza di byte 3 dalla rilocazione.
IMAGE_REL_AMD64_REL32_4
0x0008
Indirizzo a 32 bit relativo alla distanza di byte 4 dalla rilocazione.
IMAGE_REL_AMD64_REL32_5
0x0009
Indirizzo a 32 bit relativo alla distanza di byte 5 dalla rilocazione.
IMAGE_REL_AMD64_SECTION
0x000A
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_AMD64_SECREL
0x000B
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_AMD64_SECREL7
0x000C
Offset senza segno a 7 bit dalla base della sezione che contiene la destinazione.
IMAGE_REL_AMD64_TOKEN
0x000D
Token CLR.
IMAGE_REL_AMD64_SREL32
0x000E
Valore dipendente dall'intervallo con segno a 32 bit generato nell'oggetto .
IMAGE_REL_AMD64_PAIR
0x000F
Coppia che deve seguire immediatamente ogni valore dipendente dall'intervallo.
IMAGE_REL_AMD64_SSPAN32
0x0010
Valore dipendente dall'intervallo con segno a 32 bit applicato al momento del collegamento.

 

Processori ARM

I seguenti indicatori di tipo di rilocazione sono definiti per i processori ARM.

Costante valore Descrizione
IMAGE_REL_ARM_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_ARM_ADDR32
0x0001
Va a 32 bit della destinazione.
IMAGE_REL_ARM_ADDR32NB
0x0002
RVA a 32 bit della destinazione.
IMAGE_REL_ARM_BRANCH24
0x0003
Spostamento relativo a 24 bit alla destinazione.
IMAGE_REL_ARM_BRANCH11
0x0004
Riferimento a una chiamata di subroutine. Il riferimento è costituito da due istruzioni a 16 bit con offset a 11 bit.
IMAGE_REL_ARM_REL32
0x000A
Indirizzo relativo a 32 bit dal byte dopo la rilocazione.
IMAGE_REL_ARM_SECTION
0x000E
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_ARM_SECREL
0x000F
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_ARM_MOV32
0x0010
Va a 32 bit della destinazione. Questa rilocazione viene applicata usando un'istruzione MOVW per i 16 bit bassi seguiti da un MOVT per i 16 bit alti.
IMAGE_REL_THUMB_MOV32
0x0011
Va a 32 bit della destinazione. Questa rilocazione viene applicata usando un'istruzione MOVW per i 16 bit bassi seguiti da un MOVT per i 16 bit alti.
IMAGE_REL_THUMB_BRANCH20
0x0012
L'istruzione è fissa con lo spostamento relativo a 21 bit alla destinazione allineata a 2 byte. Il bit meno significativo dello spostamento è sempre zero e non è archiviato. Questa rilocazione corrisponde a un'istruzione B condizionale thumb-2 a 32 bit.
Inutilizzato
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
L'istruzione è fissa con lo spostamento relativo a 25 bit alla destinazione allineata a 2 byte. Il bit meno significativo dello spostamento è zero e non è archiviato. Questa rilocazione corrisponde a un'istruzione Thumb-2 B.
IMAGE_REL_THUMB_BLX23
0x0015
L'istruzione è fissa con lo spostamento relativo a 25 bit alla destinazione allineata a 4 byte. I 2 bit bassi dello spostamento sono zero e non sono archiviati.
Questa rilocazione corrisponde a un'istruzione BLX Thumb-2.
IMAGE_REL_ARM_PAIR
0x0016
La rilocazione è valida solo quando segue immediatamente un ARM_REFHI o un THUMB_REFHI. SymbolTableIndex contiene uno spostamento e non un indice nella tabella dei simboli.

 

Processori ARM64

I seguenti indicatori di tipo di rilocazione sono definiti per i processori ARM64.

Costante valore Descrizione
IMAGE_REL_ARM64_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_ARM64_ADDR32
0x0001
Va a 32 bit della destinazione.
IMAGE_REL_ARM64_ADDR32NB
0x0002
RVA a 32 bit della destinazione.
IMAGE_REL_ARM64_BRANCH26
0x0003
Spostamento relativo a 26 bit per la destinazione, per le istruzioni B e BL.
IMAGE_REL_ARM64_PAGEBASE_REL21
0x0004
Base di pagina della destinazione per l'istruzione ADRP.
IMAGE_REL_ARM64_REL21
0x0005
Spostamento relativo a 12 bit alla destinazione, per l'istruzione ADR
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
Offset della pagina a 12 bit della destinazione, per istruzioni ADD/ADDS (immediato) con zero shift.
IMAGE_REL_ARM64_PAGEOFFSET_12L
0x0007
Offset di pagina a 12 bit della destinazione, per l'istruzione LDR (indicizzata, immediata senza segno).
IMAGE_REL_ARM64_SECREL
0x0008
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
Bit 0:11 dell'offset di sezione della destinazione, per istruzioni ADD/ADDS (immediate) con zero shift.
IMAGE_REL_ARM64_SECREL_HIGH12A
0x000A
Bit 12:23 dell'offset di sezione della destinazione, per istruzioni ADD/ADDS (immediato) con zero shift.
IMAGE_REL_ARM64_SECREL_LOW12L
0x000B
Bit 0:11 dell'offset di sezione della destinazione, per l'istruzione LDR (indicizzata, immediata senza segno).
IMAGE_REL_ARM64_TOKEN
0x000C
Token CLR.
IMAGE_REL_ARM64_SECTION
0x000D
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_ARM64_ADDR64
0x000E
Va a 64 bit dell'obiettivo di rilocazione.
IMAGE_REL_ARM64_BRANCH19
0x000F
Offset a 19 bit per la destinazione di rilocazione, per l'istruzione B condizionale.
IMAGE_REL_ARM64_BRANCH14
0x0010
Offset a 14 bit per la destinazione di rilocazione, per istruzioni TBZ e TBNZ.
IMAGE_REL_ARM64_REL32
0x0011
Indirizzo relativo a 32 bit dal byte dopo la rilocazione.
Processori Hitachi SuperH

I seguenti indicatori di tipo di rilocazione sono definiti per i processori SH3 e SH4. Le rilozioni specifiche di SH5 sono indicate come SHM (SH Media).

Costante valore Descrizione
IMAGE_REL_SH3_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_SH3_DIRECT16
0x0001
Riferimento alla posizione a 16 bit che contiene l'va del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT32
0x0002
Va a 32 bit del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT8
0x0003
Riferimento alla posizione a 8 bit che contiene l'va del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT8_WORD
0x0004
Riferimento all'istruzione a 8 bit che contiene l'effettiva va a 16 bit del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
Riferimento all'istruzione a 8 bit che contiene l'effettiva va a 32 bit del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT4
0x0006
Riferimento alla posizione a 8 bit i cui 4 bit bassi contengono la va del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
Riferimento all'istruzione a 8 bit i cui 4 bit bassi contengono l'effettiva va a 16 bit del simbolo di destinazione.
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
Riferimento all'istruzione a 8 bit i cui 4 bit bassi contengono l'effettiva va a 32 bit del simbolo di destinazione.
IMAGE_REL_SH3_PCREL8_WORD
0x0009
Riferimento all'istruzione a 8 bit che contiene l'offset relativo effettivo a 16 bit del simbolo di destinazione.
IMAGE_REL_SH3_PCREL8_LONG
0x000A
Riferimento all'istruzione a 8 bit che contiene l'offset relativo a 32 bit effettivo del simbolo di destinazione.
IMAGE_REL_SH3_PCREL12_WORD
0x000B
Riferimento all'istruzione a 16 bit i cui 12 bit bassi contengono l'offset relativo effettivo a 16 bit del simbolo di destinazione.
IMAGE_REL_SH3_STARTOF_SECTION
0x000C
Riferimento a una posizione a 32 bit che rappresenta la va della sezione che contiene il simbolo di destinazione.
IMAGE_REL_SH3_SIZEOF_SECTION
0x000D
Riferimento alla posizione a 32 bit che corrisponde alla dimensione della sezione che contiene il simbolo di destinazione.
IMAGE_REL_SH3_SECTION
0x000E
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_SH3_SECREL
0x000F
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
RVA a 32 bit del simbolo di destinazione.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
Gp relativo.
IMAGE_REL_SH3_TOKEN
0x0012
Token CLR.
IMAGE_REL_SHM_PCRELPT
0x0013
Offset dall'istruzione corrente in parole lunghe. Se il bit NOMODE non è impostato, inserire l'inverso del bit basso a bit 32 per selezionare PTA o PTB.
IMAGE_REL_SHM_REFLO
0x0014
I 16 bit bassi dell'indirizzo a 32 bit.
IMAGE_REL_SHM_REFHALF
0x0015
I 16 bit alti dell'indirizzo a 32 bit.
IMAGE_REL_SHM_RELLO
0x0016
16 bit bassi dell'indirizzo relativo.
IMAGE_REL_SHM_RELHALF
0x0017
I 16 bit alti dell'indirizzo relativo.
IMAGE_REL_SHM_PAIR
0x0018
La rilocazione è valida solo quando segue immediatamente una rilocazione REFHALF, RELHALF o RELLO. Il campo SymbolTableIndex della rilocazione contiene uno spostamento e non un indice nella tabella dei simboli.
IMAGE_REL_SHM_NOMODE
0x8000
La rilocazione ignora la modalità sezione.

 

Processori IBM PowerPC

I seguenti indicatori di tipo di rilocazione sono definiti per i processori PowerPC.

Costante valore Descrizione
IMAGE_REL_PPC_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_PPC_ADDR64
0x0001
Va a 64 bit della destinazione.
IMAGE_REL_PPC_ADDR32
0x0002
Va a 32 bit della destinazione.
IMAGE_REL_PPC_ADDR24
0x0003
I 24 bit bassi dell'va della destinazione. Questo valore è valido solo quando il simbolo di destinazione è assoluto e può essere esteso al valore originale.
IMAGE_REL_PPC_ADDR16
0x0004
I 16 bit bassi dell'va di destinazione.
IMAGE_REL_PPC_ADDR14
0x0005
I 14 bit bassi dell'va di destinazione. Questo valore è valido solo quando il simbolo di destinazione è assoluto e può essere esteso al valore originale.
IMAGE_REL_PPC_REL24
0x0006
Offset relativo al PC a 24 bit in base alla posizione del simbolo.
IMAGE_REL_PPC_REL14
0x0007
Offset relativo al PC a 14 bit in base alla posizione del simbolo.
IMAGE_REL_PPC_ADDR32NB
0x000A
RVA a 32 bit della destinazione.
IMAGE_REL_PPC_SECREL
0x000B
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_PPC_SECTION
0x000C
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_PPC_SECREL16
0x000F
Offset a 16 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_PPC_REFHI
0x0010
I 16 bit alti dell'va a 32 bit della destinazione. Viene usato per la prima istruzione in una sequenza di due istruzioni che carica un indirizzo completo. Questa rilocazione deve essere immediatamente seguita da una rilocazione PAIR il cui SymbolTableIndex contiene uno spostamento a 16 bit firmato che viene aggiunto ai 16 bit superiori prelevati dalla posizione da spostare.
IMAGE_REL_PPC_REFLO
0x0011
I 16 bit bassi dell'va di destinazione.
IMAGE_REL_PPC_PAIR
0x0012
Rilocazione valida solo quando segue immediatamente una rilocazione REFHI o SECRELHI. SymbolTableIndex contiene uno spostamento e non un indice nella tabella dei simboli.
IMAGE_REL_PPC_SECRELLO
0x0013
I 16 bit bassi dell'offset a 32 bit della destinazione dall'inizio della relativa sezione.
IMAGE_REL_PPC_GPREL
0x0015
Spostamento con segno a 16 bit della destinazione rispetto al registro Gp.
IMAGE_REL_PPC_TOKEN
0x0016
Token CLR.

 

Processori Intel 386

I seguenti indicatori di tipo di rilocazione sono definiti per i processori Intel 386 e compatibili.

Costante valore Descrizione
IMAGE_REL_I386_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_I386_DIR16
0x0001
Non supportato.
IMAGE_REL_I386_REL16
0x0002
Non supportato.
IMAGE_REL_I386_DIR32
0x0006
Va a 32 bit di destinazione.
IMAGE_REL_I386_DIR32NB
0x0007
RVA a 32 bit della destinazione.
IMAGE_REL_I386_SEG12
0x0009
Non supportato.
IMAGE_REL_I386_SECTION
0x000A
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_I386_SECREL
0x000B
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_I386_TOKEN
0x000C
Token CLR.
IMAGE_REL_I386_SECREL7
0x000D
Offset a 7 bit dalla base della sezione che contiene la destinazione.
IMAGE_REL_I386_REL32
0x0014
Spostamento relativo a 32 bit alla destinazione. Supporta il ramo relativo x86 e le istruzioni di chiamata.

 

Famiglia di processori Intel Itanium (IPF)

I seguenti indicatori di tipo di rilocazione sono definiti per la famiglia di processori Intel Itanium e i processori compatibili. Si noti che le rilocazione sulle istruzioni usano l'offset del bundle e il numero di slot per l'offset di rilocazione.

Costante valore Descrizione
IMAGE_REL_IA64_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_IA64_IMM14
0x0001
La rilocazione delle istruzioni può essere seguita da una rilocazione ADDEND il cui valore viene aggiunto all'indirizzo di destinazione prima che venga inserito nello slot specificato nel bundle IMM14. La destinazione di rilocazione deve essere assoluta o l'immagine deve essere fissa.
IMAGE_REL_IA64_IMM22
0x0002
La rilocazione delle istruzioni può essere seguita da una rilocazione ADDEND il cui valore viene aggiunto all'indirizzo di destinazione prima di essere inserito nello slot specificato nel bundle IMM22. La destinazione di rilocazione deve essere assoluta o l'immagine deve essere fissa.
IMAGE_REL_IA64_IMM64
0x0003
Il numero di slot di questa rilocazione deve essere uno (1). La rilocazione può essere seguita da una rilocazione ADDEND il cui valore viene aggiunto all'indirizzo di destinazione prima che venga archiviato in tutti e tre gli slot del bundle IMM64.
IMAGE_REL_IA64_DIR32
0x0004
Va a 32 bit di destinazione. Questa opzione è supportata solo per le immagini /LARGEADDRESSAWARE:NO.
IMAGE_REL_IA64_DIR64
0x0005
Va a 64 bit di destinazione.
IMAGE_REL_IA64_PCREL21B
0x0006
L'istruzione è fissa con lo spostamento relativo a 25 bit alla destinazione allineata a 16 bit. I 4 bit bassi dello spostamento sono zero e non sono archiviati.
IMAGE_REL_IA64_PCREL21M
0x0007
L'istruzione è fissa con lo spostamento relativo a 25 bit alla destinazione allineata a 16 bit. I 4 bit bassi dello spostamento, che sono zero, non vengono memorizzati.
IMAGE_REL_IA64_PCREL21F
0x0008
I LSB dell'offset della rilocazione devono contenere il numero di slot, mentre il resto è l'indirizzo del bundle. Il bundle viene fissato con lo spostamento relativo a 25 bit alla destinazione allineata a 16 bit. I 4 bit bassi dello spostamento sono zero e non sono archiviati.
IMAGE_REL_IA64_GPREL22
0x0009
La rilocazione delle istruzioni può essere seguita da una rilocazione ADDEND il cui valore viene aggiunto all'indirizzo di destinazione e quindi da un offset relativo a criteri di gruppo a 22 bit calcolato e applicato al bundle GPREL22.
IMAGE_REL_IA64_LTOFF22
0x000A
L'istruzione viene corretta con l'offset relativo gp a 22 bit alla voce della tabella letterale del simbolo di destinazione. Il linker crea questa voce di tabella letterale in base a questa rilocazione e alla rilocazione ADDEND che potrebbe essere seguita.
IMAGE_REL_IA64_SECTION
0x000B
L'indice di sezione a 16 bit della sezione contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_IA64_SECREL22
0x000C
L'istruzione viene risolta con l'offset a 22 bit della destinazione dall'inizio della relativa sezione. Questa rilocazione può essere seguita immediatamente da una rilocazione ADDEND, il cui campo Valore contiene l'offset senza segno a 32 bit della destinazione dall'inizio della sezione.
IMAGE_REL_IA64_SECREL64I
0x000D
Il numero di slot per questa rilocazione deve essere uno (1). L'istruzione viene risolta con l'offset a 64 bit della destinazione dall'inizio della relativa sezione. Questa rilocazione può essere seguita immediatamente da una rilocazione ADDEND il cui campo Valore contiene l'offset senza segno a 32 bit della destinazione dall'inizio della sezione.
IMAGE_REL_IA64_SECREL32
0x000E
Indirizzo dei dati da correggere con l'offset a 32 bit della destinazione dall'inizio della relativa sezione.
IMAGE_REL_IA64_DIR32NB
0x0010
RVA a 32 bit della destinazione.
IMAGE_REL_IA64_SREL14
0x0011
Questa operazione viene applicata a un immediato a 14 bit con segno che contiene la differenza tra due destinazioni rilocabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già emesso questo valore.
IMAGE_REL_IA64_SREL22
0x0012
Questa operazione viene applicata a un immediato a 22 bit con segno che contiene la differenza tra due destinazioni rilocabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già emesso questo valore.
IMAGE_REL_IA64_SREL32
0x0013
Questa operazione viene applicata a un immediato con segno a 32 bit che contiene la differenza tra due valori rilocabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già emesso questo valore.
IMAGE_REL_IA64_UREL32
0x0014
Questa operazione viene applicata a un immediato a 32 bit senza segno che contiene la differenza tra due valori rilocabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già emesso questo valore.
IMAGE_REL_IA64_PCREL60X
0x0015
Correzione relativa al PC a 60 bit che rimane sempre come istruzione BRL di un bundle MLX.
IMAGE_REL_IA64_PCREL60B
0x0016
Correzione relativa al PC a 60 bit. Se lo spostamento di destinazione rientra in un campo a 25 bit firmato, convertire l'intero bundle in un bundle MBB con NOP. B nello slot 1 e un'istruzione BR a 25 bit (con i 4 bit più bassi tutti zero e eliminati) nello slot 2.
IMAGE_REL_IA64_PCREL60F
0x0017
Correzione relativa al PC a 60 bit. Se lo spostamento di destinazione rientra in un campo a 25 bit firmato, convertire l'intero bundle in un bundle MFB con NOP. F nello slot 1 e a 25 bit (4 bit più bassi tutti zero e eliminati) istruzioni BR nello slot 2.
IMAGE_REL_IA64_PCREL60I
0x0018
Correzione relativa al PC a 60 bit. Se lo spostamento di destinazione rientra in un campo a 25 bit firmato, convertire l'intero bundle in un bundle MIB con NOP. Io nello slot 1 e un'istruzione BR nello slot 2 (4 bit più bassi tutti zero e eliminati) nello slot 2.
IMAGE_REL_IA64_PCREL60M
0x0019
Correzione relativa al PC a 60 bit. Se lo spostamento di destinazione rientra in un campo a 25 bit firmato, convertire l'intero bundle in un bundle MMB con NOP. M nello slot 1 e a 25 bit (4 bit più bassi tutti zero e eliminati) istruzioni BR nello slot 2.
IMAGE_REL_IA64_IMMGPREL64
0x001a
Correzione relativa a Criteri di gruppo a 64 bit.
IMAGE_REL_IA64_TOKEN
0x001b
Token CLR.
IMAGE_REL_IA64_GPREL32
0x001c
Correzione relativa a Criteri di gruppo a 32 bit.
IMAGE_REL_IA64_ADDEND
0x001F
La rilocazione è valida solo quando segue immediatamente una delle rilocazione seguenti: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I o SECREL32. Il valore contiene l'addend da applicare alle istruzioni all'interno di un bundle, non per i dati.

 

Processori MIPS

I seguenti indicatori di tipo di rilocazione sono definiti per i processori MIPS.

Costante valore Descrizione
IMAGE_REL_MIPS_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_MIPS_REFHALF
0x0001
I 16 bit alti dell'va a 32 bit della destinazione.
IMAGE_REL_MIPS_REFWORD
0x0002
Va a 32 bit di destinazione.
IMAGE_REL_MIPS_JMPADDR
0x0003
I 26 bit bassi dell'va di destinazione. In questo modo sono supportate le istruzioni J e JAL DI MIPS.
IMAGE_REL_MIPS_REFHI
0x0004
I 16 bit alti dell'va a 32 bit della destinazione. Viene usato per la prima istruzione in una sequenza di due istruzioni che carica un indirizzo completo. Questa rilocazione deve essere immediatamente seguita da una rilocazione PAIR il cui SymbolTableIndex contiene uno spostamento a 16 bit firmato che viene aggiunto ai 16 bit superiori che vengono prelevati dalla posizione da rilocare.
IMAGE_REL_MIPS_REFLO
0x0005
I 16 bit bassi dell'va di destinazione.
IMAGE_REL_MIPS_GPREL
0x0006
Spostamento con segno a 16 bit della destinazione rispetto al registro GP.
IMAGE_REL_MIPS_LITERAL
0x0007
Uguale a IMAGE_REL_MIPS_GPREL.
IMAGE_REL_MIPS_SECTION
0x000A
L'indice di sezione a 16 bit della sezione contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_MIPS_SECREL
0x000B
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_MIPS_SECRELLO
0x000C
I 16 bit bassi dell'offset a 32 bit della destinazione dall'inizio della relativa sezione.
IMAGE_REL_MIPS_SECRELHI
0x000D
I 16 bit alti dell'offset a 32 bit della destinazione dall'inizio della relativa sezione. Una rilocazione IMAGE_REL_MIPS_PAIR deve seguire immediatamente questa. SymbolTableIndex della rilocazione PAIR contiene uno spostamento a 16 bit con segno che viene aggiunto ai 16 bit superiori ricavati dalla posizione da spostare.
IMAGE_REL_MIPS_JMPADDR16
0x0010
I 26 bit bassi dell'va di destinazione. Supporta l'istruzione JAL MIPS16.
IMAGE_REL_MIPS_REFWORDNB
0x0022
RVA a 32 bit della destinazione.
IMAGE_REL_MIPS_PAIR
0x0025
La rilocazione è valida solo quando segue immediatamente una rilocazione REFHI o SECRELHI. SymbolTableIndex contiene uno spostamento e non un indice nella tabella dei simboli.

 

Kamishi M32R

I seguenti indicatori di tipo di rilocazione sono definiti per i processori M32R di Routeishi.

Costante valore Descrizione
IMAGE_REL_M32R_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_M32R_ADDR32
0x0001
Va a 32 bit di destinazione.
IMAGE_REL_M32R_ADDR32NB
0x0002
RVA a 32 bit della destinazione.
IMAGE_REL_M32R_ADDR24
0x0003
Va a 24 bit di destinazione.
IMAGE_REL_M32R_GPREL16
0x0004
Offset a 16 bit della destinazione dal registro Criteri di gruppo.
IMAGE_REL_M32R_PCREL24
0x0005
Offset a 24 bit della destinazione dal contatore del programma (PC), spostato a sinistra di 2 bit e con segno esteso
IMAGE_REL_M32R_PCREL16
0x0006
Offset a 16 bit della destinazione dal PC, spostato a sinistra di 2 bit e con segno esteso
IMAGE_REL_M32R_PCREL8
0x0007
Offset a 8 bit della destinazione dal PC, spostato a sinistra di 2 bit e con segno esteso
IMAGE_REL_M32R_REFHALF
0x0008
16 MSB dell'va di destinazione.
IMAGE_REL_M32R_REFHI
0x0009
I 16 MSB dell'va di destinazione, regolati per l'estensione del segno LSB. Viene usato per la prima istruzione in una sequenza a due istruzioni che carica un indirizzo completo a 32 bit. Questa rilocazione deve essere immediatamente seguita da una rilocazione PAIR il cui SymbolTableIndex contiene uno spostamento a 16 bit firmato che viene aggiunto ai 16 bit superiori che vengono prelevati dalla posizione da rilocare.
IMAGE_REL_M32R_REFLO
0x000A
16 LSB dell'va di destinazione.
IMAGE_REL_M32R_PAIR
0x000B
La rilocazione deve seguire la rilocazione REFHI. SymbolTableIndex contiene uno spostamento e non un indice nella tabella dei simboli.
IMAGE_REL_M32R_SECTION
0x000C
Indice di sezione a 16 bit della sezione che contiene la destinazione. Viene usato per supportare le informazioni di debug.
IMAGE_REL_M32R_SECREL
0x000D
Offset a 32 bit della destinazione dall'inizio della relativa sezione. Viene usato per supportare le informazioni di debug e l'archiviazione locale del thread statico.
IMAGE_REL_M32R_TOKEN
0x000E
Token CLR.

 

Numeri di riga COFF (deprecato)

I numeri di riga COFF non vengono più prodotti e, in futuro, non verranno utilizzati.

I numeri di riga COFF indicano la relazione tra il codice e i numeri di riga nei file di origine. Il formato Microsoft per i numeri di riga COFF è simile al COFF standard, ma è stato esteso per consentire a una singola sezione di correlare i numeri di riga in più file di origine.

I numeri di riga COFF sono costituiti da una matrice di record a lunghezza fissa. Il percorso (offset del file) e le dimensioni della matrice vengono specificati nell'intestazione di sezione. Ogni record di numero di riga è del formato seguente.

Contropartita Dimensione Campo Descrizione
0
4
Tipo (*)
Si tratta di un'unione di due campi: SymbolTableIndex e VirtualAddress. L'uso di SymbolTableIndex o RVA dipende dal valore di Linenumber.
4
2
Linenumber
Se diverso da zero, questo campo specifica un numero di riga in base uno. Quando zero, il campo Type viene interpretato come indice di tabella dei simboli per una funzione.

 

Il campo Tipo è un'unione di due campi a 4 byte: SymbolTableIndex e VirtualAddress.

Contropartita Dimensione Campo Descrizione
0
4
SymbolTableIndex
Usato quando Linenumber è zero: indice per la voce della tabella dei simboli per una funzione. Questo formato viene usato per indicare la funzione a cui fa riferimento un gruppo di record di numeri di riga.
0
4
VirtualAddress
Usato quando Linenumber è diverso da zero: L'RVA del codice eseguibile che corrisponde alla riga di origine indicata. In un file di oggetto, questo contiene l'oggetto VA all'interno della sezione .

 

Un record di numeri di riga può impostare il campo Linenumber su zero e puntare a una definizione di funzione nella tabella dei simboli oppure può funzionare come voce numero di riga standard assegnando un numero intero positivo (numero di riga) e l'indirizzo corrispondente nel codice dell'oggetto.

Un gruppo di voci di numeri di riga inizia sempre con il primo formato: l'indice di un simbolo di funzione. Se si tratta del primo record di numeri di riga nella sezione, è anche il nome del simbolo COMDAT per la funzione se è impostato il flag COMDAT della sezione. Vedere sezioni COMDAT (solo oggetto). Il record ausiliario della funzione nella tabella dei simboli ha un puntatore al campo Linenumber che punta allo stesso record di numeri di riga.

Un record che identifica una funzione è seguito da un numero qualsiasi di voci di numeri di riga che forniscono informazioni effettive sul numero di riga, ovvero voci con numero di riga maggiore di zero. Queste voci sono basate su un solo, rispetto all'inizio della funzione e rappresentano ogni riga di origine nella funzione, ad eccezione della prima riga.

Ad esempio, il primo record numerico di riga per l'esempio seguente specifica la funzione ReverseSign (SymbolTableIndex di ReverseSign e Linenumber impostata su zero). I record con valori Linenumber pari a 1, 2 e 3 seguono, corrispondenti alle righe di origine, come illustrato di seguito:

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

Tabella dei simboli COFF

La tabella dei simboli in questa sezione viene ereditata dal formato COFF tradizionale. È diverso dalle informazioni di debug di Microsoft Visual C++. Un file può contenere sia una tabella dei simboli COFF che le informazioni di debug di Visual C++ e le due vengono mantenute separate. Alcuni strumenti Microsoft usano la tabella dei simboli per scopi limitati ma importanti, ad esempio per comunicare le informazioni COMDAT al linker. I nomi di sezione e i nomi di file, nonché i simboli di codice e dati, sono elencati nella tabella dei simboli.

La posizione della tabella dei simboli è indicata nell'intestazione COFF.

La tabella dei simboli è una matrice di record, ogni 18 byte di lunghezza. Ogni record è un record standard o ausiliario della tabella dei simboli. Un record standard definisce un simbolo o un nome e ha il formato seguente.

Contropartita Dimensione Campo Descrizione
0
8
Nome (*)
Nome del simbolo, rappresentato da un'unione di tre strutture. Se il nome non supera gli 8 byte, viene utilizzata una matrice di 8 byte. Per altre informazioni, vedere Rappresentazione del nome del simbolo.
8
4
Value
Valore associato al simbolo. L'interpretazione di questo campo dipende da SectionNumber e StorageClass. Un significato tipico è l'indirizzo rilocazione.
12
2
SectionNumber
Intero con segno che identifica la sezione, utilizzando un indice in base uno nella tabella delle sezioni. Alcuni valori hanno un significato speciale, come definito nella sezione 5.4.2, "Valori dei numeri di sezione".
14
2
Digitare
Numero che rappresenta il tipo. Gli strumenti Microsoft impostano questo campo su 0x20 (funzione) o 0x0 (non una funzione). Per altre informazioni, vedere Rappresentazione dei tipi.
16
1
StorageClass
Valore enumerato che rappresenta la classe di archiviazione. Per altre informazioni, vedere Classe di archiviazione.
17
1
NumberOfAuxSymbols
Numero di voci della tabella dei simboli ausiliari che seguono questo record.

 

Zero o più record di tabella dei simboli ausiliari seguono immediatamente ogni record di tabella dei simboli standard. Tuttavia, in genere non più di un record di tabella simboli ausiliari segue un record di tabella dei simboli standard (ad eccezione dei record con estensione file con nomi di file lunghi). Ogni record ausiliario è la stessa dimensione di un record di tabella dei simboli standard (18 byte), ma invece di definire un nuovo simbolo, il record ausiliario fornisce informazioni aggiuntive sull'ultimo simbolo definito. La scelta di quali formati usare dipende dal campo StorageClass. I formati attualmente definiti per i record di tabella dei simboli ausiliari sono visualizzati nella sezione 5.5, "Record simboli ausiliari".

Gli strumenti che leggono le tabelle dei simboli COFF devono ignorare i record dei simboli ausiliari la cui interpretazione è sconosciuta. In questo modo il formato della tabella dei simboli può essere esteso per aggiungere nuovi record ausiliari, senza interrompere gli strumenti esistenti.

Rappresentazione del nome del simbolo

Il campo ShortName in una tabella dei simboli è costituito da 8 byte che contengono il nome stesso, se non è lungo più di 8 byte o il campo ShortName restituisce un offset nella tabella di stringhe. Per determinare se viene specificato il nome stesso o un offset, verificare la parità tra i primi 4 byte e zero.

Per convenzione, i nomi vengono considerati stringhe con codifica UTF-8 con terminazione zero.

Contropartita Dimensione Campo Descrizione
0
8
ShortName
Matrice di 8 byte. Questa matrice viene riempita con valori Null a destra se il nome è inferiore a 8 byte.
0
4
Zeri
Campo impostato su tutti gli zeri se il nome è più lungo di 8 byte.
4
4
Compensare
Offset nella tabella di stringhe.

 

Valori dei numeri di sezione

In genere, il campo Valore sezione in una voce di tabella dei simboli è un indice in base uno nella tabella delle sezioni. Tuttavia, questo campo è un intero con segno e può accettare valori negativi. I valori seguenti, minori di uno, hanno significati speciali.

Costante valore Descrizione
IMAGE_SYM_UNDEFINED
0
Il record di simboli non è ancora assegnato a una sezione. Un valore pari a zero indica che un riferimento a un simbolo esterno è definito altrove. Un valore diverso da zero è un simbolo comune con una dimensione specificata dal valore .
IMAGE_SYM_ABSOLUTE
1-
Il simbolo ha un valore assoluto (non rilocabile) e non è un indirizzo.
IMAGE_SYM_DEBUG
2-
Il simbolo fornisce informazioni generali sul tipo o sul debug, ma non corrisponde a una sezione. Gli strumenti Microsoft usano questa impostazione insieme ai record con estensione file (file della classe di archiviazione FILE).

 

Rappresentazione dei tipi

Il campo Tipo di una voce della tabella dei simboli contiene 2 byte, dove ogni byte rappresenta le informazioni sul tipo. LSB rappresenta il tipo di dati semplice (base) e msb rappresenta il tipo complesso, se presente:

MSB LSB
Tipo complesso: nessuno, puntatore, funzione, matrice.
Tipo di base: integer, a virgola mobile e così via.

 

I valori seguenti sono definiti per il tipo di base, anche se gli strumenti Microsoft in genere non usano questo campo e impostano LSB su 0. Le informazioni di debug di Visual C++ vengono invece usate per indicare i tipi. Tuttavia, i possibili valori COFF sono elencati qui per completezza.

Costante valore Descrizione
IMAGE_SYM_TYPE_NULL
0
Nessuna informazione sul tipo o tipo di base sconosciuto. Gli strumenti Microsoft usano questa impostazione
IMAGE_SYM_TYPE_VOID
1
Nessun tipo valido; usato con puntatori e funzioni void
IMAGE_SYM_TYPE_CHAR
2
Carattere (byte firmato)
IMAGE_SYM_TYPE_SHORT
3
Intero con segno a 2 byte
IMAGE_SYM_TYPE_INT
4
Tipo intero naturale (in genere 4 byte in Windows)
IMAGE_SYM_TYPE_LONG
5
Intero con segno a 4 byte
IMAGE_SYM_TYPE_FLOAT
6
Numero a virgola mobile a 4 byte
IMAGE_SYM_TYPE_DOUBLE
7
Numero a virgola mobile a 8 byte
IMAGE_SYM_TYPE_STRUCT
8
Struttura
IMAGE_SYM_TYPE_UNION
9
Un'unione
IMAGE_SYM_TYPE_ENUM
10
Tipo enumerato
IMAGE_SYM_TYPE_MOE
11
Membro dell'enumerazione (un valore specifico)
IMAGE_SYM_TYPE_BYTE
12
Un byte; intero senza segno a 1 byte
IMAGE_SYM_TYPE_WORD
13
Una parola; intero senza segno a 2 byte
IMAGE_SYM_TYPE_UINT
14
Intero senza segno di dimensioni naturali (in genere, 4 byte)
IMAGE_SYM_TYPE_DWORD
15
Intero senza segno a 4 byte

 

Il byte più significativo specifica se il simbolo è un puntatore a, una funzione che restituisce o una matrice del tipo di base specificato nell'LSB. Gli strumenti Microsoft usano questo campo solo per indicare se il simbolo è una funzione, in modo che gli unici due valori risultanti siano 0x0 e 0x20 per il campo Tipo. Tuttavia, altri strumenti possono usare questo campo per comunicare altre informazioni.

È molto importante specificare correttamente l'attributo della funzione. Queste informazioni sono necessarie per il corretto funzionamento del collegamento incrementale. Per alcune architetture, le informazioni potrebbero essere necessarie per altri scopi.

Costante valore Descrizione
IMAGE_SYM_DTYPE_NULL
0
Nessun tipo derivato; il simbolo è una semplice variabile scalare.
IMAGE_SYM_DTYPE_POINTER
1
Il simbolo è un puntatore al tipo di base.
IMAGE_SYM_DTYPE_FUNCTION
2
Il simbolo è una funzione che restituisce un tipo di base.
IMAGE_SYM_DTYPE_ARRAY
3
Il simbolo è una matrice di tipo base.

 

Classe di archiviazione

Il campo StorageClass della tabella dei simboli indica il tipo di definizione rappresentato da un simbolo. Nella tabella seguente vengono illustrati i valori possibili. Si noti che il campo StorageClass è un intero senza segno a 1 byte. Il valore speciale -1 deve quindi essere preso per indicare l'equivalente senza segno, 0xFF.

Sebbene il formato COFF tradizionale usi molti valori di classe di archiviazione, gli strumenti Microsoft si basano sul formato di debug di Visual C++ per la maggior parte delle informazioni simboliche e in genere usano solo quattro valori di classe di archiviazione: EXTERNAL (2), STATIC (3), FUNCTION (101) e FILE (103). Ad eccezione del secondo titolo di colonna riportato di seguito, "Valore" deve essere preso per indicare il campo Valore del record di simboli (la cui interpretazione dipende dal numero trovato come classe di archiviazione).

Costante Valore Descrizione/interpretazione del campo Valore
IMAGE_SYM_CLASS_END_OF_FUNCTION
-1 (0xFF)
Simbolo speciale che rappresenta la fine della funzione, a scopo di debug.
IMAGE_SYM_CLASS_NULL
0
Nessuna classe di archiviazione assegnata.
IMAGE_SYM_CLASS_AUTOMATIC
1
Variabile automatica (stack). Il campo Valore specifica l'offset dello stack frame.
IMAGE_SYM_CLASS_EXTERNAL
2
Valore usato da Microsoft Tools per i simboli esterni. Il campo Valore indica le dimensioni se il numero di sezione è IMAGE_SYM_UNDEFINED (0). Se il numero di sezione non è zero, il campo Valore specifica l'offset all'interno della sezione.
IMAGE_SYM_CLASS_STATIC
3
Offset del simbolo all'interno della sezione. Se il campo Valore è zero, il simbolo rappresenta un nome di sezione.
IMAGE_SYM_CLASS_REGISTER
4
Variabile di registro. Il campo Valore specifica il numero di registro.
IMAGE_SYM_CLASS_EXTERNAL_DEF
5
Simbolo definito esternamente.
IMAGE_SYM_CLASS_LABEL
6
Etichetta di codice definita all'interno del modulo. Il campo Valore specifica l'offset del simbolo all'interno della sezione.
IMAGE_SYM_CLASS_UNDEFINED_LABEL
7
Riferimento a un'etichetta di codice non definita.
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
8
Membro della struttura. Il campo Valore specifica l'n membro.
IMAGE_SYM_CLASS_ARGUMENT
9
Argomento formale (parametro) di una funzione. Il campo Valore specifica l'n argomento.
IMAGE_SYM_CLASS_STRUCT_TAG
10
Voce tag-name della struttura.
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11
Membro dell'unione. Il campo Valore specifica l'n membro.
IMAGE_SYM_CLASS_UNION_TAG
12
Voce union tag-name.
IMAGE_SYM_CLASS_TYPE_DEFINITION
13
Voce Typedef.
IMAGE_SYM_CLASS_UNDEFINED_STATIC
14
Dichiarazione di dati statici.
IMAGE_SYM_CLASS_ENUM_TAG
15
Voce tagname di tipo enumerata.
IMAGE_SYM_CLASS_MEMBER_OF_ENUM
16
Membro di un'enumerazione. Il campo Valore specifica l'n membro.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
Parametro register.
IMAGE_SYM_CLASS_BIT_FIELD
18
Riferimento al campo di bit. Il campo Valore specifica il n bit nel campo bit.
IMAGE_SYM_CLASS_BLOCK
100
Record con estensione bb (inizio del blocco) o con estensione eb (fine del blocco). Il campo Valore è l'indirizzo rilocabile della posizione del codice.
IMAGE_SYM_CLASS_FUNCTION
101
Valore usato dagli strumenti Microsoft per i record di simboli che definiscono l'extent di una funzione: begin function (.bf), funzione end ( .ef ) e righe nella funzione ( .lf ). Per i record con estensione lf, il campo Valore restituisce il numero di righe di origine nella funzione. Per i record con estensione ef, il campo Valore restituisce le dimensioni del codice della funzione.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
Voce di fine struttura.
IMAGE_SYM_CLASS_FILE
103
Valore usato dagli strumenti Microsoft, nonché dal formato COFF tradizionale, per il record di simboli del file di origine. Il simbolo è seguito da record ausiliari che denominano il file.
IMAGE_SYM_CLASS_SECTION
104
Definizione di una sezione (gli strumenti Microsoft usano invece la classe di archiviazione STATIC).
IMAGE_SYM_CLASS_WEAK_EXTERNAL
105
Un esterno debole. Per altre informazioni, vedere Formato ausiliario 3: Esterni deboli.
IMAGE_SYM_CLASS_CLR_TOKEN
107
Simbolo del token CLR. Il nome è una stringa ASCII costituita dal valore esadecimale del token. Per altre informazioni, vedere Definizione del token CLR (solo oggetto).

 

Record dei simboli ausiliari

I record di tabella dei simboli ausiliari seguono sempre e si applicano a alcuni record di tabella dei simboli standard. Un record ausiliario può avere qualsiasi formato che gli strumenti possono riconoscere, ma è necessario allocare 18 byte per tali record in modo che la tabella dei simboli venga mantenuta come matrice di dimensioni regolari. Attualmente, gli strumenti Microsoft riconoscono i formati ausiliari per i tipi di record seguenti: definizioni di funzione, simboli di inizio e fine della funzione (con estensione bf e ef), esterni deboli, nomi di file e definizioni di sezione.

La progettazione TRADIZIONALE di COFF include anche formati di record ausiliari per matrici e strutture. Gli strumenti Microsoft non usano questi strumenti, ma inseriscono invece tali informazioni simbolica nel formato di debug di Visual C++ nelle sezioni di debug.

Formato ausiliario 1: definizioni di funzione

Un record di tabella dei simboli contrassegna l'inizio di una definizione di funzione se include tutte le opzioni seguenti: una classe di archiviazione EXTERNAL (2), un valore Type che indica che è una funzione (0x20) e un numero di sezione maggiore di zero. Si noti che un record di tabella dei simboli con un numero di sezione UNDEFINED (0) non definisce la funzione e non dispone di un record ausiliario. I record dei simboli di definizione della funzione sono seguiti da un record ausiliario nel formato descritto di seguito:

Contropartita Dimensione Campo Descrizione
0
4
TagIndex
Indice della tabella dei simboli del record simbolo .bf (begin function) corrispondente.
4
4
TotalSize
Dimensioni del codice eseguibile per la funzione stessa. Se la funzione si trova nella propria sezione, SizeOfRawData nell'intestazione di sezione è maggiore o uguale a questo campo, a seconda delle considerazioni sull'allineamento.
8
4
PointerToLinenumber
Offset del file della prima voce di numero di riga COFF per la funzione oppure zero se non esiste alcuno. Per altre informazioni, vedere Numeri di riga COFF (deprecato).
12
4
PointerToNextFunction
Indice della tabella dei simboli del record per la funzione successiva. Se la funzione è l'ultima nella tabella dei simboli, questo campo viene impostato su zero.
16
2
Inutilizzato

 

Formato ausiliario 2: simboli bf ed ef

Per ogni definizione di funzione nella tabella dei simboli, tre elementi descrivono l'inizio, la fine e il numero di righe. Ognuno di questi simboli ha la classe di archiviazione FUNCTION (101):

Record di simboli denominato .bf (funzione begin). Il campo Valore non è usato.

Record di simboli denominato .lf (righe nella funzione). Il campo Valore indica il numero di righe nella funzione.

Record di simboli denominato .ef (fine della funzione). Il campo Valore ha lo stesso numero del campo Dimensioni totali nel record di simboli di definizione della funzione.

I record dei simboli bf e ef (ma non i record lf) sono seguiti da un record ausiliario con il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
Inutilizzato
4
2
Linenumber
Numero di riga ordinale effettivo (1, 2, 3 e così via) all'interno del file di origine, corrispondente al record con estensione bf o ef.
6
6
Inutilizzato
12
4
PointerToNextFunction ( solo .bf)
Indice della tabella dei simboli del record di simboli con estensione bf successivo. Se la funzione è l'ultima nella tabella dei simboli, questo campo viene impostato su zero. Non viene usato per i record ef.
16
2
Inutilizzato

 

Formato ausiliario 3: esterni deboli

Gli "esterni deboli" sono un meccanismo per i file oggetto che consente flessibilità in fase di collegamento. Un modulo può contenere un simbolo esterno non risolto (sym1), ma può includere anche un record ausiliario che indica che se sym1 non è presente al momento del collegamento, viene usato un altro simbolo esterno (sym2) per risolvere i riferimenti.

Se una definizione di sym1 è collegata, un riferimento esterno al simbolo viene risolto normalmente. Se una definizione di sym1 non è collegata, tutti i riferimenti all'esterno debole per sym1 fanno invece riferimento a sym2. Il simbolo esterno, sym2, deve sempre essere collegato; in genere, è definito nel modulo che contiene il riferimento debole a sym1.

Gli esterni deboli sono rappresentati da un record di tabella dei simboli con la classe di archiviazione EXTERNAL, il numero di sezione UNDEF e il valore zero. Il record di simboli deboli-esterni è seguito da un record ausiliario con il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
TagIndex
Indice della tabella dei simboli di sym2, simbolo da collegare se sym1 non viene trovato.
4
4
Caratteristiche
Un valore di IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY indica che non deve essere eseguita alcuna ricerca di libreria per sym1.
Un valore di IMAGE_WEAK_EXTERN_SEARCH_LIBRARY indica che deve essere eseguita una ricerca di libreria sym1.
Un valore di IMAGE_WEAK_EXTERN_SEARCH_ALIAS indica che sym1 è un alias per sym2.
8
10
Inutilizzato

 

Si noti che il campo Caratteristiche non è definito in WINNT. H; Viene invece utilizzato il campo Dimensioni totali.

Formato ausiliario 4: file

Questo formato segue un record di tabella dei simboli con file della classe di archiviazione (103). Il nome del simbolo deve essere file e il record ausiliario che segue assegna il nome di un file di codice sorgente.

Contropartita Dimensione Campo Descrizione
0
18
Nome file
Stringa ANSI che assegna il nome del file di origine. Viene riempito con valori Null se è minore della lunghezza massima.

 

Formato ausiliario 5: definizioni di sezione

Questo formato segue un record di tabella dei simboli che definisce una sezione. Un record di questo tipo ha un nome di simbolo che corrisponde al nome di una sezione ( ad esempio .text o .drectve) e ha la classe di archiviazione STATIC (3). Il record ausiliario fornisce informazioni sulla sezione a cui fa riferimento. Di conseguenza, duplica alcune delle informazioni nell'intestazione di sezione.

Contropartita Dimensione Campo Descrizione
0
4
Lunghezza
Dimensioni dei dati di sezione; uguale a SizeOfRawData nell'intestazione della sezione.
4
2
NumberOfRelocations
Numero di voci di rilocazione per la sezione.
6
2
NumberOfLinenumbers
Numero di voci di numero di riga per la sezione.
8
4
Checksum
Checksum per i dati comuni. È applicabile se il flag IMAGE_SCN_LNK_COMDAT è impostato nell'intestazione della sezione. Per altre informazioni, vedere Sezioni COMDAT (solo oggetto).
12
2
Numero
Indice in base uno nella tabella delle sezioni per la sezione associata. Viene utilizzato quando l'impostazione di selezione COMDAT è 5.
14
1
Selezione
Numero di selezione COMDAT. Questo è applicabile se la sezione è una sezione COMDAT.
15
3
Inutilizzato

 

Sezioni COMDAT (solo oggetto)

Il campo Selezione del formato ausiliario della definizione di sezione è applicabile se la sezione è una sezione COMDAT. Una sezione COMDAT è una sezione che può essere definita da più file oggetto. Il flag IMAGE_SCN_LNK_COMDAT è impostato nel campo Flag di sezione dell'intestazione di sezione. Il campo Selezione determina il modo in cui il linker risolve le più definizioni delle sezioni COMDAT.

Il primo simbolo con il valore della sezione COMDAT deve essere il simbolo di sezione. Questo simbolo ha il nome della sezione, il campo Valore uguale a zero, il numero di sezione della sezione COMDAT in questione, il campo Tipo uguale a IMAGE_SYM_TYPE_NULL, il campo Classe uguale a IMAGE_SYM_CLASS_STATIC e un record ausiliario. Il secondo simbolo viene chiamato "simbolo COMDAT" e viene usato dal linker insieme al campo Selection.

Di seguito sono riportati i valori per il campo Selezione.

Costante valore Descrizione
IMAGE_COMDAT_SELECT_NODUPLICATES
1
Se questo simbolo è già definito, il linker genera un errore "moltiplica simbolo definito".
IMAGE_COMDAT_SELECT_ANY
2
Qualsiasi sezione che definisce lo stesso simbolo COMDAT può essere collegata; il resto viene rimosso.
IMAGE_COMDAT_SELECT_SAME_SIZE
3
Il linker sceglie una sezione arbitraria tra le definizioni per questo simbolo. Se tutte le definizioni non hanno le stesse dimensioni, viene generato un errore di "moltiplica simbolo definito".
IMAGE_COMDAT_SELECT_EXACT_MATCH
4
Il linker sceglie una sezione arbitraria tra le definizioni per questo simbolo. Se tutte le definizioni non corrispondono esattamente, viene generato un errore "moltiplica simbolo definito".
IMAGE_COMDAT_SELECT_ASSOCIATIVE
5
La sezione è collegata se è collegata una determinata sezione COMDAT. Questa altra sezione è indicata dal campo Numero del record simbolo ausiliario per la definizione di sezione. Questa impostazione è utile per le definizioni con componenti in più sezioni, ad esempio codice in uno e dati in un altro, ma in cui tutti devono essere collegati o eliminati come set. L'altra sezione associata a questa sezione deve essere una sezione COMDAT, che può essere un'altra sezione COMDAT associativa. La catena di associazione di sezioni COMDAT associativa non può formare un ciclo. La catena di associazioni di sezioni deve venire a una sezione COMDAT che non ha IMAGE_COMDAT_SELECT_ASSOCIATIVE impostato.
IMAGE_COMDAT_SELECT_LARGEST
6
Il linker sceglie la definizione più grande tra tutte le definizioni per questo simbolo. Se più definizioni hanno queste dimensioni, la scelta tra di esse è arbitraria.

 

Definizione del token CLR (solo oggetto)

Questo simbolo ausiliario segue in genere il IMAGE_SYM_CLASS_CLR_TOKEN. Viene usato per associare un token allo spazio dei nomi della tabella dei simboli COFF.

Contropartita Dimensione Campo Descrizione
0
1
bAuxType
Deve essere IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1).
1
1
bReserved
Riservato, deve essere zero.
2
4
SymbolTableIndex
Indice dei simboli del simbolo COFF a cui fa riferimento questa definizione di token CLR.
6
12
Riservato, deve essere zero.

 

Tabella di stringhe COFF

Immediatamente dopo la tabella dei simboli COFF è presente la tabella di stringhe COFF. La posizione di questa tabella viene trovata prendendo l'indirizzo della tabella dei simboli nell'intestazione COFF e aggiungendo il numero di simboli moltiplicati per le dimensioni di un simbolo.

All'inizio della tabella di stringhe COFF sono presenti 4 byte che contengono le dimensioni totali (in byte) del resto della tabella di stringhe. Questa dimensione include il campo delle dimensioni stesso, in modo che il valore in questa posizione sia 4 se non sono presenti stringhe.

Le dimensioni sono stringhe con terminazione Null a cui puntano i simboli nella tabella dei simboli COFF.

Tabella dei certificati dell'attributo (solo immagine)

I certificati degli attributi possono essere associati a un'immagine aggiungendo una tabella dei certificati dell'attributo. La tabella dei certificati dell'attributo è costituita da un set di voci di certificato con allineamento quadword contigue. La spaziatura interna zero viene inserita tra la fine originale del file e l'inizio della tabella dei certificati dell'attributo per ottenere questo allineamento. Ogni voce del certificato dell'attributo contiene i campi seguenti.

Contropartita Dimensione Campo Descrizione
0
4
dwLength
Specifica la lunghezza della voce del certificato dell'attributo.
4
2
wRevision
Contiene il numero di versione del certificato. Per informazioni dettagliate, vedere il testo seguente.
6
2
wCertificateType
Specifica il tipo di contenuto in bCertificate. Per informazioni dettagliate, vedere il testo seguente.
8
Vedere quanto segue
bCertificate
Contiene un certificato, ad esempio una firma Authenticode. Per informazioni dettagliate, vedere il testo seguente.

 

Il valore dell'indirizzo virtuale della voce Tabella certificati nella directory dati intestazione facoltativa è un offset di file alla prima voce del certificato dell'attributo. Le voci successive sono accessibili avanzando i byte dwLength della voce, arrotondati fino a un multiplo a 8 byte, dall'inizio della voce corrente del certificato dell'attributo. Questa operazione continua fino a quando la somma dei valori dwLength arrotondati è uguale al valore Size della voce Tabella certificati nella directory dati intestazione facoltativa. Se la somma dei valori dwLength arrotondati non è uguale al valore Size, la tabella dei certificati dell'attributo o il campo Size è danneggiato.

Ad esempio, se la voce della tabella dei certificati della directory di intestazione facoltativa contiene:

virtual address = 0x5000
size = 0x1000

Il primo certificato inizia in corrispondenza dell'offset 0x5000 dall'inizio del file su disco. Per passare attraverso tutte le voci del certificato dell'attributo:

  1. Aggiungere il valore dwLength del primo certificato dell'attributo all'offset iniziale.
  2. Arrotondare il valore dal passaggio 1 al multiplo a 8 byte più vicino per trovare l'offset della seconda voce del certificato dell'attributo.
  3. Aggiungere il valore di offset dal passaggio 2 al secondo valore dwLength della voce del certificato dell'attributo e arrotondare il multiplo a 8 byte più vicino per determinare l'offset della terza voce del certificato attributo.
  4. Ripetere il passaggio 3 per ogni certificato successivo fino a quando l'offset calcolato è uguale a 0x6000 (0x5000 inizio + 0x1000 dimensione totale), che indica che l'intera tabella è stata completata.

In alternativa, è possibile enumerare le voci del certificato chiamando la funzione Win32 ImageEnumerateCertificates in un ciclo. Per un collegamento alla pagina di riferimento della funzione, vedere Riferimenti.

Le voci della tabella dei certificati degli attributi possono contenere qualsiasi tipo di certificato, purché la voce abbia il valore dwLength corretto, un valore wRevision univoco e un valore wCertificateType univoco. Il tipo più comune di voce della tabella dei certificati è una struttura WIN_CERTIFICATE, documentata in Wintrust.h e descritta nella parte restante di questa sezione.

Le opzioni per il membro wRevision WIN_CERTIFICATE includono (ma non sono limitate a) le opzioni seguenti.

valore Nome Note
0x0100
WIN_CERT_REVISION_1_0
Versione 1, versione legacy della struttura Win_Certificate. È supportato solo ai fini della verifica delle firme Authenticode legacy
0x0200
WIN_CERT_REVISION_2_0
La versione 2 è la versione corrente della struttura Win_Certificate.

 

Le opzioni per il membro WIN_CERTIFICATE wCertificateType includono (ma non sono limitate a) gli elementi nella tabella seguente. Si noti che alcuni valori non sono attualmente supportati.

valore Nome Note
0x0001
WIN_CERT_TYPE_X509
bCertificate contiene un certificato X.509
Non supportato
0x0002
WIN_CERT_TYPE_PKCS_SIGNED_DATA
bCertificate contiene una struttura SignedData PKCS#7
0x0003
WIN_CERT_TYPE_RESERVED_1
Riservato
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Firma del certificato dello stack di protocolli terminal server
Non supportato

 

Il membro bCertificate della struttura WIN_CERTIFICATE contiene una matrice di byte a lunghezza variabile con il tipo di contenuto specificato da wCertificateType. Il tipo supportato da Authenticode è WIN_CERT_TYPE_PKCS_SIGNED_DATA, una struttura SignedData PKCS#7. Per informazioni dettagliate sul formato di firma digitale Authenticode, vedere Windows Authenticode Portable Executable Signature Format.

Se il contenuto bCertificate non termina su un limite quadword, la voce del certificato dell'attributo viene riempita con zeri, dalla fine di bCertificate al limite quadword successivo.

Il valore dwLength è la lunghezza della struttura WIN_CERTIFICATE finalizzata e viene calcolata come segue:

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

Questa lunghezza deve includere le dimensioni di qualsiasi spaziatura interna usata per soddisfare il requisito che ogni struttura WIN_CERTIFICATE sia allineata a quadword:

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

La dimensione della tabella dei certificati specificata nella voce Tabella certificati nella directory dei dati di intestazione facoltativa (solo immagine) include la spaziatura interna.

Per altre informazioni sull'uso dell'API ImageHlp per enumerare, aggiungere e rimuovere certificati da file PE, vedere Funzioni ImageHlp.

Dati certificato

Come indicato nella sezione precedente, i certificati nella tabella dei certificati dell'attributo possono contenere qualsiasi tipo di certificato. I certificati che garantiscono l'integrità di un file PE possono includere un hash dell'immagine PE.

Un hash dell'immagine PE (o hash di file) è simile a un checksum di file in cui l'algoritmo hash produce un digest del messaggio correlato all'integrità di un file. Tuttavia, un checksum viene prodotto da un algoritmo semplice e viene usato principalmente per rilevare se un blocco di memoria su disco è andato male e i valori archiviati sono danneggiati. Un hash di file è simile a un checksum in quanto rileva anche il danneggiamento del file. Tuttavia, a differenza della maggior parte degli algoritmi checksum, è molto difficile modificare un file senza modificare l'hash del file dal valore originale non modificato. Un hash di file può quindi essere usato per rilevare modifiche intenzionali e persino sottili a un file, come quelli introdotti da virus, hacker o programmi trojan horse.

Se incluso in un certificato, il digest dell'immagine deve escludere determinati campi nell'immagine PE, ad esempio la voce Checksum e Tabella certificati in Directory dati intestazione facoltative. Ciò è dovuto al fatto che l'operazione di aggiunta di un certificato modifica questi campi e causerebbe il calcolo di un valore hash diverso.

La funzione Win32 ImageGetDigestStream fornisce un flusso di dati da un file PE di destinazione con cui eseguire l'hash delle funzioni. Questo flusso di dati rimane coerente quando i certificati vengono aggiunti o rimossi da un file PE. In base ai parametri passati a ImageGetDigestStream, è possibile omettere altri dati dell'immagine PE dal calcolo hash. Per un collegamento alla pagina di riferimento della funzione, vedere Riferimenti.

Tabelle di importazione di caricamento ritardato (solo immagine)

Queste tabelle sono state aggiunte all'immagine per supportare un meccanismo uniforme per consentire alle applicazioni di ritardare il caricamento di una DLL fino alla prima chiamata a tale DLL. Il layout delle tabelle corrisponde a quello delle tabelle di importazione tradizionali descritte nella sezione 6.4, Sezione .idata". Di seguito sono illustrati solo alcuni dettagli.

Tabella della directory delay-load

La tabella di directory delay-load è la controparte della tabella di directory di importazione. Può essere recuperata tramite la voce Delay Import Descriptor nell'elenco di directory dati di intestazione facoltativo (offset 200). La tabella è disposta nel modo seguente:

Contropartita Dimensione Campo Descrizione
0
4
Attributi
Deve essere zero.
4
4
Nome
RVA del nome della DLL da caricare. Il nome risiede nella sezione dei dati di sola lettura dell'immagine.
8
4
Handle del modulo
RVA dell'handle del modulo (nella sezione dati dell'immagine) della DLL da caricare in ritardo. Viene usato per l'archiviazione dalla routine fornita per gestire il caricamento ritardato.
12
4
Tabella indirizzi di importazione ritardata
RVA della tabella degli indirizzi di importazione di caricamento ritardato. Per altre informazioni, vedere Tabella indirizzi di importazione ritardata (IAT).
16
4
Tabella dei nomi di importazione ritardata
RVA della tabella dei nomi di caricamento ritardato, che contiene i nomi delle importazioni che potrebbero essere necessarie per il caricamento. Corrisponde al layout della tabella dei nomi di importazione. Per altre informazioni, vedere Hint/Name Table.
20
4
Tabella di importazione ritardata associata
RVA della tabella di indirizzi di caricamento ritardo associata, se presente.
24
4
Scarica tabella di importazione ritardata
RVA della tabella di indirizzi di caricamento ritardato, se esistente. Si tratta di una copia esatta della tabella degli indirizzi di importazione ritardata. Se il chiamante scarica la DLL, questa tabella deve essere copiata nuovamente sulla tabella degli indirizzi di importazione ritardata in modo che le chiamate successive alla DLL continuino a usare correttamente il meccanismo di recapito.
28
4
Timestamp
Timestamp della DLL a cui è stata associata l'immagine.

 

Le tabelle a cui viene fatto riferimento in questa struttura di dati sono organizzate e ordinate esattamente come per le importazioni tradizionali. Per informazioni dettagliate, vedere la sezione .idata.

Attributi

Non sono ancora stati definiti flag di attributo. Il linker imposta questo campo su zero nell'immagine. Questo campo può essere usato per estendere il record indicando la presenza di nuovi campi oppure può essere usato per indicare i comportamenti delle funzioni helper di ritardo o scaricamento.

Nome

Il nome della DLL da caricare in ritardo risiede nella sezione dei dati di sola lettura dell'immagine. Viene fatto riferimento tramite il campo szName.

Handle del modulo

L'handle della DLL da caricare in ritardo si trova nella sezione dei dati dell'immagine. Il campo phmod punta all'handle. L'helper di caricamento ritardato fornito usa questo percorso per archiviare l'handle nella DLL caricata.

Tabella indirizzi di importazione ritardata

La tabella degli indirizzi di importazione ritardata (IAT) fa riferimento al descrittore di importazione ritardata tramite il campo pIAT. L'helper di caricamento ritardato aggiorna questi puntatori con i punti di ingresso reali in modo che i batch non si trovino più nel ciclo di chiamata. È possibile accedere ai puntatori di funzione usando l'espressione pINT->u1.Function.

Tabella dei nomi di importazione ritardata

La tabella dei nomi di importazione ritardata (INT) contiene i nomi delle importazioni che potrebbero richiedere il caricamento. Vengono ordinati nello stesso modo dei puntatori a funzione nell'IAT. Sono costituiti dalle stesse strutture dell'INT standard e a cui si accede usando l'espressione pINT->u1.AddressOfData->Name[0].

Tabella degli indirizzi di importazione con associazione ritardata e timestamp

La tabella di indirizzi di importazione con associazione ritardata (BIAT) è una tabella facoltativa di IMAGE_THUNK_DATA elementi utilizzati insieme al campo timestamp della tabella di directory delay-load da una fase di associazione post-processo.

Ritardo di scaricamento della tabella degli indirizzi di importazione

Il ritardo di scaricamento della tabella degli indirizzi di importazione (UIAT) è una tabella facoltativa di IMAGE_THUNK_DATA elementi usati dal codice di scaricamento per gestire una richiesta esplicita di scaricamento. È costituito da dati inizializzati nella sezione di sola lettura che è una copia esatta dell'IAT originale che ha fatto riferimento al codice ai batch di caricamento ritardato. Nella richiesta di scaricamento, la libreria può essere liberata, la *phmod cancellata e l'interfaccia utente scritta sull'IAT per ripristinare lo stato di precaricamento di tutti gli elementi.

Sezioni speciali

Le sezioni COFF tipiche contengono codice o dati che i linker e i caricatori Microsoft Win32 elaborano senza conoscere in modo speciale il contenuto della sezione. Il contenuto è rilevante solo per l'applicazione collegata o eseguita.

Tuttavia, alcune sezioni COFF hanno significati speciali quando vengono trovati nei file oggetto o nei file di immagine. Gli strumenti e i caricatori riconoscono queste sezioni perché hanno flag speciali impostati nell'intestazione di sezione, perché posizioni speciali nell'intestazione facoltativa dell'immagine puntano a esse o perché il nome della sezione stessa indica una funzione speciale della sezione. Anche se il nome della sezione stessa non indica una funzione speciale della sezione, il nome della sezione è determinato per convenzione, quindi gli autori di questa specifica possono fare riferimento a un nome di sezione in tutti i casi.

Le sezioni riservate e i relativi attributi sono descritti nella tabella seguente, seguiti da descrizioni dettagliate per i tipi di sezione persistenti nei file eseguibili e nei tipi di sezione che contengono metadati per le estensioni.

Nome sezione Contenuto Caratteristiche
.Bss
Dati non inizializzati (formato libero)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.cormeta
Metadati CLR che indicano che il file oggetto contiene codice gestito
IMAGE_SCN_LNK_INFO
.dati
Dati inizializzati (formato libero)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.debug$F
Informazioni di debug FPO generate (solo oggetto, solo architettura x86 e ora obsoleto)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$P
Tipi di debug precompilati (solo oggetto)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$S
Simboli di debug (solo oggetto)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$T
Tipi di debug (solo oggetto)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
Drective
Opzioni del linker
IMAGE_SCN_LNK_INFO
.edata
Esportare tabelle
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.idata
Importare tabelle
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.idlsym
Include seH registrato (solo immagine) per supportare gli attributi IDL. Per informazioni, vedere "Attributi IDL" in Riferimenti alla fine di questo argomento.
IMAGE_SCN_LNK_INFO
.pdata
Informazioni sulle eccezioni
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.rdata
Dati inizializzati di sola lettura
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.reloc
Rilocazione delle immagini
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.rsrc
Directory delle risorse
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.sbss
Dati non inizializzati relativi a Criteri di gruppo (formato libero)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Il flag di IMAGE_SCN_GPREL deve essere impostato solo per le architetture IA64; questo flag non è valido per altre architetture. Il flag IMAGE_SCN_GPREL è solo per i file oggetto; quando questo tipo di sezione viene visualizzato in un file di immagine, il flag IMAGE_SCN_GPREL non deve essere impostato.
.sdata
Dati inizializzati relativi a Criteri di gruppo (formato libero)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Il flag di IMAGE_SCN_GPREL deve essere impostato solo per le architetture IA64; questo flag non è valido per altre architetture. Il flag IMAGE_SCN_GPREL è solo per i file oggetto; quando questo tipo di sezione viene visualizzato in un file di immagine, il flag IMAGE_SCN_GPREL non deve essere impostato.
.srdata
Dati di sola lettura relativi a Criteri di gruppo (formato libero)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Il flag di IMAGE_SCN_GPREL deve essere impostato solo per le architetture IA64; questo flag non è valido per altre architetture. Il flag IMAGE_SCN_GPREL è solo per i file oggetto; quando questo tipo di sezione viene visualizzato in un file di immagine, il flag IMAGE_SCN_GPREL non deve essere impostato.
.sxdata
Dati del gestore eccezioni registrati (solo formato libero e x86/oggetto)
IMAGE_SCN_LNK_INFO Contiene l'indice dei simboli di ognuno dei gestori di eccezioni a cui fa riferimento il codice nel file oggetto. Il simbolo può essere per un simbolo UNDEF o uno definito in tale modulo.
.Testo
Codice eseguibile (formato libero)
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IIMAGE_SCN_MEM_READ
.tls
Archiviazione locale thread (solo oggetto)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.tls$
Archiviazione locale thread (solo oggetto)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.vsdata
Dati inizializzati relativi a Criteri di gruppo (solo formato libero e per architetture ARM, SH4 e Thumb)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.xdata
Informazioni sulle eccezioni (formato libero)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

 

Alcune delle sezioni elencate di seguito sono contrassegnate come "solo oggetto" o "solo immagine" per indicare che la relativa semantica speciale è rilevante solo per i file oggetto o i file di immagine, rispettivamente. Una sezione contrassegnata come "solo immagine" potrebbe essere ancora visualizzata in un file oggetto come modo per accedere al file di immagine, ma la sezione non ha alcun significato speciale per il linker, solo per il caricatore di file di immagine.

Sezione .debug

La sezione debug viene usata nei file oggetto per contenere informazioni di debug generate dal compilatore e nei file di immagine per contenere tutte le informazioni di debug generate. Questa sezione descrive la creazione di pacchetti di informazioni di debug nei file oggetto e immagine.

La sezione successiva descrive il formato della directory di debug, che può essere ovunque nell'immagine. Le sezioni successive descrivono i "gruppi" nei file oggetto che contengono informazioni di debug.

Il valore predefinito per il linker è che le informazioni di debug non vengono mappate nello spazio indirizzi dell'immagine. Esiste una sezione con estensione debug solo quando vengono mappate le informazioni di debug nello spazio indirizzi.

Directory di debug (solo immagine)

I file di immagine contengono una directory di debug facoltativa che indica quale forma di informazioni di debug è presente e dove si trova. Questa directory è costituita da una matrice di voci di directory di debug la cui posizione e le dimensioni sono indicate nell'intestazione facoltativa dell'immagine.

La directory di debug può trovarsi in una sezione con estensione debug annullabile (se esistente) oppure può essere inclusa in qualsiasi altra sezione del file di immagine o non trovarsi in una sezione.

Ogni voce della directory di debug identifica il percorso e le dimensioni di un blocco di informazioni di debug. L'RVA specificato può essere pari a zero se le informazioni di debug non sono coperte da un'intestazione di sezione, ovvero risiede nel file di immagine e non viene mappata nello spazio degli indirizzi di runtime. Se è mappato, l'RVA è il relativo indirizzo.

Una voce di directory di debug ha il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
Caratteristiche
Riservato, deve essere zero.
4
4
TimeDateStamp
Ora e data di creazione dei dati di debug.
8
2
MajorVersion
Numero di versione principale del formato di dati di debug.
10
2
MinorVersion
Numero di versione secondaria del formato di dati di debug.
12
4
Digitare
Formato delle informazioni di debug. Questo campo abilita il supporto di più debugger. Per altre informazioni, vedere Tipo di debug.
16
4
SizeOfData
Dimensioni dei dati di debug( non inclusa la directory di debug stessa).
20
4
AddressOfRawData
Indirizzo dei dati di debug quando vengono caricati, in relazione alla base dell'immagine.
24
4
PointerToRawData
Puntatore di file ai dati di debug.

 

Tipo di debug

I valori seguenti sono definiti per il campo Tipo della voce della directory di debug:

Costante valore Descrizione
IMAGE_DEBUG_TYPE_UNKNOWN
0
Valore sconosciuto ignorato da tutti gli strumenti.
IMAGE_DEBUG_TYPE_COFF
1
Informazioni di debug COFF (numeri di riga, tabella dei simboli e tabella di stringhe). Questo tipo di informazioni di debug è indicato anche dai campi nelle intestazioni dei file.
IMAGE_DEBUG_TYPE_CODEVIEW
2
Informazioni di debug di Visual C++.
IMAGE_DEBUG_TYPE_FPO
3
Informazioni sull'omissione del puntatore di fotogramma (FPO). Queste informazioni indicano al debugger come interpretare i frame di stack non standard, che usano il registro EBP per uno scopo diverso da un puntatore di frame.
IMAGE_DEBUG_TYPE_MISC
4
Percorso del file DBG.
IMAGE_DEBUG_TYPE_EXCEPTION
5
Copia della sezione .pdata.
IMAGE_DEBUG_TYPE_FIXUP
6
Riservato.
IMAGE_DEBUG_TYPE_OMAP_TO_SRC
7
Mapping da un'appliance virtuale di controllo di accesso in un'immagine RVA nell'immagine di origine.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
Mapping da un'appliance virtuale di controllo di accesso nell'immagine di origine a un'appliance virtuale di gruppo nell'immagine.
IMAGE_DEBUG_TYPE_BORLAND
9
Riservato per Borland.
IMAGE_DEBUG_TYPE_RESERVED10
10
Riservato.
IMAGE_DEBUG_TYPE_CLSID
11
Riservato.
IMAGE_DEBUG_TYPE_REPRO
16
Determinismo PE o riproducibilità.
Non definito
17
Le informazioni di debug vengono incorporate nel file PE nel percorso specificato da PointerToRawData.
Non definito
19
Archivia l'hash di crittografia per il contenuto del file di simboli usato per compilare il file PE/COFF.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Bit di caratteristiche DLL estese.

 

Se il campo Tipo è impostato su IMAGE_DEBUG_TYPE_FPO, i dati non elaborati di debug sono una matrice in cui ogni membro descrive lo stack frame di una funzione. Non tutte le funzioni nel file di immagine devono avere informazioni FPO definite, anche se il tipo di debug è FPO. Si presuppone che le funzioni che non dispongono di informazioni FPO abbiano frame di stack normali. Il formato per le informazioni FPO è il seguente:

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

La presenza di una voce di tipo IMAGE_DEBUG_TYPE_REPRO indica che il file PE è compilato in modo da ottenere determinismo o riproducibilità. Se l'input non cambia, il file PE di output è garantito che sia identico a bit per bit indipendentemente dal momento in cui viene prodotto o da dove viene prodotto pe. Vari campi di data/ora nel file PE vengono compilati con parte o tutti i bit di un valore hash calcolato che usa il contenuto del file PE come input e quindi non rappresentano più la data e l'ora effettive in cui viene prodotto un file PE o dati specifici correlati all'interno del PE. I dati non elaborati di questa voce di debug possono essere vuoti o possono contenere un valore hash calcolato preceduto da un valore a quattro byte che rappresenta la lunghezza del valore hash.

Se il campo Tipo è impostato su IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, i dati non elaborati di debug contengono bit di caratteristiche DLL estese, in aggiunta a quelli che possono essere impostati nell'intestazione facoltativa dell'immagine. Vedere Caratteristiche DLL nella sezione Campi specifici di Intestazione facoltativa di Windows (solo immagine).

Caratteristiche dll estese

I valori seguenti sono definiti per i bit delle caratteristiche DLL estese.

Costante valore Descrizione
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 Image is Control-flow Enforcement Technology (CET) Shadow Stack compatible.Image is Control-flow Enforcement Technology (CET) Shadow Stack compatible.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Tutte le destinazioni di ramo in tutte le sezioni del codice immagine sono annotate con istruzioni di protezione dell'integrità del flusso di controllo forward-edge, ad esempio le istruzioni X86 CET-Indirect Branch Tracking (IBT) o ARM Branch Target Identification (BTI). Questo bit non viene usato da Windows.

.debug$F (solo oggetto)

I dati in questa sezione sono stati sostituiti in Visual C++ versione 7.0 e successive da un set di dati più esteso generato in una sottosezione .debug$S .

I file oggetto possono contenere sezioni .debug$F il cui contenuto è uno o più record FPO_DATA (informazioni sull'omissione del puntatore di frame). Vedere "IMAGE_DEBUG_TYPE_FPO" in Tipo di debug.

Il linker riconosce questi record .debug$F . Se vengono generate informazioni di debug, il linker ordina i record FPO_DATA in base alla routine RVA e genera una voce di directory di debug per tali record.

Il compilatore non deve generare record FPO per le procedure con un formato frame standard.

.debug$S (solo oggetto)

Questa sezione contiene informazioni sul debug di Visual C++ (informazioni simbolica).

.debug$P (solo oggetto)

Questa sezione contiene informazioni di debug di Visual C++ (informazioni precompilate). Si tratta di tipi condivisi tra tutti gli oggetti compilati usando l'intestazione precompilata generata con questo oggetto.

.debug$T (solo oggetto)

Questa sezione contiene informazioni sul debug di Visual C++ (informazioni sul tipo).

Supporto del linker per le informazioni di debug Microsoft

Per supportare le informazioni di debug, il linker:

  • Raccoglie tutti i dati di debug pertinenti dalle sezioni .debug$F, debug$S, .debug$P e .debug$T .

  • Elabora i dati insieme alle informazioni di debug generate dal linker nel file PDB e crea una voce di directory di debug per farvi riferimento.

Sezione .drectve (solo oggetto)

Una sezione è una sezione di direttiva se ha il flag IMAGE_SCN_LNK_INFO impostato nell'intestazione della sezione e ha il nome della sezione .drectve . Il linker rimuove una sezione con estensione drectve dopo l'elaborazione delle informazioni, quindi la sezione non viene visualizzata nel file di immagine collegato.

Una sezione .drectve è costituita da una stringa di testo che può essere codificata come ANSI o UTF-8. Se l'indicatore di ordine dei byte UTF-8 (BOM, un prefisso a tre byte costituito da 0xEF, 0xBB e 0xBF) non è presente, la stringa di direttiva viene interpretata come ANSI. La stringa di direttiva è una serie di opzioni del linker separate da spazi. Ogni opzione contiene un trattino, il nome dell'opzione e qualsiasi attributo appropriato. Se un'opzione contiene spazi, l'opzione deve essere racchiusa tra virgolette. La sezione .drectve non deve contenere rilocazione o numeri di riga.

Sezione .edata (solo immagine)

La sezione esporta dati, denominata .edata, contiene informazioni sui simboli a cui altre immagini possono accedere tramite il collegamento dinamico. I simboli esportati sono in genere disponibili nelle DLL, ma le DLL possono anche importare simboli.

Di seguito è descritta una panoramica della struttura generale della sezione di esportazione. Le tabelle descritte sono in genere contigue nel file nell'ordine indicato (anche se questa operazione non è obbligatoria). Solo la tabella di directory di esportazione e la tabella degli indirizzi di esportazione sono necessarie per esportare i simboli come ordinali. Un ordinale è un'esportazione accessibile direttamente dall'indice della tabella degli indirizzi di esportazione. La tabella dei puntatori dei nomi, la tabella ordinale e la tabella dei nomi di esportazione esistono tutti per supportare l'uso dei nomi di esportazione.

Nome tabella Descrizione
Esporta tabella directory
Tabella con una sola riga ,a differenza della directory di debug. Questa tabella indica i percorsi e le dimensioni delle altre tabelle di esportazione.
Tabella degli indirizzi di esportazione
Matrice di RVA di simboli esportati. Si tratta degli indirizzi effettivi delle funzioni e dei dati esportati all'interno del codice eseguibile e delle sezioni dati. Altri file di immagine possono importare un simbolo usando un indice in questa tabella (ordinale) o, facoltativamente, usando il nome pubblico che corrisponde all'ordinale se è definito un nome pubblico.
Tabella puntatore nome
Matrice di puntatori ai nomi di esportazione pubblici, ordinati in ordine crescente.
Tabella ordinale
Matrice dei ordinali che corrispondono ai membri della tabella dei puntatori dei nomi. La corrispondenza è in base alla posizione; pertanto, la tabella dei puntatori dei nomi e la tabella ordinale devono avere lo stesso numero di membri. Ogni ordinale è un indice nella tabella degli indirizzi di esportazione.
Esporta tabella dei nomi
Serie di stringhe ASCII con terminazione Null. I membri della tabella puntatore del nome puntano a questa area. Questi nomi sono i nomi pubblici attraverso i quali i simboli vengono importati ed esportati; non sono necessariamente uguali ai nomi privati usati all'interno del file di immagine.

 

Quando un altro file di immagine importa un simbolo in base al nome, il caricatore Win32 cerca una stringa corrispondente nella tabella dei puntatori dei nomi. Se viene trovata una stringa corrispondente, il numero ordinale associato viene identificato cercando il membro corrispondente nella tabella ordinale, ovvero il membro della tabella ordinale con lo stesso indice del puntatore stringa trovato nella tabella dei puntatori dei nomi. L'ordinale risultante è un indice nella tabella degli indirizzi di esportazione, che fornisce la posizione effettiva del simbolo desiderato. Ogni simbolo di esportazione può essere accessibile da un ordinale.

Quando un altro file di immagine importa un simbolo per ordinale, non è necessario cercare una stringa corrispondente nella tabella dei puntatori dei nomi. L'uso diretto di un ordinale è quindi più efficiente. Tuttavia, un nome di esportazione è più facile da ricordare e non richiede all'utente di conoscere l'indice della tabella per il simbolo.

Esporta tabella directory

Le informazioni sul simbolo di esportazione iniziano con la tabella della directory di esportazione, che descrive il resto delle informazioni sul simbolo di esportazione. La tabella della directory di esportazione contiene informazioni sull'indirizzo utilizzate per risolvere le importazioni nei punti di ingresso all'interno dell'immagine.

Contropartita Dimensione Campo Descrizione
0
4
Flag di esportazione
Riservato, deve essere 0.
4
4
Time/Datestamp
Ora e data di creazione dei dati di esportazione.
8
2
Versione principale
Numero di versione principale. I numeri di versione principale e secondaria possono essere impostati dall'utente.
10
2
Versione secondaria
Numero di versione secondario.
12
4
Nome RVA
Indirizzo della stringa ASCII che contiene il nome della DLL. Questo indirizzo è relativo alla base dell'immagine.
16
4
Base ordinale
Numero ordinale iniziale per le esportazioni in questa immagine. Questo campo specifica il numero ordinale iniziale per la tabella degli indirizzi di esportazione. È in genere impostato su 1.
20
4
Voci della tabella degli indirizzi
Numero di voci nella tabella degli indirizzi di esportazione.
24
4
Numero di puntatori ai nomi
Numero di voci nella tabella dei puntatori dei nomi. Si tratta anche del numero di voci nella tabella ordinale.
28
4
Esportare l'RVA della tabella degli indirizzi
Indirizzo della tabella degli indirizzi di esportazione, rispetto alla base dell'immagine.
32
4
RVA del puntatore del nome
Indirizzo della tabella del puntatore del nome di esportazione, rispetto alla base dell'immagine. Le dimensioni della tabella sono specificate dal campo Number of Name Pointers .The table size is given by the Number of Name Pointers field.
36
4
RVA tabella ordinale
Indirizzo della tabella ordinale, rispetto alla base dell'immagine.

 

Tabella degli indirizzi di esportazione

La tabella degli indirizzi di esportazione contiene l'indirizzo dei punti di ingresso esportati e i dati e i valori assoluti esportati. Un numero ordinale viene usato come indice nella tabella degli indirizzi di esportazione.

Ogni voce nella tabella degli indirizzi di esportazione è un campo che utilizza uno dei due formati nella tabella seguente. Se l'indirizzo specificato non si trova all'interno della sezione di esportazione (come definito dall'indirizzo e dalla lunghezza indicati nell'intestazione facoltativa), il campo è un'appliance virtuale di esportazione, ovvero un indirizzo effettivo nel codice o nei dati. In caso contrario, il campo è un'appliance virtuale di inoltro, che assegna un nome a un simbolo in un'altra DLL.

Contropartita Dimensione Campo Descrizione
0
4
Esportare RVA
Indirizzo del simbolo esportato quando caricato in memoria, rispetto alla base dell'immagine. Ad esempio, l'indirizzo di una funzione esportata.
0
4
RVA del server d'inoltro
Puntatore a una stringa ASCII con terminazione Null nella sezione di esportazione. Questa stringa deve essere compresa nell'intervallo specificato dalla voce della directory dei dati della tabella di esportazione. Vedere Directory dei dati di intestazione facoltative (solo immagine). Questa stringa assegna il nome della DLL e il nome dell'esportazione (ad esempio, "MYDLL.expfunc") o il nome della DLL e il numero ordinale dell'esportazione (ad esempio, "MYDLL.#27").

 

Un'appliance virtuale di inoltro esporta una definizione da un'altra immagine, rendendola come se fosse esportata dall'immagine corrente. Il simbolo viene quindi importato ed esportato contemporaneamente.

Ad esempio, in Kernel32.dll in Windows XP, l'esportazione denominata "HeapAlloc" viene inoltrata alla stringa "NTDLL. RtlAllocateHeap." In questo modo, le applicazioni possono usare il modulo specifico di Windows XP Ntdll.dll senza contenere effettivamente riferimenti all'importazione. La tabella di importazione dell'applicazione si riferisce solo a Kernel32.dll. Pertanto, l'applicazione non è specifica di Windows XP e può essere eseguita in qualsiasi sistema Win32.

Esporta tabella puntatore nome

La tabella dei puntatori dei nomi di esportazione è una matrice di indirizzi (RVA) nella tabella dei nomi di esportazione. I puntatori sono 32 bit ciascuno e sono relativi alla base dell'immagine. I puntatori vengono ordinati in modo lessicale per consentire ricerche binarie.

Un nome di esportazione viene definito solo se la tabella del puntatore al nome di esportazione contiene un puntatore.

Esporta tabella ordinale

La tabella ordinale di esportazione è una matrice di indici non distorti a 16 bit nella tabella degli indirizzi di esportazione. Gli ordinali sono distorti dal campo Base ordinale della tabella di directory di esportazione. In altre parole, la base ordinale deve essere sottratta dai ordinali per ottenere gli indici true nella tabella degli indirizzi di esportazione.

La tabella puntatore del nome di esportazione e la tabella ordinale di esportazione formano due matrici parallele separate per consentire l'allineamento del campo naturale. Queste due tabelle, in effetti, operano come una tabella, in cui la colonna Puntatore nome esportazione punta a un nome pubblico (esportato) e la colonna Esporta ordinale fornisce l'ordinale corrispondente per tale nome pubblico. Un membro della tabella dei puntatori dei nomi di esportazione e un membro della tabella ordinale di esportazione sono associati con la stessa posizione (indice) nelle rispettive matrici.

Pertanto, quando viene eseguita la ricerca della tabella puntatore del nome di esportazione e viene trovata una stringa corrispondente nella posizione i, l'algoritmo per trovare l'RVA del simbolo e l'ordinale distorto è:

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

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

Quando si cerca un simbolo per ordinale (con distorsione), l'algoritmo per trovare l'RVA del simbolo e il nome è:

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

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

Esporta tabella dei nomi

La tabella dei nomi di esportazione contiene i dati stringa effettivi a cui punta la tabella del puntatore del nome di esportazione. Le stringhe in questa tabella sono nomi pubblici che altre immagini possono usare per importare i simboli. Questi nomi di esportazione pubblica non sono necessariamente uguali ai nomi dei simboli privati che i simboli hanno nel proprio file di immagine e nel codice sorgente, anche se possono essere.

Ogni simbolo esportato ha un valore ordinale, che è solo l'indice nella tabella degli indirizzi di esportazione. L'uso dei nomi di esportazione, tuttavia, è facoltativo. Alcuni, tutti o nessuno dei simboli esportati può avere nomi di esportazione. Per i simboli esportati con nomi di esportazione, le voci corrispondenti nella tabella del puntatore del nome di esportazione e l'esportazione della tabella ordinale interagiscono per associare ogni nome a un ordinale.

La struttura della tabella dei nomi di esportazione è una serie di stringhe ASCII con terminazione Null di lunghezza variabile.

Sezione .idata

Tutti i file di immagine che importano simboli, inclusi praticamente tutti i file eseguibili (EXE), hanno una sezione .idata. Di seguito è riportato un layout di file tipico per le informazioni di importazione:

  • Tabella directory

    Voce di directory Null

  • DLL1 Importa tabella di ricerca

    Null

  • DLL2 Importa tabella di ricerca

    Null

  • DLL3 Importa tabella di ricerca

    Null

  • Tabella hint-name

Importa tabella directory

Le informazioni di importazione iniziano con la tabella di directory di importazione, che descrive il resto delle informazioni di importazione. La tabella della directory di importazione contiene informazioni sull'indirizzo usate per risolvere i riferimenti di correzione ai punti di ingresso all'interno di un'immagine DLL. La tabella di directory di importazione è costituita da una matrice di voci di directory di importazione, una voce per ogni DLL a cui fa riferimento l'immagine. L'ultima voce di directory è vuota (riempita con valori Null), che indica la fine della tabella di directory.

Ogni voce di directory di importazione ha il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
Import Lookup Table RVA (Caratteristiche)
RVA della tabella di ricerca di importazione. Questa tabella contiene un nome o un ordinale per ogni importazione. Il nome "Caratteristiche" viene usato in Winnt.h, ma non descrive più questo campo.
4
4
Time/Datestamp
Timbro impostato su zero fino a quando l'immagine non viene associata. Dopo l'associazione dell'immagine, questo campo viene impostato sul time/datastamp della DLL.
8
4
Catena di inoltro
Indice del primo riferimento del server d'inoltro.
12
4
Nome RVA
Indirizzo di una stringa ASCII contenente il nome della DLL. Questo indirizzo è relativo alla base dell'immagine.
16
4
Import Address Table RVA (Tabella Thunk)
RVA della tabella degli indirizzi di importazione. Il contenuto di questa tabella è identico al contenuto della tabella di ricerca di importazione fino a quando l'immagine non è associata.

 

Importa tabella di ricerca

Una tabella di ricerca di importazione è una matrice di numeri a 32 bit per PE32 o una matrice di numeri a 64 bit per PE32+. Ogni voce usa il formato del campo di bit descritto nella tabella seguente. In questo formato, bit 31 è il bit più significativo per PE32 e bit 63 è il bit più significativo per PE32+. La raccolta di queste voci descrive tutte le importazioni da una determinata DLL. L'ultima voce è impostata su zero (NULL) per indicare la fine della tabella.

Bit/i Dimensione Campo di bit Descrizione
31/63
1
Contrassegno ordinale/nome
Se questo bit è impostato, importare per ordinale. In caso contrario, importare in base al nome. Il bit viene mascherato come 0x80000000 per PE32, 0x8000000000000000 per PE32+.
15-0
16
Numero ordinale
Numero ordinale a 16 bit. Questo campo viene utilizzato solo se il campo di bit Ordinal/Name Flag è 1 (importazione per ordinale). I bit 30-15 o 62-15 devono essere 0.
30-0
31
RVA della tabella dei suggerimenti/nomi
RVA a 31 bit di una voce di tabella hint/name. Questo campo viene utilizzato solo se il campo di bit Ordinal/Name Flag è 0 (importazione per nome). Per PE32+ bit da 62 a 31 deve essere zero.

 

Tabella hint/name

Per l'intera sezione di importazione è sufficiente una tabella hint/name. Ogni voce nella tabella hint/name ha il formato seguente:

Contropartita Dimensione Campo Descrizione
0
2
Alludere
Indice nella tabella del puntatore del nome di esportazione. Viene tentata prima una corrispondenza con questo valore. In caso di errore, viene eseguita una ricerca binaria nella tabella del puntatore del nome di esportazione della DLL.
2
variabile
Nome
Stringa ASCII che contiene il nome da importare. Si tratta della stringa che deve essere confrontata con il nome pubblico nella DLL. Questa stringa fa distinzione tra maiuscole e minuscole e termina con un byte Null.
*
0 o 1
Blocco
Byte zero finale visualizzato dopo il byte null finale, se necessario, per allineare la voce successiva su un limite pari.

 

Importa tabella indirizzi

La struttura e il contenuto della tabella degli indirizzi di importazione sono identici a quelli della tabella di ricerca di importazione, fino a quando il file non viene associato. Durante l'associazione, le voci nella tabella degli indirizzi di importazione vengono sovrascritte con gli indirizzi a 32 bit (per PE32) o a 64 bit (per PE32+) dei simboli importati. Questi indirizzi sono gli indirizzi di memoria effettivi dei simboli, anche se tecnicamente sono ancora chiamati "indirizzi virtuali". Il caricatore elabora in genere l'associazione.

Sezione .pdata

La sezione .pdata contiene una matrice di voci di tabella delle funzioni utilizzate per la gestione delle eccezioni. Fa riferimento alla voce della tabella delle eccezioni nella directory dei dati dell'immagine. Le voci devono essere ordinate in base agli indirizzi della funzione (il primo campo di ogni struttura) prima di essere emesso nell'immagine finale. La piattaforma di destinazione determina quale delle tre varianti di formato di voce della tabella delle funzioni descritte di seguito viene usata.

Per le immagini MIPS a 32 bit, le voci della tabella delle funzioni hanno il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
Inizio indirizzo
Va della funzione corrispondente.
4
4
Indirizzo finale
VA della fine della funzione.
8
4
Gestore eccezioni
Puntatore al gestore eccezioni da eseguire.
12
4
Dati del gestore
Puntatore a informazioni aggiuntive da passare al gestore.
16
4
Indirizzo finale prologo
Va della fine del prologo della funzione.

 

Per le piattaforme ARM, PowerPC, SH3 e SH4 Windows CE, le voci della tabella delle funzioni hanno il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
Inizio indirizzo
Va della funzione corrispondente.
4
8 bit
Lunghezza prologo
Numero di istruzioni nel prologo della funzione.
4
22 bit
Lunghezza funzione
Numero di istruzioni nella funzione.
4
1 bit
Flag a 32 bit
Se impostata, la funzione è costituita da istruzioni a 32 bit. Se non è chiaro, la funzione è costituita da istruzioni a 16 bit.
4
1 bit
Flag eccezione
Se impostato, per la funzione esiste un gestore eccezioni. In caso contrario, non esiste alcun gestore eccezioni.

 

Per le piattaforme x64 e Itanium, le voci della tabella delle funzioni hanno il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
Inizio indirizzo
RVA della funzione corrispondente.
4
4
Indirizzo finale
RVA della fine della funzione.
8
4
Informazioni sulla rimozione
RVA delle informazioni di rimozione.

 

Sezione .reloc (solo immagine)

La tabella di rilocazione di base contiene voci per tutte le rilocazione di base nell'immagine. Il campo Tabella di rilocazione di base nelle directory dei dati di intestazione facoltative fornisce il numero di byte nella tabella di rilocazione di base. Per altre informazioni, vedere Directory dei dati di intestazione facoltative (solo immagine). La tabella di rilocazione di base è suddivisa in blocchi. Ogni blocco rappresenta le rilocazione di base per una pagina 4K. Ogni blocco deve iniziare su un limite a 32 bit.

Il caricatore non è necessario per elaborare le rilocazione di base risolte dal linker, a meno che l'immagine di caricamento non possa essere caricata nella base dell'immagine specificata nell'intestazione PE.

Blocco di rilocazione di base

Ogni blocco di rilocazione di base inizia con la struttura seguente:

Contropartita Dimensione Campo Descrizione
0
4
RVA di pagina
La base dell'immagine più l'RVA della pagina viene aggiunta a ogni offset per creare l'va in cui deve essere applicata la rilocazione di base.
4
4
Dimensioni blocco
Numero totale di byte nel blocco di rilocazione di base, inclusi i campi Page RVA e Block Size e i campi Tipo/Offset che seguono.

 

Il campo Dimensione blocco viene quindi seguito da un numero qualsiasi di voci di campo Tipo o Offset. Ogni voce è una parola (2 byte) e ha la struttura seguente:

Contropartita Dimensione Campo Descrizione
0
4 bit
Digitare
Archiviato nei 4 bit alti di WORD, valore che indica il tipo di rilocazione di base da applicare. Per altre informazioni, vedere Tipi di rilocazione di base.
0
12 bit
Compensare
Archiviato nei rimanenti 12 bit di WORD, un offset rispetto all'indirizzo iniziale specificato nel campo Page RVA per il blocco. Questo offset specifica dove applicare la rilocazione di base.

 

Per applicare una rilocazione di base, la differenza viene calcolata tra l'indirizzo di base preferito e la base in cui viene effettivamente caricata l'immagine. Se l'immagine viene caricata nella base preferita, la differenza è zero e quindi non è necessario applicare le rilozioni di base.

Tipi di rilocazione di base

Costante valore Descrizione
IMAGE_REL_BASED_ABSOLUTE
0
La rilocazione di base viene ignorata. Questo tipo può essere usato per riempire un blocco.
IMAGE_REL_BASED_HIGH
1
La rilocazione di base aggiunge i 16 bit alti della differenza al campo a 16 bit in corrispondenza dell'offset. Il campo a 16 bit rappresenta il valore elevato di una parola a 32 bit.
IMAGE_REL_BASED_LOW
2
La rilocazione di base aggiunge i 16 bit bassi della differenza al campo a 16 bit in corrispondenza dell'offset. Il campo a 16 bit rappresenta la metà bassa di una parola a 32 bit.
IMAGE_REL_BASED_HIGHLOW
3
La rilocazione di base applica tutti i 32 bit della differenza al campo a 32 bit in corrispondenza dell'offset.
IMAGE_REL_BASED_HIGHADJ
4
La rilocazione di base aggiunge i 16 bit alti della differenza al campo a 16 bit in corrispondenza dell'offset. Il campo a 16 bit rappresenta il valore elevato di una parola a 32 bit. I 16 bit bassi del valore a 32 bit vengono archiviati nella parola a 16 bit che segue questa rilocazione di base. Ciò significa che questa rilocazione di base occupa due slot.
IMAGE_REL_BASED_MIPS_JMPADDR
5
L'interpretazione della rilocazione dipende dal tipo di computer.
Quando il tipo di macchina è MIPS, la rilocazione di base si applica a un'istruzione di salto MIPS.
IMAGE_REL_BASED_ARM_MOV32
5
Questa rilocazione è significativa solo quando il tipo di computer è ARM o Thumb. La rilocazione di base applica l'indirizzo a 32 bit di un simbolo in una coppia di istruzioni MOVW/MOVT consecutiva.
IMAGE_REL_BASED_RISCV_HIGH20
5
Questa rilocazione è significativa solo quando il tipo di macchina è RISC-V. La rilocazione di base si applica ai 20 bit alti di un indirizzo assoluto a 32 bit.
6
Riservato, deve essere zero.
IMAGE_REL_BASED_THUMB_MOV32
7
Questa rilocazione è significativa solo quando il tipo di computer è Thumb. La rilocazione di base applica l'indirizzo a 32 bit di un simbolo a una coppia di istruzioni MOVW/MOVT consecutiva.
IMAGE_REL_BASED_RISCV_LOW12I
7
Questa rilocazione è significativa solo quando il tipo di macchina è RISC-V. La rilocazione di base si applica ai 12 bit bassi di un indirizzo assoluto a 32 bit formato nel formato di istruzioni di tipo I-V RISC-V.
IMAGE_REL_BASED_RISCV_LOW12S
8
Questa rilocazione è significativa solo quando il tipo di macchina è RISC-V. La rilocazione di base si applica ai 12 bit bassi di un indirizzo assoluto a 32 bit formato in formato di istruzioni S-V RISC-V.
IMAGE_REL_BASED_LOONGARCH32_MARK_LA
8
Questa rilocazione è significativa solo quando il tipo di computer è LoongArch a 32 bit. La rilocazione di base si applica a un indirizzo assoluto a 32 bit formato in due istruzioni consecutive.
IMAGE_REL_BASED_LOONGARCH64_MARK_LA
8
Questa rilocazione è significativa solo quando il tipo di computer è LoongArch a 64 bit. La rilocazione di base si applica a un indirizzo assoluto a 64 bit formato in quattro istruzioni consecutive.
IMAGE_REL_BASED_MIPS_JMPADDR16
9
La rilocazione è significativa solo quando il tipo di computer è MIPS. La rilocazione di base si applica a un'istruzione di salto MIPS16.
IMAGE_REL_BASED_DIR64
10
La rilocazione di base applica la differenza al campo a 64 bit in corrispondenza dell'offset.

 

Sezione .tls

La sezione .tls fornisce il supporto DIRETTO PE e COFF per l'archiviazione locale del thread statico (TLS). TLS è una classe di archiviazione speciale supportata da Windows in cui un oggetto dati non è una variabile automatica (stack), ma è locale per ogni singolo thread che esegue il codice. Ogni thread può quindi mantenere un valore diverso per una variabile dichiarata tramite TLS.

Si noti che qualsiasi quantità di dati TLS può essere supportata usando le chiamate API TlsAlloc, TlsFree, TlsSetValue e TlsGetValue. L'implementazione PE o COFF è un approccio alternativo all'uso dell'API e ha il vantaggio di essere più semplice dal punto di vista del programmatore del linguaggio di alto livello. Questa implementazione consente di definire e inizializzare i dati TLS in modo analogo alle normali variabili statiche in un programma. Ad esempio, in Visual C++, una variabile TLS statica può essere definita come segue, senza usare l'API Di Windows:

__declspec (thread) int tlsFlag = 1;

Per supportare questo costrutto di programmazione, la sezione PE e COFF .tls specifica le informazioni seguenti: dati di inizializzazione, routine di callback per l'inizializzazione e la terminazione per thread e l'indice TLS, illustrato nella discussione seguente.

Nota

Prima di Windows Vista, gli oggetti dati TLS dichiarati staticamente possono essere usati solo nei file di immagine caricati staticamente. Questo fatto rende inaffidabile l'uso di dati TLS statici in una DLL, a meno che non si conosca che la DLL, o qualsiasi elemento collegato in modo statico, non verrà mai caricato in modo dinamico con la funzione API LoadLibrary. Tuttavia, a partire da Windows Vista, sono stati apportati miglioramenti al caricatore di Windows per supportare meglio il caricamento dinamico delle DLL con TLS statico. Questa modifica significa che le DLL con oggetti dati TLS dichiarati in modo statico possono ora essere usate in modo più affidabile, anche se vengono caricate dinamicamente usando LoadLibrary. Il caricatore è in grado di allocare slot TLS per tali DLL in fase di caricamento, riducendo le limitazioni presenti nelle versioni precedenti di Windows.

 

Nota

I riferimenti agli offset a 32 bit e ai moltiplicatori di indice di 4 si applicano ai sistemi con architetture a 32 bit. In un sistema basato su architetture a 64 bit, modificarle in base alle esigenze.

Il codice eseguibile accede a un oggetto dati TLS statico tramite la procedura seguente:

  1. Al momento del collegamento, il linker imposta il campo Indirizzo di indice della directory TLS. Questo campo punta a un percorso in cui il programma prevede di ricevere l'indice TLS.

    La libreria di runtime Microsoft facilita questo processo definendo un'immagine di memoria della directory TLS e assegnandogli il nome speciale "__tls_used" (piattaforme Intel x86) o "_tls_used" (altre piattaforme). Il linker cerca questa immagine di memoria e usa i dati per creare la directory TLS. Altri compilatori che supportano TLS e funzionano con il linker Microsoft devono usare questa stessa tecnica.

  2. Quando viene creato un thread, il caricatore comunica l'indirizzo della matrice TLS del thread inserendo l'indirizzo del blocco di ambiente thread (TEB) nel registro FS. Un puntatore alla matrice TLS è all'offset di 0x2C dall'inizio di TEB. Questo comportamento è specifico di Intel x86.

  3. Il caricatore assegna il valore dell'indice TLS alla posizione indicata dal campo Indirizzo di indice.

  4. Il codice eseguibile recupera l'indice TLS e anche il percorso della matrice TLS.

  5. Il codice usa l'indice TLS e il percorso della matrice TLS (moltiplicando l'indice per 4 e usandolo come offset per la matrice) per ottenere l'indirizzo dell'area dati TLS per il programma e il modulo specificati. Ogni thread ha una propria area dati TLS, ma questo è trasparente per il programma, che non deve sapere come vengono allocati i dati per singoli thread.

  6. Si accede a un singolo oggetto dati TLS come offset fisso nell'area dati TLS.

La matrice TLS è una matrice di indirizzi gestiti dal sistema per ogni thread. Ogni indirizzo in questa matrice fornisce la posizione dei dati TLS per un determinato modulo (EXE o DLL) all'interno del programma. L'indice TLS indica quale membro della matrice usare. L'indice è un numero (significativo solo per il sistema) che identifica il modulo.

The TLS Directory

La directory TLS ha il formato seguente:

Offset (PE32/ PE32+) Dimensioni (PE32/ PE32+) Campo Descrizione
0
4/8
Data Start VA non elaborato
Indirizzo iniziale del modello TLS. Il modello è un blocco di dati usato per inizializzare i dati TLS. Il sistema copia tutti questi dati ogni volta che viene creato un thread, quindi non deve essere danneggiato. Si noti che questo indirizzo non è un RVA; si tratta di un indirizzo per il quale deve essere presente una rilocazione di base nella sezione .reloc.
4/8
4/8
Va finale dati non elaborati
Indirizzo dell'ultimo byte di TLS, ad eccezione del riempimento zero. Come per il campo va avvio dati non elaborati, si tratta di un va va, non di un RVA.
8/16
4/8
Indirizzo dell'indice
Percorso in cui ricevere l'indice TLS, assegnato dal caricatore. Questa posizione si trova in una sezione dati normale, quindi può essere assegnato un nome simbolico accessibile al programma.
12/24
4/8
Indirizzo dei callback
Puntatore a una matrice di funzioni di callback TLS. La matrice è con terminazione Null, quindi se non è supportata alcuna funzione di callback, questo campo punta a 4 byte impostato su zero. Per informazioni sul prototipo per queste funzioni, vedere Funzioni di callback TLS.
16/32
4
Dimensioni di riempimento zero
Dimensioni in byte del modello, oltre i dati inizializzati delimitati dai campi VA avvio dati non elaborati e va di fine dati non elaborati. Le dimensioni totali del modello devono corrispondere alle dimensioni totali dei dati TLS nel file di immagine. Il riempimento zero è la quantità di dati che viene dopo i dati non zero inizializzati.
20/36
4
Caratteristiche
I quattro bit [23:20] descrivono le informazioni di allineamento. I valori possibili sono quelli definiti come IMAGE_SCN_ALIGN_*, che vengono usati anche per descrivere l'allineamento della sezione nei file oggetto. Gli altri 28 bit sono riservati per uso futuro.

 

Funzioni di callback TLS

Il programma può fornire una o più funzioni di callback TLS per supportare l'inizializzazione e la terminazione aggiuntive per gli oggetti dati TLS. Un uso tipico per una funzione di callback di questo tipo è chiamare costruttori e distruttori per gli oggetti.

Anche se in genere non è presente più di una funzione di callback, un callback viene implementato come matrice per consentire l'aggiunta di altre funzioni di callback, se necessario. Se è presente più di una funzione di callback, ogni funzione viene chiamata nell'ordine in cui il relativo indirizzo viene visualizzato nella matrice. Un puntatore Null termina la matrice. È perfettamente valido avere un elenco vuoto (nessun callback supportato), nel qual caso la matrice di callback ha esattamente un puntatore membro-un puntatore Null.

Il prototipo per una funzione di callback (a cui punta un puntatore di tipo PIMAGE_TLS_CALLBACK) ha gli stessi parametri di una funzione punto di ingresso DLL:

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

Il parametro Reserved deve essere impostato su zero. Il parametro Reason può accettare i valori seguenti:

Impostazione valore Descrizione
DLL_PROCESS_ATTACH
1
È stato avviato un nuovo processo, incluso il primo thread.
DLL_THREAD_ATTACH
2
È stato creato un nuovo thread. Questa notifica è stata inviata per tutti i thread, ma per il primo thread.
DLL_THREAD_DETACH
3
Un thread sta per essere terminato. Questa notifica è stata inviata per tutti i thread, ma per il primo thread.
DLL_PROCESS_DETACH
0
Un processo sta per terminare, incluso il thread originale.

 

Struttura di configurazione del carico (solo immagine)

La struttura di configurazione del carico (IMAGE_LOAD_CONFIG_DIRECTORY) è stata usata in precedenza in casi molto limitati nel sistema operativo Windows NT stesso per descrivere varie funzionalità troppo difficili o troppo grandi per descrivere nell'intestazione del file o nell'intestazione facoltativa dell'immagine. Le versioni correnti del linker Microsoft e Windows XP e versioni successive di Windows usano una nuova versione di questa struttura per sistemi basati su x86 a 32 bit che includono la tecnologia SEH riservata. In questo modo viene fornito un elenco di gestori di eccezioni strutturati sicuri usati dal sistema operativo durante l'invio delle eccezioni. Se l'indirizzo del gestore si trova nell'intervallo va di un'immagine e viene contrassegnato come seh-aware riservato (ovvero, IMAGE_DLLCHARACTERISTICS_NO_SEH è chiaro nel campo DllCharacteristics dell'intestazione facoltativa, come descritto in precedenza), il gestore deve essere incluso nell'elenco dei gestori sicuri noti per tale immagine. In caso contrario, il sistema operativo termina l'applicazione. Ciò consente di evitare l'exploit di hijacking del gestore eccezioni x86 usato in passato per assumere il controllo del sistema operativo.

Il linker Microsoft fornisce automaticamente una struttura di configurazione del carico predefinita per includere i dati SEH riservati. Se il codice utente fornisce già una struttura di configurazione del carico, deve includere i nuovi campi SEH riservati. In caso contrario, il linker non può includere i dati SEH riservati e l'immagine non è contrassegnata come contenente SEH riservato.

Caricare la directory di configurazione

La voce della directory dei dati per una struttura di configurazione del carico SEH pre-riservata deve specificare una determinata dimensione della struttura di configurazione del carico perché il caricatore del sistema operativo prevede sempre che sia un determinato valore. A questo proposito, la dimensione è davvero solo un controllo della versione. Per la compatibilità con Windows XP e le versioni precedenti di Windows, le dimensioni devono essere 64 per le immagini x86.

Layout di configurazione del carico

La struttura di configurazione del carico ha il layout seguente per i file PE a 32 bit e a 64 bit:

Contropartita Dimensione Campo Descrizione
0
4
Caratteristiche
Flag che indicano gli attributi del file, attualmente inutilizzati.
4
4
TimeDateStamp
Valore di data e ora. Il valore è rappresentato nel numero di secondi trascorsi dalla mezzanotte (00:00:00), 1 gennaio 1970, Universal Coordinated Time, in base all'orologio di sistema. Il timestamp può essere stampato usando la funzione temporale del runtime C (CRT).
8
2
MajorVersion
Numero di versione principale.
10
2
MinorVersion
Numero di versione secondaria.
12
4
GlobalFlagsClear
Flag del caricatore globale da cancellare per questo processo quando il caricatore avvia il processo.
16
4
GlobalFlagsSet
Flag del caricatore globale da impostare per questo processo quando il caricatore avvia il processo.
20
4
CriticalSectionDefaultTimeout
Valore di timeout predefinito da usare per le sezioni critiche di questo processo abbandonate.
24
4/8
DeCommitFreeBlockThreshold
Memoria che deve essere liberata prima che venga restituita al sistema, in byte.
28/32
4/8
DeCommitTotalFreeThreshold
Quantità totale di memoria libera, in byte.
32/40
4/8
LockPrefixTable
[solo x86] VA di un elenco di indirizzi in cui viene usato il prefisso LOCK in modo che possano essere sostituiti con NOP in computer a processore singolo.
36/48
4/8
MaximumAllocationSize
Dimensioni massime di allocazione, in byte.
40/56
4/8
VirtualMemoryThreshold
Dimensioni massime della memoria virtuale, in byte.
44/64
4/8
ProcessAffinityMask
L'impostazione di questo campo su un valore diverso da zero equivale a chiamare SetProcessAffinityMask con questo valore durante l'avvio del processo (solo .exe)
48/72
4
ProcessHeapFlags
Contrassegni dell'heap di processo che corrispondono al primo argomento della funzione HeapCreate. Questi flag si applicano all'heap del processo creato durante l'avvio del processo.
52/76
2
CSDVersion
Identificatore della versione del Service Pack.
54/78
2
DependentLoadFlags
Flag di carico predefiniti usati quando il sistema operativo risolve le importazioni collegate staticamente di un modulo.
56/80
4/8
EditList
Riservato per l'uso da parte del sistema.
60/88
4/8
SecurityCookie
Puntatore a un cookie usato dall'implementazione di Visual C++ o GS.
64/96
4/8
SEHandlerTable
[solo x86] Va della tabella ordinata di RVA di ogni gestore SE valido e univoco nell'immagine.
68/104
4/8
SEHandlerCount
[solo x86] Numero di gestori univoci nella tabella.
72/112
4/8
GuardCFCheckFunctionPointer
Va in cui è archiviato il puntatore a funzione check-function di Control Flow Guard.
76/120
4/8
GuardCFDispatchFunctionPointer
Va in cui è archiviato il puntatore a funzione dispatch-guard di Control Flow Guard.
80/128
4/8
GuardCFFunctionTable
Va della tabella ordinata di RVAs di ogni funzione control flow guard nell'immagine.
84/136
4/8
GuardCFFunctionCount
Numero di RVA univoci nella tabella precedente.
88/144
4
GuardFlags
Flag correlati a Control Flow Guard.
92/148
12
CodeIntegrity
Informazioni sull'integrità del codice.
104/160
4/8
GuardAddressTakenIatEntryTable
Va in cui è archiviato l'indirizzo di Control Flow Guard acquisito tabella IAT.
108/168
4/8
GuardAddressTakenIatEntryCount
Numero di RVA univoci nella tabella precedente.
112/176
4/8
GuardLongJumpTargetTable
Va in cui è archiviata la tabella di destinazione del salto a lungo di Control Flow Guard.
116/184
4/8
GuardLongJumpTargetCount
Numero di RVA univoci nella tabella precedente.

 

Il campo GuardFlags contiene una combinazione di uno o più dei flag e campi secondari seguenti:

  • Il modulo esegue controlli di integrità del flusso di controllo usando il supporto fornito dal sistema.

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • Il modulo esegue controlli di integrità del flusso di controllo e scrittura.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • Il modulo contiene metadati validi per la destinazione del flusso di controllo.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • Il modulo non usa il cookie di sicurezza /GS.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • Il modulo supporta il caricamento in ritardo di sola lettura.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • Tabella di importazione delayload nella propria sezione con estensione didat (senza altro contenuto) che può essere riprotetto liberamente.

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • Il modulo contiene informazioni sull'esportazione eliminate. Ciò deduce anche che l'indirizzo acquisito tabella IAT è presente anche nella configurazione di caricamento.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • Il modulo abilita l'eliminazione delle esportazioni.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • Il modulo contiene informazioni sulla destinazione longjmp.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Maschera per il sottocampo che contiene lo stride delle voci della tabella della funzione Control Flow Guard, ovvero il conteggio aggiuntivo di byte per voce di tabella.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

Inoltre, l'intestazione winnt.h di Windows SDK definisce questa macro per la quantità di bit da spostare a destra il valore GuardFlags per giustificare a destra la tabella della funzione Control Flow Guard stride:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

Sezione .rsrc

Le risorse vengono indicizzate da una struttura ad albero con ordinamento binario a più livelli. La progettazione generale può incorporare 2**31 livelli. Per convenzione, tuttavia, Windows usa tre livelli:

Lingua del nome del tipo

Una serie di tabelle di directory delle risorse è correlata a tutti i livelli nel modo seguente: ogni tabella di directory è seguita da una serie di voci di directory che assegnano il nome o l'identificatore (ID) per tale livello (Tipo, Nome o Lingua) e un indirizzo di una descrizione dei dati o di un'altra tabella di directory. Se l'indirizzo punta a una descrizione dei dati, i dati sono una foglia nell'albero. Se l'indirizzo punta a un'altra tabella di directory, la tabella elenca le voci di directory al livello successivo verso il basso.

Gli ID tipo, nome e lingua di una foglia sono determinati dal percorso che viene eseguito attraverso le tabelle di directory per raggiungere la foglia. La prima tabella determina l'ID tipo, la seconda tabella (a cui punta la voce di directory nella prima tabella) determina l'ID nome e la terza tabella determina l'ID lingua.

La struttura generale della sezione .rsrc è:

Dati Descrizione
Tabelle di directory delle risorse (e voci della directory delle risorse)
Serie di tabelle, una per ogni gruppo di nodi nell'albero. Tutti i nodi di primo livello (tipo) sono elencati nella prima tabella. Le voci in questa tabella puntano a tabelle di secondo livello. Ogni albero di secondo livello ha lo stesso ID di tipo ma id nome diversi. Gli alberi di terzo livello hanno gli stessi ID tipo e nome, ma ID lingua diversi.
Ogni singola tabella viene immediatamente seguita dalle voci della directory, in cui ogni voce ha un nome o un identificatore numerico e un puntatore a una descrizione dei dati o a una tabella al livello inferiore successivo.
Stringhe della directory delle risorse
Stringhe Unicode allineate a due byte, che fungono da dati stringa a cui puntano le voci della directory.
Descrizione dati risorsa
Matrice di record, a cui puntano le tabelle, che descrivono le dimensioni effettive e la posizione dei dati delle risorse. Questi record sono le foglie nell'albero della descrizione delle risorse.
Dati risorsa
Dati non elaborati della sezione della risorsa. Le informazioni sulle dimensioni e sulla posizione nel campo Descrizioni dati risorsa delimitano le singole aree dei dati delle risorse.

 

Tabella della directory delle risorse

Ogni tabella della directory delle risorse ha il formato seguente. Questa struttura di dati deve essere considerata l'intestazione di una tabella perché la tabella è costituita effettivamente da voci di directory (descritte nella sezione 6.9.2, "Voci della directory delle risorse") e da questa struttura:

Contropartita Dimensione Campo Descrizione
0
4
Caratteristiche
Flag di risorsa. Questo campo è riservato per un uso futuro. Attualmente è impostato su zero.
4
4
Time/Datestamp
Ora in cui i dati della risorsa sono stati creati dal compilatore di risorse.
8
2
Versione principale
Numero di versione principale, impostato dall'utente.
10
2
Versione secondaria
Numero di versione secondario, impostato dall'utente.
12
2
Numero di voci nome
Numero di voci di directory immediatamente successive alla tabella che usano stringhe per identificare le voci Tipo, Nome o Lingua (a seconda del livello della tabella).
14
2
Numero di voci ID
Numero di voci di directory immediatamente successive alle voci Nome che usano ID numerici per le voci Tipo, Nome o Lingua.

 

Voci della directory delle risorse

Le voci della directory costituiscono le righe di una tabella. Ogni voce della directory delle risorse ha il formato seguente. Indica se la voce è una voce Name o ID è indicata dalla tabella della directory delle risorse, che indica il numero di voci Nome e ID che lo seguono (tenere presente che tutte le voci Nome precedono tutte le voci ID per la tabella). Tutte le voci per la tabella vengono ordinate in ordine crescente: le voci Name per stringa con distinzione tra maiuscole e minuscole e le voci ID in base al valore numerico. Gli offset sono relativi all'indirizzo nella IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Per altre informazioni, vedere Peering inside the PE: A Tour of the Win32 Portable Executable File Format (Peering inside the PE: A Tour of the Win32 Portable Executable File Format ).

Contropartita Dimensione Campo Descrizione
0
4
Offset dei nomi
Offset di una stringa che fornisce la voce Type, Name o Language ID, a seconda del livello della tabella.
0
4
ID intero
Intero a 32 bit che identifica la voce Tipo, Nome o ID lingua.
4
4
Offset di immissione dati
Bit alto 0. Indirizzo di una voce di dati della risorsa (foglia).
4
4
Offset della sottodirectory
Bit alto 1. I 31 bit inferiori sono l'indirizzo di un'altra tabella della directory delle risorse (il livello successivo verso il basso).

 

Stringa della directory delle risorse

L'area della stringa della directory delle risorse è costituita da stringhe Unicode, allineate a parole. Queste stringhe vengono archiviate insieme dopo l'ultima voce di Directory risorse e prima della prima voce di Dati risorsa. Ciò riduce al minimo l'impatto di queste stringhe a lunghezza variabile sull'allineamento delle voci di directory a dimensione fissa. Ogni stringa di directory di risorse ha il formato seguente:

Contropartita Dimensione Campo Descrizione
0
2
Lunghezza
Dimensione della stringa, senza includere il campo di lunghezza stesso.
2
variabile
Stringa Unicode
Dati stringa Unicode a lunghezza variabile, allineati a parole.

 

Immissione dati risorsa

Ogni voce Dati risorsa descrive un'unità effettiva di dati non elaborati nell'area Dati risorsa. Una voce Dati risorsa ha il formato seguente:

Contropartita Dimensione Campo Descrizione
0
4
RVA dei dati
Indirizzo di un'unità di dati delle risorse nell'area Dati risorsa.
4
4
Grandezza
Dimensioni, in byte, dei dati delle risorse a cui punta il campo RVA dati.
8
4
Tabella codici
Tabella codici usata per decodificare i valori dei punti di codice all'interno dei dati della risorsa. In genere, la tabella codici sarà la tabella codici Unicode.
12
4
Riservato, deve essere 0.

 

Sezione .cormeta (solo oggetto)

I metadati CLR vengono archiviati in questa sezione. Viene usato per indicare che il file oggetto contiene codice gestito. Il formato dei metadati non è documentato, ma può essere passato alle interfacce CLR per la gestione dei metadati.

Sezione .sxdata

I gestori di eccezioni validi di un oggetto sono elencati nella sezione sxdata di tale oggetto. La sezione è contrassegnata IMAGE_SCN_LNK_INFO. Contiene l'indice dei simboli COFF di ogni gestore valido, utilizzando 4 byte per indice.

Inoltre, il compilatore contrassegna un oggetto COFF come seh registrato emettendo il simbolo assoluto "@feat.00" con LSB del campo valore impostato su 1. Un oggetto COFF senza gestori SEH registrati avrebbe il simbolo "@feat.00", ma nessuna sezione sxdata .

Formato file archivio (libreria)

Il formato di archivio COFF fornisce un meccanismo standard per l'archiviazione di raccolte di file oggetto. Queste raccolte sono comunemente denominate librerie nella documentazione di programmazione.

I primi 8 byte di un archivio sono costituiti dalla firma del file. Il resto dell'archivio è costituito da una serie di membri di archivio, come indicato di seguito:

  • I primi e i secondi membri sono "membri del linker". Ognuno di questi membri ha un proprio formato, come descritto nella sezione Tipo di nome importazione. In genere, un linker inserisce le informazioni in questi membri dell'archivio. I membri del linker contengono la directory dell'archivio.

  • Il terzo membro è il membro "longnames". Questo membro facoltativo è costituito da una serie di stringhe ASCII con terminazione Null in cui ogni stringa è il nome di un altro membro dell'archivio.

  • Il resto dell'archivio è costituito da membri standard (file oggetto). Ognuno di questi membri contiene il contenuto di un file oggetto nella sua interezza.

Un'intestazione membro di archivio precede ogni membro. L'elenco seguente mostra la struttura generale di un archivio:

Firma :"!<arch>\n"
Intestazione
Primo membro del linker
Intestazione
2nd Linker Member
Intestazione
Membro Longnames
Intestazione
Contenuto del file OBJ 1
(formato COFF)
Intestazione
Contenuto del file OBJ 2
(formato COFF)

...

Intestazione
Contenuto del file OBJ N
(formato COFF)

Firma file di archiviazione

La firma del file di archiviazione identifica il tipo di file. Qualsiasi utilità (ad esempio, un linker) che accetta un file di archivio come input può controllare il tipo di file leggendo questa firma. La firma è costituita dai caratteri ASCII seguenti, in cui ogni carattere seguente è rappresentato letteralmente, ad eccezione del carattere newline (\n):

!<arch>\n

L'intestazione winnt.h di Windows SDK definisce le macro seguenti:

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

Archivia intestazioni membro

Ogni membro (linker, longnames o membro di file oggetto) è preceduto da un'intestazione. Un'intestazione membro di archivio ha il formato seguente, in cui ogni campo è una stringa di testo ASCII che viene lasciata giustificato e riempita con spazi fino alla fine del campo. Nessun carattere null finale in nessuno di questi campi.

Ogni intestazione membro inizia al primo indirizzo pari dopo la fine del membro archivio precedente, un byte '\n' (IMAGE_ARCHIVE_PAD) può essere inserito dopo che un membro di archivio inizia con un indirizzo pari.

Contropartita Dimensione Campo Descrizione
0
16
Nome
Nome del membro archivio, con una barra (/) aggiunta per terminare il nome. Se il primo carattere è una barra, il nome ha un'interpretazione speciale, come descritto nella tabella seguente.
16
12
Date
Data e ora di creazione del membro archivio: rappresentazione decimale ASCII del numero di secondi dal 1/1/1970 UCT.
28
6
ID utente
Rappresentazione decimale ASCII dell'ID utente. Questo campo non contiene un valore significativo nelle piattaforme Windows perché gli strumenti Microsoft generano tutti gli spazi vuoti.
34
6
ID gruppo
Rappresentazione decimale ASCII dell'ID gruppo. Questo campo non contiene un valore significativo nelle piattaforme Windows perché gli strumenti Microsoft generano tutti gli spazi vuoti.
40
8
Modo
Rappresentazione ottale ASCII della modalità file del membro. Si tratta del valore ST_MODE della funzione di runtime C _wstat.
48
10
Grandezza
Rappresentazione decimale ASCII delle dimensioni totali del membro archivio, senza includere le dimensioni dell'intestazione.
58
2
Fine intestazione
I due byte (0x60 0x0A) nella stringa C "'\n" (IMAGE_ARCHIVE_END).

Il campo Nome ha uno dei formati illustrati nella tabella seguente. Come accennato in precedenza, ognuna di queste stringhe viene lasciata giustificata e riempita con spazi finali all'interno di un campo di 16 byte:

Contenuto del campo Nome Descrizione
nome/
Nome del membro archivio.
/
Il membro archivio è uno dei due membri del linker. Entrambi i membri del linker hanno questo nome.
//
Il membro archive è il membro longnames, costituito da una serie di stringhe ASCII con terminazione Null. Il membro longnames è il terzo membro archivio ed è facoltativo.
/n
Il nome del membro archivio si trova in corrispondenza dell'offset n all'interno del membro longnames. Il numero n è la rappresentazione decimale dell'offset. Ad esempio: "/26" indica che il nome del membro archivio si trova a 26 byte oltre l'inizio del contenuto del membro longnames.

 

Primo membro del linker

Il nome del primo membro del linker è "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Il primo membro del linker è incluso per la compatibilità con le versioni precedenti. Non viene usato dai linker correnti, ma il formato deve essere corretto. Questo membro del linker fornisce una directory di nomi di simboli, così come il secondo membro del linker. Per ogni simbolo, le informazioni indicano dove trovare il membro archivio che contiene il simbolo.

Il primo membro del linker ha il formato seguente. Queste informazioni vengono visualizzate dopo l'intestazione:

Contropartita Dimensione Campo Descrizione
0
4
Numero di simboli
Valore Long senza segno contenente il numero di simboli indicizzati. Questo numero viene archiviato in formato big-endian. Ogni membro del file oggetto definisce in genere uno o più simboli esterni.
4
4 * n
Offset
Matrice di offset di file per archiviare le intestazioni dei membri, in cui n è uguale al campo Numero di simboli. Ogni numero nella matrice è un long senza segno archiviato in formato big-endian. Per ogni simbolo denominato nella tabella di stringhe, l'elemento corrispondente nella matrice di offset fornisce la posizione del membro archivio che contiene il simbolo.
*
*
Tabella stringhe
Serie di stringhe con terminazione Null che denominano tutti i simboli nella directory. Ogni stringa inizia immediatamente dopo il carattere Null nella stringa precedente. Il numero di stringhe deve essere uguale al valore del campo Numero di simboli.

 

Gli elementi nella matrice di offset devono essere disposti in ordine crescente. Questo significa che i simboli nella tabella di stringhe devono essere disposti in base all'ordine dei membri dell'archivio. Ad esempio, tutti i simboli nel primo membro del file oggetto devono essere elencati prima dei simboli nel secondo file oggetto.

Secondo membro del linker

Analogamente al primo membro del linker, il secondo membro del linker ha il nome "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Sebbene entrambi i membri del linker forniscano una directory di simboli e membri di archivio che li contengono, il secondo membro del linker viene utilizzato in preferenza per il primo da tutti i linker correnti. Il secondo membro del linker include nomi di simboli in ordine lessicale, che consente una ricerca più veloce in base al nome.

Il secondo membro ha il formato seguente. Queste informazioni vengono visualizzate dopo l'intestazione:

Contropartita Dimensione Campo Descrizione
0
4
Numero di membri
Valore long senza segno che contiene il numero di membri dell'archivio.
4
4 * m
Offset
Matrice di offset di file per archiviare le intestazioni dei membri, disposte in ordine crescente. Ogni offset è un valore long senza segno. Il numero m è uguale al valore del campo Numero di membri.
*
4
Numero di simboli
Valore long senza segno che contiene il numero di simboli indicizzati. Ogni membro del file oggetto definisce in genere uno o più simboli esterni.
*
2 * n
Indici
Matrice di indici basati su 1 (unsigned short ) che esegue il mapping dei nomi dei simboli agli offset dei membri archiviati. Il numero n è uguale al campo Numero di simboli. Per ogni simbolo denominato nella tabella di stringhe, l'elemento corrispondente nella matrice Indici fornisce un indice nella matrice di offset. La matrice di offset, a sua volta, fornisce la posizione del membro archivio che contiene il simbolo.
*
*
Tabella stringhe
Serie di stringhe con terminazione Null che denominano tutti i simboli nella directory. Ogni stringa inizia immediatamente dopo il byte Null nella stringa precedente. Il numero di stringhe deve essere uguale al valore del campo Numero di simboli. Questa tabella elenca tutti i nomi dei simboli in ordine lessicale crescente.

 

Membro Longnames

Il nome del membro longnames è "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Il membro longnames è una serie di stringhe di nomi di membri di archivio. Un nome viene visualizzato qui solo quando non è presente spazio sufficiente nel campo Nome (16 byte). Il membro longnames è facoltativo. Può essere vuoto solo con un'intestazione oppure può essere completamente assente senza nemmeno un'intestazione.

Le stringhe sono terminate con null. Ogni stringa inizia immediatamente dopo il byte Null nella stringa precedente.

Formato libreria di importazione

Le librerie di importazione tradizionali, ovvero le librerie che descrivono le esportazioni da un'immagine da usare da un'altra, in genere seguono il layout descritto nella sezione 7, Archive (Library) File Format. La differenza principale è che i membri della libreria di importazione contengono file pseudooggetto anziché quelli reali, in cui ogni membro include i contributi della sezione necessari per compilare le tabelle di importazione descritte nella sezione 6.4, la sezione .idata Il linker genera questo archivio durante la compilazione dell'applicazione di esportazione.

I contributi della sezione per un'importazione possono essere dedotti da un piccolo set di informazioni. Il linker può generare le informazioni complete e dettagliate nella libreria di importazione per ogni membro al momento della creazione della libreria o scrivere solo le informazioni canoniche nella libreria e consentire all'applicazione che successivamente usa di generare i dati necessari in tempo reale.

In una libreria di importazione con il formato lungo, un singolo membro contiene le informazioni seguenti:

  • Intestazione del membro archivio
  • Intestazione file
  • Intestazioni di sezione
  • Dati che corrispondono a ognuna delle intestazioni di sezione
  • Tabella dei simboli COFF
  • Stringhe

Al contrario, una breve libreria di importazione viene scritta come segue:

  • Intestazione del membro archivio
  • Importa intestazione
  • Stringa del nome di importazione con terminazione Null
  • Stringa di nome DLL con terminazione Null

Queste informazioni sono sufficienti per ricostruire in modo accurato l'intero contenuto del membro al momento dell'utilizzo.

Importa intestazione

L'intestazione di importazione contiene i campi e gli offset seguenti:

Contropartita Dimensione Campo Descrizione
0
2
Sig1
Deve essere IMAGE_FILE_MACHINE_UNKNOWN. Per altre informazioni, vedere Tipi di computer.
2
2
Sig2
Deve essere 0xFFFF.
4
2
Versione
Versione della struttura.
6
2
Macchina
Numero che identifica il tipo di computer di destinazione. Per altre informazioni, vedere Tipi di computer.
8
4
Time-Date Stamp
Ora e data di creazione del file.
12
4
Dimensioni dei dati
Dimensioni delle stringhe che seguono l'intestazione.
16
2
Ordinal/Hint
Ordinale o hint per l'importazione, determinato dal valore nel campo Tipo nome.
18
2 bit
Digitare
Tipo di importazione. Per valori e descrizioni specifici, vedere Tipo di importazione.
3 bit
Tipo di nome
Tipo di nome di importazione. Per altre informazioni, vedere Import Name Type.For more information, see Import Name Type.
11 bit
Riservato
Riservato, deve essere 0.

 

Questa struttura è seguita da due stringhe con terminazione Null che descrivono il nome del simbolo importato e la DLL da cui proviene.

Tipo di importazione

I valori seguenti sono definiti per il campo Tipo nell'intestazione di importazione:

Costante valore Descrizione
IMPORT_OBJECT_CODE
0
Codice eseguibile.
IMPORT_OBJECT_DATA
1
Dati.
IMPORT_OBJECT_CONST
2
Specificato come CONST nel file con estensione def.

Questi valori vengono usati per determinare quali contributi di sezione devono essere generati dallo strumento che usa la libreria se deve accedere a tali dati.

Tipo nome importazione

Il nome del simbolo di importazione con terminazione Null segue immediatamente l'intestazione di importazione associata. I valori seguenti sono definiti per il campo Tipo nome nell'intestazione di importazione. Indicano come usare il nome per generare i simboli corretti che rappresentano l'importazione:

Costante valore Descrizione
IMPORT_OBJECT_ORDINAL 0 L'importazione è per ordinale. Ciò indica che il valore nel campo Ordinal/Hint dell'intestazione di importazione è l'ordinale dell'importazione. Se questa costante non viene specificata, il campo Ordinal/Hint deve essere sempre interpretato come hint dell'importazione.
IMPORT_OBJECT_NAME 1 Il nome dell'importazione è identico al nome del simbolo pubblico.
IMPORT_OBJECT_NAME_NOPREFIX 2 Il nome dell'importazione è il nome del simbolo pubblico, ma ignora l'iniziale ?, @o facoltativamente _.
IMPORT_OBJECT_NAME_UNDECORATE 3 Il nome dell'importazione è il nome del simbolo pubblico, ma ignora il nome iniziale ?, @o facoltativamente _, e troncamento al primo @.

Appendice A: Calcolo dell'hash dell'immagine Authenticode PE

È previsto che vengano usati diversi certificati di attributo per verificare l'integrità delle immagini. Tuttavia, la firma più comune è Authenticode. È possibile usare una firma Authenticode per verificare che le sezioni pertinenti di un file di immagine PE non siano state modificate in alcun modo dal formato originale del file. Per eseguire questa attività, le firme Authenticode contengono un elemento denominato hash dell'immagine PE

Che cos'è un hash dell'immagine Authenticode PE?

L'hash dell'immagine Authenticode PE, o hash di file per brevità, è simile a un checksum di file in quanto produce un piccolo valore correlato all'integrità di un file. Un checksum viene prodotto da un algoritmo semplice e viene usato principalmente per rilevare gli errori di memoria. Vale a dire, viene usato per rilevare se un blocco di memoria su disco non è andato male e i valori archiviati lì sono danneggiati. Un hash di file è simile a un checksum in quanto rileva anche il danneggiamento del file. Tuttavia, a differenza della maggior parte degli algoritmi checksum, è molto difficile modificare un file in modo che abbia lo stesso hash di file del formato originale (non modificato). Ovvero, un checksum è destinato a rilevare semplici errori di memoria che portano al danneggiamento, ma un hash di file può essere usato per rilevare modifiche intenzionali e persino sottili a un file, ad esempio quelli introdotti da virus, hacker o programmi trojan horse.

In una firma Authenticode, l'hash del file viene firmato digitalmente usando una chiave privata nota solo al firmatario del file. Un consumer software può verificare l'integrità del file calcolando il valore hash del file e confrontandolo con il valore dell'hash firmato contenuto nella firma digitale Authenticode. Se gli hash del file non corrispondono, parte del file coperto dall'hash dell'immagine PE è stata modificata.

Che cos'è coperto in un hash di immagine Authenticode PE?

Non è possibile o auspicabile includere tutti i dati del file di immagine nel calcolo dell'hash dell'immagine PE. A volte presenta semplicemente caratteristiche indesiderate (ad esempio, le informazioni di debug non possono essere rimosse dai file rilasciati pubblicamente); a volte è semplicemente impossibile. Ad esempio, non è possibile includere tutte le informazioni all'interno di un file di immagine in una firma Authenticode, quindi inserire la firma Authenticode che contiene l'hash dell'immagine PE nell'immagine PE e successivamente generare un hash di immagine PE identico includendo nuovamente tutti i dati del file di immagine nel calcolo, perché il file contiene ora la firma Authenticode che non era originariamente presente.

Processo per la generazione dell'hash dell'immagine Authenticode PE

Questa sezione descrive come viene calcolato un hash dell'immagine PE e quali parti dell'immagine PE possono essere modificate senza invalidare la firma Authenticode.

Nota

L'hash dell'immagine PE per un file specifico può essere incluso in un file di catalogo separato senza includere un certificato attributo all'interno del file con hash. Ciò è rilevante, perché diventa possibile invalidare l'hash dell'immagine PE in un file di catalogo con firma Authenticode modificando un'immagine PE che in realtà non contiene una firma Authenticode.

Tutti i dati nelle sezioni dell'immagine PE specificati nella tabella delle sezioni vengono visualizzati nell'intero intervallo di esclusione, ad eccezione dei seguenti intervalli di esclusione:

  • Campo CheckSum del file dei campi specifici di Windows dell'intestazione facoltativa. Questo checksum include l'intero file (inclusi i certificati degli attributi nel file). In tutta probabilità, il checksum sarà diverso dal valore originale dopo l'inserimento della firma Authenticode.

  • Informazioni relative ai certificati degli attributi. Le aree dell'immagine PE correlate alla firma Authenticode non sono incluse nel calcolo dell'hash dell'immagine PE perché le firme Authenticode possono essere aggiunte o rimosse da un'immagine senza influire sull'integrità complessiva dell'immagine. Questo non è un problema, perché esistono scenari utente che dipendono dalla rifirmazione di immagini PE o dall'aggiunta di un timestamp. Authenticode esclude le informazioni seguenti dal calcolo hash:

    • Campo Tabella certificati delle directory dati di intestazione facoltative.

    • Tabella certificati e certificati corrispondenti a cui punta il campo Tabella certificati elencato immediatamente sopra.

    Per calcolare l'hash dell'immagine PE, Authenticode ordina le sezioni specificate nella tabella di sezioni in base all'intervallo di indirizzi, quindi esegue l'hashing della sequenza di byte risultante, passando sugli intervalli di esclusione.

  • Informazioni oltre la fine dell'ultima sezione. L'area oltre l'ultima sezione (definita dall'offset più alto) non viene eseguito l'hashing. Questa area contiene in genere informazioni di debug. Le informazioni di debug possono in genere essere considerate consultive per i debugger; non influisce sull'integrità effettiva del programma eseguibile. È letteralmente possibile rimuovere le informazioni di debug da un'immagine dopo il recapito di un prodotto e non influire sulla funzionalità del programma. In effetti, questa operazione viene talvolta eseguita come misura di salvataggio del disco. Vale la pena notare che le informazioni di debug contenute nelle sezioni specificate dell'immagine PE non possono essere rimosse senza invalidare la firma Authenticode.

È possibile usare gli strumenti makecert e signtool forniti nella SDK per piattaforma Windows per sperimentare la creazione e la verifica delle firme Authenticode. Per altre informazioni, vedere Informazioni di riferimento di seguito.

Riferimenti

Download e strumenti per Windows (include Windows SDK)

Creazione, visualizzazione e gestione dei certificati

Procedura dettagliata per la firma del codice in modalità kernel (.doc)

SignTool

Windows Authenticode Portable Executable Signature Format (.docx)

Funzioni ImageHlp