Compartir a través de


/SAFESEH (La imagen tiene controladores de excepciones seguros)

Actualización: noviembre 2007

/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 sólo 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 y 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.

En Microsoft Visual C++ 2005, no es posible marcar un binario existente para indicar que dispone de controladores de excepciones seguros (o sin controladores de excepciones). La información sobre control de excepciones seguro se debe agregar en tiempo de generació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 una estructura 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

  1. 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++.

  2. Haga clic en la carpeta Vinculador.

  3. Haga clic en la página de propiedades Línea de comandos.

  4. Escriba la opción en el cuadro Opciones adicionales.

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

Vea también

Referencia

Establecer las opciones del vinculador

Opciones del vinculador