Blob Blame History Raw
diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake
index 534f1d19de6..50d81842274 100644
--- a/eng/common/cross/toolchain.cmake
+++ b/eng/common/cross/toolchain.cmake
@@ -83,15 +83,26 @@ endif()
 
 # Specify link flags
 
+function(add_toolchain_linker_flag Flag)
+  set(Config "${ARGV1}")
+  set(CONFIG_SUFFIX "")
+  if (NOT Config STREQUAL "")
+    set(CONFIG_SUFFIX "_${Config}")
+  endif()
+  set("CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}" "${CMAKE_EXE_LINKER_FLAGS${CONFIG_SUFFIX}} ${Flag}" PARENT_SCOPE)
+  set("CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}" "${CMAKE_SHARED_LINKER_FLAGS${CONFIG_SUFFIX}} ${Flag}" PARENT_SCOPE)
+endfunction()
+
+
 if(TARGET_ARCH_NAME STREQUAL "armel")
   if(DEFINED TIZEN_TOOLCHAIN) # For Tizen only
-    add_link_options("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
-    add_link_options("-L${CROSS_ROOTFS}/lib")
-    add_link_options("-L${CROSS_ROOTFS}/usr/lib")
-    add_link_options("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+    add_toolchain_linker_flag("-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
+    add_toolchain_linker_flag("-L${CROSS_ROOTFS}/lib")
+    add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib")
+    add_toolchain_linker_flag("-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}")
   endif()
 elseif(TARGET_ARCH_NAME STREQUAL "x86")
-  add_link_options(-m32)
+  add_toolchain_linker_flag(-m32)
 endif()
 
 # Specify compile options
diff --git a/eng/native/build-commons.sh b/eng/native/build-commons.sh
index a1a975ce177..9a0c296ff66 100755
--- a/eng/native/build-commons.sh
+++ b/eng/native/build-commons.sh
@@ -51,12 +51,9 @@ check_prereqs()
     # Check presence of CMake on the path
     command -v cmake 2>/dev/null || { echo >&2 "Please install cmake before running this script"; exit 1; }
 
-    function version { echo "$@" | awk -F. '{ printf("%d%02d%02d\n", $1,$2,$3); }'; }
-
-    local cmake_version="$(cmake --version | awk '/^cmake version [0-9]+\.[0-9]+\.[0-9]+$/ {print $3}')"
-
-    if [[ "$(version "$cmake_version")" -lt "$(version 3.14.2)" ]]; then
-        echo "Please install CMake 3.14.2 or newer from http://www.cmake.org/download/ or https://apt.kitware.com and ensure it is on your path."; exit 1;
+    if [[ "$__HostOS" == "OSX" ]]; then
+        # Check presence of pkg-config on the path
+        command -v pkg-config 2>/dev/null || { echo >&2 "Please install pkg-config before running this script, see https://github.com/dotnet/runtime/blob/master/docs/workflow/requirements/macos-requirements.md"; exit 1; }
     fi
 
     if [[ "$__UseNinja" == 1 ]]; then
@@ -156,8 +153,8 @@ build_native()
             cmake_command="emcmake $cmake_command"
         fi
 
-        echo "Executing $cmake_command --build \"$intermediatesDir\" --target install -j $__NumProc"
-        $cmake_command --build "$intermediatesDir" --target install -j "$__NumProc"
+        echo "Executing $cmake_command --build \"$intermediatesDir\" --target install -- -j $__NumProc"
+        $cmake_command --build "$intermediatesDir" --target install -- -j "$__NumProc"
     fi
 
     local exit_code="$?"
diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake
index 2937916ced9..07fd6f75f6f 100644
--- a/eng/native/configurecompiler.cmake
+++ b/eng/native/configurecompiler.cmake
@@ -8,8 +8,6 @@ set(CMAKE_C_STANDARD_REQUIRED ON)
 set(CMAKE_CXX_STANDARD 11)
 set(CMAKE_CXX_STANDARD_REQUIRED ON)
 
-cmake_policy(SET CMP0083 NEW)
-
 include(CheckCXXCompilerFlag)
 
 # "configureoptimization.cmake" must be included after CLR_CMAKE_HOST_UNIX has been set.
@@ -40,11 +38,18 @@ set(CMAKE_CXX_FLAGS_CHECKED "")
 set(CMAKE_EXE_LINKER_FLAGS_CHECKED "")
 set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "")
 
+set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "")
+set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "")
+set(CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO "")
+set(CMAKE_EXE_LINKER_FLAGS_DEBUG "")
+set(CMAKE_EXE_LINKER_FLAGS_DEBUG "")
+set(CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO "")
+
 add_compile_definitions("$<$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>:DEBUG;_DEBUG;_DBG;URTBLDENV_FRIENDLY=Checked;BUILDENV_CHECKED=1>")
 add_compile_definitions("$<$<OR:$<CONFIG:RELEASE>,$<CONFIG:RELWITHDEBINFO>>:NDEBUG;URTBLDENV_FRIENDLY=Retail>")
 
 if (MSVC)
-  add_link_options(/GUARD:CF)
+  add_linker_flag(/GUARD:CF)
 
   # Linker flags
   #
@@ -57,48 +62,51 @@ if (MSVC)
   endif ()
 
   #Do not create Side-by-Side Assembly Manifest
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/MANIFEST:NO>)
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO")
   # can handle addresses larger than 2 gigabytes
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/LARGEADDRESSAWARE>)
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE")
   #Compatible with Data Execution Prevention
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/NXCOMPAT>)
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NXCOMPAT")
   #Use address space layout randomization
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/DYNAMICBASE>)
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DYNAMICBASE")
   #shrink pdb size
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/PDBCOMPRESS>)
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS")
 
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/DEBUG>)
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/IGNORE:4197,4013,4254,4070,4221>)
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:/SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION}>)
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEBUG")
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /IGNORE:4197,4013,4254,4070,4221")
+  set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /SUBSYSTEM:WINDOWS,${WINDOWS_SUBSYSTEM_VERSION}")
 
   set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221")
 
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:/DEBUG>)
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:/PDBCOMPRESS>)
-  add_link_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:/STACK:1572864>)
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG")
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /PDBCOMPRESS")
+  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:1572864")
 
   # Debug build specific flags
-  add_link_options($<$<AND:$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>,$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>>:/NOVCFEATURE>)
+  set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} /NOVCFEATURE")
+  set(CMAKE_SHARED_LINKER_FLAGS_CHECKED "${CMAKE_SHARED_LINKER_FLAGS_CHECKED} /NOVCFEATURE")
 
   # Checked build specific flags
-  add_link_options($<$<CONFIG:CHECKED>:/INCREMENTAL:NO>) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
-  add_link_options($<$<CONFIG:CHECKED>:/OPT:REF>)
-  add_link_options($<$<CONFIG:CHECKED>:/OPT:NOICF>)
+  add_linker_flag(/INCREMENTAL:NO CHECKED) # prevent "warning LNK4075: ignoring '/INCREMENTAL' due to '/OPT:REF' specification"
+  add_linker_flag(/OPT:REF CHECKED)
+  add_linker_flag(/OPT:NOICF CHECKED)
 
   # Release build specific flags
-  add_link_options($<$<CONFIG:RELEASE>:/LTCG>)
-  add_link_options($<$<CONFIG:RELEASE>:/OPT:REF>)
-  add_link_options($<$<CONFIG:RELEASE>:/OPT:ICF>)
+  add_linker_flag(/LTCG RELEASE)
+  add_linker_flag(/OPT:REF RELEASE)
+  add_linker_flag(/OPT:ICF RELEASE)
+  add_linker_flag(/INCREMENTAL:NO RELEASE)
   set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS_RELEASE} /LTCG")
 
   # ReleaseWithDebugInfo build specific flags
-  add_link_options($<$<CONFIG:RELWITHDEBINFO>:/LTCG>)
-  add_link_options($<$<CONFIG:RELWITHDEBINFO>:/OPT:REF>)
-  add_link_options($<$<CONFIG:RELWITHDEBINFO>:/OPT:ICF>)
+  add_linker_flag(/LTCG RELWITHDEBINFO)
+  add_linker_flag(/OPT:REF RELWITHDEBINFO)
+  add_linker_flag(/OPT:ICF RELWITHDEBINFO)
   set(CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO "${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO} /LTCG")
 
   # Force uCRT to be dynamically linked for Release build
-  add_link_options("$<$<CONFIG:RELEASE>:/NODEFAULTLIB:libucrt.lib;/DEFAULTLIB:ucrt.lib>")
+  add_linker_flag(/NODEFAULTLIB:libucrt.lib RELEASE)
+  add_linker_flag(/DEFAULTLIB:ucrt.lib RELEASE)
 
 elseif (CLR_CMAKE_HOST_UNIX)
   # Set the values to display when interactively configuring CMAKE_BUILD_TYPE
