Partager via


/SAFESEH (Image avec des gestionnaires d’exceptions fiables)

Quand /SAFESEH elle est spécifiée, l’éditeur de liens produit uniquement une image si elle peut également produire une table des gestionnaires d’exceptions fiables de l’image. Ce tableau spécifie au système d’exploitation les gestionnaires d’exceptions valides pour l’image.

Syntaxe

/SAFESEH
/SAFESEH:NO

Notes

/SAFESEH est valide uniquement lors de la liaison pour les cibles x86. /SAFESEH n’est pas pris en charge pour les plateformes qui ont déjà les gestionnaires d’exceptions notés. Par exemple, sur x64 et ARM, tous les gestionnaires d’exceptions sont notés dans le PDATA. ML64.exe prend en charge l’ajout d’annotations qui émettent des informations SEH (XDATA et PDATA) dans l’image, ce qui vous permet de décompresser les fonctions ml64. Pour plus d’informations, consultez MASM pour x64 (ml64.exe).

Si /SAFESEH ce n’est pas spécifié, l’éditeur de liens produit une image avec une table des gestionnaires d’exceptions sécurisées si tous les segments de code sont compatibles avec la fonctionnalité de gestion des exceptions sécurisée. Si des segments de code n’étaient pas compatibles avec la fonctionnalité de gestion des exceptions sécurisées, l’image résultante ne contiendra pas de table de gestionnaires d’exceptions fiables. Si /SUBSYSTEM elle spécifie WINDOWSCE ou l’une des EFI_* options, l’éditeur de liens ne tente pas de produire une image avec une table des gestionnaires d’exceptions sécurisées, car aucun de ces sous-systèmes ne peut utiliser les informations.

Si /SAFESEH:NO elle est spécifiée, l’éditeur de liens ne produit pas d’image avec une table des gestionnaires d’exceptions sécurisées, même si tous les segments de code sont compatibles avec la fonctionnalité de gestion des exceptions sécurisée.

La raison la plus courante pour laquelle l’éditeur de liens ne peut pas produire d’image est que l’un ou plusieurs des fichiers d’entrée à l’éditeur de liens étaient incompatibles avec la fonctionnalité de gestionnaires d’exceptions sécurisés. Une raison courante pour laquelle le code n’est pas compatible avec les gestionnaires d’exceptions fiables est qu’il a été créé avec un compilateur à partir d’une version précédente de Visual C++.

Vous pouvez également inscrire une fonction en tant que gestionnaire d’exceptions structurées à l’aide .SAFESEHde .

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) ; des informations sur la gestion des exceptions sécurisées doivent être ajoutées au moment de la génération.

La capacité de l’éditeur de liens à générer une table de gestionnaires d’exceptions fiables dépend de l’application à l’aide de la bibliothèque runtime C. Si vous créez un lien avec /NODEFAULTLIB une table de gestionnaires d’exceptions fiables, vous devez fournir un struct de configuration de charge (tel que disponible dans le loadcfg.c fichier source CRT) 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és du projet. Pour plus d’informations, consultez Définir les propriétés du compilateur et de la génération.

  2. Sélectionnez la page de propriétés Avancées de l’Éditeur >de propriétés>de configuration.

  3. Modifiez la propriété Des gestionnaires d’exceptions sécurisées de l’image. Choisissez OK ou Appliquer pour enregistrer vos modifications.

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

Voir aussi

Informations de référence sur l’éditeur de liens MSVC
Options de l’éditeur de liens MSVC