Formato PE

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

Nota

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

Questa revisione della specifica File eseguibile portabile Microsoft e Common Object File Format sostituisce tutte le revisioni precedenti di questa specifica.

Concetti generali

Questo documento specifica la struttura dei file eseguibili (immagine) e dei file di oggetti nella famiglia di sistemi operativi Microsoft Windows. Questi file sono denominati rispettivamente file eseguibili portabili (PE) e Common Object File Format (COFF). Il nome "Eseguibile portabile" fa riferimento 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. Un numero di istruzioni verificabili diverse può essere associato a un file; uno dei più utili è un'istruzione da parte di un produttore software che indica il digest dei messaggi dell'immagine. Un digest di messaggi è simile a un checksum, ad eccezione del fatto che è estremamente difficile da forgere. Pertanto, è molto difficile modificare un file per avere lo stesso digest del messaggio del file originale. L'istruzione può essere verificata come effettuata dal produttore usando schemi di crittografia delle chiavi pubbliche o private. 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 stampo è 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
Percorso di un elemento all'interno del file stesso, prima di essere elaborato dal linker (nel caso dei file di oggetti) o del caricatore (nel caso dei file di immagine). In altre parole, si tratta di una posizione all'interno del file come archiviato su disco.
linker
Riferimento al linker fornito con Microsoft Visual Studio.
file oggetto
File specificato come input per il 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 che viene caricato in memoria, con l'indirizzo di base del file di immagine sottratto da esso. L'RVA di un elemento è quasi sempre diverso dalla sua posizione all'interno del file su disco (puntatore file).
In un file oggetto, un'applicazione RVA è meno significativa perché i percorsi di memoria non vengono assegnati. In questo caso, un'applicazione RVA sarà 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 solo impostare la prima RVA in ogni sezione su zero.
section
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 collegare in modo più selettivo il 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 va non è prevedibile come RVA perché il caricatore potrebbe non caricare l'immagine nella posizione preferita.

Panoramica

