/SAFESEH (La imagen tiene controladores de excepciones seguros)
/SAFESEH[:NO]
Cuando se especifica /SAFESEH, el vinculador sólo producirá una imagen si también puede producir una tabla de los controladores de excepciones seguros de la imagen. Esta tabla especifica al sistema operativo qué controladores de excepciones son válidos para la imagen.
/SAFESEH solo es válido al vincular para destinos de x86. /SAFESEH no se admite en plataformas en las que ya se han tenido en cuenta los controladores de excepciones. Por ejemplo, en x64 e Itanium, todos los controladores de excepciones se tienen en cuenta en PDATA. ML64.exe tiene compatibilidad para agregar anotaciones que emiten información de SEH (XDATA y PDATA) a la imagen, permitiéndole efectuar desenredo en las funciones de ml64. Vea MASM for x64 (ml64.exe) para obtener más información.
Si no se especifica /SAFESEH, el vinculador producirá una imagen con una tabla de controladores de excepciones seguros si todos los módulos son compatibles con la característica de control de excepciones seguro. Si algún módulo no fuera compatible, la imagen resultante no contendría una tabla de controladores de excepciones seguros. Si /SUBSYSTEM especifica WINDOWSCE o alguna de las opciones EFI_*, el vinculador no intentará producir una imagen con una tabla de controladores de excepciones seguros, ya que ninguno de esos subsistemas puede utilizar la información.
Si se especifica /SAFESEH:NO, el vinculador no producirá una imagen con una tabla de controladores de excepciones seguros ni aunque todos los módulos sean compatibles con la característica de control de excepciones seguro.
La razón más común para que el vinculador no pueda producir una imagen se debe a que alguno de los archivos de entrada (módulos) al vinculador no es compatible con la característica de control de excepciones seguro. Una razón habitual para que un módulo no sea compatible con los controladores de excepciones seguros es porque fue creado con un compilador de una versión anterior de Visual C++.
También puede registrar una función como controlador de excepciones estructurado mediante .SAFESEH.
No es posible marcar un binario existente para indicar que dispone de controladores de excepciones seguros (o no dispone de controladores de excepciones). La información sobre control de excepciones seguro se debe agregar en tiempo de compilación.
La capacidad del vinculador para generar una tabla de controladores de excepciones seguros depende de la aplicación que utilice la biblioteca en tiempo de ejecución de C. Si vincula con la opción /NODEFAULTLIB y desea obtener una tabla de controladores de excepciones seguros, deberá suministrar un struct de configuración de carga (como la que existe en el archivo de código fuente loadcfg.c de CRT) que contenga todas las entradas definidas para Visual C++. Por ejemplo:
#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
};
Para establecer esta opción del vinculador en el entorno de desarrollo de Visual Studio
Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener más información, vea Establecer las propiedades de un proyecto de Visual C++.
Haga clic en la carpeta Vinculador.
Haga clic en la página de propiedades Línea de comandos.
Escriba la opción en el cuadro Opciones adicionales.
Para establecer esta opción del vinculador mediante programación
- Vea AdditionalOptions.