Udostępnij za pośrednictwem


/SAFESEH (Obraz ma bezpieczną obsługę wyjątków)

/SAFESEH[:NO]

Kiedy opcja /SAFESEH jest określona, konsolidator generuje obraz tylko, jeśli może utworzyć również tabelę bezpiecznej obsługi wyjątków obrazu.Ta tabela określa dla systemu operacyjnego, które programy obsługi wyjątków są prawidłowe dla obrazu.

/SAFESEH jest prawidłowy tylko podczas łączenia do elementów docelowych architektury x86./SAFESEH nie jest obsługiwany na platformach, które mają już zapisaną procedurę obsługi wyjątków.Na przykład, na x64 i ARM, wszystkie obsługi wyjątków są zapisane w 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 dla wersji x64 (ml64.exe).

Jeśli /SAFESEH nie zostanie określona, program łączący wyprodukuje obraz z tabeli obsługi bezpiecznych wyjątków, jeśli wszystkie moduły są zgodne z funkcją obsługi wyjątków bezpiecznych.Jeśli wszystkie moduły nie były zgodne z funkcją obsługi bezpiecznych wyjątków, obraz wynikowy nie będzie zawierać tabeli obsługi bezpiecznych wyjątków.Jeśli /SUBSYSTEM określa WINDOWSCE lub jedną z opcji EFI_ * konsolidator nie będzie próbował utworzyć obrazu z tabeli obsługi wyjątków bezpiecznych, ponieważ żaden z tych podsystemów, nie może wykorzystać informacji.

Jeśli /SAFESEH:NO nie zostanie określony, konsolidator nie wyprodukuje obrazu z tabeli obsługi bezpiecznych wyjątków, jeśli wszystkie moduły są zgodne z funkcją obsługi wyjątków bezpiecznych.

Najczęstszą przyczyną, dla której konsolidator nie może wyprodukować obrazu, jest brak zgodności z funkcją obsługi bezpiecznych wyjątków z konsolidatorem, przez jeden lub więcej plików wejściowych (modułów).Częstą przyczyną niezgodności modułu z obsługą bezpiecznych wyjątków jest utworzenie modułu, przy użyciu kompilatora poprzednich wersji programu Visual C++.

Funkcję można zarejestrować jako obsługę wyjątków strukturalnych, za pomocą .SAFESEH.

Nie istnieje możliwość oznaczenia istniejących danych binarnych jako posiadające obsługę wyjątków bezpiecznych (lub brak obsługi wyjątków); informację na temat obsługi wyjątków bezpiecznych muszą zostać dodane w czasie kompilacji.

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 /NODEFAULTLIB i chcesz uzyskać tabelę obsługi wyjątków bezpiecznych, konieczne jest podanie ustawień obciążeń struct (można je znaleźć w pliku źródłowym loadcfg.c CRT), który zawiera wszystkie wpisy, które są zdefiniowane dla 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ć opcję konsolidatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości projektu.Aby uzyskać szczegółowe informacje, zobacz Konfigurowanie właściwości projektu programu Visual C++.

  2. Wybierz folder Konsolidator.

  3. Wybierz stronę właściwości Wiersz polecenia.

  4. Wprowadź opcje do pola Dodatkowe opcje.

Aby programowo ustawić opcję konsolidatora

Zobacz też

Informacje

Ustawianie opcji konsolidatora

Opcje konsolidatora