Nell'elenco seguente viene descritto il formato eseguibile 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 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

  • unused

  • Identificatore OEM

    Informazioni OEM

    Offset all'intestazione PE

  • Tabella di trasferimento e programma Stub MS-DOS 2.0

  • unused

  • Intestazione PE (allineata al limite di 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 oggetto COFF Microsoft:

  • Intestazione COFF Microsoft

  • 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 oggetto COFF è costituita da un'intestazione di file COFF e da un'intestazione facoltativa. In entrambi i casi, le intestazioni di file vengono 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 "Questo programma non può essere eseguito 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.

Offset Dimensione Campo Descrizione
0
2
Computer
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
Alfa 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
Mitsubishi M32R piccolo 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 degli indirizzi a 32 bit di RISC-V
IMAGE_FILE_MACHINE_RISCV64
0x5064
Spazio degli indirizzi a 64 bit di RISC-V
IMAGE_FILE_MACHINE_RISCV128
0x5128
Spazio degli indirizzi a 128 bit di RISC-V
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
Thumb
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS little-endian WCE v2

Caratteristiche

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

Flag valore Descrizione
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Solo immagine, Windows CE e Microsoft Windows NT e versioni successive. Questo indica che il file non contiene rilocazione di base e pertanto deve essere caricato all'indirizzo di base preferito. Se l'indirizzo di base non è disponibile, il caricatore segnala un errore. Il comportamento predefinito del linker consiste nel rimuovere le rilocazione 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 set di lavoro. 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 l'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 nel supporto 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 di 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 dati non vada oltre SizeOfOptionalHeader. Per altre informazioni, vedere Intestazione file COFF (oggetto e immagine).For more information, see COFF File Header (Object and Image).

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 dell'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 le dimensioni dell'immagine a 2 gigabyte. Altre modifiche PE32+ vengono trattate nelle rispettive sezioni.

L'intestazione facoltativa stessa 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 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+.

Offset Dimensione Campo Descrizione
0
2
Magic
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 inizializzata o della somma di tutte queste sezioni se sono presenti più sezioni di dati.
12
4
SizeOfUninitializedData
Dimensioni della sezione dati non inizializzata (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.

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

Campi facoltativi di intestazione Windows-Specific (solo immagine)

I 21 campi successivi sono un'estensione per il 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 Windows CE EXEs è 0x00010000. L'impostazione predefinita 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 pari a 2 tra 512 e 64 K, inclusiva. Il valore predefinito è 512. Se la sezioneAlignment è 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, mentre 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 al momento dell'avvio e qualsiasi DLL caricata in un processo di Windows critico.
68/68
2
Subsystem
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 SizeOfStackCommit; il resto è 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 SizeOfHeapCommit; il resto è 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 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
Driver EFI con servizi di avvio
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER
12
Driver EFI con servizi di runtime
IMAGE_SUBSYSTEM_EFI_ROM
13
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 di indirizzi virtuali a entropia elevata a 64 bit.
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 delle eccezioni strutturate (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 oggetto 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
Server terminale a conoscenza.

Directory dati intestazione facoltativa (solo immagine)

Ogni directory dati fornisce l'indirizzo e le dimensioni di una tabella o di una stringa usata da Windows. Queste voci della directory dati vengono 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, è effettivamente l'RVA della tabella. RVA è l'indirizzo della tabella rispetto all'indirizzo di base dell'immagine quando viene caricata la tabella. Il secondo campo fornisce 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 si supponga che i RVA di 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 certificati
Indirizzo e dimensioni della tabella dei certificati dell'attributo. Per altre informazioni, vedere Tabella certificato 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
I dati di debug iniziano l'indirizzo e le dimensioni. 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
Indirizzo e dimensioni della tabella di archiviazione locale del thread (TLS). Per altre informazioni, vedere La sezione .tls.
176/192
8
Tabella di configurazione di caricamento
Indirizzo e dimensioni della tabella di configurazione del carico. Per altre informazioni, vedere Struttura di configurazione del carico (solo immagine).
184/200
8
Importazione associata
Indirizzo e dimensioni della tabella di importazione associati.
192/208
8
IAT
Indirizzo e dimensione della tabella degli indirizzi di importazione. Per altre informazioni, vedere Importa tabella indirizzi.
200/216
8
Descrittore di importazione ritardato
Indirizzo e dimensioni del descrittore di importazione ritardato. Per altre informazioni, vedere Tabelle di importazione di 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, è 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. Questo posizionamento è obbligatorio perché l'intestazione del file non contiene un puntatore diretto alla tabella delle sezioni. La posizione della tabella delle sezioni 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 un multiplo 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.

Offset Dimensione Campo Descrizione
0
8
Nome
Stringa con codifica UTF-8 a 8 byte. Se la stringa è lunga esattamente 8 caratteri, non esiste alcun valore Null di terminazione. 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 con 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 relativa alla base dell'immagine quando la sezione viene caricata in memoria. Per i file oggetto, questo campo è l'indirizzo del primo byte prima dell'applicazione della 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 su 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 viene riempito senza riempimento. Poiché il campo SizeOfRawData viene arrotondato ma il campo VirtualSize non è , è possibile che SizeOfRawData sia maggiore anche 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 a 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 al 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 del 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 per utilizzi futuri.
0x00000001
Riservato per utilizzi futuri.
0x00000002
Riservato per utilizzi futuri.
0x00000004
Riservato per utilizzi futuri.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
La sezione non deve essere riempita al limite successivo. Questo flag è obsoleto e viene sostituito da IMAGE_SCN_ALIGN_1BYTES. Questa opzione è valida solo per i file oggetto.
0x00000010
Riservato per utilizzi futuri.
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 per utilizzi futuri.
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 per utilizzi futuri.
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).For more information, see COMDAT Sections (Object Only). Questa opzione è valida solo per i file oggetto.
IMAGE_SCN_GPREL
0x00008000
La sezione contiene i dati a cui si fa riferimento tramite il puntatore globale (GP).
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Riservato per utilizzi futuri.
IMAGE_SCN_MEM_16BIT
0x00020000
Riservato per utilizzi futuri.
IMAGE_SCN_MEM_LOCKED
0x00040000
Riservato per utilizzi futuri.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Riservato per utilizzi futuri.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
Allineare i dati su un limite a 1 byte. Valido solo per i file oggetto.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
Allineare i dati su un limite a 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
Impossibile memorizzare nella cache la sezione.
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
È possibile leggere la sezione.
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 della sezione. Se il bit è impostato e il campo NumberOfRelocations nell'intestazione della sezione è 0xffff, il conteggio effettivo di rilocazione viene archiviato nel campo VirtualAddress a 32 bit del primo trasferimento. Si tratta di un errore se IMAGE_SCN_LNK_NRELOC_OVFL è impostato e sono presenti meno di 0xffff rilocazione nella sezione.

Sezioni raggruppate (solo oggetto)

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

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

Tuttavia, i caratteri seguenti sono "$"? determinare l'ordinamento dei contributi alla sezione immagine. Tutti i contributi con lo stesso nome della 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, tutto nei file di oggetti con il nome della sezione .text$X termina 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 "$"? .

Altro contenuto del file

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

Il resto di un oggetto COFF o 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 inferiore alle 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 dei file dei dati della sezione, come descritto nella sezione 5.1, "Dati sezione". Un'altra eccezione è che il certificato di attributo e le informazioni di debug devono essere posizionate alla fine di un file di immagine, con la tabella del certificato dell'attributo immediatamente precedente alla sezione di debug, perché il caricatore non esegue il mapping di tali informazioni in memoria. La regola relativa al certificato di attributo e alle informazioni di debug non si applica ai file di oggetti, tuttavia.

Dati sezione

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

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

In un file di immagine i dati della sezione devono essere allineati a 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 illustrato nelle singole intestazioni di sezione nella tabella della sezione.

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 l'immagine viene caricata, in modo che l'offset fisico per i dati della sezione sia uguale all'RVA.

Rilocazione COFF (solo oggetto)

I file di 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 della sezione. Ogni elemento della matrice ha il formato seguente.

Offset Dimensione Campo Descrizione
0
4
VirtualAddress
Indirizzo dell'elemento a cui viene applicata la rilocazione. Si tratta dell'offset dall'inizio della sezione, oltre al valore del campo RVA/Offset della sezione. Vedere Tabella sezione (intestazioni sezione). 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 assegna 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
Tipo
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 la 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

Gli indicatori di tipo di rilocazione seguenti 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 della destinazione 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 RVA (Image Base).
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 della 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
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

Per i processori ARM vengono definiti gli indicatori di tipo di rilocazione seguenti.

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 a 24 bit relativo alla destinazione.
IMAGE_REL_ARM_BRANCH11
0x0004
Riferimento a una chiamata 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 della 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
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 viene fissa con lo spostamento a 21 bit relativo 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 a 2 32 bit.
Non utilizzato
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
L'istruzione viene fissa con lo spostamento a 25 bit relativo 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 viene risolta con lo spostamento relativo a 25 bit alla destinazione allineata a 4 byte. I 2 bit bassi dello spostamento sono zero e non vengono 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

Gli indicatori di tipo di rilocazione seguenti 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 a 26 bit relativo alla 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 a 12 bit relativo alla destinazione, per l'istruzione ADR
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
Offset di 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
Bit 0:11 dell'offset di sezione della destinazione, per istruzioni ADD/ADDS (immediato) 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 della 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 della destinazione 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

Gli indicatori di tipo di rilocazione seguenti sono definiti per i processori SH3 e SH4. Le rilocazione 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'oggetto 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'oggetto 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 effettivo a 32 bit 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 della 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
RVA a 32 bit del simbolo di destinazione.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
Relativo a Criteri di gruppo.
IMAGE_REL_SH3_TOKEN
0x0012
Token CLR.
IMAGE_REL_SHM_PCRELPT
0x0013
Offset dell'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
I 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

Gli indicatori di tipo di rilocazione seguenti 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 rispetto alla posizione del simbolo.
IMAGE_REL_PPC_REL14
0x0007
Offset relativo al PC a 14 bit rispetto 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
IMAGE_REL_PPC_SECTION
0x000C
Indice della 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
IMAGE_REL_PPC_REFHI
0x0010
I 16 bit alti della 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 la cui proprietà SymbolTableIndex contiene uno spostamento a 16 bit firmato aggiunto ai 16 bit superiori prelevati dalla posizione che viene spostata.
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 Criteri di gruppo.
IMAGE_REL_PPC_TOKEN
0x0016
Token CLR.

 

Processori Intel 386

Gli indicatori di tipo di rilocazione seguenti 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 della 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 della 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 il debug delle informazioni e l'archiviazione locale dei thread statici.
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)

Gli indicatori di tipo di rilocazione seguenti sono definiti per la famiglia di processori Intel Itanium e i processori compatibili. Si noti che le rilocazione nelle 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 di essere 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 ricollocazione 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 /LARGEADDRESSAWARE:NO images.
IMAGE_REL_IA64_DIR64
0x0005
Va a 64 bit di destinazione.
IMAGE_REL_IA64_PCREL21B
0x0006
L'istruzione viene fissa con lo spostamento relativo a 25 bit alla destinazione allineata a 16 bit. I 4 bit bassi dello spostamento sono zero e non vengono archiviati.
IMAGE_REL_IA64_PCREL21M
0x0007
L'istruzione viene 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 archiviati.
IMAGE_REL_IA64_PCREL21F
0x0008
Gli LSB di questo offset di rilocazione devono contenere il numero di slot mentre il resto è l'indirizzo del bundle. Il bundle viene risolto con lo spostamento relativo a 25 bit alla destinazione allineata a 16 bit. I 4 bit bassi dello spostamento sono zero e non vengono 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 22 bit calcolato e applicato al bundle MDFEL22.
IMAGE_REL_IA64_LTOFF22
0x000A
L'istruzione viene risolta con l'offset relativo criteri di gruppo a 22 bit alla voce letterale del simbolo di destinazione. Il linker crea questa voce letterale di tabella in base a questa rilocazione e alla rilocazione ADDEND che potrebbe essere seguita.
IMAGE_REL_IA64_SECTION
0x000B
L'indice della sezione a 16 bit della sezione contiene la destinazione. Questa operazione viene usata 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 sezione. Questa rilocazione può essere seguita immediatamente da una rilocazione ADDEND, il cui campo Value 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 sezione. Questa rilocazione può essere seguita immediatamente da una rilocazione ADDEND il cui campo Value 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 di destinazione.
IMAGE_REL_IA64_SREL14
0x0011
Questa operazione viene applicata a un valore immediato a 14 bit firmato che contiene la differenza tra due destinazioni spostabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già generato questo valore.
IMAGE_REL_IA64_SREL22
0x0012
Questa operazione viene applicata a un'immediata firma a 22 bit che contiene la differenza tra due destinazioni spostabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già generato questo valore.
IMAGE_REL_IA64_SREL32
0x0013
Questa operazione viene applicata a un valore immediato a 32 bit firmato che contiene la differenza tra due valori spostabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già generato questo valore.
IMAGE_REL_IA64_UREL32
0x0014
Questa operazione viene applicata a un valore immediato a 32 bit senza segno che contiene la differenza tra due valori spostabili. Si tratta di un campo dichiarativo per il linker che indica che il compilatore ha già generato questo valore.
IMAGE_REL_IA64_PCREL60X
0x0015
Correzione relativa a PC a 60 bit che rimane sempre come istruzione BRL di un bundle MLX.
IMAGE_REL_IA64_PCREL60B
0x0016
Correzione relativa a PC a 60 bit. Se lo spostamento di destinazione si adatta a 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 a PC a 60 bit. Se lo spostamento di destinazione si adatta a un campo a 25 bit firmato, convertire l'intero bundle in un bundle MFB con NOP. F nello slot 1 e 25 bit (4 bit più bassi tutti zero e eliminati) istruzione BR nello slot 2.
IMAGE_REL_IA64_PCREL60I
0x0018
Correzione relativa a PC a 60 bit. Se lo spostamento di destinazione si adatta a un campo a 25 bit firmato, convertire l'intero bundle in un bundle MIB con NOP. Io nello slot 1 e un 25 bit (4 bit più bassi tutti zero e eliminati) istruzione BR nello slot 2.
IMAGE_REL_IA64_PCREL60M
0x0019
Correzione relativa a PC a 60 bit. Se lo spostamento di destinazione si adatta a un campo a 25 bit firmato, convertire l'intero bundle in un bundle MMB con NOP. M nello slot 1 e in 25 bit (4 bit più bassi tutti zero e eliminati) istruzione BR nello slot 2.
IMAGE_REL_IA64_IMMGPREL64
0x001a
Correzione a 64 bit relativa a Criteri di gruppo.
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, MDFEL22, 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

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

Costante Valore Descrizione
IMAGE_REL_MIPS_ABSOLUTE
0x0000
La rilocazione viene ignorata.
IMAGE_REL_MIPS_REFHALF
0x0001
L'alto 16 bit del va a 32 bit di destinazione.
IMAGE_REL_MIPS_REFWORD
0x0002
Va a 32 bit di destinazione.
IMAGE_REL_MIPS_JMPADDR
0x0003
I 26 bit bassi del va di destinazione. Supporta le istruzioni MIPS J e JAL.
IMAGE_REL_MIPS_REFHI
0x0004
L'alto 16 bit del va a 32 bit di 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 simboloTableIndex contiene uno spostamento a 16 bit firmato aggiunto ai 16 bit superiori che vengono presi dalla posizione in cui viene spostato.
IMAGE_REL_MIPS_REFLO
0x0005
I 16 bit bassi del va di destinazione.
IMAGE_REL_MIPS_GPREL
0x0006
Spostamento con segno a 16 bit della destinazione rispetto al registro Criteri di gruppo.
IMAGE_REL_MIPS_LITERAL
0x0007
Uguale a IMAGE_REL_MIPS_GPREL.
IMAGE_REL_MIPS_SECTION
0x000A
L'indice della sezione a 16 bit della sezione contiene la destinazione. Questa operazione viene usata per supportare le informazioni di debug.
IMAGE_REL_MIPS_SECREL
0x000B
Offset a 32 bit della destinazione dall'inizio della sezione. Questa operazione viene usata per supportare il debug delle informazioni 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 sezione.
IMAGE_REL_MIPS_SECRELHI
0x000D
Valore elevato a 16 bit dell'offset a 32 bit della destinazione dall'inizio della sezione. Una IMAGE_REL_MIPS_PAIR rilocazione deve seguire immediatamente questa. SymbolTableIndex della rilocazione PAIR contiene uno spostamento a 16 bit firmato aggiunto ai 16 bit superiori che vengono acquisiti dalla posizione in cui viene spostato.
IMAGE_REL_MIPS_JMPADDR16
0x0010
I 26 bit bassi del va di destinazione. Supporta l'istruzione JAL MIPS16.
IMAGE_REL_MIPS_REFWORDNB
0x0022
RVA a 32 bit di destinazione.
IMAGE_REL_MIPS_PAIR
0x0025
Il trasferimento è valido solo quando segue immediatamente una rilocazione REFHI o SECRELHI. SymbolTableIndex contiene uno spostamento e non un indice nella tabella dei simboli.

 

Mitsubishi M32R

Per i processori M32R vengono definiti gli indicatori di tipo di rilocazione seguenti.

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

 

Numeri di riga COFF (deprecati)

I numeri di riga COFF non sono più prodotti e, in futuro, non verranno usati.

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 file) e le dimensioni della matrice vengono specificati nell'intestazione della sezione. Ogni record numero di riga è del formato seguente.

