Поделиться через


/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

  1. Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.

  2. Выберите страницу свойств>компоновщика>конфигурации Advanced.

  3. Измените свойство Image Has Safe Exception Handlers property. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.

Задание данного параметра компоновщика программным способом

См. также

Справочник по компоновщику MSVC
Параметры компоновщика MSVC