Параметр /SAFESEH (образ содержит обработчики безопасных событий)
/SAFESEH[:NO]
Если задан параметр /SAFESEH, образ создается компоновщиком только в том случае, когда возможно создание таблицы обработчиков безопасных исключений образа. Эта таблица используется операционной системой для определения допустимых для образа обработчиков событий.
Параметр /SAFESEH может использоваться только при компоновке целевых объектов x86. Параметр /SAFESEH не поддерживается на платформах, для которых уже определены обработчики исключений. Например, для платформ x64 и Itanium все обработчики исключений определяются в разделе PDATA. Программа ML64.exe поддерживает добавление аннотаций, с помощью которых в образ добавляются данные структурированной обработки исключений (XDATA и PDATA). Это позволяет выполнять очистку с помощью функций ml64. Дополнительные сведения см. в разделе MASM for 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
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Установка свойств проекта Visual C++.
Щелкните папку Компоновщик.
Выберите страницу свойств Командная строка.
Введите параметр в поле Дополнительные параметры.
Установка данного параметра компоновщика программным способом
- См. раздел AdditionalOptions.