From 4aab95786dca51a3b79d18298e4b3581d68424b4 Mon Sep 17 00:00:00 2001 From: Aaron Robinson Date: Thu, 23 Sep 2021 16:23:53 -0700 Subject: [PATCH] Address some linker issues when consuming from the PAL. --- src/coreclr/inc/clrconfignocache.h | 84 +++++++++++-------- src/coreclr/pal/src/exception/signal.cpp | 2 +- src/coreclr/pal/src/init/pal.cpp | 4 +- .../pal/src/misc/tracepointprovider.cpp | 2 +- src/coreclr/pal/src/thread/process.cpp | 10 +-- src/coreclr/utilcode/clrconfig.cpp | 2 +- src/coreclr/vm/perfmap.cpp | 2 +- 7 files changed, 58 insertions(+), 48 deletions(-) diff --git a/src/coreclr/inc/clrconfignocache.h b/src/coreclr/inc/clrconfignocache.h index 2ecc5a545f283..31f1785727924 100644 --- a/src/coreclr/inc/clrconfignocache.h +++ b/src/coreclr/inc/clrconfignocache.h @@ -7,6 +7,9 @@ // Logic for resolving configuration names. // +#ifndef _CLRCONFIGNOCACHE_H_ +#define _CLRCONFIGNOCACHE_H_ + #ifndef StrLen #define StrLen(STR) ((sizeof(STR) / sizeof(STR[0])) - 1) #endif // !StrLen @@ -48,50 +51,57 @@ class CLRConfigNoCache return fSuccess; } - static CLRConfigNoCache Get(LPCSTR cfg, bool noPrefix = false) - { - if (cfg == nullptr) - return {}; + friend CLRConfigNoCache GetCLRConfigNoCache(LPCSTR cfg, bool noPrefix); +}; - char nameBuffer[64]; - const char* fallbackPrefix = NULL; - const size_t namelen = strlen(cfg); +// This function is not a member of CLRConfigNoCache and marked inline so linkage +// is relative to the compilation unit it is included in. The linkage concerns here +// are due to usage in the PAL regarding getenv. +inline CLRConfigNoCache GetCLRConfigNoCache(LPCSTR cfg, bool noPrefix = false) +{ + if (cfg == nullptr) + return {}; - if (noPrefix) - { - if (namelen >= _countof(nameBuffer)) - { - _ASSERTE(!"Environment variable name too long."); - return {}; - } + char nameBuffer[64]; + const char* fallbackPrefix = NULL; + const size_t namelen = strlen(cfg); - *nameBuffer = W('\0'); - } - else + if (noPrefix) + { + if (namelen >= _countof(nameBuffer)) { - bool dotnetValid = namelen < (size_t)(_countof(nameBuffer) - 1 - LEN_OF_DOTNET_PREFIX); - bool complusValid = namelen < (size_t)(_countof(nameBuffer) - 1 - LEN_OF_COMPLUS_PREFIX); - if (!dotnetValid || !complusValid) - { - _ASSERTE(!"Environment variable name too long."); - return {}; - } - - // Priority order is DOTNET_ and then COMPlus_. - strcpy_s(nameBuffer, _countof(nameBuffer), DOTNET_PREFIX_A); - fallbackPrefix = COMPLUS_PREFIX_A; + _ASSERTE(!"Environment variable name too long."); + return {}; } - strcat_s(nameBuffer, _countof(nameBuffer), cfg); - - LPCSTR val = getenv(nameBuffer); - if (val == NULL && fallbackPrefix != NULL) + *nameBuffer = W('\0'); + } + else + { + bool dotnetValid = namelen < (size_t)(_countof(nameBuffer) - 1 - LEN_OF_DOTNET_PREFIX); + bool complusValid = namelen < (size_t)(_countof(nameBuffer) - 1 - LEN_OF_COMPLUS_PREFIX); + if (!dotnetValid || !complusValid) { - strcpy_s(nameBuffer, _countof(nameBuffer), fallbackPrefix); - strcat_s(nameBuffer, _countof(nameBuffer), cfg); - val = getenv(nameBuffer); + _ASSERTE(!"Environment variable name too long."); + return {}; } - return { val }; + // Priority order is DOTNET_ and then COMPlus_. + strcpy_s(nameBuffer, _countof(nameBuffer), DOTNET_PREFIX_A); + fallbackPrefix = COMPLUS_PREFIX_A; } -}; + + strcat_s(nameBuffer, _countof(nameBuffer), cfg); + + LPCSTR val = getenv(nameBuffer); + if (val == NULL && fallbackPrefix != NULL) + { + strcpy_s(nameBuffer, _countof(nameBuffer), fallbackPrefix); + strcat_s(nameBuffer, _countof(nameBuffer), cfg); + val = getenv(nameBuffer); + } + + return { val }; +} + +#endif // _CLRCONFIGNOCACHE_H_ diff --git a/src/coreclr/pal/src/exception/signal.cpp b/src/coreclr/pal/src/exception/signal.cpp index fc7c0ff50631f..20ca8d778a6e1 100644 --- a/src/coreclr/pal/src/exception/signal.cpp +++ b/src/coreclr/pal/src/exception/signal.cpp @@ -149,7 +149,7 @@ BOOL SEHInitializeSignals(CorUnix::CPalThread *pthrCurrent, DWORD flags) #if !HAVE_MACH_EXCEPTIONS g_enable_alternate_stack_check = false; - CLRConfigNoCache stackCheck = CLRConfigNoCache::Get("EnableAlternateStackCheck"); + CLRConfigNoCache stackCheck = GetCLRConfigNoCache("EnableAlternateStackCheck"); if (stackCheck.IsSet()) { DWORD value; diff --git a/src/coreclr/pal/src/init/pal.cpp b/src/coreclr/pal/src/init/pal.cpp index 0bce2e4acb44f..d808dd6dcde7c 100644 --- a/src/coreclr/pal/src/init/pal.cpp +++ b/src/coreclr/pal/src/init/pal.cpp @@ -269,7 +269,7 @@ EnsureStackSize(SIZE_T stackSize) void InitializeDefaultStackSize() { - CLRConfigNoCache defStackSize = CLRConfigNoCache::Get("DefaultStackSize"); + CLRConfigNoCache defStackSize = GetCLRConfigNoCache("DefaultStackSize"); if (defStackSize.IsSet()) { DWORD size; @@ -403,7 +403,7 @@ Initialize( #endif // ENSURE_PRIMARY_STACK_SIZE #ifdef FEATURE_ENABLE_NO_ADDRESS_SPACE_RANDOMIZATION - CLRConfigNoCache useDefaultBaseAddr = CLRConfigNoCache::Get("UseDefaultBaseAddr"); + CLRConfigNoCache useDefaultBaseAddr = GetCLRConfigNoCache("UseDefaultBaseAddr"); if (useDefaultBaseAddr.IsSet()) { DWORD flag; diff --git a/src/coreclr/pal/src/misc/tracepointprovider.cpp b/src/coreclr/pal/src/misc/tracepointprovider.cpp index 35aac5ceb55e3..f45c572f3a8f6 100644 --- a/src/coreclr/pal/src/misc/tracepointprovider.cpp +++ b/src/coreclr/pal/src/misc/tracepointprovider.cpp @@ -66,7 +66,7 @@ PAL_InitializeTracing(void) // Check if loading the LTTng providers should be disabled. // Note: this env var is formally declared in clrconfigvalues.h, but // this code is executed too early to use the mechanics that come with that definition. - CLRConfigNoCache cfgLTTng = CLRConfigNoCache::Get("LTTng"); + CLRConfigNoCache cfgLTTng = GetCLRConfigNoCache("LTTng"); if (cfgLTTng.IsSet()) { DWORD value; diff --git a/src/coreclr/pal/src/thread/process.cpp b/src/coreclr/pal/src/thread/process.cpp index 1d1ab193a22c6..b6d00d62a9367 100644 --- a/src/coreclr/pal/src/thread/process.cpp +++ b/src/coreclr/pal/src/thread/process.cpp @@ -3276,16 +3276,16 @@ Return BOOL PROCAbortInitialize() { - CLRConfigNoCache enabledCfg= CLRConfigNoCache::Get("DbgEnableMiniDump"); + CLRConfigNoCache enabledCfg= GetCLRConfigNoCache("DbgEnableMiniDump"); DWORD enabled = 0; if (enabledCfg.IsSet() && enabledCfg.TryAsInteger(10, enabled) && enabled) { - CLRConfigNoCache dmpNameCfg = CLRConfigNoCache::Get("DbgMiniDumpName"); + CLRConfigNoCache dmpNameCfg = GetCLRConfigNoCache("DbgMiniDumpName"); - CLRConfigNoCache dmpTypeCfg = CLRConfigNoCache::Get("DbgMiniDumpType"); + CLRConfigNoCache dmpTypeCfg = GetCLRConfigNoCache("DbgMiniDumpType"); DWORD dumpType = UndefinedDumpType; if (dmpTypeCfg.IsSet()) { @@ -3296,11 +3296,11 @@ PROCAbortInitialize() } } - CLRConfigNoCache createDumpCfg = CLRConfigNoCache::Get("CreateDumpDiagnostics"); + CLRConfigNoCache createDumpCfg = GetCLRConfigNoCache("CreateDumpDiagnostics"); DWORD val = 0; BOOL diag = createDumpCfg.IsSet() && createDumpCfg.TryAsInteger(10, val) && val == 1; - CLRConfigNoCache enabldReportCfg = CLRConfigNoCache::Get("EnableCrashReport"); + CLRConfigNoCache enabldReportCfg = GetCLRConfigNoCache("EnableCrashReport"); val = 0; BOOL crashReport = enabldReportCfg.IsSet() && enabldReportCfg.TryAsInteger(10, val) && val == 1; diff --git a/src/coreclr/utilcode/clrconfig.cpp b/src/coreclr/utilcode/clrconfig.cpp index 98518c4dd8ebc..81aeeab11ba30 100644 --- a/src/coreclr/utilcode/clrconfig.cpp +++ b/src/coreclr/utilcode/clrconfig.cpp @@ -205,7 +205,7 @@ namespace SString valueAsUTF8; temp.ConvertToUTF8(valueAsUTF8); - CLRConfigNoCache nonCache = CLRConfigNoCache::Get(nameAsUTF8.GetUTF8NoConvert(), noPrefix); + CLRConfigNoCache nonCache = GetCLRConfigNoCache(nameAsUTF8.GetUTF8NoConvert(), noPrefix); LPCSTR valueNoCache = nonCache.AsString(); _ASSERTE(SString::_stricmp(valueNoCache, valueAsUTF8.GetUTF8NoConvert()) == 0); diff --git a/src/coreclr/vm/perfmap.cpp b/src/coreclr/vm/perfmap.cpp index 31da16cac5586..7fa9e39e6f8bd 100644 --- a/src/coreclr/vm/perfmap.cpp +++ b/src/coreclr/vm/perfmap.cpp @@ -53,7 +53,7 @@ void PerfMap::Initialize() const char* jitdumpPath; char jitdumpPathBuffer[4096]; - CLRConfigNoCache value = CLRConfigNoCache::Get("PerfMapJitDumpPath"); + CLRConfigNoCache value = GetCLRConfigNoCache("PerfMapJitDumpPath"); if (value.IsSet()) { jitdumpPath = value.AsString();