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


Параметр /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

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

  2. Щелкните папку Компоновщик.

  3. Выберите страницу свойств Командная строка.

  4. Введите параметр в поле Дополнительные параметры.

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

См. также

Ссылки

Настройка параметров компоновщика

Параметры компоновщика