/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 Safe Exception Handlers 屬性。 選擇 [確定] 或 [套用] 以儲存變更。

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

另請參閱

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