Share via


/SAFESEH(影像有保管庫例外狀況處理常式)

當指定 時 /SAFESEH ,連結器只有在它也可以產生映射的安全例外狀況處理常式資料表時,才會產生影像。 此資料表會指定作業系統的例外狀況處理常式對映射有效。

語法

/SAFESEH
/SAFESEH:NO

備註

/SAFESEH 只有在連結 x86 目標時才有效。 /SAFESEH 對於已經注意到例外狀況處理常式的平臺不支援。 例如,在 x64 和 ARM 上,PDATA 中會指出所有例外狀況處理常式。 ML64.exe 支援將發出 SEH 資訊 (XDATA 和 PDATA) 的注釋新增至映射,讓您能夠透過 ml64 函式回溯。 如需詳細資訊,請參閱 適用于 x64 的 MASM (ml64.exe)

如果未 /SAFESEH 指定,如果所有程式碼區段都與安全例外狀況處理功能相容,則連結器會產生具有安全例外狀況處理常式資料表的影像。 如果任何程式碼區段與安全例外狀況處理功能不相容,產生的影像就不會包含安全例外狀況處理常式的資料表。 如果 /SUBSYSTEM 指定 WINDOWSCE 或其中 EFI_* 一個選項,連結器不會嘗試產生具有安全例外狀況處理常式資料表的映射,因為這些子系統都無法使用資訊。

如果 /SAFESEH:NO 已指定,即使所有程式碼區段都與安全例外狀況處理功能相容,連結器也不會產生具有安全例外狀況處理常式資料表的影像。

連結器無法產生影像最常見的原因是連結器一或多個輸入檔與安全例外狀況處理常式功能不相容。 程式碼與安全例外狀況處理常式不相容的常見原因是,它是使用舊版 Visual C++ 的編譯器所建立。

您也可以使用 .SAFESEH 將函式註冊為結構化例外狀況處理常式。

無法將現有的二進位檔標示為具有安全例外狀況處理常式(或沒有例外狀況處理常式):必須在建置階段新增安全例外狀況處理的相關資訊。

連結器建置安全例外狀況處理常式資料表的能力取決於使用 C 執行時間程式庫的應用程式。 如果您與 /NODEFAULTLIB 連結,而且想要安全例外狀況處理常式的資料表,您必須提供負載設定結構(例如,可以在 CRT 原始程式檔中找到 loadcfg.c ),其中包含針對 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. 開啟專案的 [ 屬性頁 ] 對話方塊。 如需詳細資訊,請參閱 設定編譯器和建置屬性

  2. 選取 [組態屬性 > ] 連結器 > [ 進階 ] 屬性頁。

  3. 修改 Image Has 保管庫 Exception Handlers 屬性。 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。

若要以程式設計方式設定這個連結器選項

另請參閱

MSVC 連結器參考
MSVC 連結器選項