Compartilhar via


/SAFESEH (a imagem tem manipuladores de exceção seguros)

Quando /SAFESEH for especificado, o vinculador só produzirá uma imagem se também puder produzir uma tabela dos manipuladores de exceção seguros da imagem. Esta tabela especifica para o sistema operacional quais manipuladores de exceção são válidos para a imagem.

Sintaxe

/SAFESEH
/SAFESEH:NO

Comentários

/SAFESEH somente é válido ao vincular destinos x86. /SAFESEH não tem suporte a plataformas que já possuem os manipuladores de exceção indicados. Por exemplo, em x64 e ARM, todos os manipuladores de exceção são anotados no PDATA. O ML64.exe tem suporte para adicionar as anotações que emitem informações SEH (XDATA e PDATA) na imagem, permitindo desenrolar por meio das funções ml64. Para obter mais informações, confira MASM para x64 (ml64.exe).

Se /SAFESEH não for especificado, o vinculador produzirá uma imagem com uma tabela de manipuladores de exceções seguras se todos os segmentos de código forem compatíveis com o recurso de manipulação segura de exceções. Se os segmentos de código não forem compatíveis com o recurso de manipulação segura de exceções, a imagem resultante não conterá uma tabela de manipuladores de exceções seguras. Se /SUBSYSTEM especificar WINDOWSCE ou uma das EFI_* opções, o vinculador não tentará produzir uma imagem com uma tabela de manipuladores de exceções seguras, pois nenhum desses subsistemas pode usar as informações.

Se /SAFESEH:NO for especificado, o vinculador não produzirá uma imagem com uma tabela de manipuladores de exceções seguras, mesmo se todos os segmentos de código forem compatíveis com o recurso de manipulação segura de exceções.

O motivo mais comum pelo qual o vinculador não poderá produzir uma imagem é porque um ou mais arquivos de entrada para o vinculador eram incompatíveis com o recurso de manipuladores de exceção seguros. Um motivo comum pelo qual o código é incompatível com manipuladores de exceção seguros é porque foi criado com um compilador de uma versão anterior do Visual C++.

Também é possível registrar uma função como um manipulador de exceção estruturado usando .SAFESEH.

Não é possível marcar um binário existente como tendo manipuladores de exceções seguras (ou nenhum manipulador de exceção), portanto, as informações sobre manipulação segura de exceções deverão ser adicionadas em tempo de build.

A capacidade do vinculador de criar uma tabela de manipuladores de exceções seguras dependerá do aplicativo que usar a biblioteca de runtime C. Se você vincular com /NODEFAULTLIB e quiser uma tabela de manipuladores de exceções seguras, será necessário fornecer uma estrutura de configuração de carregamento (que pode ser encontrada no arquivo de origem CRT loadcfg.c) contendo todas as entradas definidas para Visual C++. Por exemplo:

#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 definir esta opção do vinculador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.

  2. Selecione a página de propriedades Propriedades da Configuração>Vinculador>Avançado.

  3. Modifique a propriedade Image Has Safe Exception Handlers . Escolha OK ou Aplicar para salvar as alterações.

Para definir esta opção do vinculador por meio de programação

Confira também

Referência de vinculador MSVC
Opções de vinculador MSVC