Compartilhar via


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

/SAFESEH[:NO]

Quando /SAFESEH for especificado, o vinculador gerará uma imagem somente se também pode gerar uma tabela de manipuladores seguro da exceção da imagem. Esta tabela a seguir especifica para o sistema operacional que os manipuladores de exceção são válidas para a imagem.

/SAFESEH só é válida para vincular para os destinos x86. /SAFESEH não oferece suporte às plataformas que já têm os manipuladores de exceção observados. Por exemplo, em x64 e no BRAÇO, todos os manipuladores de exceção são observados em PDATA. ML64.exe tem suporte para adicionar anotações que se emitem INSTRUÇÕES informações (XDATA e PDATA) na imagem, permitindo que você desenrole com as funções ml64. Consulte MASM para x64 (ml64.exe) para maiores informações.

Se /SAFESEH não for especificado, o vinculador gerará uma imagem com uma tabela de manipuladores seguro de exceções se todos os módulos são compatíveis com o recurso seguro de manipulação de exceção. Se nenhum módulos não forem compatíveis com o recurso seguro de manipulação de exceção, a imagem resultante não conterá uma tabela de manipuladores seguro de exceção. Se /SUBSYSTEM especifica WINDOWSCE ou uma das opções de EFI_*, o vinculador não tentará gerar uma imagem com uma tabela de manipuladores seguro de exceções, como nenhum dos subsistemas podem utilizar as informações.

Se /SAFESEH:NO for especificado, o vinculador não gerará uma imagem com uma tabela de manipuladores seguro de exceções mesmo se todos os módulos são compatíveis com o recurso seguro de manipulação de exceção.

O motivo mais comum para o vinculador não poder gerar uma imagem é porque um ou mais dos arquivos de entrada (módulos) ao vinculador não forem compatíveis com o recurso seguro de manipuladores de exceção. Uma razão mais comum para um módulo não seja compatível com manipuladores seguro de exceção é porque foi criada com um compilador de uma versão anterior do Visual C++.

Você também pode registrar uma função como um manipulador estruturado de exceção usando .SAFESEH.

Não é possível marcar um binário existente como não tendo conexões seguras exception (ou nenhum manipulador de exceção); as informações na manipulação de exceção segura deve ser adicionada em tempo de compilação.

A capacidade do vinculador de criar uma tabela de manipuladores seguro de exceção depende do aplicativo usando a biblioteca de tempo de execução C. Se você vincular com /NODEFAULTLIB e você quiser uma tabela de manipuladores seguro de exceção, você precisa fornecer uma estrutura de configuração de carga (como pode ser localizado no arquivo de origem de CRT de loadcfg.c) que contém todas as entradas definidas para o 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 Propriedade do projeto. Para obter detalhes, consulte Configurando as propriedades de projeto do Visual C++.

  2. Selecione a pasta do Vinculador.

  3. Selecione a página de propriedades Linha de Comando .

  4. Insira a opção na caixa de Opções Adicionais .

Para definir essa opção de vinculador por meio de programação

Consulte também

Referência

Definindo opções de vinculador

Opções de vinculador