Sdílet prostřednictvím


/SAFESEH (Abbild verfügt über sichere Ausnahmehandler)

Aktualisiert: November 2007

/SAFESEH[:NO]

Bei Angabe von /SAFESEH wird vom Linker nur dann ein Abbild erstellt, wenn gleichzeitig auch eine Tabelle der sicheren Ausnahmehandler für das Abbild generiert werden kann. In dieser Tabelle sind die gültigen Ausnahmehandler des Abbildes angegeben, die das Betriebssystem nutzen kann.

/SAFESEH betrifft nur Verknüpfungen für x86-Ziele. /SAFESEH wird nicht für Plattformen unterstützt, auf denen die Ausnahmehandler bereits aufgeführt werden. Auf x64 und Itanium sind z. B. alle Ausnahmehandler in PDATA aufgeführt. ML64.exe unterstützt das Hinzufügen von Anmerkungen, die SEH-Informationen (XDATA und PDATA) an das Abbild ausgeben, sodass Sie die ml64-Funktionen nacheinander entladen können. Weitere Informationen finden Sie unter MASM for x64 (ml64.exe).

Wenn /SAFESEH nicht angegeben wird, erstellt der Linker ein Abbild mit einer Tabelle sicherer Ausnahmehandler, sofern alle Module mit der sicheren Ausnahmebehandlung kompatibel sind. Falls einige Module nicht mit der sicheren Ausnahmebehandlung kompatibel sind, enthält das resultierende Abbild keine Tabelle mit sicheren Ausnahmehandlern. Wenn durch /SUBSYSTEMWINDOWSCE oder eine der EFI_*-Optionen festgelegt wird, unternimmt der Linker keinen Versuch, ein Abbild mit einer Tabelle sicherer Ausnahmehandler zu erstellen, da die Informationen von keinem dieser Subsysteme genutzt werden können.

Wenn /SAFESEH:NO angegeben wird, erstellt der Linker kein Abbild mit einer Tabelle sicherer Ausnahmehandler, auch wenn alle Module mit der sicheren Ausnahmebehandlung kompatibel sind.

Der häufigste Grund dafür, dass der Linker kein Abbild erstellen kann, besteht darin, dass eine oder mehrere der Linkereingabedateien (Module) nicht mit der sicheren Ausnahmebehandlung kompatibel sind. Eine häufige Ursache für die Inkompatibilität von Modulen mit sicheren Ausnahmehandlern liegt darin, dass sie mit einem Compiler aus einer früheren Visual C++-Version erstellt wurden.

Sie können auch eine Funktion als strukturierte Ausnahmehandler registrieren, indem Sie .SAFESEH verwenden.

In Microsoft Visual C++ 2005 ist es nicht möglich, vorhandene Binärdateien als sichere (oder keine) Ausnahmehandler besitzend zu markieren. Informationen zur sicheren Ausnahmebehandlung müssen beim Erstellen hinzugefügt werden.

Ob der Linker in der Lage ist, eine Tabelle sicherer Ausnahmehandler zu generieren, richtet sich nach der Anwendung, die die C-Laufzeitbibliothek nutzt. Wenn Sie eine Verknüpfung mit /NODEFAULTLIB herstellen und eine Tabelle sicherer Ausnahmehandler generieren möchten, müssen Sie eine Ladekonfigurationsstruktur (wie sie z. B. in der CRT-Quelldatei loadcfg.c enthalten ist) bereitstellen, die alle für Visual C++ definierten Einträge enthält. 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 des Projekts. Ausführliche Informationen finden Sie unter Festlegen von Visual C++-Projekteigenschaften.

  2. Klicken Sie auf den Ordner Linker.

  3. Klicken Sie auf die Eigenschaftenseite für die Befehlszeile.

  4. Geben Sie die Option im Feld Zusätzliche Optionen ein.

So legen Sie diese Linkeroption programmgesteuert fest

Siehe auch

Referenz

Festlegen von Linkeroptionen

Linkeroptionen