/SAFESEH (安全な例外ハンドラーがあるイメージ)
/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 を使用して、関数を構造化例外ハンドラーとして登録することもできます。
既存のバイナリを、安全な例外ハンドラーがある、または例外ハンドラーがないものとしてマークすることはできません。安全な例外処理の情報は、ビルド時に追加する必要があります。
リンカーが安全な例外ハンドラーのテーブルを生成できるかどうかは、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 開発環境でこのリンカー オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「Visual C++ プロジェクトのプロパティの設定」を参照してください。
[リンカー] フォルダーをクリックします。
[コマンド ライン] プロパティ ページをクリックします。
[追加のオプション] ボックスにオプションを入力します。
このリンカーをコードから設定するには
- AdditionalOptions を参照してください。