Udostępnij za pośrednictwem


/SAFESEH (Obraz ma bezpieczne programy obsługi wyjątków)

Po /SAFESEH określeniu konsolidator tworzy obraz tylko wtedy, gdy może również utworzyć tabelę bezpiecznych procedur obsługi wyjątków obrazu. Ta tabela określa system operacyjny, który procedury obsługi wyjątków są prawidłowe dla obrazu.

Składnia

/SAFESEH
/SAFESEH:NO

Uwagi

/SAFESEH jest prawidłowy tylko podczas łączenia dla elementów docelowych x86. /SAFESEH program nie jest obsługiwany dla platform, które mają już zanotowaną obsługę wyjątków. Na przykład w przypadku architektury x64 i arm wszystkie procedury obsługi wyjątków są zanotowane w kodzie PDATA. ML64.exe obsługuje dodawanie adnotacji, które emitują informację strukturalnej obsługi wyjątków (XDATA i PDATA) do obrazu, pozwalając na odpoczynek, dzięki funkcji ml64. Aby uzyskać więcej informacji, zobacz MASM for x64 (ml64.exe).

Jeśli /SAFESEH nie zostanie określony, konsolidator utworzy obraz z tabelą procedur obsługi bezpiecznych wyjątków, jeśli wszystkie segmenty kodu są zgodne z funkcją bezpiecznej obsługi wyjątków. Jeśli jakiekolwiek segmenty kodu nie były zgodne z funkcją bezpiecznej obsługi wyjątków, wynikowy obraz nie będzie zawierać tabeli bezpiecznych procedur obsługi wyjątków. Jeśli /SUBSYSTEM określono WINDOWSCE lub jedną z EFI_* opcji, konsolidator nie podejmie próby utworzenia obrazu z tabelą procedur obsługi bezpiecznych wyjątków, ponieważ żaden z tych podsystemów nie może korzystać z informacji.

Jeśli /SAFESEH:NO zostanie określony, konsolidator nie utworzy obrazu z tabelą procedur obsługi bezpiecznych wyjątków, nawet jeśli wszystkie segmenty kodu są zgodne z funkcją bezpiecznej obsługi wyjątków.

Najczęstszym powodem, dla którego konsolidator nie może utworzyć obrazu, jest to, że co najmniej jeden plik wejściowy konsolidatora był niezgodny z funkcją bezpiecznego obsługi wyjątków. Typowym powodem, dla którego kod jest niezgodny z bezpiecznymi procedurami obsługi wyjątków, jest to, że został utworzony za pomocą kompilatora z poprzedniej wersji programu Visual C++.

Funkcję można również zarejestrować jako procedurę obsługi wyjątków strukturalnych przy użyciu polecenia .SAFESEH.

Nie można oznaczyć istniejącego pliku binarnego jako bezpiecznego programu obsługi wyjątków (lub bez procedur obsługi wyjątków); w czasie kompilacji należy dodać informacje na temat bezpiecznej obsługi wyjątków.

Konsolidator posiada możliwość utworzenia tabeli obsługi bezpiecznych wyjątków zależnych od aplikacji przy użyciu biblioteki środowiska uruchomieniowego C. Jeśli łączysz się z tabelą /NODEFAULTLIB bezpiecznych procedur obsługi wyjątków, musisz podać strukturę konfiguracji obciążenia (taką jak można znaleźć w loadcfg.c pliku źródłowym CRT), która zawiera wszystkie wpisy zdefiniowane dla języka Visual C++. Na przykład:

#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
};

Aby ustawić tę opcję konsolidatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać więcej informacji, zobacz Ustawianie właściwości kompilatora i kompilacji.

  2. Wybierz stronę właściwości Zaawansowane konsolidatora> właściwości>konfiguracji.

  3. Zmodyfikuj właściwość Procedury obsługi bezpiecznych wyjątków obrazu. Wybierz przycisk OK lub Zastosuj , aby zapisać zmiany.

Aby programowo ustawić tę opcję konsolidatora

Zobacz też

Dokumentacja konsolidatora MSVC
Opcje konsolidatora MSVC