Offset 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
Quando non viene eseguito il numero di zero, questo campo specifica un numero di riga basato su un solo. Quando zero, il campo Type viene interpretato come indice di tabella dei simboli per una funzione.

 

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

Offset 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 numero di righe.
0
4
VirtualAddress
Usato quando Linenumber non è zero: L'RVA del codice eseguibile corrispondente alla riga di origine indicata. In un file oggetto, questo contiene l'oggetto VA all'interno della sezione.

 

Un record numero 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 di numero di riga standard assegnando un numero intero positivo (numero di riga) e l'indirizzo corrispondente nel codice oggetto.

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

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

Ad esempio, il primo record del numero di riga per l'esempio seguente specifica la funzione ReverseSign (SymbolTableIndex di ReverseSign e Linenumber impostata su zero). I record con valori linenumber di 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. È distinto dalle informazioni di debug 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 la comunicazione delle informazioni COMDAT al linker. I nomi di sezione e i nomi dei 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 di tabella simbolo standard o ausiliario. Un record standard definisce un simbolo o un nome e ha il formato seguente.

Offset Dimensione Campo Descrizione
0
8
Nome (*)
Nome del simbolo rappresentato da un'unione di tre strutture. Se il nome non è maggiore di 8 byte, viene usata una matrice di 8 byte. Per altre informazioni, vedere Rappresentazione dei nomi dei simboli.
8
4
Valore
Valore associato al simbolo. L'interpretazione di questo campo dipende da SectionNumber e StorageClass. Un significato tipico è l'indirizzo spostabile.
12
2
SectionNumber
Intero con segno che identifica la sezione usando un indice basato su uno nella tabella della sezione. Alcuni valori hanno un significato speciale, come definito nella sezione 5.4.2, "Valori numero sezione".
14
2
Tipo
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 simboli ausiliari seguono immediatamente ogni record di tabella dei simboli standard. Tuttavia, in genere non più di un record di tabella simbolo ausiliario segue un record di tabella dei simboli standard (ad eccezione dei record di file con nomi di file lunghi). Ogni record ausiliario è la stessa dimensione di un record di tabella dei simboli standard (18 byte), ma anziché definire un nuovo simbolo, il record ausiliario fornisce informazioni aggiuntive sull'ultimo simbolo definito. La scelta di quali formati da 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 leggeno le tabelle dei simboli COFF devono ignorare i record dei simboli ausiliari la cui interpretazione è sconosciuta. Ciò consente di estendere il formato della tabella dei simboli per aggiungere nuovi record ausiliari, senza interrompere gli strumenti esistenti.

