/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 .SAFESEH
registrieren.
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
Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen finden Sie unter Festlegen von Compiler- und Buildeigenschaften.
Wählen Sie die Seite "Konfigurationseigenschaften linker>>Advanced".
Ä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 AdditionalOptions.