Es wird empfohlen, Visual Studio 2017 zu verwenden

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

 

Veröffentlicht: Juli 2016

Die neueste Dokumentation zu Visual Studio 2017 finden Sie unter Dokumentation zu Visual Studio 2017.

/SAFESEH[:NO]  

Wenn /SAFESEH angegeben ist, erstellt der Linker nur dann ein Image, wenn auch eine Tabelle mit den sicheren Ausnahmehandlern des Images erstellt werden kann. In dieser Tabelle ist für das Betriebssystem angegeben, welche Ausnahmehandler für das Image gültig sind.

/SAFESEH gilt nur für Verknüpfungen mit x86-Zielen. /SAFESEH wird nicht für Plattformen unterstützt, auf denen die Ausnahmehandler bereits aufgeführt werden. Für x64 und ARM sind beispielsweise alle Ausnahmehandler in PDATA aufgeführt. 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 for x64 (ml64.exe).

Wenn /SAFESEH nicht angegeben wird, erstellt der Linker ein Image 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 Image keine Tabelle mit sicheren Ausnahmehandlern. Wenn durch /SUBSYSTEM WINDOWSCE oder eine der EFI_*-Optionen festgelegt wird, unternimmt der Linker keinen Versuch, ein Image 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 Image 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 Image erstellen kann, besteht darin, dass mindestens eine der Eingabedateien (Module) für den Linker nicht mit der sicheren Ausnahmebehandlung kompatibel sind. Eine häufige Ursache dafür, dass ein Module nicht mit sicheren Ausnahmehandlern kompatibel ist, besteht darin, dass es 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.

Es ist 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, von der die C-Laufzeitbibliothek verwendet wird. Wenn Sie mit /NODEFAULTLIB linken und eine Tabelle sicherer Ausnahmehandler generieren möchten, müssen Sie eine Ladekonfigurationsstruktur (wie sie beispielsweise 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. Wählen Sie den Ordner Linker aus.

  3. Wählen Sie die Eigenschaftenseite Befehlszeile aus.

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

So legen Sie diese Linkeroption programmgesteuert fest

Festlegen von Linkeroptionen
Linkeroptionen

Anzeigen: