/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
Abra a caixa de diálogo Páginas de Propriedade do projeto. Para obter detalhes, consulte Configurando as propriedades de projeto do Visual C++.
Selecione a pasta do Vinculador.
Selecione a página de propriedades Linha de Comando .
Insira a opção na caixa de Opções Adicionais .
Para definir essa opção de vinculador por meio de programação
- Consulte AdditionalOptions.