diff --git a/src/coreclr/vm/ceemain.cpp b/src/coreclr/vm/ceemain.cpp index e1c06d2c629797..188cdb9abd50b4 100644 --- a/src/coreclr/vm/ceemain.cpp +++ b/src/coreclr/vm/ceemain.cpp @@ -470,6 +470,7 @@ void InitGSCookie() volatile GSCookie * pGSCookiePtr = GetProcessGSCookiePtr(); +#ifdef FEATURE_READONLY_GS_COOKIE // The GS cookie is stored in a read only data segment DWORD oldProtection; if(!ClrVirtualProtect((LPVOID)pGSCookiePtr, sizeof(GSCookie), PAGE_READWRITE, &oldProtection)) @@ -481,6 +482,7 @@ void InitGSCookie() // PAL layer is unable to extract old protection for regions that were not allocated using VirtualAlloc oldProtection = PAGE_READONLY; #endif // TARGET_UNIX +#endif // FEATURE_READONLY_GS_COOKIE #ifndef TARGET_UNIX // The GSCookie cannot be in a writeable page @@ -507,10 +509,12 @@ void InitGSCookie() val ++; *pGSCookiePtr = val; +#ifdef FEATURE_READONLY_GS_COOKIE if(!ClrVirtualProtect((LPVOID)pGSCookiePtr, sizeof(GSCookie), oldProtection, &oldProtection)) { ThrowLastError(); } +#endif // FEATURE_READONLY_GS_COOKIE } Volatile g_bIsGarbageCollectorFullyInitialized = FALSE; diff --git a/src/coreclr/vm/vars.cpp b/src/coreclr/vm/vars.cpp index 57046ff71c5a8b..ae813d80f56c72 100644 --- a/src/coreclr/vm/vars.cpp +++ b/src/coreclr/vm/vars.cpp @@ -252,7 +252,11 @@ void OBJECTREF_EnumMemoryRegions(OBJECTREF ref) // // We need the following to be the compiler's notion of volatile. // +#ifdef FEATURE_READONLY_GS_COOKIE extern "C" RAW_KEYWORD(volatile) const GSCookie s_gsCookie = 0; +#else +extern "C" RAW_KEYWORD(volatile) GSCookie s_gsCookie = 0; +#endif #else __GlobalVal< GSCookie > s_gsCookie(&DacGlobals::dac__s_gsCookie); diff --git a/src/coreclr/vm/vars.hpp b/src/coreclr/vm/vars.hpp index 6960585b9e7482..d78923ae1d06c2 100644 --- a/src/coreclr/vm/vars.hpp +++ b/src/coreclr/vm/vars.hpp @@ -593,12 +593,22 @@ typedef DPTR(GSCookie) PTR_GSCookie; #define READONLY_ATTR __attribute__((READONLY_ATTR_ARGS)) #endif +// Apple's __DATA_CONST segment is immutable at runtime, so InitGSCookie's ClrVirtualProtect +// call fails there (see nativeaot/Runtime for the same FEATURE_READONLY_GS_COOKIE guard). +#ifndef TARGET_APPLE +#define FEATURE_READONLY_GS_COOKIE +#endif + #ifndef DACCESS_COMPILE // const is so that it gets placed in the .text section (which is read-only) // volatile is so that accesses to it do not get optimized away because of the const // +#ifdef FEATURE_READONLY_GS_COOKIE extern "C" RAW_KEYWORD(volatile) READONLY_ATTR const GSCookie s_gsCookie; +#else +extern "C" RAW_KEYWORD(volatile) GSCookie s_gsCookie; +#endif inline GSCookie * GetProcessGSCookiePtr() { return const_cast(&s_gsCookie); }