Rappresentazione nome 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 stringa. Per determinare se il nome stesso o un offset viene specificato, testare i primi 4 byte per l'uguaglianza a zero.

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

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

 

Valori numero sezione

In genere, il campo Valore sezione in una voce di tabella dei simboli è un indice basato su una tabella della sezione. 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 dimensioni specificate dal valore.
IMAGE_SYM_ABSOLUTE
-1
Il simbolo ha un valore assoluto (non spostabile) e non è un indirizzo.
IMAGE_SYM_DEBUG
-2
Il simbolo fornisce informazioni di tipo generale o debug, ma non corrispondono a una sezione. Gli strumenti Microsoft usano questa impostazione insieme ai record con estensione file (file di archiviazione FILE di classe).

 

Rappresentazione dei tipi

Il campo Tipo di una voce della tabella dei simboli contiene 2 byte, in cui 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: intero, 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 la completezza.

Costante Valore Descrizione
IMAGE_SYM_TYPE_NULL
0
Nessuna informazione di 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 (normalmente 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
Unione
IMAGE_SYM_TYPE_ENUM
10
Tipo enumerato
IMAGE_SYM_TYPE_MOE
11
Membro dell'enumerazione (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. La tabella seguente mostra 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.

Anche se il formato COFF tradizionale usa 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 della classe di archiviazione: EXTERNAL (2), STATIC (3), FUNCTION (101) e FILE (103). Ad eccezione della seconda intestazione di colonna riportata 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 il n membro.
IMAGE_SYM_CLASS_UNION_TAG
12
Voce Nome tag Unione.
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 il n membro.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
Parametro di registrazione.
IMAGE_SYM_CLASS_BIT_FIELD
18
Riferimento a un campo a bit. Il campo Valore specifica il n bit nel campo bit.
IMAGE_SYM_CLASS_BLOCK
100
Record con estensione bb (inizio blocco) o con estensione eb (fine blocco). Il campo Valore è l'indirizzo spostabile della posizione del codice.
IMAGE_SYM_CLASS_FUNCTION
101
Valore usato dagli strumenti Microsoft per i record di simboli che definiscono l'estensione di una funzione: begin function (.bf), funzione end ( .ef ) e righe in funzione ( .lf ). Per i record con estensione lf, il campo Valore fornisce il numero di righe di origine nella funzione. Per i record con estensione ef, il campo Value fornisce le dimensioni del codice della funzione.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
Voce end-of-structure.
IMAGE_SYM_CLASS_FILE
103
Valore usato dagli strumenti Microsoft, oltre al 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 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 18 byte devono essere allocati per loro 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 (.bf e .ef), esterni deboli, nomi di file e definizioni di sezione.

La progettazione di COFF tradizionale include anche formati di record ausiliari per matrici e strutture. Gli strumenti Microsoft non usano questi strumenti, ma posizionano invece le informazioni simbolice 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 contiene tutte le operazioni 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:

Offset 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, l'intestazione SizeOfRawData nell'intestazione della sezione è maggiore o uguale a questo campo, a seconda delle considerazioni sull'allineamento.
8
4
PointerToLinenumber
Offset del primo numero di riga COFF per la funzione o zero se non esiste nessuna. 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 è impostato su zero.
16
2
Non utilizzato

 

Formato ausiliario 2: simboli .bf e .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 funzione di classe di archiviazione (101):

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

Record di simboli denominato .lf (righe nella funzione). Il campo Valore fornisce 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 del simbolo di definizione della funzione.

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

Offset Dimensione Campo Descrizione
0
4
Non utilizzato
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
Non utilizzato
12
4
PointerToNextFunction (solo con estensione bf)
Indice della tabella dei simboli del record simbolo successivo con estensione bf. Se la funzione è l'ultima nella tabella dei simboli, questo campo viene impostato su zero. Non viene usata per i record .ef.
16
2
Non utilizzato

 

Formato ausiliario 3: Esterni deboli

Gli "esterni deboli" sono un meccanismo per i file oggetto che consente flessibilità al momento del collegamento. Un modulo può contenere un simbolo esterno non risolto (sym1), ma può anche includere 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, in genere viene risolto un riferimento esterno al simbolo. 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:

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

 

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 stesso deve essere file e il record ausiliario che segue assegna il nome di un file di codice sorgente.

Offset Dimensione Campo Descrizione
0
18
File Name
Stringa ANSI che fornisce il nome del file di origine. Questo valore 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. Tale record 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 della sezione.

Offset Dimensione Campo Descrizione
0
4
Length
Dimensioni dei dati della 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 del 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).For more information, see COMDAT Sections (Object Only).
12
2
Number
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. Ciò è applicabile se la sezione è una sezione COMDAT.
15
3
Non utilizzato

 

Sezioni COMDAT (solo oggetto)

Il campo Selezione del formato ausiliario della definizione della 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 della sezione. Il campo Selection determina il modo in cui il linker risolve le più definizioni delle sezioni COMDAT.

Il primo simbolo che ha il valore della sezione COMDAT deve essere il simbolo della 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 Type uguale a IMAGE_SYM_TYPE_NULL, il campo Classe uguale a IMAGE_SYM_CLASS_STATIC e un record ausiliario. Il secondo simbolo viene chiamato "il simbolo COMDAT" e viene usato dal linker insieme al campo Selection.

Di seguito sono riportati i valori per il campo Selection.

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
È possibile collegare qualsiasi sezione che definisce lo stesso simbolo COMDAT; 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 sono le stesse dimensioni, viene generato un errore "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 del simbolo ausiliario per la definizione della sezione. Questa impostazione è utile per le definizioni che dispongono di componenti in più sezioni (ad esempio, codice in uno e dati in un altro), ma dove 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 della sezione COMDAT associativa non può formare un ciclo. La catena di associazione di sezioni deve infine venire a una sezione COMDAT che non dispone di IMAGE_COMDAT_SELECT_ASSOCIATIVE impostata.
IMAGE_COMDAT_SELECT_LARGEST
6
Il linker sceglie la definizione più grande tra tutte le definizioni per questo simbolo. Se più definizioni hanno questa dimensione, la scelta tra di esse è arbitraria.

 

Definizione del token CLR (solo oggetto)

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

Offset 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 del token CLR.
6
12
Riservato, deve essere zero.

 

Tabella di stringhe COFF

Immediatamente dopo la tabella dei simboli COFF è la tabella di stringa 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 stringa COFF sono 4 byte che contengono le dimensioni totali (in byte) del resto della tabella stringa. Questa dimensione include il campo di dimensioni stesso, in modo che il valore in questa posizione sia 4 se non sono presenti stringhe.

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

