From 09c7632be688484cc04f317b06db790e519ff72d Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Mon, 18 Dec 2017 17:03:20 +0100 Subject: [PATCH 1/6] icushim: try using the build-time libicu version --- .../System.Globalization.Native/icushim.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/corefx/System.Globalization.Native/icushim.cpp b/src/corefx/System.Globalization.Native/icushim.cpp index e97896a20592..81f97f94bbdc 100644 --- a/src/corefx/System.Globalization.Native/icushim.cpp +++ b/src/corefx/System.Globalization.Native/icushim.cpp @@ -170,6 +170,20 @@ bool FindLibWithMajorMinorVersion(int* majorVer, int* minorVer) return false; } +// Select the version of ICU present at build time. +// Search for library files with names including the major and minor version. +bool FindLibWithBuildMajorMinorVersion(int* majorVer, int* minorVer) +{ + if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, -1)) + { + *majorVer = U_ICU_VERSION_MAJOR_NUM; + *minorVer = U_ICU_VERSION_MINOR_NUM; + return true; + } + + return false; +} + // Select the highest supported version of ICU present on the local machine // Search for library files with names including the major, minor and sub version. bool FindLibWithMajorMinorSubVersion(int* majorVer, int* minorVer, int* subVer) @@ -201,6 +215,7 @@ bool FindICULibs(char* symbolName, char* symbolVersion) int subVer = -1; if (!FindLibUsingOverride(&majorVer, &minorVer, &subVer) && + !FindLibWithBuildMajorMinorVersion(&majorVer, &minorVer) && !FindLibWithMajorMinorVersion(&majorVer, &minorVer) && !FindLibWithMajorMinorSubVersion(&majorVer, &minorVer, &subVer) && // This is a fallback for the rare case when there are only lib files with major version From 86b8491712b187f1d02479e8485d48acdb5eb539 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 19 Dec 2017 09:27:08 +0100 Subject: [PATCH 2/6] Based on ICU packaging doc, use major instead of (major, minor) --- src/corefx/System.Globalization.Native/icushim.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/corefx/System.Globalization.Native/icushim.cpp b/src/corefx/System.Globalization.Native/icushim.cpp index 81f97f94bbdc..45b432c7df24 100644 --- a/src/corefx/System.Globalization.Native/icushim.cpp +++ b/src/corefx/System.Globalization.Native/icushim.cpp @@ -171,13 +171,13 @@ bool FindLibWithMajorMinorVersion(int* majorVer, int* minorVer) } // Select the version of ICU present at build time. -// Search for library files with names including the major and minor version. -bool FindLibWithBuildMajorMinorVersion(int* majorVer, int* minorVer) +bool FindLibWithBuildMajorVersion(int* majorVer) { - if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, U_ICU_VERSION_MINOR_NUM, -1)) + // ICU packaging documentation (http://userguide.icu-project.org/packaging) + // describes applications link against the major (e.g. libicuuc.so.54). + if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, -1, -1)) { *majorVer = U_ICU_VERSION_MAJOR_NUM; - *minorVer = U_ICU_VERSION_MINOR_NUM; return true; } @@ -215,7 +215,7 @@ bool FindICULibs(char* symbolName, char* symbolVersion) int subVer = -1; if (!FindLibUsingOverride(&majorVer, &minorVer, &subVer) && - !FindLibWithBuildMajorMinorVersion(&majorVer, &minorVer) && + !FindLibWithBuildMajorVersion(&majorVer) && !FindLibWithMajorMinorVersion(&majorVer, &minorVer) && !FindLibWithMajorMinorSubVersion(&majorVer, &minorVer, &subVer) && // This is a fallback for the rare case when there are only lib files with major version From a7fc5cbcee757e4b0e9c0d6732296dcbd5559ed9 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Tue, 19 Dec 2017 13:27:48 +0100 Subject: [PATCH 3/6] Verify we can look-up symbols on the build version --- .../System.Globalization.Native/icushim.cpp | 101 ++++++++++-------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/src/corefx/System.Globalization.Native/icushim.cpp b/src/corefx/System.Globalization.Native/icushim.cpp index 45b432c7df24..d999e8c17d11 100644 --- a/src/corefx/System.Globalization.Native/icushim.cpp +++ b/src/corefx/System.Globalization.Native/icushim.cpp @@ -105,6 +105,22 @@ bool OpenICULibraries(int majorVer, int minorVer, int subVer) return libicuuc != nullptr; } +__attribute__((destructor)) +void CloseICULibraries() +{ + if (libicuuc != nullptr) + { + dlclose(libicuuc); + libicuuc = nullptr; + } + + if (libicui18n != nullptr) + { + dlclose(libicui18n); + libicui18n = nullptr; + } +} + // Select libraries using the version override specified by the CLR_ICU_VERSION_OVERRIDE // environment variable. // The format of the string in this variable is majorVer[.minorVer[.subVer]] (the brackets @@ -170,15 +186,51 @@ bool FindLibWithMajorMinorVersion(int* majorVer, int* minorVer) return false; } +bool FindSymbolVersion(int majorVer, int minorVer, int subVer, char* symbolName, char* symbolVersion) +{ + // Find out the format of the version string added to each symbol + // First try just the unversioned symbol + if (dlsym(libicuuc, "u_strlen") == nullptr) + { + // Now try just the _majorVer added + sprintf(symbolVersion, "_%d", majorVer); + sprintf(symbolName, "u_strlen%s", symbolVersion); + if ((dlsym(libicuuc, symbolName) == nullptr) && (minorVer != -1)) + { + // Now try the _majorVer_minorVer added + sprintf(symbolVersion, "_%d_%d", majorVer, minorVer); + sprintf(symbolName, "u_strlen%s", symbolVersion); + if ((dlsym(libicuuc, symbolName) == nullptr) && (subVer != -1)) + { + // Finally, try the _majorVer_minorVer_subVer added + sprintf(symbolVersion, "_%d_%d_%d", majorVer, minorVer, subVer); + sprintf(symbolName, "u_strlen%s", symbolVersion); + if (dlsym(libicuuc, symbolName) == nullptr) + { + return false; + } + } + } + } + + return true; +} + // Select the version of ICU present at build time. -bool FindLibWithBuildMajorVersion(int* majorVer) +bool FindLibWithBuildMajorVersion(int* majorVer, char* symbolName, char* symbolVersion) { // ICU packaging documentation (http://userguide.icu-project.org/packaging) // describes applications link against the major (e.g. libicuuc.so.54). if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, -1, -1)) { - *majorVer = U_ICU_VERSION_MAJOR_NUM; - return true; + // Verify the major is enough to lookup symbols. + if (FindSymbolVersion(U_ICU_VERSION_MAJOR_NUM, -1, -1, symbolName, symbolVersion)) + { + *majorVer = U_ICU_VERSION_MAJOR_NUM; + return true; + } + + CloseICULibraries(); } return false; @@ -215,7 +267,7 @@ bool FindICULibs(char* symbolName, char* symbolVersion) int subVer = -1; if (!FindLibUsingOverride(&majorVer, &minorVer, &subVer) && - !FindLibWithBuildMajorVersion(&majorVer) && + !FindLibWithBuildMajorVersion(&majorVer, symbolName, symbolVersion) && !FindLibWithMajorMinorVersion(&majorVer, &minorVer) && !FindLibWithMajorMinorSubVersion(&majorVer, &minorVer, &subVer) && // This is a fallback for the rare case when there are only lib files with major version @@ -224,33 +276,8 @@ bool FindICULibs(char* symbolName, char* symbolVersion) // No usable ICU version found return false; } - // Find out the format of the version string added to each symbol - // First try just the unversioned symbol - if (dlsym(libicuuc, "u_strlen") == nullptr) - { - // Now try just the _majorVer added - sprintf(symbolVersion, "_%d", majorVer); - sprintf(symbolName, "u_strlen%s", symbolVersion); - if ((dlsym(libicuuc, symbolName) == nullptr) && (minorVer != -1)) - { - // Now try the _majorVer_minorVer added - sprintf(symbolVersion, "_%d_%d", majorVer, minorVer); - sprintf(symbolName, "u_strlen%s", symbolVersion); - if ((dlsym(libicuuc, symbolName) == nullptr) && (subVer != -1)) - { - // Finally, try the _majorVer_minorVer_subVer added - sprintf(symbolVersion, "_%d_%d_%d", majorVer, minorVer, subVer); - sprintf(symbolName, "u_strlen%s", symbolVersion); - if (dlsym(libicuuc, symbolName) == nullptr) - { - return false; - } - } - } - } - - return true; + return FindSymbolVersion(majorVer, minorVer, subVer, symbolName, symbolVersion); } #endif // __APPLE__ @@ -293,17 +320,3 @@ extern "C" int32_t GlobalizationNative_GetICUVersion() u_getVersion((uint8_t *) &version); return version; } - -__attribute__((destructor)) -void ShutdownICUShim() -{ - if (libicuuc != nullptr) - { - dlclose(libicuuc); - } - - if (libicui18n != nullptr) - { - dlclose(libicui18n); - } -} From a2030b468c2e501e72aaec57fdde0cf86ea66b34 Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 20 Dec 2017 09:39:25 +0100 Subject: [PATCH 4/6] First find Major; add FEATURE_FIXED_ICU_VERSION --- .../CMakeLists.txt | 3 + .../System.Globalization.Native/icushim.cpp | 59 ++++++++++--------- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/corefx/System.Globalization.Native/CMakeLists.txt b/src/corefx/System.Globalization.Native/CMakeLists.txt index 55c685449740..526af4cabb35 100644 --- a/src/corefx/System.Globalization.Native/CMakeLists.txt +++ b/src/corefx/System.Globalization.Native/CMakeLists.txt @@ -5,6 +5,9 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) add_definitions(-DPIC=1) add_definitions(-DBIT64=1) +if(FEATURE_FIXED_ICU_VERSION) + add_definitions(-DFEATURE_FIXED_ICU_VERSION) +endif(FEATURE_FIXED_ICU_VERSION) set(ICU_HOMEBREW_INC_PATH "/usr/local/opt/icu4c/include") diff --git a/src/corefx/System.Globalization.Native/icushim.cpp b/src/corefx/System.Globalization.Native/icushim.cpp index d999e8c17d11..c848017ab590 100644 --- a/src/corefx/System.Globalization.Native/icushim.cpp +++ b/src/corefx/System.Globalization.Native/icushim.cpp @@ -150,22 +150,6 @@ bool FindLibUsingOverride(int* majorVer, int* minorVer, int* subVer) return false; } -// Select the highest supported version of ICU present on the local machine -// Search for library files with names including the major version. -bool FindLibWithMajorVersion(int* majorVer) -{ - for (int i = MaxICUVersion; i >= MinICUVersion; i--) - { - if (OpenICULibraries(i, -1, -1)) - { - *majorVer = i; - return true; - } - } - - return false; -} - // Select the highest supported version of ICU present on the local machine // Search for library files with names including the major and minor version. bool FindLibWithMajorMinorVersion(int* majorVer, int* minorVer) @@ -216,17 +200,13 @@ bool FindSymbolVersion(int majorVer, int minorVer, int subVer, char* symbolName, return true; } -// Select the version of ICU present at build time. -bool FindLibWithBuildMajorVersion(int* majorVer, char* symbolName, char* symbolVersion) +bool OpenICULibrariesMajor(int majorVer, char* symbolName, char* symbolVersion) { - // ICU packaging documentation (http://userguide.icu-project.org/packaging) - // describes applications link against the major (e.g. libicuuc.so.54). - if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, -1, -1)) + if (OpenICULibraries(majorVer, -1, -1)) { // Verify the major is enough to lookup symbols. - if (FindSymbolVersion(U_ICU_VERSION_MAJOR_NUM, -1, -1, symbolName, symbolVersion)) + if (FindSymbolVersion(majorVer, -1, -1, symbolName, symbolVersion)) { - *majorVer = U_ICU_VERSION_MAJOR_NUM; return true; } @@ -236,6 +216,33 @@ bool FindLibWithBuildMajorVersion(int* majorVer, char* symbolName, char* symbolV return false; } +// Search for library files with names including the major version. +bool FindLibWithMajorVersion(int* majorVer, char* symbolName, char* symbolVersion) +{ +#ifdef FEATURE_FIXED_ICU_VERSION + // Select the version of ICU present at build time. + // ICU packaging documentation (http://userguide.icu-project.org/packaging) + // describes applications link against the major (e.g. libicuuc.so.54). + if (OpenICULibrariesMajor(U_ICU_VERSION_MAJOR_NUM, symbolName, symbolVersion)) + { + *majorVer = U_ICU_VERSION_MAJOR_NUM; + return true; + } +#endif + + // Select the highest supported version of ICU present on the local machine + for (int i = MaxICUVersion; i >= MinICUVersion; i--) + { + if (OpenICULibrariesMajor(i, symbolName, symbolVersion)) + { + *majorVer = i; + return true; + } + } + + return false; +} + // Select the highest supported version of ICU present on the local machine // Search for library files with names including the major, minor and sub version. bool FindLibWithMajorMinorSubVersion(int* majorVer, int* minorVer, int* subVer) @@ -267,11 +274,9 @@ bool FindICULibs(char* symbolName, char* symbolVersion) int subVer = -1; if (!FindLibUsingOverride(&majorVer, &minorVer, &subVer) && - !FindLibWithBuildMajorVersion(&majorVer, symbolName, symbolVersion) && + !FindLibWithMajorVersion(&majorVer, symbolName, symbolVersion) && !FindLibWithMajorMinorVersion(&majorVer, &minorVer) && - !FindLibWithMajorMinorSubVersion(&majorVer, &minorVer, &subVer) && - // This is a fallback for the rare case when there are only lib files with major version - !FindLibWithMajorVersion(&majorVer)) + !FindLibWithMajorMinorSubVersion(&majorVer, &minorVer, &subVer)) { // No usable ICU version found return false; From 013dc71d3d3de54d19f8a36ab7aaaecf2b0f410d Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Wed, 20 Dec 2017 10:04:10 +0100 Subject: [PATCH 5/6] Move FindSymbolVersion check in OpenICULibraries --- .../System.Globalization.Native/icushim.cpp | 191 ++++++++---------- 1 file changed, 79 insertions(+), 112 deletions(-) diff --git a/src/corefx/System.Globalization.Native/icushim.cpp b/src/corefx/System.Globalization.Native/icushim.cpp index c848017ab590..e0dfaa475773 100644 --- a/src/corefx/System.Globalization.Native/icushim.cpp +++ b/src/corefx/System.Globalization.Native/icushim.cpp @@ -79,8 +79,38 @@ void GetVersionedLibFileName(const char* baseFileName, int majorVer, int minorVe } } +bool FindSymbolVersion(int majorVer, int minorVer, int subVer, char* symbolName, char* symbolVersion) +{ + // Find out the format of the version string added to each symbol + // First try just the unversioned symbol + if (dlsym(libicuuc, "u_strlen") == nullptr) + { + // Now try just the _majorVer added + sprintf(symbolVersion, "_%d", majorVer); + sprintf(symbolName, "u_strlen%s", symbolVersion); + if ((dlsym(libicuuc, symbolName) == nullptr) && (minorVer != -1)) + { + // Now try the _majorVer_minorVer added + sprintf(symbolVersion, "_%d_%d", majorVer, minorVer); + sprintf(symbolName, "u_strlen%s", symbolVersion); + if ((dlsym(libicuuc, symbolName) == nullptr) && (subVer != -1)) + { + // Finally, try the _majorVer_minorVer_subVer added + sprintf(symbolVersion, "_%d_%d_%d", majorVer, minorVer, subVer); + sprintf(symbolName, "u_strlen%s", symbolVersion); + if (dlsym(libicuuc, symbolName) == nullptr) + { + return false; + } + } + } + } + + return true; +} + // Try to open the necessary ICU libraries -bool OpenICULibraries(int majorVer, int minorVer, int subVer) +bool OpenICULibraries(int majorVer, int minorVer, int subVer, char* symbolName, char* symbolVersion) { char libicuucName[64]; char libicui18nName[64]; @@ -94,7 +124,10 @@ bool OpenICULibraries(int majorVer, int minorVer, int subVer) libicuuc = dlopen(libicuucName, RTLD_LAZY); if (libicuuc != nullptr) { - libicui18n = dlopen(libicui18nName, RTLD_LAZY); + if (FindSymbolVersion(majorVer, minorVer, subVer, symbolName, symbolVersion)) + { + libicui18n = dlopen(libicui18nName, RTLD_LAZY); + } if (libicui18n == nullptr) { dlclose(libicuuc); @@ -105,27 +138,11 @@ bool OpenICULibraries(int majorVer, int minorVer, int subVer) return libicuuc != nullptr; } -__attribute__((destructor)) -void CloseICULibraries() -{ - if (libicuuc != nullptr) - { - dlclose(libicuuc); - libicuuc = nullptr; - } - - if (libicui18n != nullptr) - { - dlclose(libicui18n); - libicui18n = nullptr; - } -} - // Select libraries using the version override specified by the CLR_ICU_VERSION_OVERRIDE // environment variable. // The format of the string in this variable is majorVer[.minorVer[.subVer]] (the brackets // indicate optional parts). -bool FindLibUsingOverride(int* majorVer, int* minorVer, int* subVer) +bool FindLibUsingOverride(char* symbolName, char* symbolVersion) { char* versionOverride = getenv("CLR_ICU_VERSION_OVERRIDE"); if (versionOverride != nullptr) @@ -137,31 +154,8 @@ bool FindLibUsingOverride(int* majorVer, int* minorVer, int* subVer) int matches = sscanf(versionOverride, "%d.%d.%d", &first, &second, &third); if (matches > 0) { - if (OpenICULibraries(first, second, third)) - { - *majorVer = first; - *minorVer = second; - *subVer = third; - return true; - } - } - } - - return false; -} - -// Select the highest supported version of ICU present on the local machine -// Search for library files with names including the major and minor version. -bool FindLibWithMajorMinorVersion(int* majorVer, int* minorVer) -{ - for (int i = MaxICUVersion; i >= MinICUVersion; i--) - { - for (int j = MaxMinorICUVersion; j >= MinMinorICUVersion; j--) - { - if (OpenICULibraries(i, j, -1)) + if (OpenICULibraries(first, second, third, symbolName, symbolVersion)) { - *majorVer = i; - *minorVer = j; return true; } } @@ -170,73 +164,43 @@ bool FindLibWithMajorMinorVersion(int* majorVer, int* minorVer) return false; } -bool FindSymbolVersion(int majorVer, int minorVer, int subVer, char* symbolName, char* symbolVersion) +// Search for library files with names including the major version. +bool FindLibWithMajorVersion(char* symbolName, char* symbolVersion) { - // Find out the format of the version string added to each symbol - // First try just the unversioned symbol - if (dlsym(libicuuc, "u_strlen") == nullptr) +#ifdef FEATURE_FIXED_ICU_VERSION + // Select the version of ICU present at build time. + // ICU packaging documentation (http://userguide.icu-project.org/packaging) + // describes applications link against the major (e.g. libicuuc.so.54). + if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, -1, -1, symbolName, symbolVersion)) { - // Now try just the _majorVer added - sprintf(symbolVersion, "_%d", majorVer); - sprintf(symbolName, "u_strlen%s", symbolVersion); - if ((dlsym(libicuuc, symbolName) == nullptr) && (minorVer != -1)) - { - // Now try the _majorVer_minorVer added - sprintf(symbolVersion, "_%d_%d", majorVer, minorVer); - sprintf(symbolName, "u_strlen%s", symbolVersion); - if ((dlsym(libicuuc, symbolName) == nullptr) && (subVer != -1)) - { - // Finally, try the _majorVer_minorVer_subVer added - sprintf(symbolVersion, "_%d_%d_%d", majorVer, minorVer, subVer); - sprintf(symbolName, "u_strlen%s", symbolVersion); - if (dlsym(libicuuc, symbolName) == nullptr) - { - return false; - } - } - } + return true; } +#endif - return true; -} - -bool OpenICULibrariesMajor(int majorVer, char* symbolName, char* symbolVersion) -{ - if (OpenICULibraries(majorVer, -1, -1)) + // Select the highest supported version of ICU present on the local machine + for (int i = MaxICUVersion; i >= MinICUVersion; i--) { - // Verify the major is enough to lookup symbols. - if (FindSymbolVersion(majorVer, -1, -1, symbolName, symbolVersion)) + if (OpenICULibraries(i, -1, -1, symbolName, symbolVersion)) { return true; } - - CloseICULibraries(); } return false; } -// Search for library files with names including the major version. -bool FindLibWithMajorVersion(int* majorVer, char* symbolName, char* symbolVersion) +// Select the highest supported version of ICU present on the local machine +// Search for library files with names including the major and minor version. +bool FindLibWithMajorMinorVersion(char* symbolName, char* symbolVersion) { -#ifdef FEATURE_FIXED_ICU_VERSION - // Select the version of ICU present at build time. - // ICU packaging documentation (http://userguide.icu-project.org/packaging) - // describes applications link against the major (e.g. libicuuc.so.54). - if (OpenICULibrariesMajor(U_ICU_VERSION_MAJOR_NUM, symbolName, symbolVersion)) - { - *majorVer = U_ICU_VERSION_MAJOR_NUM; - return true; - } -#endif - - // Select the highest supported version of ICU present on the local machine for (int i = MaxICUVersion; i >= MinICUVersion; i--) { - if (OpenICULibrariesMajor(i, symbolName, symbolVersion)) + for (int j = MaxMinorICUVersion; j >= MinMinorICUVersion; j--) { - *majorVer = i; - return true; + if (OpenICULibraries(i, j, -1, symbolName, symbolVersion)) + { + return true; + } } } @@ -245,7 +209,7 @@ bool FindLibWithMajorVersion(int* majorVer, char* symbolName, char* symbolVersio // Select the highest supported version of ICU present on the local machine // Search for library files with names including the major, minor and sub version. -bool FindLibWithMajorMinorSubVersion(int* majorVer, int* minorVer, int* subVer) +bool FindLibWithMajorMinorSubVersion(char* symbolName, char* symbolVersion) { for (int i = MaxICUVersion; i >= MinICUVersion; i--) { @@ -253,11 +217,8 @@ bool FindLibWithMajorMinorSubVersion(int* majorVer, int* minorVer, int* subVer) { for (int k = MaxSubICUVersion; k >= MinSubICUVersion; k--) { - if (OpenICULibraries(i, j, k)) + if (OpenICULibraries(i, j, k, symbolName, symbolVersion)) { - *majorVer = i; - *minorVer = j; - *subVer = k; return true; } } @@ -269,20 +230,10 @@ bool FindLibWithMajorMinorSubVersion(int* majorVer, int* minorVer, int* subVer) bool FindICULibs(char* symbolName, char* symbolVersion) { - int majorVer = -1; - int minorVer = -1; - int subVer = -1; - - if (!FindLibUsingOverride(&majorVer, &minorVer, &subVer) && - !FindLibWithMajorVersion(&majorVer, symbolName, symbolVersion) && - !FindLibWithMajorMinorVersion(&majorVer, &minorVer) && - !FindLibWithMajorMinorSubVersion(&majorVer, &minorVer, &subVer)) - { - // No usable ICU version found - return false; - } - - return FindSymbolVersion(majorVer, minorVer, subVer, symbolName, symbolVersion); + return FindLibUsingOverride(symbolName, symbolVersion) || + FindLibWithMajorVersion(symbolName, symbolVersion) || + FindLibWithMajorMinorVersion(symbolName, symbolVersion) || + FindLibWithMajorMinorSubVersion(symbolName, symbolVersion); } #endif // __APPLE__ @@ -325,3 +276,19 @@ extern "C" int32_t GlobalizationNative_GetICUVersion() u_getVersion((uint8_t *) &version); return version; } + +__attribute__((destructor)) +void ShutdownICUShim() +{ + if (libicuuc != nullptr) + { + dlclose(libicuuc); + libicuuc = nullptr; + } + + if (libicui18n != nullptr) + { + dlclose(libicui18n); + libicui18n = nullptr; + } +} \ No newline at end of file From 65a58175930c6d3556ea73a9d133648b3f800c0e Mon Sep 17 00:00:00 2001 From: Tom Deseyn Date: Fri, 22 Dec 2017 09:49:09 +0100 Subject: [PATCH 6/6] Remove FEATURE_FIXED_ICU_VERSION --- src/corefx/System.Globalization.Native/CMakeLists.txt | 3 --- src/corefx/System.Globalization.Native/icushim.cpp | 9 ++++----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/corefx/System.Globalization.Native/CMakeLists.txt b/src/corefx/System.Globalization.Native/CMakeLists.txt index 526af4cabb35..55c685449740 100644 --- a/src/corefx/System.Globalization.Native/CMakeLists.txt +++ b/src/corefx/System.Globalization.Native/CMakeLists.txt @@ -5,9 +5,6 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) add_definitions(-DPIC=1) add_definitions(-DBIT64=1) -if(FEATURE_FIXED_ICU_VERSION) - add_definitions(-DFEATURE_FIXED_ICU_VERSION) -endif(FEATURE_FIXED_ICU_VERSION) set(ICU_HOMEBREW_INC_PATH "/usr/local/opt/icu4c/include") diff --git a/src/corefx/System.Globalization.Native/icushim.cpp b/src/corefx/System.Globalization.Native/icushim.cpp index e0dfaa475773..42193ba4d96d 100644 --- a/src/corefx/System.Globalization.Native/icushim.cpp +++ b/src/corefx/System.Globalization.Native/icushim.cpp @@ -167,18 +167,17 @@ bool FindLibUsingOverride(char* symbolName, char* symbolVersion) // Search for library files with names including the major version. bool FindLibWithMajorVersion(char* symbolName, char* symbolVersion) { -#ifdef FEATURE_FIXED_ICU_VERSION - // Select the version of ICU present at build time. // ICU packaging documentation (http://userguide.icu-project.org/packaging) // describes applications link against the major (e.g. libicuuc.so.54). - if (OpenICULibraries(U_ICU_VERSION_MAJOR_NUM, -1, -1, symbolName, symbolVersion)) + + // Select the version of ICU present at build time. + if (OpenICULibraries(MinICUVersion, -1, -1, symbolName, symbolVersion)) { return true; } -#endif // Select the highest supported version of ICU present on the local machine - for (int i = MaxICUVersion; i >= MinICUVersion; i--) + for (int i = MaxICUVersion; i > MinICUVersion; i--) { if (OpenICULibraries(i, -1, -1, symbolName, symbolVersion)) {