Condividi tramite


/SAFESEH (Immagine con gestori eccezioni sicuri)

Quando /SAFESEH viene specificato, il linker produce un'immagine solo se può anche produrre una tabella dei gestori di eccezioni sicuri dell'immagine. Questa tabella specifica il sistema operativo che i gestori eccezioni sono validi per l'immagine.

Sintassi

/SAFESEH
/SAFESEH:NO

Osservazioni:

/SAFESEH è valido solo quando si esegue il collegamento per le destinazioni x86. /SAFESEH non è supportato per le piattaforme che dispongono già dei gestori eccezioni annotati. Ad esempio, in x64 e ARM, tutti i gestori eccezioni vengono annotati in PDATA. ML64.exe supporta l'aggiunta di annotazioni che generano informazioni SEH (XDATA e PDATA) nell'immagine, consentendo di eseguire la rimozione tramite funzioni ml64. Per altre informazioni, vedere MASM per x64 (ml64.exe).

Se /SAFESEH non viene specificato, il linker produrrà un'immagine con una tabella di gestori di eccezioni sicure se tutti i segmenti di codice sono compatibili con la funzionalità di gestione delle eccezioni sicure. Se i segmenti di codice non sono compatibili con la funzionalità di gestione delle eccezioni sicure, l'immagine risultante non conterrà una tabella di gestori di eccezioni sicuri. Se /SUBSYSTEM specifica WINDOWSCE o una delle EFI_* opzioni, il linker non tenterà di produrre un'immagine con una tabella di gestori di eccezioni sicure, perché nessuno di questi sottosistemi può usare le informazioni.

Se /SAFESEH:NO viene specificato, il linker non produrrà un'immagine con una tabella di gestori di eccezioni sicure anche se tutti i segmenti di codice sono compatibili con la funzionalità di gestione delle eccezioni sicure.

Il motivo più comune per cui il linker non può produrre un'immagine è dovuto al fatto che uno o più file di input al linker non sono compatibili con la funzionalità gestori di eccezioni sicuri. Un motivo comune per cui il codice non è compatibile con i gestori di eccezioni sicuri è dovuto al fatto che è stato creato con un compilatore da una versione precedente di Visual C++.

È anche possibile registrare una funzione come gestore di eccezioni strutturate usando .SAFESEH.

Non è possibile contrassegnare un file binario esistente come gestori di eccezioni sicuri (o senza gestori eccezioni); è necessario aggiungere informazioni sulla gestione delle eccezioni sicure in fase di compilazione.

La capacità del linker di compilare una tabella di gestori di eccezioni sicuri dipende dall'applicazione usando la libreria di runtime C. Se si esegue il collegamento con /NODEFAULTLIB e si vuole una tabella di gestori di eccezioni sicuri, è necessario specificare uno struct di configurazione del carico (ad esempio, disponibile nel loadcfg.c file di origine CRT) che contiene tutte le voci definite per Visual C++. Ad esempio:

#include <windows.h>
extern DWORD_PTR __security_cookie;  /* /GS security cookie */

/*
* The following two names are automatically created by the linker for any
* image that has the safe exception table present.
*/

extern PVOID __safe_se_handler_table[]; /* base of safe handler entry table */
extern BYTE  __safe_se_handler_count;  /* absolute symbol whose address is
                                           the count of table entries */
typedef struct {
    DWORD       Size;
    DWORD       TimeDateStamp;
    WORD        MajorVersion;
    WORD        MinorVersion;
    DWORD       GlobalFlagsClear;
    DWORD       GlobalFlagsSet;
    DWORD       CriticalSectionDefaultTimeout;
    DWORD       DeCommitFreeBlockThreshold;
    DWORD       DeCommitTotalFreeThreshold;
    DWORD       LockPrefixTable;            // VA
    DWORD       MaximumAllocationSize;
    DWORD       VirtualMemoryThreshold;
    DWORD       ProcessHeapFlags;
    DWORD       ProcessAffinityMask;
    WORD        CSDVersion;
    WORD        Reserved1;
    DWORD       EditList;                   // VA
    DWORD_PTR   *SecurityCookie;
    PVOID       *SEHandlerTable;
    DWORD       SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY32_2;

const IMAGE_LOAD_CONFIG_DIRECTORY32_2 _load_config_used = {
    sizeof(IMAGE_LOAD_CONFIG_DIRECTORY32_2),
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    &__security_cookie,
    __safe_se_handler_table,
    (DWORD)(DWORD_PTR) &__safe_se_handler_count
};

Per impostare questa opzione del linker nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per altre informazioni, vedere Impostare le proprietà del compilatore e della compilazione.

  2. Selezionare la pagina delle>proprietà Proprietà di configurazione Linker>Avanzate.

  3. Modificare la proprietà Image Has Safe Exception Handlers.Modify the Image Has Safe Exception Handlers property. Scegliere OK o Applica per salvare le modifiche.

Per impostare l'opzione del linker a livello di codice

Vedi anche

Informazioni di riferimento sul linker MSVC
Opzioni del linker MSVC