/SAFESEH (Bild enthält sichere Ausnahmehandler)

Wenn /SAFESEH angegeben, erzeugt der Linker nur ein Bild, wenn es auch eine Tabelle der sicheren Ausnahmehandler des Bilds erzeugen kann. Diese Tabelle gibt das Betriebssystem an, für das Ausnahmehandler für das Image gültig sind.

Syntax

/SAFESEH
/SAFESEH:NO

Hinweise

/SAFESEH ist nur gültig, wenn eine Verknüpfung für x86-Ziele erfolgt. /SAFESEH wird für Plattformen, für die bereits die Ausnahmehandler angegeben sind, nicht unterstützt. Bei x64 und ARM werden beispielsweise alle Ausnahmehandler in der PDATA angegeben. ML64.exe unterstützt das Hinzufügen von Anmerkungen, die SEH-Informationen (XDATA und PDATA) an das Image ausgeben, sodass Entladung mithilfe von ml64-Funktionen möglich ist. Weitere Informationen finden Sie unter MASM für x64 (ml64.exe).

Wenn /SAFESEH nicht angegeben, erzeugt der Linker ein Bild mit einer Tabelle sicherer Ausnahmenhandler, wenn alle Codesegmente mit dem Feature für die sichere Ausnahmebehandlung kompatibel sind. Wenn Codesegmente nicht mit dem Feature für die sichere Ausnahmebehandlung kompatibel waren, enthält das resultierende Bild keine Tabelle sicherer Ausnahmehandler. Wenn /SUBSYSTEM angegeben oder eine der EFI_* Optionen angegeben WINDOWSCE wird, versucht der Linker nicht, ein Bild mit einer Tabelle sicherer Ausnahmenhandler zu erstellen, da keine dieser Subsysteme die Informationen verwenden kann.

Wenn /SAFESEH:NO angegeben, erzeugt der Linker kein Bild mit einer Tabelle sicherer Ausnahmenhandler, auch wenn alle Codesegmente mit dem Feature für die sichere Ausnahmebehandlung kompatibel sind.

Der häufigste Grund, warum der Linker kein Bild erzeugen kann, besteht darin, dass mindestens eine der Eingabedateien für den Linker mit dem Feature für sichere Ausnahmehandler nicht kompatibel war. Ein häufiger Grund, warum Code nicht mit sicheren Ausnahmehandlern kompatibel ist, ist, dass er mit einem Compiler aus einer früheren Version von Visual C++ erstellt wurde.

Sie können eine Funktion auch mithilfe eines strukturierten Ausnahmehandlers .SAFESEHregistrieren.

Es ist nicht möglich, eine vorhandene Binärdatei als sichere Ausnahmehandler (oder keine Ausnahmehandler) zu markieren; Informationen zur behandlung sicherer Ausnahmen müssen zur Erstellungszeit hinzugefügt werden.

Ob der Linker in der Lage ist, eine Tabelle sicherer Ausnahmehandler zu generieren, richtet sich nach der Anwendung, von der die C-Laufzeitbibliothek verwendet wird. Wenn Sie eine Verknüpfung mit /NODEFAULTLIB und eine Tabelle sicherer Ausnahmehandler erstellen möchten, müssen Sie eine Lastkonfigurationsstruktur (z. B. in der loadcfg.c CRT-Quelldatei) angeben, die alle für Visual C++ definierten Einträge enthält. Zum Beispiel:

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

So legen Sie diese Linkeroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen finden Sie unter Festlegen von Compiler- und Buildeigenschaften.

  2. Wählen Sie die Seite "Konfigurationseigenschaften linker>>Advanced".

  3. Ändern sie die Eigenschaft "Image Has Safe ExceptionHandlers ". Wählen Sie OK oder Übernehmen, um die Änderungen zu speichern.

So legen Sie diese Linkeroption programmgesteuert fest

Siehe auch

MSVC-Linkerreferenz
Linkeroptionen