Partager via


/SAFESEH (L'image est dotée de gestionnaires d'exceptions sécurisés)

/SAFESEH[:NO]

Lorsque /SAFESEH est spécifié, l'éditeur de liens produit uniquement une image s'il peut également produire une table des gestionnaires d'exceptions sécurisés de l'image.Cette table indique au système d'exploitation les gestionnaires d'exceptions valides pour l'image.

/SAFESEH n'est valide que lors de la liaison de cibles x86.L'option /SAFESEH n'est pas prise en charge pour les plates-formes dont les gestionnaires d'exceptions sont déjà définis.Par exemple, sur x64 et Itanium, tous les gestionnaires d'exceptions sont indiqués dans le PDATA.ML64.exe prend en charge l'ajoute d'annotations qui émettent des informations SEH (XDATA et PDATA) dans l'image, ce qui vous permet de procéder au déroulement à l'aide de fonctions ml64.Consultez MASM pour ml64.exe (x64) pour plus d'informations.

Si /SAFESEH n'est pas spécifié, l'éditeur de liens produit une image avec une table des gestionnaires d'exceptions sécurisés si tous les modules sont compatibles avec la fonction de gestion sécurisée des exceptions.Si des modules n'étaient pas compatibles avec la fonction de gestion sécurisée des exceptions, l'image résultante ne contient pas de table des gestionnaires d'exceptions sécurisés.Si /SUBSYSTEM spécifie WINDOWSCE ou l'une des options EFI_*, l'éditeur de liens ne tente pas de produire une image avec une table des gestionnaires d'exceptions sécurisés, puisque aucun de ces sous-systèmes n'est en mesure d'utiliser les informations.

Si /SAFESEH:NO est spécifié, l'éditeur de liens ne produit d'image avec une table des gestionnaires d'exceptions sécurisés, même si tous les modules sont compatibles avec la fonction de gestion sécurisée des exceptions.

La cause la plus fréquente de l'impossibilité pour l'éditeur de liens de produire une image est l'incompatibilité d'un ou de plusieurs des fichiers d'entrée (modules) à l'éditeur de liens avec la fonction de gestion sécurisée des exceptions.La non-compatibilité d'un module avec des gestionnaires d'exceptions sécurisés est souvent due à sa création par un compilateur d'une version précédente de Visual C++.

Vous pouvez également enregistrer une fonction en tant que gestionnaire d'exceptions structuré à l'aide de .SAFESEH.

Dans , il n'est pas possible de marquer un fichier binaire existant comme ayant des gestionnaires d'exceptions sécurisés (ou aucun gestionnaire d'exceptions) ; les informations sur la gestion sécurisée des exceptions doivent être ajoutées au moment de la génération.

L'éditeur de liens ne peut générer une table des gestionnaires d'exceptions sécurisés que si l'application utilise la bibliothèque Microsoft C Runtime.Si vous créez un lien avec /NODEFAULTLIB et souhaitez obtenir une table des gestionnaires d'exceptions sécurisés, vous devez fournir une structure de configuration de charge (comme celle du fichier source CRT loadcfg.c) qui contient toutes les entrées définies pour Visual C++.Par exemple :

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

Pour définir cette option de l'éditeur de liens dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet.Pour plus d'informations, consultez Définition des propriétés de projets Visual C++.

  2. Cliquez sur le dossier Éditeur de liens.

  3. Cliquez sur la page de propriétés Ligne de commande.

  4. Tapez l'option dans la zone Options supplémentaires.

Pour définir cette option de l'éditeur de liens par programme

Voir aussi

Référence

Définition des options de l'Éditeur de liens

Options de l'Éditeur de liens