@@ -157,11 +165,10 @@ elseif (CLR_CMAKE_HOST_UNIX)
 
       # -fdata-sections -ffunction-sections: each function has own section instead of one per .o file (needed for --gc-sections)
       # -O1: optimization level used instead of -O0 to avoid compile error "invalid operand for inline asm constraint"
-      add_compile_definitions("$<$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>:${CLR_SANITIZE_CXX_OPTIONS};-fdata-sections;--ffunction-sections;-O1>")
-      add_link_options($<$<AND:$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>,$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>>:${CLR_SANITIZE_LINK_OPTIONS}>)
-
+      add_compile_options("$<$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>:${CLR_SANITIZE_CXX_OPTIONS};-fdata-sections;--ffunction-sections;-O1>")
+      add_linker_flag("${CLR_SANITIZE_LINK_OPTIONS}" DEBUG CHECKED)
       # -Wl and --gc-sections: drop unused sections\functions (similar to Windows /Gy function-level-linking)
-      add_link_options("$<$<AND:$<OR:$<CONFIG:DEBUG>,$<CONFIG:CHECKED>>,$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>>:${CLR_SANITIZE_LINK_OPTIONS};-Wl,--gc-sections>")
+      add_linker_flag("-Wl,--gc-sections" DEBUG CHECKED)
     endif ()
   endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL DEBUG OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL CHECKED)
 endif(MSVC)
@@ -173,15 +180,18 @@ endif(MSVC)
 #       ./build-native.sh cmakeargs "-DCLR_ADDITIONAL_COMPILER_OPTIONS=<...>" cmakeargs "-DCLR_ADDITIONAL_LINKER_FLAGS=<...>"
 #
 if(CLR_CMAKE_HOST_UNIX)
-    add_link_options(${CLR_ADDITIONAL_LINKER_FLAGS})
+  foreach(ADDTL_LINKER_FLAG ${CLR_ADDITIONAL_LINKER_FLAGS})
+    add_linker_flag(${ADDTL_LINKER_FLAG})
+  endforeach()
 endif(CLR_CMAKE_HOST_UNIX)
 
 if(CLR_CMAKE_HOST_LINUX)
   add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-Wa,--noexecstack>)
-  add_link_options(-Wl,--build-id=sha1 -Wl,-z,relro,-z,now)
+  add_linker_flag(-Wl,--build-id=sha1)
+  add_linker_flag(-Wl,-z,relro,-z,now)
 elseif(CLR_CMAKE_HOST_FREEBSD)
   add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-Wa,--noexecstack>)
-  add_link_options(LINKER:--build-id=sha1)
+  add_linker_flag("-Wl,--build-id=sha1")
 elseif(CLR_CMAKE_HOST_SUNOS)
   set(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} /opt/local/include)
   set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} /opt/local/lib)
@@ -357,7 +367,7 @@ if (CLR_CMAKE_HOST_UNIX)
   if(CLR_CMAKE_HOST_OSX)
     set(MACOS_VERSION_MIN_FLAGS -mmacosx-version-min=10.12)
     add_compile_options(${MACOS_VERSION_MIN_FLAGS})
-    add_link_options(${MACOS_VERSION_MIN_FLAGS})
+    add_linker_flag(${MACOS_VERSION_MIN_FLAGS})
   endif(CLR_CMAKE_HOST_OSX)
 endif(CLR_CMAKE_HOST_UNIX)
 
@@ -514,7 +524,7 @@ if(CLR_CMAKE_ENABLE_CODE_COVERAGE)
 
     add_compile_options(-fprofile-arcs)
     add_compile_options(-ftest-coverage)
-    add_link_options(--coverage)
+    add_linker_flag(--coverage)
   else()
     message(FATAL_ERROR "Code coverage builds not supported on current platform")
   endif(CLR_CMAKE_HOST_UNIX)
diff --git a/eng/native/configureplatform.cmake b/eng/native/configureplatform.cmake
index 1c5254d8496..4a4131cb05d 100644
--- a/eng/native/configureplatform.cmake
+++ b/eng/native/configureplatform.cmake
@@ -1,4 +1,3 @@
-include(CheckPIESupported)
 include(${CMAKE_CURRENT_LIST_DIR}/functions.cmake)
 
 # If set, indicates that this is not an officially supported release
@@ -363,19 +362,10 @@ if(NOT CLR_CMAKE_TARGET_EMSCRIPTEN)
     # but since we know that PIE is supported, we can safely skip this redundant check).
     #
     # The default linker on Solaris also does not support PIE.
-    if(NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_SUNOS)
-        # All code we build should be compiled as position independent
-        get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
-        if("CXX" IN_LIST languages)
-            set(CLR_PIE_LANGUAGE CXX)
-        else()
-            set(CLR_PIE_LANGUAGE C)
-        endif()
-        check_pie_supported(OUTPUT_VARIABLE PIE_SUPPORT_OUTPUT LANGUAGES ${CLR_PIE_LANGUAGE})
-        if(NOT MSVC AND NOT CMAKE_${CLR_PIE_LANGUAGE}_LINK_PIE_SUPPORTED)
-            message(WARNING "PIE is not supported at link time: ${PIE_SUPPORT_OUTPUT}.\n"
-                      "PIE link options will not be passed to linker.")
-        endif()
+    if(NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_SUNOS AND NOT CLR_CMAKE_TARGET_OSX AND NOT CLR_CMAKE_HOST_TVOS AND NOT CLR_CMAKE_HOST_IOS AND NOT MSVC)
+        set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie")
+        add_compile_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,EXECUTABLE>:-fPIE>)
+        add_compile_options($<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,SHARED_LIBRARY>:-fPIC>)
     endif()
 
     set(CMAKE_POSITION_INDEPENDENT_CODE ON)
diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake
index b7f8f463804..f4a96cbe35e 100644
--- a/eng/native/functions.cmake
+++ b/eng/native/functions.cmake
@@ -123,7 +123,7 @@ function(preprocess_compile_asm)
   set(options "")
   set(oneValueArgs OUTPUT_OBJECTS)
   set(multiValueArgs ASM_FILES)
-  cmake_parse_arguments(PARSE_ARGV 0 COMPILE_ASM "${options}" "${oneValueArgs}" "${multiValueArgs}")
+  cmake_parse_arguments(COMPILE_ASM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV})
 
   get_include_directories_asm(ASM_INCLUDE_DIRECTORIES)
 
@@ -209,7 +209,7 @@ function(target_precompile_header)
   set(options "")
   set(oneValueArgs TARGET HEADER)
   set(multiValueArgs ADDITIONAL_INCLUDE_DIRECTORIES)
-  cmake_parse_arguments(PARSE_ARGV 0 PRECOMPILE_HEADERS "${options}" "${oneValueArgs}" "${multiValueArgs}")
+  cmake_parse_arguments(PRECOMPILE_HEADERS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV})
 
   if ("${PRECOMPILE_HEADERS_TARGET}" STREQUAL "")
   message(SEND_ERROR "No target supplied to target_precompile_header.")
@@ -321,7 +321,7 @@ endfunction()
 function(install_clr)
   set(oneValueArgs ADDITIONAL_DESTINATION)
   set(multiValueArgs TARGETS)