Tabella certificato attributo (solo immagine)

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

Offset 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 dalla voce Tabella certificati nella directory dati intestazione facoltativa è un offset di file alla voce del primo certificato attributo. Le voci successive vengono accessibili avanzando i byte dwLength della voce, arrotondati a un multiplo a 8 byte, dall'inizio della voce del certificato dell'attributo corrente. Ciò continua fino a quando la somma dei valori dwLength arrotondati equivale al valore Size della voce Certificate Table (Tabella certificati) nella directory dati di intestazione facoltativa. Se la somma dei valori dwLength arrotondati non corrisponde al valore Size, la tabella del certificato dell'attributo o il campo Size è danneggiato.

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

virtual address = 0x5000
size = 0x1000

Il primo certificato inizia in 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 più vicino a più di 8 byte per trovare l'offset della seconda voce del certificato dell'attributo.
  3. Aggiungere il valore di offset dal passaggio 2 al secondo valore dwLength del certificato dell'attributo e arrotondare fino al multiplo di 8 byte più vicino per determinare l'offset della terza voce del certificato di attributo.
  4. Ripetere il passaggio 3 per ogni certificato successivo fino a quando l'offset calcolato è uguale a 0x6000 (0x5000 start + 0x1000 dimensioni totali), che indica che l'intera tabella è stata dettagliata.

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 attributo 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 illustrata 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 wCertificateType WIN_CERTIFICATE includono (ma non sono limitate agli 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 PKCS#7 SignedData
0x0003
WIN_CERT_TYPE_RESERVED_1
Riservato
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Firma del certificato dello stack di protocolli del server terminal
Non supportato

 

Il membro bCertificate della struttura di 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 PKCS#7 SignedData . Per informazioni dettagliate sul formato di firma digitale Authenticode, vedere Formato di firma eseguibile portatile Di Windows Authenticode.

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

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

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 è allineata:

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

Le dimensioni della tabella certificati specificate nella voce Tabella certificati nella directory dati di intestazione facoltativa (solo immagine) includono 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 file) è simile a un checksum di file in cui l'algoritmo hash produce un digest di messaggi 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 sul disco è andato male e i valori archiviati sono stati danneggiati. Un hash di file è simile a un checksum in cui 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 relativo valore non modificato originale. Un hash di file può quindi essere usato per rilevare modifiche intenzionali e persino sottili a un file, ad esempio quelle introdotte da virus, hacker o programmi di cavallo di Trojan.

Se incluso in un certificato, il digest immagine deve escludere determinati campi nell'immagine PE, ad esempio la voce Checksum e Certificate Table in Directory dati intestazioni facoltative. Si tratta del fatto che l'atto di aggiunta di un certificato modifica questi campi e determina 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, altri dati dell'immagine PE possono essere omessi dal calcolo hash. Per un collegamento alla pagina di riferimento della funzione, vedere Riferimenti.

tabelle di importazione Delay-Load (solo immagine)

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

Tabella directory Delay-Load

La tabella directory di caricamento ritardo è la controparte della tabella della directory di importazione. Può essere recuperato tramite la voce Descrittore di importazione ritardo nell'elenco delle directory dati di intestazione facoltative (offset 200). La tabella è disposta come segue:

Offset Dimensione Campo Descrizione
0
4
Attributi
Deve essere zero.
4
4
Nome
RVA del nome della DLL da caricare. Il nome risiede nella sezione 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 indirizzi di importazione di caricamento ritardato. Per altre informazioni, vedere Delay Import Address Table (IAT).
16
4
Tabella nome 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 ritardo associata
RVA della tabella di indirizzi di caricamento ritardo associata, se presente.
24
4
Scarica tabella di importazione ritardo
RVA della tabella degli indirizzi di caricamento ritardo di scaricamento, se esistente. Si tratta di una copia esatta della tabella 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 meccanismodio.
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 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 per le funzioni helper delay o unload.

Nome

Il nome della DLL da ritardare il caricamento 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 ritardare il caricamento 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 di indirizzi di importazione ritardata

La tabella di 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 threadk non siano più nel ciclo di chiamata. È possibile accedere ai puntatori a 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 di 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 usati insieme al campo timestamp della tabella di directory delay-load in base a 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, il phmod cancellato e l'interfaccia utente scritta sull'IAT per ripristinare tutto lo stato di precaricamento.

Sezioni speciali

Le sezioni COFF tipiche contengono codice o dati che i linker e i caricatori Microsoft Win32 elaborano senza particolari conoscenze del 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é percorsi speciali nell'intestazione facoltativa dell'immagine puntano a essi 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 salvati in modo permanente nei file eseguibili e nei tipi di sezione che contengono metadati per le estensioni.

