/SAFESEH
(Образ содержит безопасные обработчики исключений)
При /SAFESEH
указании компоновщик создает только изображение, если оно также может создать таблицу безопасных обработчиков исключений образа. Эта таблица указывает операционной системе, которую обработчики исключений допустимы для образа.
Синтаксис
/SAFESEH
/SAFESEH:NO
Замечания
/SAFESEH
допустимо только при связывании для целевых объектов x86. /SAFESEH
не поддерживается для платформ, которые уже отмечены обработчиками исключений. Например, в X64 и ARM все обработчики исключений отмечаются в PDATA. ML64.exe поддерживает добавление заметок, которые выдают сведения SEH (XDATA и PDATA) в изображение, что позволяет отключать функции ml64. Дополнительные сведения см. в статье MASM для x64 (ml64.exe).
Если /SAFESEH
не указано, компоновщик создаст изображение с таблицей безопасных обработчиков исключений, если все сегменты кода совместимы с функцией безопасной обработки исключений. Если какие-либо сегменты кода не совместимы с функцией безопасной обработки исключений, результирующий образ не будет содержать таблицу безопасных обработчиков исключений. Если /SUBSYSTEM
задан WINDOWSCE
или один из EFI_*
вариантов, компоновщик не попытается создать изображение с таблицей безопасных обработчиков исключений, так как ни один из этих подсистем не может использовать информацию.
Если /SAFESEH:NO
задано, компоновщик не создает изображение с таблицей безопасных обработчиков исключений, даже если все сегменты кода совместимы с функцией безопасной обработки исключений.
Наиболее распространенная причина, по которой компоновщик не может создать изображение, заключается в том, что один или несколько входных файлов компоновщика несовместимы с функцией безопасных обработчиков исключений. Распространенная причина, по которой код несовместим с безопасными обработчиками исключений, потому что он был создан с компилятором из предыдущей версии Visual C++.
Вы также можете зарегистрировать функцию в качестве структурированного обработчика исключений с помощью .SAFESEH
.
Невозможно пометить существующий двоичный файл как безопасный обработчик исключений (или нет обработчиков исключений); Сведения о безопасной обработке исключений необходимо добавить во время сборки.
Возможность компоновщика создавать таблицу безопасных обработчиков исключений зависит от приложения с помощью библиотеки среды выполнения C. Если вы связываетесь с /NODEFAULTLIB
таблицей безопасных обработчиков исключений, необходимо указать структуру конфигурации нагрузки (например, найти в исходном loadcfg.c
файле CRT), содержащую все записи, определенные для Visual C++. Например:
#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
};
Задание данного параметра компоновщика в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.
Выберите страницу свойств>компоновщика>конфигурации Advanced.
Измените свойство Image Has Safe Exception Handlers property. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.
Задание данного параметра компоновщика программным способом
- См. раздел AdditionalOptions.