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
- Stub MS-DOS (solo immagine)
- Firma (solo immagine)
- Intestazione file COFF (oggetto e immagine)
- Intestazione facoltativa (solo immagine)
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
- Dati sezione
- Rilocazione COFF (solo oggetto)
- Numeri di riga COFF (deprecati)
- Tabella dei simboli COFF
- Record simboli ausiliari
- Tabella di stringhe COFF
- Tabella certificato attributo (solo immagine)
- Tabelle di importazione di caricamento ritardato (solo immagine)
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:
- Aggiungere il valore dwLength del primo certificato dell'attributo all'offset iniziale.
- 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.
- 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.
- 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
- Sezione .debug
- Sezione .drectve (solo oggetto)
- Sezione .edata (solo immagine)
- Sezione .idata
- Sezione .pdata
- Sezione .reloc (solo immagine)
- Sezione .tls
- Struttura di configurazione del carico (solo immagine)
- Sezione .rsrc
- Sezione .cormeta (solo oggetto)
- Sezione .sxdata
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:
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.
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.
Il caricatore assegna il valore dell'indice TLS al posto indicato dal campo Indirizzo di indice.
Il codice eseguibile recupera l'indice TLS e anche la posizione della matrice TLS.
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.
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)
- Firma file di archiviazione
- Intestazioni membro di archiviazione
- Primo membro del linker
- Secondo membro del linker
- Membro Longnames
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
- Che cos'è un hash di immagini Authenticode PE?
- Che cos'è coperto in un hash di immagini 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)
Windows Authenticode Portable Executable Signature Format (.docx)