Nome sezione Content 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 registrati (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.
text
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 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 un 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ò trovarsi in qualsiasi punto dell'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 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 della directory di debug le cui dimensioni e posizione sono indicate nell'intestazione facoltativa dell'immagine.

La directory di debug può trovarsi in una sezione con estensione debug scartabile (se presente) 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'oggetto RVA specificato può essere zero se le informazioni di debug non sono coperte da un'intestazione di sezione, ovvero risiede nel file di immagine e non è mappata nello spazio di indirizzi di runtime. Se è mappato, l'RVA è il relativo indirizzo.

Una voce di directory di debug ha il formato seguente:

Offset 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 dati di debug.
10
2
MinorVersion
Numero di versione secondario del formato dati di debug.
12
4
Tipo
Formato delle informazioni di debug. Questo campo consente 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 al momento del caricamento, rispetto alla base dell'immagine.
24
4
PointerToRawData
Puntatore file ai dati di debug.

 

Tipo di debug

I valori seguenti sono definiti per il campo Type 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 del frame (FPO). Queste informazioni indicano al debugger come interpretare i frame dello stack non standard, che usano il registro EBP per uno scopo diverso da un puntatore al 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 una RVA nell'immagine a una RVA nell'immagine di origine.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
Mapping da una RVA nell'immagine di origine a una RVA 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à.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Bit di caratteristiche DLL estese.

 

Se il campo Type è impostato su IMAGE_DEBUG_TYPE_FPO, i dati non elaborati di debug sono una matrice in cui ogni membro descrive il frame dello stack di una funzione. Non tutte le funzioni nel file di immagine devono avere informazioni FPO definite, anche se il tipo di debug è FPO. Tali funzioni che non dispongono di informazioni FPO vengono considerate con 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 viene 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 o dove viene prodotto l'PE. Vari campi di data/ora del file PE vengono riempiti 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 effettiva in cui viene generato 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 Type è impostato su IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, i dati non elaborati di debug contengono bit di caratteristiche DLL estese, in aggiunta a quelli che potrebbero essere impostati nell'intestazione facoltativa dell'immagine. Vedere Caratteristiche DLL nella sezione Intestazione facoltativa Windows-Specific campi (solo immagine).

Caratteristiche della DLL estesa

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

Costante Valore Descrizione
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 L'immagine è compatibile con LA CET.

.debug$F (solo oggetto)

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

I file di oggetto possono contenere sezioni con estensione debug$F il cui contenuto è uno o più record FPO_DATA (informazioni sull'omissione del puntatore a fotogrammi). 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 di FPO_DATA in base alla procedura RVA e genera una voce di directory di debug per loro.

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

.debug$S (solo oggetto)

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

.debug$P (solo oggetto)

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

.debug$T (solo oggetto)

Questa sezione contiene informazioni di 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 il marcatore dell'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 relativa ai dati di esportazione, denominata edata, contiene informazioni sui simboli a cui altre immagini possono accedere tramite il collegamento dinamico. I simboli esportati si trovano in genere 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 della 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 dei 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 del nome
Matrice di puntatori ai nomi di esportazione pubblici, ordinati in ordine crescente.
Tabella ordinale
Matrice dei ordinali che corrispondono ai membri della tabella del puntatore del nome. La corrispondenza è in base alla posizione; Pertanto, la tabella puntatore del nome 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. Membri della tabella del puntatore del nome in 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 puntatore del nome. 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 di questa immagine.

Offset 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 del puntatore del nome. Questo è anche il numero di voci nella tabella ordinale.
28
4
Esportazione di RVA tabella indirizzi
Indirizzo della tabella degli indirizzi di esportazione, relativo alla base dell'immagine.
32
4
RVA del puntatore del nome
Indirizzo della tabella puntatore del nome di esportazione, rispetto alla base dell'immagine. Le dimensioni della tabella sono specificate dal campo Numero di puntatori dei nomi.
36
4
RVA tabella ordinale
Indirizzo della tabella ordinale, relativo alla base dell'immagine.

 

Esporta tabella indirizzi

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 usa 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 RVA 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.

Offset 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 server d'inoltro
Puntatore a una stringa ASCII con terminazione Null nella sezione di esportazione. Questa stringa deve trovarsi all'interno dell'intervallo specificato dalla voce della directory dei dati della tabella di esportazione. Vedere Directory dati intestazione facoltative (solo immagine). Questa stringa assegna il nome dll e il nome dell'esportazione (ad esempio, "MYDLL.expfunc") o il nome 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 fa riferimento 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 del puntatore del nome 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 sono ordinati in modo lessicale per consentire le ricerche binarie.

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

Esporta tabella ordinale

La tabella ordinale di esportazione è una matrice di indici nonbiati a 16 bit nella tabella degli indirizzi di esportazione. I ordinali sono distorti dal campo Base ordinale della tabella della directory di esportazione. In altre parole, la base ordinale deve essere sottratta dai ordinali per ottenere 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 esportata punta a un nome pubblico (esportato) e la colonna Ordinale esporta fornisce il numero ordinale corrispondente per tale nome pubblico. Un membro della tabella puntatore del nome 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 il numero ordinale distorto è:

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

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

Quando si cerca un simbolo per ordinale (distorto), 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 corrispondono necessariamente 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 possono avere nomi di esportazione. Per i simboli esportati con nomi di esportazione, le voci corrispondenti nella tabella del puntatore del nome di esportazione e la tabella ordinale di esportazione 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 della directory di importazione, una voce per ogni DLL a cui fa riferimento l'immagine. L'ultima voce di directory è vuota (compilata con valori Null), che indica la fine della tabella di directory.

Ogni voce della directory di importazione ha il formato seguente:

Offset Dimensione Campo Descrizione
0
4
Import Lookup Table RVA (Caratteristiche)
RVA della tabella di ricerca di importazione. Questa tabella contiene un nome o un numero 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 aver associato l'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
RVA della tabella indirizzi di importazione (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 viene 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 di 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
Flag ordinale/nome
Se questo bit è impostato, importare per ordinale. In caso contrario, importare per 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 hint/name
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 i bit PE32+ 62-31 deve essere zero.

 

Tabella hint/name

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

Offset Dimensione Campo Descrizione
0
2
Hint
Indice nella tabella del puntatore del nome di esportazione. Viene tentata prima una corrispondenza con questo valore. Se ha esito negativo, 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 abbinata al nome pubblico nella DLL. Questa stringa fa distinzione tra maiuscole e minuscole e termina con un byte Null.
*
0 o 1
Pad
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 è 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 della tabella delle funzioni usate 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 della 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:

Offset 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 Prolog
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:

Offset Dimensione Campo Descrizione
0
4
Inizio indirizzo
Va della funzione corrispondente.
4
8 bit
lunghezza Prolog
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 impostato, la funzione è costituita da istruzioni a 32 bit. Se è chiaro, la funzione è costituita da istruzioni a 16 bit.
4
1 bit
Flag di eccezione
Se impostato, esiste un gestore di eccezioni per la funzione. In caso contrario, non esiste alcun gestore di eccezioni.

 

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

Offset Dimensione Campo Descrizione
0
4
Inizio indirizzo
RVA della funzione corrispondente.
4
4
Indirizzo finale
RVA della fine della funzione.
8
4
Informazioni di 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 base nelle directory dati di intestazione facoltative fornisce il numero di byte nella tabella di rilocazione di base. Per altre informazioni, vedere Directory dati intestazione facoltativa (solo immagine). La tabella di rilocazione di base è divisa 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:

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

 

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

Offset Dimensione Campo Descrizione
0
4 bit
Tipo
Archiviato nei 4 bit elevati 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
Offset
Archiviato nei restanti 12 bit di WORD, un offset dall'indirizzo iniziale specificato nel campo Page RVA per il blocco. Questo offset specifica dove deve essere applicata 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 l'immagine viene effettivamente caricata. Se l'immagine viene caricata alla base preferita, la differenza è zero e quindi le rilocazione di base non devono essere applicate.

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 tastierare un blocco.
IMAGE_REL_BASED_HIGH
1
La rilocazione di base aggiunge i 16 bit elevati 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 elevati 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 ricollocazione di base occupa due slot.
IMAGE_REL_BASED_MIPS_JMPADDR
5
L'interpretazione della rilocazione dipende dal tipo di computer.
Quando il tipo di computer è 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 computer è RISC-V. La rilocazione di base si applica ai 20 bit elevati 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 computer è RISC-V. La rilocazione di base si applica ai 12 bit bassi di un indirizzo assoluto a 32 bit formato in formato di istruzione I-type RISC-V.
IMAGE_REL_BASED_RISCV_LOW12S
8
Questa rilocazione è significativa solo quando il tipo di computer è RISC-V. La rilocazione di base si applica ai 12 bit bassi di un indirizzo assoluto a 32 bit formato in formato di istruzione S-V DI 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 PE diretto 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. Pertanto, ogni thread può 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 di linguaggio di alto livello. Questa implementazione consente di definire e inizializzare i dati TLS in modo analogo alle variabili statiche normali in un programma. In Visual C++, ad esempio, una variabile TLS statica può essere definita come segue, senza usare l'API Windows:

__declspec (thread) int tlsFlag = 1;

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

Nota

Gli oggetti dati TLS dichiarati staticamente possono essere usati solo nei file di immagine caricati staticamente. Questo fatto rende non affidabile l'uso di dati TLS statici in una DLL, a meno che non si sappia che la DLL o qualsiasi elemento collegato staticamente con esso, non verrà mai caricato dinamicamente con la funzione API LoadLibrary.

 

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

  1. Al momento del collegamento, il linker imposta il campo Address of Index della directory TLS. Questo campo punta a una posizione 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 assegnandole il nome speciale "__tls_used" (piattaforme Intel x86) o "_tls_used" (altre piattaforme). Il linker cerca questa immagine di memoria e usa i dati presenti 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 è in corrispondenza dell'offset di 0x2C dall'inizio di TEB. Questo comportamento è Intel x86 specifico.

  3. Il caricatore assegna il valore dell'indice TLS al posto indicato dal campo Indirizzo di indice.

  4. Il codice eseguibile recupera l'indice TLS e anche la posizione 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 i dati vengono allocati per singoli thread.

  6. Un singolo oggetto dati TLS viene accessibile 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
Avvio dati non elaborati VA
Indirizzo iniziale del modello TLS. Il modello è un blocco di dati usato per inizializzare i dati TLS. Il sistema copia tutti i 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 di fine 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, non di una RVA.
8/16
4/8
Indirizzo dell'indice
Posizione da ricevere l'indice TLS, che il caricatore assegna. Questa posizione si trova in una sezione dati normale, quindi può essere dato un nome simbolico accessibile al programma.
12/24
4/8
Indirizzo dei callback
Puntatore a una matrice di funzioni di callback TLS. La matrice è terminata con valore 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
Le dimensioni in byte del modello, oltre i dati inizializzati delimitati dai campi VA Avvio dati non elaborati e Data End Va non elaborati. Le dimensioni totali del modello devono essere uguali alle dimensioni totali dei dati TLS nel file di immagine. Il riempimento zero è la quantità di dati che viene fornita 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_*, usati anche per descrivere l'allineamento della sezione nei file di oggetti. Gli altri 28 bit sono riservati per l'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 consiste nel 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 funzioni di callback aggiuntive se desiderate. Se è presente più di una funzione di callback, ogni funzione viene chiamata nell'ordine in cui viene visualizzato il relativo indirizzo nella matrice. Un puntatore Null termina la matrice. È perfettamente valido per avere un elenco vuoto (nessun callback supportato), in questo caso la matrice di callback ha esattamente un puntatore null membro.

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 Riservato 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 inviata per tutto il primo thread.
DLL_THREAD_DETACH
3
Un thread sta per essere terminato. Questa notifica inviata per tutto 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 in precedenza usata in casi molto limitati nel sistema operativo Windows NT stesso per descrivere diverse funzionalità troppo difficili o troppo grandi da 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 trovarsi 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 controllare il 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 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 tale proposito, le dimensioni sono davvero solo un controllo della versione. Per la compatibilità con Windows XP e 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:

Offset 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, Ora coordinata universale, in base all'orologio di sistema. Il timestamp può essere stampato usando la funzione di tempo C runtime (CRT).
8
2
MajorVersion
Numero di versione principale.
10
2
MinorVersion
Numero di versione secondario.
12
4
GlobalFlagsClear
I flag del caricatore globale da cancellare per questo processo quando il caricatore avvia il processo.
16
4
GlobalFlagsSet
I 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 del 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 singoli processori.
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
Flag dell'heap del 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
Riservato
Deve essere zero.
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 univoco valido nell'immagine.
68/104
4/8
SEHandlerCount
[solo x86] Conteggio dei gestori univoci nella tabella.
72/112
4/8
GuardCFCheckFunctionPointer
Va dove è 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-function 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 è archiviata la tabella IAT dell'indirizzo di Control Flow Guard acquisito.
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 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 seguenti flag e sottocampi:

  • 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 della 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 l'IAT di caricamento ritardato 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 la tabella IAT acquisita dall'indirizzo è presente anche nella configurazione di caricamento.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • Il modulo consente 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, vale a dire il numero aggiuntivo di byte per ogni 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 per 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 binaria 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 livello lingua) e un indirizzo di una descrizione 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, tale tabella elenca le voci di directory al livello successivo verso il basso.

Gli ID di tipo, nome e lingua di una foglia sono determinati dal percorso acquisito tramite 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 della 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 di questa tabella puntano a tabelle di secondo livello. Ogni albero di secondo livello ha lo stesso ID tipo ma id nome diverso. 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 di directory delle risorse
Stringhe Unicode allineate a due byte, che fungono da dati stringa a cui puntano le voci della directory.
Descrizione dei dati delle risorse
Matrice di record, puntati alle tabelle, che descrivono le dimensioni effettive e la posizione dei dati della risorsa. Questi record sono le foglie nell'albero della descrizione delle risorse.
Dati della 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 è effettivamente costituita da voci di directory (descritte nella sezione 6.9.2, "Voci directory risorse") e questa struttura:

Offset Dimensione Campo Descrizione
0
4
Caratteristiche
Flag di risorse. Questo campo è riservato per un utilizzo 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 secondaria impostato dall'utente.
12
2
Numero di voci nome
Numero di voci di directory immediatamente successive alla tabella che utilizzano stringhe per identificare le voci Type, Name o Language (a seconda del livello della tabella).
14
2
Numero di voci ID
Numero di voci di directory immediatamente seguenti alle voci Nome che usano ID numerici per le voci Type, Name o Language.

 

Voci della directory di risorse

Le voci della directory costituiscono le righe di una tabella. Ogni voce della directory delle risorse ha il formato seguente. 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 Nome in base alla 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 Eseguibil File Format (File eseguibile portabile Win32 ).

Offset Dimensione Campo Descrizione
0
4
Offset nome
Offset di una stringa che fornisce la voce Type, Name o Language ID, a seconda del livello di tabella.
0
4
ID di tipo integer
Intero a 32 bit che identifica la voce Type, Name o Language ID.
4
4
Offset di immissione dati
Bit elevato 0. Indirizzo di una voce Dati risorsa (foglia).
4
4
Offset di sottodirectory
Bit elevato 1. I 31 bit inferiori sono l'indirizzo di un'altra tabella di directory di risorse (il livello successivo verso il basso).

 

Stringa di directory delle risorse

L'area 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 dati risorsa. Ciò riduce al minimo l'impatto di queste stringhe a lunghezza variabile sull'allineamento delle voci della directory di dimensioni fisse. Ogni stringa di directory delle risorse ha il formato seguente:

Offset Dimensione Campo Descrizione
0
2
Length
Dimensioni della stringa, non incluso il campo di lunghezza stesso.
2
Variabile
Stringa Unicode
Dati stringa Unicode a lunghezza variabile, allineati a parole.

 

Voce 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:

Offset Dimensione Campo Descrizione
0
4
RVA dati
Indirizzo di un'unità di dati delle risorse nell'area Dati risorsa.
4
4
Dimensione
Dimensioni, in byte, dei dati delle risorse a cui fa riferimento il campo RVA dati.
8
4
codepage
Tabella codici usata per decodificare i valori del punto di codice all'interno dei dati delle risorse. In genere, la tabella codici è 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 usando 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 di oggetti. Queste raccolte sono comunemente chiamate 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 segue:

  • I primi e i secondi membri sono "membri del linker". Ognuno di questi membri ha il proprio formato, come descritto nella sezione Importa tipo di nome. 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 (object-file). Ognuno di questi membri contiene il contenuto di un file oggetto nell'intera dimensione.

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

Firma :"!< arco>\n"
Intestazione
Membro del linker 1°
Intestazione
2° membro del linker
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

Intestazioni membro di archiviazione

Ogni membro (linker, longnames o membro del file a oggetti) è 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 giustificata e riempita con spazi fino alla fine del campo. Non esiste alcun carattere null terminante in uno di questi campi.

Ogni intestazione membro inizia sul primo indirizzo anche dopo la fine del membro di archivio precedente.

Offset Dimensione Campo Descrizione
0
16
Nome
Nome del membro di 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
Data
Data e ora di creazione del membro di archivio: questa è la 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 sulle 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 sulle piattaforme Windows perché gli strumenti Microsoft generano tutti gli spazi vuoti.
40
8
Modalità
Rappresentazione ottale ASCII della modalità file del membro. Si tratta del valore ST_MODE della funzione di runtime C _wstat.
48
10
Dimensione
Rappresentazione decimale ASCII della dimensione totale del membro di archivio, non inclusa la dimensione dell'intestazione.
58
2
Fine dell'intestazione
I due byte nella stringa C " ̃\n" (0x60 0x0A).

 

Il campo Name ha uno dei formati visualizzati 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 dell'archivio.
/
Il membro dell'archivio è uno dei due membri del linker. Entrambi i membri del linker hanno questo nome.
//
Il membro dell'archivio è il membro longnames, costituito da una serie di stringhe ASCII con terminazione null. Il membro longnames è il terzo membro dell'archivio ed è facoltativo.
/n
Il nome del membro di archivio si trova in offset n all'interno del membro longnames. Il numero n è la rappresentazione decimale dell'offset. Ad esempio: "/26" indica che il nome del membro di 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 è "/". Il primo membro del linker è incluso per la compatibilità con le versioni precedenti. Non viene usato dai linker correnti, ma il relativo formato deve essere corretto. Questo membro del linker fornisce una directory di nomi di simboli, come fa il secondo membro del linker. Per ogni simbolo, le informazioni indicano dove trovare il membro di archivio contenente il simbolo.

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

Offset Dimensione Campo Descrizione
0
4
Numero di simboli
Unsigned long contenente il numero di simboli indicizzati. Questo numero viene archiviato in formato big-endian. Ogni membro di file a oggetti definisce in genere uno o più simboli esterni.
4
4 * n
Offset
Matrice di offset di file per archiviare le intestazioni membro, 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 stringa, l'elemento corrispondente nella matrice di offset fornisce la posizione del membro di archivio contenente il simbolo.
*
*
Tabella stringa
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 fatto implica che i simboli della tabella stringa devono essere disposti in base all'ordine dei membri dell'archivio. Ad esempio, tutti i simboli del primo membro del file oggetto devono essere elencati prima dei simboli nel secondo file di oggetti.

Secondo membro del linker

Il secondo membro del linker ha il nome "/" come fa il primo membro del linker. Anche se entrambi i membri del linker forniscono una directory di simboli e membri di archivio che li contengono, il secondo membro del linker viene usato in preferenza per il primo da tutti i linker correnti. Il secondo membro del linker include i nomi dei simboli nell'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:

Offset Dimensione Campo Descrizione
0
4
Numero di membri
Oggetto 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 oggetto long senza segno. Il numero m è uguale al valore del campo Numero di membri.
*
4
Numero di simboli
Lungo senza segno che contiene il numero di simboli indicizzati. Ogni membro di file a oggetti definisce in genere uno o più simboli esterni.
*
2 * n
Indici
Matrice di indici basati su 1 (breve senza segno) che esegue il mapping dei nomi dei simboli all'archiviazione degli offset dei membri. Il numero n è uguale al campo Numero di simboli. Per ogni simbolo denominato nella tabella stringa, l'elemento corrispondente nella matrice Indicis fornisce un indice nella matrice di offset. La matrice di offset, a sua volta, fornisce la posizione del membro di archivio che contiene il simbolo.
*
*
Tabella stringa
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 lesicale crescente.

 

Membro Longnames

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

Le stringhe vengono terminate con valori Null. Ogni stringa inizia immediatamente dopo il byte Null nella stringa precedente.

Formato della 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, Archivio (libreria) File Format. La differenza principale è che i membri della libreria di importazione contengono file pseudo-oggetto 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 di usarli in un secondo momento genera i dati necessari al volo.

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 nel modo seguente:

  • Intestazione del membro archivio
  • Importare l'intestazione
  • Stringa del nome di importazione con terminazione Null
  • Stringa del 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:

Offset 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
Computer
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
Ordinale/Hint
Ordinale o hint per l'importazione, determinato dal valore nel campo Tipo nome.
18
2 bit
Tipo
Tipo di importazione. Per valori e descrizioni specifici, vedere Import Type.For specific values and description, see Import Type.
3 bit
Tipo di nome
Tipo di nome di importazione. Per altre informazioni, vedere 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_CODE
0
Codice eseguibile.
IMPORT_DATA
1
Dati.
IMPORT_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 di 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_ORDINAL 0 L'importazione è 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_NAME 1 Il nome dell'importazione è identico al nome del simbolo pubblico.
IMPORT_NAME_NOPREFIX 2 Il nome dell'importazione è il nome del simbolo pubblico, ma ignora il valore iniziale ?, @o facoltativamente _.
IMPORT_NAME_UNDECORATE 3 Il nome dell'importazione è il nome del simbolo pubblico, ma ignora l'iniziale ?, @o facoltativamente _, e tronca il 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 utilizzare una firma Authenticode per verificare che le sezioni pertinenti di un file di immagine PE non siano state modificate in alcun modo dal modulo originale del file. Per eseguire questa attività, le firme Authenticode contengono un elemento denominato hash dell'immagine PE

Che cos'è un hash di immagini Authenticode PE?

L'hash dell'immagine Authenticode PE, o hash di file per brevità, è simile a un checksum di file in quanto produce un valore piccolo correlato all'integrità di un file. Un checksum viene generato da un algoritmo semplice e viene usato principalmente per rilevare gli errori di memoria. Ciò significa che viene usato per rilevare se un blocco di memoria su disco non è più valido 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 di checksum, è molto difficile modificare un file in modo che abbia lo stesso hash di file del formato originale (non modificato). Vale a dire, 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 anche 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 immagini 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 essere in grado di generare un hash immagine PE identico includendo di nuovo tutti i dati del file di immagine nel calcolo, perché il file ora contiene 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 di 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 non contiene effettivamente una firma Authenticode.

Tutti i dati nelle sezioni dell'immagine PE specificati nella tabella delle sezioni vengono inseriti nell'hashing completo, ad eccezione degli intervalli di esclusione seguenti:

  • Campo CheckSum del file dei campi specifici di Windows dell'intestazione facoltativa. Questo checksum include l'intero file (inclusi tutti 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 delle 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 gli intervalli di esclusione.

  • Informazioni passate alla fine dell'ultima sezione. L'area oltre l'ultima sezione (definita dall'offset più alto) non viene sottoposto a 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 la consegna di un prodotto e non influire sulla funzionalità del programma. In realtà, questa operazione viene talvolta eseguita come misura di salvataggio su 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