/SAFESEH(La imagen tiene controladores de excepciones seguros)

Cuando /SAFESEH se especifica , el enlazador solo genera una imagen si también puede generar una tabla de los controladores de excepciones seguros de la imagen. Esta tabla especifica en el sistema operativo qué controladores de excepciones son válidos para la imagen.

Sintaxis

/SAFESEH
/SAFESEH:NO

Comentarios

/SAFESEH solo es válido al vincular destinos x86. /SAFESEH no se admite en las plataformas que ya han tenido en cuenta los controladores de excepciones. Por ejemplo, en x64 y ARM, 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) en la imagen, lo que permite desenredar a través de las funciones de ml64. Para más información, consulte MASM para x64 (ml64.exe).

Cuando no se especifica /SAFESEH, el enlazador producirá una imagen con una tabla de los controladores de excepciones seguros si todos los segmentos de código son compatibles con la característica de control de excepciones seguro. Si algún segmento de código no fuera compatible con la característica de control de excepción seguro, la imagen resultante no contendrá una tabla de controladores de excepciones seguros. Si /SUBSYSTEM especifica WINDOWSCE o una de las EFI_* opciones, el enlazador no intentará generar una imagen con una tabla de controladores de excepciones seguros, ya que ninguno de esos subsistemas puede usar la información.

Si no se especifica /SAFESEH:NO, el enlazador no producirá una imagen con una tabla de los controladores de excepciones seguros aunque todos los segmentos de código sean compatibles con la característica de control de excepciones seguro.

La razón más común por la que el enlazador no puede producir una imagen es porque uno o más de los archivos de entrada al enlazador era incompatible con la función de los controladores de excepciones seguros. Una razón común por la que el código es incompatible con los controladores de excepciones seguros es porque se creó con un compilador de una versión anterior de Visual C++.

Una función también puede registrarse como controlador de excepciones estructurado mediante .SAFESEH.

No es posible marcar un binario existente para indicar que dispone de controladores de excepciones seguros (o que no los tiene). La información sobre el control de excepciones seguro se debe agregar en tiempo de compilación.

La capacidad del vinculador para compilar una tabla de controladores de excepciones seguros depende de que la aplicación utilice la biblioteca en tiempo de ejecución de C. Si vincula con la opción /NODEFAULTLIB y desea obtener una tabla de los controladores de excepciones seguros, deberá proporcionar un struct de configuración de carga (como el que se encuentra en el archivo de origen de CRT loadcfg.c) 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

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento de las propiedades del compilador y la compilación.

  2. Seleccione la página de propiedades Propiedades de configuración>Enlazador>Avanzado.

  3. Modifique la propiedad Image Has Safe Exception Handlers . Haga clic en Aceptar o en Aplicar para guardar los cambios.

Para establecer esta opción del vinculador mediante programación

Consulte también

Referencia del enlazador MSVC
Opciones del enlazador MSVC