/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
Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.
Selecione a página de propriedades Propriedades da Configuração>Vinculador>Avançado.
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
- Consulte AdditionalOptions.