/SAFESEH (نسخة على معالجات استثناء آمن)
/SAFESEH[:NO]
عند /SAFESEHالمحدد، فقط سيقوم الرابط بإنشاء نسخة إذا كان يمكنك أيضا إنشاء جدول من معالجات استثناء آمن الخاص بالصورة. يحدد هذا الجدول لمعالجات استثناء التي تكون صالحة لنظام التشغيل نسخة.
/SAFESEHهو صالحاً فقط عند الارتباط ل x86 الأهداف. /SAFESEHهو غير معتمدة للأنظمة التي تحتوي على معالجات استثناء المذكورة مسبقاً. تشغيل سبيل المثال، في x64و Itanium، تتم الإشارة إلى الجميع معالجات استثناء في PDATA. لدى ML64.exe دعما لإضافة التعليقات التوضيحية التي تقوم بإرسال معلومات SEH (XDATA و PDATA) في إلى الصورة، مما يسمح لك إلى unwind من خلال وظائف ml64. لمزيد من المعلومات، راجع MASM x 64 (ml64.exe).
إذا /SAFESEHهو غير محددة، الرابط سوف تعطي نسخة باستخدام جدول الاستثناءات آمن معالجات إذا الجميع الوحدات النمطية متوافقة مع استثناء آمن معالجة الميزة. إذا لم يكن متوافقاً مع معالجة استثناء آمن أية وحدات نمطية ميزة، لن يحتوي على جدول معالجات استثناء آمن على الصورة الناتجة. إذا /نظام فرعي تعين WINDOWSCE أو واحد الخيارات EFI_ *، لا ستحاول الرابط إلى إنتاج نسخة باستخدام جدول معالجات استثناءات آمن، كما لم يكن أي من هذه الأنظمة الفرعية يمكن أن تستخدم المعلومات.
إذا /SAFESEH:NOهو، الرابط سوف لا إنتاج نسخة باستخدام جدول استثناءات آمن معالجات حتى إذا كانت الجميع الوحدات النمطية متوافقة باستثناء آمن معالجة الميزة.
السبب الأكثر شيوعاً لالرابط غير لكي تتمكن من إنشاء نسخة هو لأن واحد أو المزيد ملفات إدخال (الوحدات النمطية) الرابط غير متوافقة مع ميزة معالجات استثناء آمن. أحد أسباب شائعة لوحدة نمطية لا تكون متوافقة مع معالجات استثناء آمن هو لأنه تم إنشاؤه باستخدام برنامج التحويل برمجي من الإصدار سابق ل C + + Vهوual.
يمكنك أيضا تسجيل دالة كـ معالج استثناء المبنية باستخدام .SAFESEH .
في Microsoft Visual C++ 2005هو غير ممكنة لوضع علامة exهوting الثنائية باستثناء آمن معالجات (أو لا توجد معالجات استثناء)؛ المعلومات حول معالجة استثناء آمن يجب أن تتم إضافتها في وقت الإنشاء.
قابلية لرابط إلى بناء جدول استثناء آمن معالجات تستند إلى تطبيق الذي يستخدم في مكتبة وقت تشغيل C. إذا قمت بربط مع /NODEFAULTLIB وأردت جدول معالجات استثناء آمنة، تحتاج إلى توفير بنية تكوين تحميل (مثل كـ في الملف المصدر loadcfg.c CRT) الذي يحتوي على الجميع الإدخالات المعرفة من أجل 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
افتح مربع الحوار صفحات الخصائص للمشروع. للحصول على تفاصيل، راجع إعداد خصائص مشروع Visual C++.
انقر فوق المجلد الرابط.
انقر فوق صفحة الخصائص سطر الأوامر.
نوع خيار في المربع خيارات إضافى.
إلى قم بتعيين هذا خيار الرابط برمجياً
- انظر AdditionalOptions