Bagikan melalui


/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

  1. Buka kotak dialog Halaman Properti untuk proyek. Untuk informasi selengkapnya, lihat Mengatur properti kompilator dan build.

  2. Pilih halaman properti Tingkat Lanjut Linker>Properti>Konfigurasi.

  3. Ubah properti Image Has Safe Exception Handlers. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.

Untuk menyetel opsi linker ini secara terprogram

Lihat juga

Referensi linker MSVC
Opsi linker MSVC