diff --git a/src/coreclr/vm/CMakeLists.txt b/src/coreclr/vm/CMakeLists.txt index bcc0a0d6e791cc..ce4b849c84750d 100644 --- a/src/coreclr/vm/CMakeLists.txt +++ b/src/coreclr/vm/CMakeLists.txt @@ -17,6 +17,10 @@ include_directories(${CLR_SRC_NATIVE_DIR}/libs/Common) add_definitions(-DUNICODE) add_definitions(-D_UNICODE) +if(NOT CLR_CMAKE_TARGET_APPLE AND NOT CLR_CMAKE_TARGET_ARCH_WASM AND NOT CLR_CMAKE_TARGET_OPENBSD) + add_definitions(-DFEATURE_READONLY_GS_COOKIE) +endif() + if(CLR_CMAKE_TARGET_ANDROID OR CLR_CMAKE_TARGET_OPENBSD) # OpenBSD's ld.so cannot resolve native TLS relocations in shared objects and has no # __tls_get_addr, so the runtime must use emulated TLS (like Android). 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..b250a23ef27e5c 100644 --- a/src/coreclr/vm/vars.hpp +++ b/src/coreclr/vm/vars.hpp @@ -594,11 +594,16 @@ typedef DPTR(GSCookie) PTR_GSCookie; #endif #ifndef DACCESS_COMPILE -// const is so that it gets placed in the .text section (which is read-only) +#ifdef FEATURE_READONLY_GS_COOKIE + +// const places the cookie in a read-only data section. // volatile is so that accesses to it do not get optimized away because of the const // extern "C" RAW_KEYWORD(volatile) READONLY_ATTR const GSCookie s_gsCookie; +#else +extern "C" RAW_KEYWORD(volatile) GSCookie s_gsCookie; +#endif // FEATURE_READONLY_GS_COOKIE inline GSCookie * GetProcessGSCookiePtr() { return const_cast(&s_gsCookie); }