/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 .SAFESEH
de .
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
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.
Sélectionnez la page de propriétés Avancées de l’Éditeur >de propriétés>de configuration.
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
- Consultez AdditionalOptions.
Voir aussi
Informations de référence sur l’éditeur de liens MSVC
Options de l’éditeur de liens MSVC