/SAFESEH(이미지에는 금고 예외 처리기가 있습니다.)

/SAFESEH 지정되면 링커는 이미지의 안전한 예외 처리기 테이블을 생성할 수 있는 경우에만 이미지를 생성합니다. 이 표는 이미지에 유효한 예외 처리기를 운영 체제에 지정합니다.

구문

/SAFESEH
/SAFESEH:NO

설명

/SAFESEH 는 x86 대상에 연결할 때만 유효합니다. /SAFESEH 은 예외 처리기가 이미 기록된 플랫폼에 대해 지원되지 않습니다. 예를 들어 x64 및 ARM에서 모든 예외 처리기는 PDATA에 기록됩니다. ML64.exe는 이미지에 SEH 정보(XDATA 및 PDATA)를 내보내는 주석을 추가하여 ml64 함수를 해제할 수 있도록 지원합니다. 자세한 내용은 x64용 MASM(ml64.exe)을 참조하세요.

지정하지 않으면 /SAFESEH 모든 코드 세그먼트가 안전한 예외 처리 기능과 호환되는 경우 링커는 안전한 예외 처리기 테이블이 있는 이미지를 생성합니다. 코드 세그먼트가 안전한 예외 처리 기능과 호환되지 않는 경우 결과 이미지에는 안전한 예외 처리기의 테이블이 포함되지 않습니다. 옵션을 지정하거나 옵션 중 EFI_* 하나를 지정 WINDOWSCE 하는 경우 /SUBSYSTEM 링커는 안전한 예외 처리기 테이블이 있는 이미지를 생성하려고 시도하지 않습니다. 이러한 하위 시스템 중 어느 것도 정보를 사용할 수 없기 때문에 링커는 이를 사용하지 않습니다.

지정한 경우 /SAFESEH:NO 링커는 모든 코드 세그먼트가 안전한 예외 처리 기능과 호환되더라도 안전한 예외 처리기 테이블이 있는 이미지를 생성하지 않습니다.

링커에서 이미지를 생성할 수 없는 가장 일반적인 이유는 링커에 대한 입력 파일 중 하나 이상이 안전한 예외 처리기 기능과 호환되지 않기 때문입니다. 코드가 안전한 예외 처리기와 호환되지 않는 일반적인 이유는 이전 버전의 Visual C++에서 컴파일러로 만들어졌기 때문입니다.

를 사용하여 .SAFESEH함수를 구조적 예외 처리기로 등록할 수도 있습니다.

기존 이진 파일을 안전한 예외 처리기(또는 예외 처리기 없음)가 있는 것으로 표시할 수 없습니다. 안전한 예외 처리에 대한 정보는 빌드 시 추가해야 합니다.

안전한 예외 처리기 테이블을 빌드하는 링커의 기능은 C 런타임 라이브러리를 사용하는 애플리케이션에 따라 달라집니다. 연결 /NODEFAULTLIB 하여 안전한 예외 처리기 테이블을 원하는 경우 Visual C++에 대해 정의된 모든 항목을 포함하는 부하 구성 구조체(예: CRT 원본 파일에서 loadcfg.c 찾을 수 있습니다)를 제공해야 합니다. 예시:

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

Visual Studio 개발 환경에서 이 링커 옵션을 설정하려면

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 자세한 내용은 컴파일러 및 빌드 속성 설정을 참조 하세요.

  2. 구성 속성>링커>고급 속성 페이지를 선택합니다.

  3. Image Has 금고 예외 처리기 속성을 수정합니다. 확인을 선택하거나 적용하여 변경 내용을 저장합니다.

프로그래밍 방식으로 이 링커 옵션을 설정하려면

참고 항목

MSVC 링커 참조
MSVC 링커 옵션