/SafeSEH (imagem tem manipuladores de exceção segura)
/SAFESEH[:NO]
Quando /SAFESEH for especificado, o vinculador produzirá uma imagem somente 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 que já possuem os manipuladores de exceção observados.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.Consulte MASM para x64 (ml64.exe) para obter mais informações.
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 o recurso de manipulação de exceção segura.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 recurso de manipulação de exceção segura.
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 para 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 manipuladores de exceção segura (ou sem manipuladores de exceção); informações sobre o tratamento de exceções de segurança 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++.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 de vinculador no ambiente de desenvolvimento Visual Studio
Abra o projeto Páginas de propriedades caixa de diálogo.Para obter detalhes, consulte Definindo propriedades de projeto Visual C++.
Clique no vinculador pasta.
Clique no a linha de comando página de propriedades.
Digite a opção para o Opções adicionais de caixa.
Para definir esta opção de vinculador programaticamente
- Consulte AdditionalOptions.