/SAFESEH
(Gambar memiliki Handler Pengecualian Aman)
Ketika /SAFESEH
ditentukan, linker hanya menghasilkan gambar jika juga dapat menghasilkan tabel penangan pengecualian aman gambar. Tabel ini menentukan sistem operasi penangan pengecualian mana yang valid untuk gambar.
Sintaks
/SAFESEH
/SAFESEH:NO
Keterangan
/SAFESEH
hanya valid saat menautkan untuk target x86. /SAFESEH
tidak didukung untuk platform yang sudah memiliki handler pengecualian yang dicatat. Misalnya, pada x64 dan ARM, semua handler pengecualian dicatat dalam PDATA. ML64.exe memiliki dukungan untuk menambahkan anotasi yang memancarkan informasi SEH (XDATA dan PDATA) ke dalam gambar, memungkinkan Anda untuk melepas lelah melalui fungsi ml64. Untuk informasi selengkapnya, lihat MASM untuk x64 (ml64.exe).
Jika /SAFESEH
tidak ditentukan, linker akan menghasilkan gambar dengan tabel handler pengecualian aman jika semua segmen kode kompatibel dengan fitur penanganan pengecualian yang aman. Jika ada segmen kode yang tidak kompatibel dengan fitur penanganan pengecualian aman, gambar yang dihasilkan tidak akan berisi tabel penangan pengecualian yang aman. Jika /SUBSYSTEM
menentukan WINDOWSCE
atau salah EFI_*
satu opsi, linker tidak akan mencoba menghasilkan gambar dengan tabel penangan pengecualian yang aman, karena tidak satu pun dari subsistem tersebut dapat menggunakan informasi.
Jika /SAFESEH:NO
ditentukan, linker tidak akan menghasilkan gambar dengan tabel handler pengecualian yang aman meskipun semua segmen kode kompatibel dengan fitur penanganan pengecualian yang aman.
Alasan paling umum linker tidak dapat menghasilkan gambar adalah karena satu atau beberapa file input ke linker tidak kompatibel dengan fitur handler pengecualian yang aman. Alasan umum mengapa kode tidak kompatibel dengan handler pengecualian yang aman adalah karena dibuat dengan pengkompilasi dari versi Visual C++sebelumnya.
Anda juga dapat mendaftarkan fungsi sebagai handler pengecualian terstruktur dengan menggunakan .SAFESEH
.
Tidak dimungkinkan untuk menandai biner yang ada sebagai memiliki penangan pengecualian yang aman (atau tidak ada penangan pengecualian); informasi tentang penanganan pengecualian yang aman harus ditambahkan pada waktu build.
Kemampuan linker untuk membangun tabel penangan pengecualian yang aman tergantung pada aplikasi menggunakan pustaka runtime C. Jika Anda menautkan dengan /NODEFAULTLIB
dan Anda menginginkan tabel penangan pengecualian yang aman, Anda perlu menyediakan struct konfigurasi beban (seperti dapat ditemukan di loadcfg.c
file sumber CRT) yang berisi semua entri yang ditentukan untuk Visual C++. Contohnya:
#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
};
Untuk mengatur opsi linker ini di lingkungan pengembangan Visual Studio
Buka kotak dialog Halaman Properti untuk proyek. Untuk informasi selengkapnya, lihat Mengatur properti kompilator dan build.
Pilih halaman properti Tingkat Lanjut Linker>Properti>Konfigurasi.
Ubah properti Image Has Safe Exception Handlers. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.
Untuk menyetel opsi linker ini secara terprogram
- Lihat AdditionalOptions.