次の方法で共有


/SAFESEH (安全な例外ハンドラがあるイメージ)

更新 : 2007 年 11 月

/SAFESEH[:NO]

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

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

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

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

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

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

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

リンカが安全な例外ハンドラのテーブルを生成できるかどうかは、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. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。

  2. [リンカ] フォルダをクリックします。

  3. [コマンド ライン] プロパティ ページをクリックします。

  4. [追加のオプション] ボックスにオプションを入力します。

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

参照

参照

リンカ オプションの設定

リンカ オプション