-  cmake_parse_arguments(PARSE_ARGV 0 INSTALL_CLR "${options}" "${oneValueArgs}" "${multiValueArgs}")
+  cmake_parse_arguments(INSTALL_CLR "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV})
 
   if ("${INSTALL_CLR_TARGETS}" STREQUAL "")
     message(FATAL_ERROR "At least one target must be passed to install_clr(TARGETS )")
@@ -377,6 +377,15 @@ function(disable_pax_mprotect targetName)
   endif()
 endfunction()
 
+if (CMAKE_VERSION VERSION_LESS "3.12")
+  # Polyfill add_compile_definitions when it is unavailable
+  function(add_compile_definitions)
+    get_directory_property(DIR_COMPILE_DEFINITIONS COMPILE_DEFINITIONS)
+    list(APPEND DIR_COMPILE_DEFINITIONS ${ARGV})
+    set_directory_properties(PROPERTIES COMPILE_DEFINITIONS "${DIR_COMPILE_DEFINITIONS}")
+  endfunction()
+endif()
+
 function(_add_executable)
     if(NOT WIN32)
       add_executable(${ARGV} ${VERSION_FILE_PATH})
@@ -415,3 +424,16 @@ endfunction()
 function(add_executable_clr)
     _add_executable(${ARGV})
 endfunction()
+
+# add_linker_flag(Flag [Config1 Config2 ...])
+function(add_linker_flag Flag)
+  if (ARGN STREQUAL "")
+    set("CMAKE_EXE_LINKER_FLAGS" "${CMAKE_EXE_LINKER_FLAGS} ${Flag}" PARENT_SCOPE)
+    set("CMAKE_SHARED_LINKER_FLAGS" "${CMAKE_SHARED_LINKER_FLAGS} ${Flag}" PARENT_SCOPE)
+  else()
+    foreach(Config ${ARGN})
+      set("CMAKE_EXE_LINKER_FLAGS_${Config}" "${CMAKE_EXE_LINKER_FLAGS_${Config}} ${Flag}" PARENT_SCOPE)
+      set("CMAKE_SHARED_LINKER_FLAGS_${Config}" "${CMAKE_SHARED_LINKER_FLAGS_${Config}} ${Flag}" PARENT_SCOPE)
+    endforeach()
+  endif()
+endfunction()
diff --git a/eng/native/gen-buildsys.sh b/eng/native/gen-buildsys.sh
index f27bb33e357..1b4c2e02c59 100755
--- a/eng/native/gen-buildsys.sh
+++ b/eng/native/gen-buildsys.sh
@@ -91,6 +91,9 @@ if [[ "$build_arch" == "wasm" ]]; then
     cmake_command="emcmake $cmake_command"
 fi
 
+# We have to be able to build with CMake 3.6.2, so we can't use the -S or -B options
+pushd "$3"
+
 # Include CMAKE_USER_MAKE_RULES_OVERRIDE as uninitialized since it will hold its value in the CMake cache otherwise can cause issues when branch switching
 $cmake_command \
   -G "$generator" \
@@ -98,5 +101,6 @@ $cmake_command \
   "-DCMAKE_INSTALL_PREFIX=$__CMakeBinDir" \
   $cmake_extra_defines \
   $__UnprocessedCMakeArgs \
-  -S "$1" \
-  -B "$3"
+  "$1"
+
+popd
diff --git a/src/coreclr/CMakeLists.txt b/src/coreclr/CMakeLists.txt
index 5fa572c4fcd..071ac2cf5fa 100644
--- a/src/coreclr/CMakeLists.txt
+++ b/src/coreclr/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14.2)
+cmake_minimum_required(VERSION 3.6.2)
 
 cmake_policy(SET CMP0042 NEW)
 
diff --git a/src/coreclr/pgosupport.cmake b/src/coreclr/pgosupport.cmake
index 4b119809017..04bde2bc20b 100644
--- a/src/coreclr/pgosupport.cmake
+++ b/src/coreclr/pgosupport.cmake
@@ -1,5 +1,18 @@
-include(CheckIPOSupported)
-check_ipo_supported(RESULT HAVE_LTO)
+include(CheckCXXSourceCompiles)
+include(CheckCXXCompilerFlag)
+
+# VC++ guarantees support for LTCG (LTO's equivalent)
+if(NOT WIN32)
+  # Function required to give CMAKE_REQUIRED_* local scope
+  function(check_have_lto)
+    set(CMAKE_REQUIRED_FLAGS -flto)
+    set(CMAKE_REQUIRED_LIBRARIES -flto -fuse-ld=gold)
+    check_cxx_source_compiles("int main() { return 0; }" HAVE_LTO)
+  endfunction(check_have_lto)
+  check_have_lto()
+
+  check_cxx_compiler_flag(-faligned-new COMPILER_SUPPORTS_F_ALIGNED_NEW)
+endif(NOT WIN32)
 
 # Adds Profile Guided Optimization (PGO) flags to the current target
 function(add_pgo TargetName)
diff --git a/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt b/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
index dcd39e346c9..7b471d53726 100644
--- a/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
+++ b/src/coreclr/src/ToolBox/SOS/DacTableGen/CMakeLists.txt
@@ -1,3 +1,4 @@
+cmake_minimum_required(VERSION 3.8)
 # Quick note: The CMake C# support is using the CSC bundled with the MSBuild that the native build runs on, not the one supplied by the local .NET SDK.
 
 project(DacTableGen LANGUAGES CSharp)
diff --git a/src/coreclr/src/binder/CMakeLists.txt b/src/coreclr/src/binder/CMakeLists.txt
index 3a66c81e10e..208f1214dd0 100644
--- a/src/coreclr/src/binder/CMakeLists.txt
+++ b/src/coreclr/src/binder/CMakeLists.txt
@@ -82,11 +82,13 @@ endif(CLR_CMAKE_TARGET_WIN32)
 convert_to_absolute_path(BINDER_SOURCES ${BINDER_SOURCES})
 convert_to_absolute_path(BINDER_CROSSGEN_SOURCES ${BINDER_CROSSGEN_SOURCES})
 
