/SAFESEH (イメージには安全な例外ハンドラーがあります)

/SAFESEHを指定すると、リンカーは、イメージの安全な例外ハンドラーのテーブルも生成できる場合にのみ、イメージを生成します。 この表は、イメージに対して有効な例外ハンドラーをオペレーティング システムに指定します。

構文

/SAFESEH
/SAFESEH:NO

解説

/SAFESEH は x86 ターゲットのリンク時にのみ有効です。 /SAFESEH は、例外ハンドラーが既にコメントされているプラットフォームではサポートされません。 たとえば、x64 および ARM では、すべての例外ハンドラーは PDATA にコメントされています。 ML64.exe には、コメントを追加して SEH 情報 (XDATA および PDATA) をイメージに出力する機能をサポートしているため、ml64 関数からのアンワインドが可能です。 詳細については、「x64 用 MASM (ml64.exe)」を参照してください。

/SAFESEH が指定されていない場合、すべてのコード セグメントに安全な例外処理機能との互換性があれば、リンカーによってイメージおよび安全な例外ハンドラーのテーブルが生成されます。 いずれかのコード セグメントに安全な例外処理機能との互換性がない場合、生成されるイメージには安全な例外ハンドラーのテーブルが含まれません。 /SUBSYSTEMWINDOWSCEまたはいずれかのEFI_*オプションを指定した場合、リンカーは安全な例外ハンドラーのテーブルを含むイメージを生成しようとしません。これらのサブシステムはどちらも情報を利用できないためです。

/SAFESEH:NO が指定されている場合、すべてのコード セグメントに安全な例外処理機能との互換性があっても、リンカーではイメージおよび安全な例外ハンドラーのテーブルが生成されません。

リンカーでイメージを生成できない最も一般的な理由は、リンカーへの入力ファイル の 1 つ以上に、安全な例外ハンドラー機能との互換性がないことです。 コードに安全な例外ハンドラーとの互換性がない一般的な理由は、以前のバージョンの Visual C++ のコンパイラでそれが作成されていることです。

.SAFESEHを使用して、関数を構造化例外ハンドラーとして登録することもできます。

既存のバイナリを、安全な例外ハンドラーがある、または例外ハンドラーがないものとしてマークすることはできません。安全な例外処理の情報は、ビルド時に追加する必要があります。

リンカーが安全な例外ハンドラーのテーブルを生成できるかどうかは、C ランタイム ライブラリを使用しているアプリケーションによって決まります。 /NODEFAULTLIB とリンクしていて、安全な例外ハンドラーのテーブルが必要な場合は、Visual C++ に対して定義されているすべてのエントリを含む読み込み構成構造体 (loadcfg.c CRT ソース ファイルなどにあります) を用意する必要があります。 次に例を示します。

#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 に安全な例外ハンドラープロパティを変更します。 [OK] または [適用] を選択して、変更内容を保存します。

このリンカーをコードから設定するには

関連項目

MSVC リンカーのリファレンス
MSVC リンカー オプション