/SAFESEH
(Görüntüde Güvenli Özel Durum İşleyicileri var)
Belirtildiğinde /SAFESEH
, bağlayıcı yalnızca görüntünün güvenli özel durum işleyicilerinin bir tablosunu da üretebiliyorsa bir görüntü oluşturur. Bu tablo, görüntü için hangi özel durum işleyicilerinin geçerli olduğunu işletim sistemine belirtir.
Sözdizimi
/SAFESEH
/SAFESEH:NO
Açıklamalar
/SAFESEH
yalnızca x86 hedefleri için bağlanırken geçerlidir. /SAFESEH
zaten özel durum işleyicileri belirtilen platformlar için desteklenmez. Örneğin, x64 ve ARM'de tüm özel durum işleyicileri PDATA'da not edilir. ML64.exe, görüntüye SEH bilgilerini (XDATA ve PDATA) yayan ek açıklamalar ekleme desteğine sahiptir ve ml64 işlevleriyle geri sarmanızı sağlar. Daha fazla bilgi için bkz. x64 için MASM (ml64.exe).
Belirtilmezse /SAFESEH
, tüm kod kesimleri güvenli özel durum işleme özelliğiyle uyumluysa bağlayıcı, güvenli özel durum işleyicileri tablosuyla bir görüntü oluşturur. Herhangi bir kod kesimi güvenli özel durum işleme özelliğiyle uyumlu değilse, sonuçta elde edilen görüntü güvenli özel durum işleyicileri tablosu içermez. Seçeneklerden birini EFI_*
veya belirtirse /SUBSYSTEM
WINDOWSCE
, bağlayıcı güvenli özel durum işleyicileri tablosuna sahip bir görüntü oluşturmayı denemez, çünkü bu alt sistemlerin hiçbiri bu bilgileri kullanamaz.
Belirtilirse /SAFESEH:NO
, bağlayıcı, tüm kod kesimleri güvenli özel durum işleme özelliğiyle uyumlu olsa bile güvenli özel durum işleyicileri tablosuna sahip bir görüntü üretmez.
Bağlayıcının görüntü oluşturamamasının en yaygın nedeni, bağlayıcıya yönelik bir veya daha fazla giriş dosyasının güvenli özel durum işleyicileri özelliğiyle uyumsuz olmasıdır. Kodun güvenli özel durum işleyicileriyle uyumsuz olmasının yaygın nedenlerinden biri, Visual C++'ın önceki bir sürümünden bir derleyiciyle oluşturulmuş olmasıdır.
Ayrıca kullanarak bir işlevi yapılandırılmış özel durum işleyicisi olarak kaydedebilirsiniz .SAFESEH
.
Mevcut bir ikiliyi güvenli özel durum işleyicileri (veya özel durum işleyicileri yok) olarak işaretlemek mümkün değildir; derleme zamanında güvenli özel durum işleme bilgileri eklenmelidir.
Bağlayıcının güvenli özel durum işleyicileri tablosu oluşturabilmesi, C çalışma zamanı kitaplığını kullanan uygulamaya bağlıdır. ile /NODEFAULTLIB
bağlantı ve güvenli özel durum işleyicileri tablosu istiyorsanız, Visual C++ için tanımlanan tüm girdileri içeren bir yük yapılandırma yapısı (örneğin, CRT kaynak dosyasında bulunabilir loadcfg.c
) sağlamanız gerekir. Örneğin:
#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 geliştirme ortamındaki bu bağlayıcı seçeneğini ayarlamak için
Proje için Özellik Sayfaları iletişim kutusunu açın. Daha fazla bilgi için bkz . Derleyici ve derleme özelliklerini ayarlama.
Yapılandırma Özellikleri>Bağlayıcısı>Gelişmiş özellik sayfasını seçin.
Görüntüde Güvenli Özel Durum İşleyicileri var özelliğini değiştirin. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.
Bu bağlayıcı seçeneğini program aracılığıyla ayarlamak için
- Bkz. AdditionalOptions.