Compartilhar via


/SafeSEH (a imagem tem manipuladores de exceção segura)

/SAFESEH[:NO]

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

/SAFESEHsó é válido quando a vinculação para x86 destinos. /SAFESEHNão há suporte para plataformas já tem anotados os manipuladores de exceção. Por exemplo, em x64 e Itanium, todos os manipuladores de exceção são observados no PDATA. ML64.exe tem suporte para adicionar anotações emitem informações de SEH (XDATA e PDATA) na imagem, permitindo que você desenrolar através das funções de ml64. See MASM for x64 (ml64.exe) for more information.

Se /SAFESEH não for especificado, o vinculador produzirá uma imagem com uma tabela de manipuladores de exceções de segurança se todos os módulos são compatíveis com a exceção de segurança manipulando o recurso. Se todos os módulos não eram compatíveis com o recurso de manipulação de exceção segura, a imagem resultante não conterá uma tabela de manipuladores de exceção de segurança. Se /SUBSYSTEM Especifica WINDOWSCE ou uma das opções de EFI_ *, o vinculador não tentará produzir uma imagem com uma tabela de manipuladores de exceções de segurança, como nenhuma esses subsistemas podem fazer uso das informações.

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

O motivo mais comum para o vinculador não deve ser capaz de produzir uma imagem é porque um ou mais dos arquivos de entrada (módulos) para o vinculador não era compatível com o recurso de manipuladores de exceção segura. Uma razão comum para um módulo de não ser compatível com manipuladores de exceção segura é porque ele foi criado com um compilador de uma versão anterior do Visual C++.

Você também pode registrar uma função como um manipulador de exceção estruturada usando ./SafeSEH.

Não é possível marcar uma existente binário como tendo os manipuladores de exceção segura (ou sem manipuladores de exceção); informações sobre o tratamento de exceção segura devem ser adicionadas em tempo de compilação.

A capacidade do vinculador para construir um índice de manipuladores de exceção de segurança depende do aplicativo usando a biblioteca de tempo de execução C. Se você vincular com /NODEFAULTLIB e quiser uma tabela de manipuladores de exceção de segurança, você precisa fornecer uma struct de configuração de carga (como pode ser encontrado no arquivo de origem loadcfg.c CRT) que contém todas as entradas definidas para o Visual C++. For example:

#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 de vinculador no ambiente de desenvolvimento Visual Studio

  1. Abra o projeto Property Pages caixa de diálogo. Para obter detalhes, consulte Definindo propriedades de projeto Visual C++.

  2. Clique o vinculador pasta.

  3. Clique na a linha de comando página de propriedades.

  4. Digite a opção para o Opções adicionais de caixa.

Para definir esta opção de vinculador programaticamente

Consulte também

Referência

Configurando opções de vinculador

Opções do Vinculador