-add_library_clr(v3binder
-    STATIC
+add_library_clr(v3binder_obj
+    OBJECT
     ${BINDER_SOURCES}
 )
-add_dependencies(v3binder eventing_headers)
+add_dependencies(v3binder_obj eventing_headers)
+add_library(v3binder INTERFACE)
+target_sources(v3binder INTERFACE $<TARGET_OBJECTS:v3binder_obj>)
 
 add_library_clr(v3binder_crossgen
     STATIC
diff --git a/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt b/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt
index 391f70eff43..fdcf344c16a 100644
--- a/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt
+++ b/src/coreclr/src/classlibnative/bcltype/CMakeLists.txt
@@ -10,9 +10,11 @@ set(BCLTYPE_SOURCES
     variant.cpp
 )
 
-add_library_clr(bcltype
-    STATIC
+add_library_clr(bcltype_obj
+    OBJECT
     ${BCLTYPE_SOURCES}
 )
 
-add_dependencies(bcltype eventing_headers)
+add_dependencies(bcltype_obj eventing_headers)
+add_library(bcltype INTERFACE)
+target_sources(bcltype INTERFACE $<TARGET_OBJECTS:bcltype_obj>)
diff --git a/src/coreclr/src/classlibnative/float/CMakeLists.txt b/src/coreclr/src/classlibnative/float/CMakeLists.txt
index 44d40c92592..3c066620f76 100644
--- a/src/coreclr/src/classlibnative/float/CMakeLists.txt
+++ b/src/coreclr/src/classlibnative/float/CMakeLists.txt
@@ -7,9 +7,12 @@ set(FLOAT_SOURCES
     floatsingle.cpp
 )
 
-add_library_clr(comfloat_wks
-    STATIC
+add_library_clr(comfloat_wks_obj
+    OBJECT
     ${FLOAT_SOURCES}
 )
 
-add_dependencies(comfloat_wks eventing_headers)
+add_dependencies(comfloat_wks_obj eventing_headers)
+
+add_library(comfloat_wks INTERFACE)
+target_sources(comfloat_wks INTERFACE $<TARGET_OBJECTS:comfloat_wks_obj>)
diff --git a/src/coreclr/src/debug/debug-pal/CMakeLists.txt b/src/coreclr/src/debug/debug-pal/CMakeLists.txt
index ac1e48fb5fb..213fa59e784 100644
--- a/src/coreclr/src/debug/debug-pal/CMakeLists.txt
+++ b/src/coreclr/src/debug/debug-pal/CMakeLists.txt
@@ -34,4 +34,6 @@ if(CLR_CMAKE_HOST_UNIX)
 
 endif(CLR_CMAKE_HOST_UNIX)
 
-_add_library(debug-pal STATIC ${TWO_WAY_PIPE_SOURCES})
+_add_library(debug-pal_obj OBJECT ${TWO_WAY_PIPE_SOURCES})
+add_library(debug-pal INTERFACE)
+target_sources(debug-pal INTERFACE $<TARGET_OBJECTS:debug-pal_obj>)
diff --git a/src/coreclr/src/debug/ee/wks/CMakeLists.txt b/src/coreclr/src/debug/ee/wks/CMakeLists.txt
index ee6c482ce76..3dd5e3612df 100644
--- a/src/coreclr/src/debug/ee/wks/CMakeLists.txt
+++ b/src/coreclr/src/debug/ee/wks/CMakeLists.txt
@@ -9,9 +9,9 @@ if (CLR_CMAKE_TARGET_WIN32)
 
   if(CLR_CMAKE_HOST_ARCH_ARM OR CLR_CMAKE_HOST_ARCH_ARM64)
 
-    preprocess_compile_asm(ASM_FILES ${ASM_FILE} OUTPUT_OBJECTS ASM_OBJECTS)
+    preprocess_compile_asm(TARGET cordbee_wks_obj ASM_FILES ${ASM_FILE} OUTPUT_OBJECTS ASM_OBJECTS)
 
-    add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${ASM_OBJECTS})
+    add_library_clr(cordbee_wks_obj OBJECT ${CORDBEE_SOURCES_WKS} ${ASM_FILE} ${ASM_OBJECTS})
 
   else ()
 
@@ -23,19 +23,21 @@ if (CLR_CMAKE_TARGET_WIN32)
 
     set_source_files_properties(${ASM_FILE} PROPERTIES COMPILE_OPTIONS "${ASM_OPTIONS}")
 
-    add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ${ASM_FILE})
+    add_library_clr(cordbee_wks_obj OBJECT ${CORDBEE_SOURCES_WKS} ${ASM_FILE})
 
   endif()
 
 else ()
 
   if(CLR_CMAKE_HOST_ARCH_AMD64 OR CLR_CMAKE_HOST_ARCH_ARM OR CLR_CMAKE_HOST_ARCH_ARM64 OR CLR_CMAKE_HOST_ARCH_I386)
-    add_library_clr(cordbee_wks ${CORDBEE_SOURCES_WKS} ../${ARCH_SOURCES_DIR}/dbghelpers.S)
+    add_library_clr(cordbee_wks_obj OBJECT ${CORDBEE_SOURCES_WKS} ../${ARCH_SOURCES_DIR}/dbghelpers.S)
   else()
     message(FATAL_ERROR "Unknown platform")
   endif()
 
 endif (CLR_CMAKE_TARGET_WIN32)
 
-target_precompile_header(TARGET cordbee_wks HEADER stdafx.h)
-add_dependencies(cordbee_wks eventing_headers)
+target_precompile_header(TARGET cordbee_wks_obj HEADER stdafx.h)
+add_dependencies(cordbee_wks_obj eventing_headers)
+add_library(cordbee_wks INTERFACE)
+target_sources(cordbee_wks INTERFACE $<TARGET_OBJECTS:cordbee_wks_obj>)
diff --git a/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt b/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt
index 88364658f11..362da1f6483 100644
--- a/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt
+++ b/src/coreclr/src/debug/ildbsymlib/CMakeLists.txt
@@ -10,5 +10,6 @@ set( ILDBSYMLIB_SOURCES
   symwrite.cpp
 )
 
-add_library_clr(ildbsymlib ${ILDBSYMLIB_SOURCES})
-
+add_library_clr(ildbsymlib_obj OBJECT ${ILDBSYMLIB_SOURCES})
+add_library(ildbsymlib INTERFACE)
+target_sources(ildbsymlib INTERFACE $<TARGET_OBJECTS:ildbsymlib_obj>)
diff --git a/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt b/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
index 777a2869e4f..066b75ab01f 100644
--- a/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
+++ b/src/coreclr/src/dlls/mscoree/coreclr/CMakeLists.txt
@@ -9,20 +9,20 @@ if (CLR_CMAKE_HOST_WIN32)
 
     list(APPEND CLR_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/coreclr.def)
 
-    add_link_options(/ENTRY:CoreDllMain)
+    add_linker_flag("/ENTRY:CoreDllMain")
 
     # Incremental linking results in the linker inserting extra padding and routing function calls via thunks that can break the
     # invariants (e.g. size of region between Jit_PatchedCodeLast-Jit_PatchCodeStart needs to fit in a page).
-    add_link_options(/INCREMENTAL:NO)
+    add_linker_flag("/INCREMENTAL:NO")
 
     # Delay load libraries required for WinRT as that is not supported on all platforms
-    add_link_options("/DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll")
-    add_link_options("/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll")
-    add_link_options("/DELAYLOAD:api-ms-win-core-winrt-roparameterizediid-l1-1-0.dll")
-    add_link_options("/DELAYLOAD:api-ms-win-ro-typeresolution-l1-1-0.dll")
+    add_linker_flag("/DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll")
+    add_linker_flag("/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll")
+    add_linker_flag("/DELAYLOAD:api-ms-win-core-winrt-roparameterizediid-l1-1-0.dll")
+    add_linker_flag("/DELAYLOAD:api-ms-win-ro-typeresolution-l1-1-0.dll")
 
     # Delay load version.dll so that we can specify how to search when loading it as it is not part of Windows' known DLLs
-    add_link_options("/DELAYLOAD:version.dll")
+    add_linker_flag("/DELAYLOAD:version.dll")
 
     # No library groups for Win32
     set(START_LIBRARY_GROUP)
@@ -35,7 +35,7 @@ else(CLR_CMAKE_HOST_WIN32)
     if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD)
         # This option is necessary to ensure that the overloaded delete operator defined inside
         # of the utilcode will be used instead of the standard library delete operator.
-        add_link_options("LINKER:-Bsymbolic")
+        add_linker_flag("-Wl,-Bsymbolic")
 
         # The following linked options can be inserted into the linker libraries list to
         # ensure proper resolving of circular references between a subset of the libraries.
@@ -110,7 +110,7 @@ set(CORECLR_LIBRARIES
     utilcode
     v3binder
     libraries-native
-    System.Globalization.Native-Static
+    System.Globalization.Native-static
     interop
 )
 
@@ -162,7 +162,12 @@ if(FEATURE_EVENT_TRACE)
     endif(CLR_CMAKE_HOST_UNIX)
 endif(FEATURE_EVENT_TRACE)
 
-target_link_libraries(coreclr ${CORECLR_LIBRARIES})
+if(FEATURE_MERGE_JIT_AND_ENGINE)
+    set(CLRJIT_STATIC clrjit_static)
+endif(FEATURE_MERGE_JIT_AND_ENGINE)
+
+target_sources(coreclr PUBLIC $<TARGET_OBJECTS:cee_wks_core>)
+target_link_libraries(coreclr PUBLIC ${CORECLR_LIBRARIES} ${CLRJIT_STATIC} cee_wks)
 
 # Create the runtime module index header file containing the coreclr build id
 # for xplat and the timestamp/size on Windows.
diff --git a/src/coreclr/src/dlls/mscorrc/CMakeLists.txt b/src/coreclr/src/dlls/mscorrc/CMakeLists.txt
index 08cf27aaf80..e114ec19cea 100644
--- a/src/coreclr/src/dlls/mscorrc/CMakeLists.txt
+++ b/src/coreclr/src/dlls/mscorrc/CMakeLists.txt
@@ -19,7 +19,9 @@ if(CLR_CMAKE_HOST_WIN32)
 else()
     build_resources(${CMAKE_CURRENT_SOURCE_DIR}/include.rc mscorrc TARGET_CPP_FILE)
 
-    add_library_clr(mscorrc STATIC
+    add_library_clr(mscorrc_obj OBJECT
         ${TARGET_CPP_FILE}
     )
+    add_library(mscorrc INTERFACE)
+    target_sources(mscorrc INTERFACE $<TARGET_OBJECTS:mscorrc_obj>)
 endif(CLR_CMAKE_HOST_WIN32)
diff --git a/src/coreclr/src/gcinfo/CMakeLists.txt b/src/coreclr/src/gcinfo/CMakeLists.txt
index b0b67462562..50a1722a8ea 100644
--- a/src/coreclr/src/gcinfo/CMakeLists.txt
+++ b/src/coreclr/src/gcinfo/CMakeLists.txt
@@ -16,11 +16,14 @@ endif(CLR_CMAKE_TARGET_ARCH_I386)
 
 convert_to_absolute_path(GCINFO_SOURCES ${GCINFO_SOURCES})
 
-add_library_clr(gcinfo
-    STATIC
+add_library_clr(gcinfo_obj
+    OBJECT
     ${GCINFO_SOURCES}
 )
 
+add_library(gcinfo INTERFACE)
+target_sources(gcinfo INTERFACE $<TARGET_OBJECTS:gcinfo_obj>)
+
 add_library_clr(gcinfo_crossgen
     STATIC
     ${GCINFO_SOURCES}
diff --git a/src/coreclr/src/inc/CMakeLists.txt b/src/coreclr/src/inc/CMakeLists.txt
index 60fad88e77d..4f75d3a882d 100644
--- a/src/coreclr/src/inc/CMakeLists.txt
+++ b/src/coreclr/src/inc/CMakeLists.txt
@@ -58,7 +58,9 @@ if(FEATURE_JIT_PITCHING)
 endif(FEATURE_JIT_PITCHING)
 
 # Compile *_i.cpp to lib
-_add_library(corguids ${CORGUIDS_SOURCES})
+_add_library(corguids_obj OBJECT ${CORGUIDS_SOURCES})
+add_library(corguids INTERFACE)
+target_sources(corguids INTERFACE $<TARGET_OBJECTS:corguids_obj>)
 
 # Binplace the inc files for packaging later.
 
@@ -75,4 +77,3 @@ _install (FILES cfi.h
                gcinfoencoder.h
                gcinfotypes.h
                DESTINATION inc)
-_install (TARGETS corguids DESTINATION lib)
diff --git a/src/coreclr/src/interop/CMakeLists.txt b/src/coreclr/src/interop/CMakeLists.txt
index d7eaa1b04ae..3924b4fdbb4 100644
--- a/src/coreclr/src/interop/CMakeLists.txt
+++ b/src/coreclr/src/interop/CMakeLists.txt
@@ -30,7 +30,10 @@ endif(WIN32)
 
 convert_to_absolute_path(INTEROP_SOURCES ${INTEROP_SOURCES})
 
-add_library_clr(interop
-    STATIC
+add_library_clr(interop_obj
+    OBJECT
     ${INTEROP_SOURCES}
 )
+
+add_library(interop INTERFACE)
+target_sources(interop INTERFACE $<TARGET_OBJECTS:interop_obj>)
diff --git a/src/coreclr/src/jit/dll/CMakeLists.txt b/src/coreclr/src/jit/dll/CMakeLists.txt
index ec7cddc78ed..01bdbf5a731 100644
--- a/src/coreclr/src/jit/dll/CMakeLists.txt
+++ b/src/coreclr/src/jit/dll/CMakeLists.txt
@@ -2,17 +2,17 @@ project(ClrJit)
 
 set_source_files_properties(${JIT_EXPORTS_FILE} PROPERTIES GENERATED TRUE)
 
+add_library_clr(clrjit_obj
+    OBJECT
+    ${JIT_CORE_SOURCES}
+    ${JIT_ARCH_SOURCES}
+)
+
 if(CLR_CMAKE_HOST_UNIX)
-    add_library_clr(clrjit_static
-      STATIC
-      ${SHARED_LIB_SOURCES}
-      ${JIT_ARCH_SOURCES}
-    )
-    add_dependencies(clrjit_static coreclrpal gcinfo)
-else()
-    add_library_clr(clrjit_static
-      ${SHARED_LIB_SOURCES}
-      ${JIT_ARCH_SOURCES}
-    )
+    add_dependencies(clrjit_obj coreclrpal gcinfo)
 endif(CLR_CMAKE_HOST_UNIX)
-target_precompile_header(TARGET clrjit_static HEADER jitpch.h ADDITIONAL_INCLUDE_DIRECTORIES ${JIT_SOURCE_DIR})
+
+target_precompile_header(TARGET clrjit_obj HEADER jitpch.h ADDITIONAL_INCLUDE_DIRECTORIES ${JIT_SOURCE_DIR})
+
+add_library(clrjit_static INTERFACE)
+target_sources(clrjit_static INTERFACE $<TARGET_OBJECTS:clrjit_obj>)
diff --git a/src/coreclr/src/md/ceefilegen/CMakeLists.txt b/src/coreclr/src/md/ceefilegen/CMakeLists.txt
index 90749c806b2..fd0f8424d97 100644
--- a/src/coreclr/src/md/ceefilegen/CMakeLists.txt
+++ b/src/coreclr/src/md/ceefilegen/CMakeLists.txt
@@ -25,8 +25,11 @@ if (CLR_CMAKE_TARGET_WIN32)
     list(APPEND CEEFILEGEN_SOURCES ${CEEFILEGEN_HEADERS})
 endif (CLR_CMAKE_TARGET_WIN32)
 
-add_library_clr(ceefgen
-    STATIC
+add_library_clr(ceefgen_obj
+    OBJECT
     ${CEEFILEGEN_SOURCES}
 )
-target_precompile_header(TARGET ceefgen HEADER stdafx.h)
+target_precompile_header(TARGET ceefgen_obj HEADER stdafx.h)
+
+add_library(ceefgen INTERFACE)
+target_sources(ceefgen INTERFACE $<TARGET_OBJECTS:ceefgen_obj>)
diff --git a/src/coreclr/src/md/compiler/CMakeLists.txt b/src/coreclr/src/md/compiler/CMakeLists.txt
index 3b916cdc9fe..f9f80db2500 100644
--- a/src/coreclr/src/md/compiler/CMakeLists.txt
+++ b/src/coreclr/src/md/compiler/CMakeLists.txt
@@ -58,9 +58,11 @@ add_library_clr(mdcompiler_dac ${MDCOMPILER_SOURCES})
 set_target_properties(mdcompiler_dac PROPERTIES DAC_COMPONENT TRUE)
 target_precompile_header(TARGET mdcompiler_dac HEADER stdafx.h)
 
-add_library_clr(mdcompiler_wks ${MDCOMPILER_SOURCES})
-target_compile_definitions(mdcompiler_wks PRIVATE FEATURE_METADATA_EMIT_ALL)
-target_precompile_header(TARGET mdcompiler_wks HEADER stdafx.h)
+add_library_clr(mdcompiler_wks_obj OBJECT ${MDCOMPILER_SOURCES})
+target_compile_definitions(mdcompiler_wks_obj PRIVATE FEATURE_METADATA_EMIT_ALL)
+target_precompile_header(TARGET mdcompiler_wks_obj HEADER stdafx.h)
+add_library(mdcompiler_wks INTERFACE)
+target_sources(mdcompiler_wks INTERFACE $<TARGET_OBJECTS:mdcompiler_wks_obj>)
 
 add_library_clr(mdcompiler-dbi ${MDCOMPILER_SOURCES})
 set_target_properties(mdcompiler-dbi PROPERTIES DBI_COMPONENT TRUE)
diff --git a/src/coreclr/src/md/enc/CMakeLists.txt b/src/coreclr/src/md/enc/CMakeLists.txt
index 7220736b9ca..82af8434296 100644
--- a/src/coreclr/src/md/enc/CMakeLists.txt
+++ b/src/coreclr/src/md/enc/CMakeLists.txt
@@ -48,9 +48,11 @@ add_library_clr(mdruntimerw_dac ${MDRUNTIMERW_SOURCES})
 set_target_properties(mdruntimerw_dac PROPERTIES DAC_COMPONENT TRUE)
 target_precompile_header(TARGET mdruntimerw_dac HEADER stdafx.h)
 
-add_library_clr(mdruntimerw_wks ${MDRUNTIMERW_SOURCES})
-target_compile_definitions(mdruntimerw_wks PRIVATE FEATURE_METADATA_EMIT_ALL)
-target_precompile_header(TARGET mdruntimerw_wks HEADER stdafx.h)
+add_library_clr(mdruntimerw_wks_obj OBJECT ${MDRUNTIMERW_SOURCES})
+target_compile_definitions(mdruntimerw_wks_obj PRIVATE FEATURE_METADATA_EMIT_ALL)
+target_precompile_header(TARGET mdruntimerw_wks_obj HEADER stdafx.h)
+add_library(mdruntimerw_wks INTERFACE)
+target_sources(mdruntimerw_wks INTERFACE $<TARGET_OBJECTS:mdruntimerw_wks_obj>)
 
 add_library_clr(mdruntimerw-dbi ${MDRUNTIMERW_SOURCES})
 set_target_properties(mdruntimerw-dbi PROPERTIES DBI_COMPONENT TRUE)
diff --git a/src/coreclr/src/md/hotdata/CMakeLists.txt b/src/coreclr/src/md/hotdata/CMakeLists.txt
index c6168d2a4b0..88475cb72f4 100644
--- a/src/coreclr/src/md/hotdata/CMakeLists.txt
+++ b/src/coreclr/src/md/hotdata/CMakeLists.txt
@@ -33,8 +33,10 @@ add_library_clr(mdhotdata_dac ${MDHOTDATA_SOURCES})
 set_target_properties(mdhotdata_dac PROPERTIES DAC_COMPONENT TRUE)
 target_precompile_header(TARGET mdhotdata_dac HEADER external.h)
 
-add_library_clr(mdhotdata_full ${MDHOTDATA_SOURCES})
-target_precompile_header(TARGET mdhotdata_full HEADER external.h)
+add_library_clr(mdhotdata_full_obj OBJECT ${MDHOTDATA_SOURCES})
+target_precompile_header(TARGET mdhotdata_full_obj HEADER external.h)
+add_library(mdhotdata_full INTERFACE)
+target_sources(mdhotdata_full INTERFACE $<TARGET_OBJECTS:mdhotdata_full_obj>)
 
 add_library_clr(mdhotdata_crossgen ${MDHOTDATA_SOURCES})
 set_target_properties(mdhotdata_crossgen PROPERTIES CROSSGEN_COMPONENT TRUE)
diff --git a/src/coreclr/src/md/runtime/CMakeLists.txt b/src/coreclr/src/md/runtime/CMakeLists.txt
index 6dc193e14a7..7e0e83f1114 100644
--- a/src/coreclr/src/md/runtime/CMakeLists.txt
+++ b/src/coreclr/src/md/runtime/CMakeLists.txt
@@ -47,9 +47,11 @@ add_library_clr(mdruntime_dac ${MDRUNTIME_SOURCES})
 set_target_properties(mdruntime_dac PROPERTIES DAC_COMPONENT TRUE)
 target_precompile_header(TARGET mdruntime_dac HEADER stdafx.h)
 
-add_library_clr(mdruntime_wks ${MDRUNTIME_SOURCES})
-target_compile_definitions(mdruntime_wks PRIVATE FEATURE_METADATA_EMIT_ALL)
-target_precompile_header(TARGET mdruntime_wks HEADER stdafx.h)
+add_library_clr(mdruntime_wks_obj OBJECT ${MDRUNTIME_SOURCES})
+target_compile_definitions(mdruntime_wks_obj PRIVATE FEATURE_METADATA_EMIT_ALL)
+target_precompile_header(TARGET mdruntime_wks_obj HEADER stdafx.h)
+add_library(mdruntime_wks INTERFACE)
+target_sources(mdruntime_wks INTERFACE $<TARGET_OBJECTS:mdruntime_wks_obj>)
 
 add_library_clr(mdruntime-dbi ${MDRUNTIME_SOURCES})
 set_target_properties(mdruntime-dbi PROPERTIES DBI_COMPONENT TRUE)
diff --git a/src/coreclr/src/pal/src/CMakeLists.txt b/src/coreclr/src/pal/src/CMakeLists.txt
index e7c1629d5b2..7818deef050 100644
--- a/src/coreclr/src/pal/src/CMakeLists.txt
+++ b/src/coreclr/src/pal/src/CMakeLists.txt
@@ -256,10 +256,12 @@ add_library(coreclrpal
 # > warning for library: libtracepointprovider.a the table of contents is empty (no object file members in the library define global symbols)
 #
 if(CLR_CMAKE_TARGET_LINUX)
-  add_library(tracepointprovider
-    STATIC
+  add_library(tracepointprovider_obj
+    OBJECT
     misc/tracepointprovider.cpp
   )
+  add_library(tracepointprovider INTERFACE)
+  target_sources(tracepointprovider INTERFACE $<TARGET_OBJECTS:tracepointprovider_obj>)
 endif(CLR_CMAKE_TARGET_LINUX)
 
 if(CLR_CMAKE_TARGET_OSX)
diff --git a/src/coreclr/src/pal/src/eventprovider/dummyprovider/CMakeLists.txt b/src/coreclr/src/pal/src/eventprovider/dummyprovider/CMakeLists.txt
index 39b9826d1ab..8e6968cf783 100644
--- a/src/coreclr/src/pal/src/eventprovider/dummyprovider/CMakeLists.txt
+++ b/src/coreclr/src/pal/src/eventprovider/dummyprovider/CMakeLists.txt
@@ -1,8 +1,8 @@
-include(FindPython)
+include(FindPythonInterp)
 
 set (GENERATE_SCRIPT ${CLR_DIR}/src/scripts/genDummyProvider.py)
 
-set(GENERATE_COMMAND ${Python_EXECUTABLE} ${GENERATE_SCRIPT} --man ${EVENT_MANIFEST} --intermediate ${CMAKE_CURRENT_BINARY_DIR})
+set(GENERATE_COMMAND ${PYTHON_EXECUTABLE} ${GENERATE_SCRIPT} --man ${EVENT_MANIFEST} --intermediate ${CMAKE_CURRENT_BINARY_DIR})
 
 execute_process(
   COMMAND ${GENERATE_COMMAND} --dry-run
diff --git a/src/coreclr/src/pal/src/eventprovider/lttngprovider/CMakeLists.txt b/src/coreclr/src/pal/src/eventprovider/lttngprovider/CMakeLists.txt
index 234dea19b75..d55dab3557f 100644
--- a/src/coreclr/src/pal/src/eventprovider/lttngprovider/CMakeLists.txt
+++ b/src/coreclr/src/pal/src/eventprovider/lttngprovider/CMakeLists.txt
@@ -1,7 +1,7 @@
-include(FindPython)
+include(FindPythonInterp)
 set (GENERATE_SCRIPT ${CLR_DIR}/src/scripts/genLttngProvider.py)
 
-set(GENERATE_COMMAND ${Python_EXECUTABLE} ${GENERATE_SCRIPT} --man ${EVENT_MANIFEST} --intermediate ${CMAKE_CURRENT_BINARY_DIR})
+set(GENERATE_COMMAND ${PYTHON_EXECUTABLE} ${GENERATE_SCRIPT} --man ${EVENT_MANIFEST} --intermediate ${CMAKE_CURRENT_BINARY_DIR})
 
 execute_process(
   COMMAND ${GENERATE_COMMAND} --dry-run
diff --git a/src/coreclr/src/pal/tests/palsuite/eventprovider/CMakeLists.txt b/src/coreclr/src/pal/tests/palsuite/eventprovider/CMakeLists.txt
index 000ee2d2fb0..845fae656be 100644
--- a/src/coreclr/src/pal/tests/palsuite/eventprovider/CMakeLists.txt
+++ b/src/coreclr/src/pal/tests/palsuite/eventprovider/CMakeLists.txt
@@ -5,10 +5,10 @@ set(SOURCES
 set(EVENT_MANIFEST ${VM_DIR}/ClrEtwAll.man)
 set(TEST_GENERATOR ${CLR_DIR}/src/scripts/genEventingTests.py)
 
-include(FindPython)
+include(FindPythonInterp)
 
 add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/clralltestevents.cpp
-  COMMAND ${Python_EXECUTABLE} ${TEST_GENERATOR} --testdir "${CMAKE_CURRENT_BINARY_DIR}" --man "${EVENT_MANIFEST}"
+  COMMAND ${PYTHON_EXECUTABLE} ${TEST_GENERATOR} --testdir "${CMAKE_CURRENT_BINARY_DIR}" --man "${EVENT_MANIFEST}"
   DEPENDS ${EVENT_MANIFEST} ${TEST_GENERATOR}
   COMMENT "Updating clralltestevents.cpp"
 )
diff --git a/src/coreclr/src/unwinder/CMakeLists.txt b/src/coreclr/src/unwinder/CMakeLists.txt
index 4421ea9f6f6..41a0219bbf7 100644
--- a/src/coreclr/src/unwinder/CMakeLists.txt
+++ b/src/coreclr/src/unwinder/CMakeLists.txt
@@ -20,8 +20,10 @@ list(APPEND UNWINDER_SOURCES
 convert_to_absolute_path(UNWINDER_SOURCES ${UNWINDER_SOURCES})
 
 if(CLR_CMAKE_HOST_UNIX)
-    add_library_clr(unwinder_wks ${UNWINDER_SOURCES})
-    add_dependencies(unwinder_wks eventing_headers)
+    add_library_clr(unwinder_wks_obj OBJECT ${UNWINDER_SOURCES})
+    add_dependencies(unwinder_wks_obj eventing_headers)
+    add_library(unwinder_wks INTERFACE)
+    target_sources(unwinder_wks INTERFACE $<TARGET_OBJECTS:unwinder_wks_obj>)
 endif(CLR_CMAKE_HOST_UNIX)
 
 add_library_clr(unwinder_dac ${UNWINDER_SOURCES})
diff --git a/src/coreclr/src/utilcode/CMakeLists.txt b/src/coreclr/src/utilcode/CMakeLists.txt
index aa28b2db603..f8082fc9076 100644
--- a/src/coreclr/src/utilcode/CMakeLists.txt
+++ b/src/coreclr/src/utilcode/CMakeLists.txt
@@ -98,7 +98,9 @@ convert_to_absolute_path(UTILCODE_CROSSGEN_SOURCES ${UTILCODE_CROSSGEN_SOURCES})
 convert_to_absolute_path(UTILCODE_STATICNOHOST_SOURCES ${UTILCODE_STATICNOHOST_SOURCES})
 
 add_library_clr(utilcode_dac STATIC ${UTILCODE_DAC_SOURCES})
-add_library_clr(utilcode STATIC ${UTILCODE_SOURCES})
+add_library_clr(utilcode_obj OBJECT ${UTILCODE_SOURCES})
+add_library(utilcode INTERFACE)
+target_sources(utilcode INTERFACE $<TARGET_OBJECTS:utilcode_obj>)
 add_library_clr(utilcodestaticnohost STATIC ${UTILCODE_STATICNOHOST_SOURCES})
 add_library_clr(utilcode_crossgen STATIC ${UTILCODE_CROSSGEN_SOURCES})
 
@@ -106,9 +108,9 @@ if(CLR_CMAKE_HOST_UNIX)
   target_link_libraries(utilcodestaticnohost  nativeresourcestring)
   target_link_libraries(utilcode_crossgen  nativeresourcestring)
   target_link_libraries(utilcode_dac nativeresourcestring)
-  target_link_libraries(utilcode nativeresourcestring)
+  target_link_libraries(utilcode INTERFACE nativeresourcestring)
   add_dependencies(utilcode_dac coreclrpal)
-  add_dependencies(utilcode coreclrpal)
+  add_dependencies(utilcode_obj coreclrpal)
 endif(CLR_CMAKE_HOST_UNIX)
 
 
@@ -121,10 +123,10 @@ set_target_properties(utilcode_crossgen PROPERTIES CROSSGEN_COMPONENT TRUE)
 target_compile_definitions(utilcode_dac PRIVATE SELF_NO_HOST)
 target_compile_definitions(utilcodestaticnohost PRIVATE SELF_NO_HOST)
 add_dependencies(utilcode_dac ${UTILCODE_DEPENDENCIES})
-add_dependencies(utilcode ${UTILCODE_DEPENDENCIES})
+add_dependencies(utilcode_obj ${UTILCODE_DEPENDENCIES})
 add_dependencies(utilcode_crossgen ${UTILCODE_DEPENDENCIES})
 add_dependencies(utilcodestaticnohost ${UTILCODE_DEPENDENCIES})
 target_precompile_header(TARGET utilcode_dac HEADER stdafx.h)
-target_precompile_header(TARGET utilcode HEADER stdafx.h)
+target_precompile_header(TARGET utilcode_obj HEADER stdafx.h)
 target_precompile_header(TARGET utilcode_crossgen HEADER stdafx.h)
 target_precompile_header(TARGET utilcodestaticnohost HEADER stdafx.h)
diff --git a/src/coreclr/src/vm/CMakeLists.txt b/src/coreclr/src/vm/CMakeLists.txt
index 3e37cebdc10..2b20d7d910a 100644
--- a/src/coreclr/src/vm/CMakeLists.txt
+++ b/src/coreclr/src/vm/CMakeLists.txt
@@ -923,7 +923,7 @@ list(APPEND VM_HEADERS_DAC
 
 if (CLR_CMAKE_TARGET_WIN32)
     list(APPEND VM_SOURCES_WKS ${VM_HEADERS_WKS})
-    list(APPEND VM_SOURCES_WKS_ARCH_ASM ${VM_HEADERS_WKS_ARCH_ASM})
+    list(APPEND VM_SOURCES_WKS ${VM_HEADERS_WKS_ARCH_ASM})
     list(APPEND VM_SOURCES_DAC ${VM_HEADERS_DAC})
 endif(CLR_CMAKE_TARGET_WIN32)
 
diff --git a/src/coreclr/src/vm/eventing/CMakeLists.txt b/src/coreclr/src/vm/eventing/CMakeLists.txt
index 98dd158df54..e2bf024fc59 100644
--- a/src/coreclr/src/vm/eventing/CMakeLists.txt
+++ b/src/coreclr/src/vm/eventing/CMakeLists.txt
@@ -8,12 +8,13 @@ else()
   set(NEED_XPLAT_HEADER ON)
 endif()
 
-include(FindPython)
+include(FindPythonInterp)
 
 set (EventingHeaders
   ${GENERATED_INCLUDE_DIR}/etmdummy.h
   ${GENERATED_INCLUDE_DIR}/clretwallmain.h
   ${GENERATED_INCLUDE_DIR}/clreventpipewriteevents.h
+  ${GENERATED_INCLUDE_DIR}/clrproviders.h
 )
 
 if (NEED_XPLAT_HEADER)
@@ -24,7 +25,7 @@ endif()
 set(GENEVENTING_SCRIPT ${CLR_DIR}/src/scripts/genEventing.py)
 
 add_custom_target(eventing_headers
-  ${Python_EXECUTABLE} ${GENEVENTING_SCRIPT} --man ${EVENT_MANIFEST} --inc ${GENERATED_INCLUDE_DIR} --dummy ${GENERATED_INCLUDE_DIR}/etmdummy.h ${NONEXTERN_ARG} ${NOXPLATHEADER_ARG}
+  ${PYTHON_EXECUTABLE} ${GENEVENTING_SCRIPT} --man ${EVENT_MANIFEST} --inc ${GENERATED_INCLUDE_DIR} --dummy ${GENERATED_INCLUDE_DIR}/etmdummy.h ${NONEXTERN_ARG} ${NOXPLATHEADER_ARG}
   DEPENDS ${EVENT_MANIFEST} ${GENEVENTING_SCRIPT}
   VERBATIM
 )
diff --git a/src/coreclr/src/vm/eventing/EtwProvider/CMakeLists.txt b/src/coreclr/src/vm/eventing/EtwProvider/CMakeLists.txt
index 34a067e1ec5..4c7df2fbb3c 100644
--- a/src/coreclr/src/vm/eventing/EtwProvider/CMakeLists.txt
+++ b/src/coreclr/src/vm/eventing/EtwProvider/CMakeLists.txt
@@ -1,4 +1,4 @@
-include(FindPython)
+include(FindPythonInterp)
 
 set(ETW_PROVIDER_SCRIPT ${CLR_DIR}/src/scripts/genEtwProvider.py)
 
@@ -14,5 +14,5 @@ set (ETW_PROVIDER_OUTPUTS
 set_source_files_properties(${ETW_PROVIDER_OUTPUTS} PROPERTIES GENERATED TRUE)
 
 add_custom_target(eventprovider
-  ${Python_EXECUTABLE} ${ETW_PROVIDER_SCRIPT} --man ${EVENT_MANIFEST} --exc ${EVENT_EXCLUSIONS} --intermediate ${GENERATED_INCLUDE_DIR}
+  ${PYTHON_EXECUTABLE} ${ETW_PROVIDER_SCRIPT} --man ${EVENT_MANIFEST} --exc ${EVENT_EXCLUSIONS} --intermediate ${GENERATED_INCLUDE_DIR}
   DEPENDS ${EVENT_MANIFEST} ${EVENT_EXCLUSIONS} ${ETW_PROVIDER_SCRIPT})
diff --git a/src/coreclr/src/vm/eventing/eventpipe/CMakeLists.txt b/src/coreclr/src/vm/eventing/eventpipe/CMakeLists.txt
index 00b3f6f386f..00d79737e54 100644
--- a/src/coreclr/src/vm/eventing/eventpipe/CMakeLists.txt
+++ b/src/coreclr/src/vm/eventing/eventpipe/CMakeLists.txt
@@ -1,9 +1,9 @@
-include(FindPython)
+include(FindPythonInterp)
 
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
 
 set(GENERATE_SCRIPT ${CLR_DIR}/src/scripts/genEventPipe.py)
-set(GENERATE_COMMAND ${Python_EXECUTABLE} ${GENERATE_SCRIPT} --man ${EVENT_MANIFEST} --exc ${EVENT_EXCLUSIONS} --intermediate ${CMAKE_CURRENT_BINARY_DIR} ${NONEXTERN_ARG})
+set(GENERATE_COMMAND ${PYTHON_EXECUTABLE} ${GENERATE_SCRIPT} --man ${EVENT_MANIFEST} --exc ${EVENT_EXCLUSIONS} --intermediate ${CMAKE_CURRENT_BINARY_DIR} ${NONEXTERN_ARG})
 
 execute_process(
   COMMAND ${GENERATE_COMMAND} --dry-run
@@ -28,10 +28,8 @@ add_custom_command(OUTPUT ${EVENTPIPE_SOURCES}
   COMMAND ${GENERATE_COMMAND}
   DEPENDS ${GENERATE_SCRIPT} ${EVENT_MANIFEST} ${EVENT_EXCLUSIONS})
 
-add_library_clr(eventpipe STATIC ${EVENTPIPE_SOURCES})
-set_target_properties(eventpipe PROPERTIES LINKER_LANGUAGE CXX)
-add_dependencies(eventpipe eventing_headers)
-
-if (NOT CLR_CMAKE_TARGET_WIN32)
-  _install(TARGETS eventpipe DESTINATION lib)
-endif()
+add_library_clr(eventpipe_obj OBJECT ${EVENTPIPE_SOURCES})
+set_target_properties(eventpipe_obj PROPERTIES LINKER_LANGUAGE CXX)
+add_dependencies(eventpipe_obj eventing_headers)
+add_library(eventpipe INTERFACE)
+target_sources(eventpipe INTERFACE $<TARGET_OBJECTS:eventpipe_obj>)
diff --git a/src/coreclr/src/vm/wks/CMakeLists.txt b/src/coreclr/src/vm/wks/CMakeLists.txt
index 1e94b575fd6..5d355f6adcb 100644
--- a/src/coreclr/src/vm/wks/CMakeLists.txt
+++ b/src/coreclr/src/vm/wks/CMakeLists.txt
@@ -7,13 +7,19 @@ if (CLR_CMAKE_TARGET_WIN32)
 
 endif (CLR_CMAKE_TARGET_WIN32)
 
-add_library_clr(cee_wks ${VM_SOURCES_WKS} ${VM_SOURCES_WKS_ARCH_ASM})
-target_precompile_header(TARGET cee_wks HEADER common.h)
+add_library_clr(cee_wks_core OBJECT ${VM_SOURCES_WKS} ${VM_SOURCES_WKS_ARCH_ASM})
+add_library_clr(cee_wks_obj OBJECT ${VM_SOURCES_WKS_SPECIAL})
+
+target_precompile_header(TARGET cee_wks_core HEADER common.h)
+target_precompile_header(TARGET cee_wks_obj HEADER common.h)
+
 if (MSVC)
     # mscorlib.cpp does not compile with precompiled header file
     set_source_files_properties(../mscorlib.cpp PROPERTIES COMPILE_FLAGS "/Y-")
 endif()
-add_dependencies(cee_wks eventing_headers)
+
+add_dependencies(cee_wks_core eventing_headers)
+add_dependencies(cee_wks_obj eventing_headers)
 
 if (CLR_CMAKE_TARGET_WIN32)
 
@@ -45,8 +51,16 @@ if (CLR_CMAKE_TARGET_WIN32)
       DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/AsmConstants.inc
     )
 
-    add_dependencies(cee_wks asmconstants_inc)
+    add_dependencies(cee_wks_core asmconstants_inc)
+    add_dependencies(cee_wks_obj asmconstants_inc)
 
   endif(NOT CLR_CMAKE_HOST_ARCH_ARM AND NOT CLR_CMAKE_HOST_ARCH_ARM64)
 
 endif (CLR_CMAKE_TARGET_WIN32)
+
+add_custom_target(preprocessd_asm DEPENDS ${VM_WKS_ARCH_ASM_OBJECTS})
+add_dependencies(cee_wks_core preprocessd_asm)
+add_dependencies(cee_wks_obj preprocessd_asm)
+
+add_library(cee_wks INTERFACE)
+target_sources(cee_wks INTERFACE $<TARGET_OBJECTS:cee_wks_obj> ${VM_WKS_ARCH_ASM_OBJECTS})
diff --git a/src/coreclr/tests/CMakeLists.txt b/src/coreclr/tests/CMakeLists.txt
index 53dbb85a58b..c5417cba7d0 100644
--- a/src/coreclr/tests/CMakeLists.txt
+++ b/src/coreclr/tests/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14.2)
+cmake_minimum_required(VERSION 3.6.2)
 
 cmake_policy(SET CMP0042 NEW)
 project(Tests)
diff --git a/src/installer/corehost/CMakeLists.txt b/src/installer/corehost/CMakeLists.txt
index 43a59a1a695..dff0496cdd8 100644
--- a/src/installer/corehost/CMakeLists.txt
+++ b/src/installer/corehost/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.14.2)
+cmake_minimum_required(VERSION 3.6.2)
 
 project(corehost)
 
diff --git a/src/installer/corehost/cli/exe.cmake b/src/installer/corehost/cli/exe.cmake
index de8cd49396b..732faf97ff9 100644
--- a/src/installer/corehost/cli/exe.cmake
+++ b/src/installer/corehost/cli/exe.cmake
@@ -5,7 +5,6 @@
 project (${DOTNET_PROJECT_NAME})
 
 cmake_policy(SET CMP0011 NEW)
-cmake_policy(SET CMP0083 NEW)
 
 include(${CMAKE_CURRENT_LIST_DIR}/common.cmake)
 
diff --git a/src/installer/corehost/cli/test/mockhostfxr/CMakeLists.txt b/src/installer/corehost/cli/test/mockhostfxr/CMakeLists.txt
index bcf6a051229..8572a6318ec 100644
--- a/src/installer/corehost/cli/test/mockhostfxr/CMakeLists.txt
+++ b/src/installer/corehost/cli/test/mockhostfxr/CMakeLists.txt
@@ -2,7 +2,6 @@
 # The .NET Foundation licenses this file to you under the MIT license.
 # See the LICENSE file in the project root for more information.
 
-cmake_minimum_required (VERSION 2.6)
 project(mockhostfxr_2_2)
 
 set(DOTNET_PROJECT_NAME "mockhostfxr_2_2")
diff --git a/src/libraries/Native/Unix/CMakeLists.txt b/src/libraries/Native/Unix/CMakeLists.txt
index f14ada69fee..cb174fe5013 100644
--- a/src/libraries/Native/Unix/CMakeLists.txt
+++ b/src/libraries/Native/Unix/CMakeLists.txt
@@ -1,19 +1,14 @@
-cmake_minimum_required(VERSION 3.14.2)
+cmake_minimum_required(VERSION 3.6.2)
+if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS) 
+     # CMake 3.14.5 contains bug fixes for iOS 
+     cmake_minimum_required(VERSION 3.14.5) 
+ endif() 
 cmake_policy(SET CMP0042 NEW)
 
 project(CoreFX C)
 
 include(${CLR_ENG_NATIVE_DIR}/configuretools.cmake)
 
-if(CLR_CMAKE_TARGET_IOS OR CLR_CMAKE_TARGET_TVOS)
-    # CMake 3.14.5 contains bug fixes for iOS
-    cmake_minimum_required(VERSION 3.14.5)
-endif()
-
-if(NOT CLR_CMAKE_TARGET_ARCH_WASM)
-    cmake_policy(SET CMP0083 NEW)
-endif(NOT CLR_CMAKE_TARGET_ARCH_WASM)
-
 set(CMAKE_MACOSX_RPATH ON)
 set(CMAKE_INSTALL_PREFIX $ENV{__CMakeBinDir})
 set(CMAKE_INCLUDE_CURRENT_DIR ON)
@@ -167,7 +162,8 @@ if(CLR_CMAKE_TARGET_UNIX)
     if(NOT CLR_CMAKE_TARGET_ARCH_WASM AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS)
         if(CLR_CMAKE_TARGET_OSX)
             add_definitions(-DTARGET_OSX)
-            add_link_options(-Wl,-bind_at_load)
+            set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-bind_at_load")
+            set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-bind_at_load" )
         else()
             add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-Wa,--noexecstack>)
             if(CLR_CMAKE_TARGET_SUNOS)
@@ -175,7 +171,8 @@ if(CLR_CMAKE_TARGET_UNIX)
             else()
                 # -z,now is required for full relro.
                 # see https://www.redhat.com/en/blog/hardening-elf-binaries-using-relocation-read-only-relro
-                add_link_options(-Wl,--build-id=sha1 -Wl,-z,relro,-z,now)
+                set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--build-id=sha1 -Wl,-z,relro,-z,now")
+                set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--build-id=sha1 -Wl,-z,relro,-z,now" )
             endif()
         endif()
     endif()
diff --git a/src/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt b/src/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt
index bcfc5dd106a..ebcb5a02b3f 100644
--- a/src/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt
+++ b/src/libraries/Native/Unix/System.Globalization.Native/CMakeLists.txt
@@ -79,14 +79,15 @@ if (GEN_SHARED_LIB)
     install_with_stripped_symbols (System.Globalization.Native PROGRAMS .)
 endif()
 
-add_library(System.Globalization.Native-Static
-    STATIC
+add_library(System.Globalization.Native-obj
+    OBJECT
     ${NATIVEGLOBALIZATION_SOURCES}
 )
 
-set_target_properties(System.Globalization.Native-Static PROPERTIES OUTPUT_NAME System.Globalization.Native  CLEAN_DIRECT_OUTPUT 1)
+set_target_properties(System.Globalization.Native-obj PROPERTIES OUTPUT_NAME System.Globalization.Native  CLEAN_DIRECT_OUTPUT 1)
 
-install (TARGETS System.Globalization.Native-Static DESTINATION .)
+add_library(System.Globalization.Native-static INTERFACE)
+target_sources(System.Globalization.Native-static INTERFACE $<TARGET_OBJECTS:System.Globalization.Native-obj>)
 
 if(NOT CLR_CMAKE_TARGET_OSX AND NOT CLR_CMAKE_TARGET_IOS AND NOT CLR_CMAKE_TARGET_TVOS AND NOT CLR_CMAKE_TARGET_ANDROID)
     if (GEN_SHARED_LIB)