From 6f0b1b13750a3b5ccad7e73b1f4927b2ebf17438 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 23 Oct 2023 11:09:39 -0700 Subject: [PATCH] Revert "Use add_link_options and target_link_options in cmake (#92844)" (#93838) * Revert "Fix target_link_options in pgosupport.cmake (#93670)" This reverts commit fa0ba15be6533c9921a967c72a0a2408a6fc6248. * Revert "Use `add_link_options` and `target_link_options` in cmake (#92844)" This reverts commit 3086d8a1c30b28290b44e73cd96b23194906c2cf. --- eng/native/configurecompiler.cmake | 84 ++++++++++--------- eng/native/configureplatform.cmake | 2 +- eng/native/functions.cmake | 13 +++ src/coreclr/CMakeLists.txt | 2 +- src/coreclr/dlls/clretwrc/CMakeLists.txt | 8 +- src/coreclr/dlls/mscordac/CMakeLists.txt | 2 +- src/coreclr/dlls/mscordbi/CMakeLists.txt | 4 +- .../dlls/mscoree/coreclr/CMakeLists.txt | 8 +- src/coreclr/dlls/mscorrc/CMakeLists.txt | 6 +- src/coreclr/ilasm/CMakeLists.txt | 2 +- src/coreclr/ildasm/exe/CMakeLists.txt | 2 +- src/coreclr/jit/CMakeLists.txt | 2 +- src/coreclr/pal/src/CMakeLists.txt | 2 +- src/coreclr/pgosupport.cmake | 10 +-- .../superpmi-shim-collector/CMakeLists.txt | 2 +- .../tools/superpmi/superpmi/CMakeLists.txt | 4 +- src/mono/CMakeLists.txt | 4 +- .../corehost/apphost/static/CMakeLists.txt | 12 +-- src/native/corehost/common.cmake | 2 +- .../corehost/test/nativehost/CMakeLists.txt | 2 +- src/native/libs/CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- .../CMakeLists.txt | 2 +- 23 files changed, 103 insertions(+), 76 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 52aa288c017cd6..6fc480fb20aab5 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -69,8 +69,7 @@ if (MSVC) add_link_options($<$>:/guard:cf>) # Load all imported DLLs from the System32 directory. - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEPENDENTLOADFLAG:0x800") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEPENDENTLOADFLAG:0x800") + add_linker_flag(/DEPENDENTLOADFLAG:0x800) # Linker flags # @@ -82,55 +81,63 @@ if (MSVC) set(WINDOWS_SUBSYSTEM_VERSION 6.03) #windows subsystem - arm64 minimum is 6.03 endif () - #shrink pdb size - add_link_options(/PDBCOMPRESS) - - add_link_options(/DEBUG) - add_link_options(/DEBUGTYPE:CV,FIXUP) - - # Do not create Side-by-Side Assembly Manifest - add_link_options($<$,SHARED_LIBRARY>:/MANIFEST:NO>) + #Do not create Side-by-Side Assembly Manifest + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO") # can handle addresses larger than 2 gigabytes - add_link_options($<$,SHARED_LIBRARY>:/LARGEADDRESSAWARE>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /LARGEADDRESSAWARE") + #shrink pdb size + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /PDBCOMPRESS") - add_link_options($<$,SHARED_LIBRARY>:/IGNORE:4197,4013,4254,4070,4221>) - add_link_options($<$,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} /DEBUGTYPE:CV,FIXUP") + 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") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUG") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DEBUGTYPE:CV,FIXUP") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /PDBCOMPRESS") # For sanitized builds, we bump up the stack size to 8MB to match behavior on Unix platforms. # Sanitized builds can use significantly more stack space than non-sanitized builds due to instrumentation. # We don't want to change the default stack size for all builds, as that will likely cause confusion and will # increase memory usage. if (CLR_CMAKE_ENABLE_SANITIZERS) - add_link_options($<$,EXECUTABLE>:/STACK:0x800000>) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:0x800000") else() - add_link_options($<$,EXECUTABLE>:/STACK:0x180000>) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:0x180000") endif() if(EXISTS ${CLR_SOURCELINK_FILE_PATH}) - add_link_options(/sourcelink:${CLR_SOURCELINK_FILE_PATH}) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /sourcelink:${CLR_SOURCELINK_FILE_PATH}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /sourcelink:${CLR_SOURCELINK_FILE_PATH}") endif(EXISTS ${CLR_SOURCELINK_FILE_PATH}) if (CMAKE_GENERATOR MATCHES "^Visual Studio.*$") # Debug build specific flags - # The Ninja generator doesn't appear to have the default `/INCREMENTAL` that + # The Ninja generator doesn't appear to have the default `/INCREMENTAL:ON` that # the Visual Studio generator has. Therefore we will override the default for Visual Studio only. - add_link_options($<$:/INCREMENTAL:NO>) - add_link_options($<$:/OPT:NOICF>) - add_link_options($<$:/OPT:NOREF>) + add_linker_flag(/INCREMENTAL:NO DEBUG) + add_linker_flag(/OPT:NOREF DEBUG) + add_linker_flag(/OPT:NOICF DEBUG) endif (CMAKE_GENERATOR MATCHES "^Visual Studio.*$") - # Options for all but DEBUG - add_link_options($<$:/INCREMENTAL:NO>) # Checked build specific flags - add_link_options($<$:/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($<$:/OPT:ICF>) - - # Set LTCG for RELEASE and RELWITHDEBINFO builds that are compatible + 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_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") elseif (CLR_CMAKE_HOST_UNIX) @@ -267,7 +274,7 @@ if (CLR_CMAKE_ENABLE_SANITIZERS) add_compile_options("$<$:${CLR_CMAKE_BUILD_SANITIZE_OPTIONS}>") else() add_compile_options("$<$:${CLR_CMAKE_BUILD_SANITIZE_OPTIONS}>") - add_link_options("${CLR_CMAKE_LINK_SANITIZE_OPTIONS}") + add_linker_flag("${CLR_CMAKE_LINK_SANITIZE_OPTIONS}") endif() endif() @@ -279,20 +286,17 @@ endif() # if(CLR_CMAKE_HOST_UNIX) foreach(ADDTL_LINKER_FLAG ${CLR_ADDITIONAL_LINKER_FLAGS}) - add_link_options(${ADDTL_LINKER_FLAG}) - if(${ADDTL_LINKER_FLAG} MATCHES "-fuse_ld=") - set(FUSE_LD ${ADDTL_LINKER_FLAG}) - endif() + add_linker_flag(${ADDTL_LINKER_FLAG}) endforeach() endif(CLR_CMAKE_HOST_UNIX) if(CLR_CMAKE_HOST_LINUX) add_compile_options($<$:-Wa,--noexecstack>) - add_link_options("LINKER:--build-id=sha1") - add_link_options("LINKER:-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($<$:-Wa,--noexecstack>) - add_link_options("LINKER:--build-id=sha1") + add_linker_flag("-Wl,--build-id=sha1") elseif(CLR_CMAKE_HOST_SUNOS) add_compile_options($<$:-Wa,--noexecstack>) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstack-protector") @@ -300,10 +304,10 @@ elseif(CLR_CMAKE_HOST_SUNOS) add_definitions(-D__EXTENSIONS__ -D_XPG4_2 -D_POSIX_PTHREAD_SEMANTICS) elseif(CLR_CMAKE_HOST_OSX AND NOT CLR_CMAKE_HOST_MACCATALYST AND NOT CLR_CMAKE_HOST_IOS AND NOT CLR_CMAKE_HOST_TVOS) add_definitions(-D_XOPEN_SOURCE) - add_link_options("LINKER:-bind_at_load") + add_linker_flag("-Wl,-bind_at_load") elseif(CLR_CMAKE_HOST_HAIKU) add_compile_options($<$:-Wa,--noexecstack>) - add_link_options("LINKER:--no-undefined") + add_linker_flag("-Wl,--no-undefined") endif() #------------------------------------ @@ -872,7 +876,7 @@ if (MSVC) add_compile_options($<$,$>>:/guard:ehcont>) add_link_options($<$>:/guard:ehcont>) - add_link_options($<$>>:/CETCOMPAT>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /CETCOMPAT") endif (CLR_CMAKE_HOST_ARCH_AMD64 AND NOT CLR_CMAKE_RUNTIME_MONO) # Statically linked CRT (libcmt[d].lib, libvcruntime[d].lib and libucrt[d].lib) by default. This is done to avoid @@ -888,8 +892,8 @@ if (MSVC) # We won't do this for sanitized builds as the dynamic CRT is not compatible with the static sanitizer runtime and # the dynamic sanitizer runtime is not redistributable. Sanitized runtime builds are not production-time scenarios # so we don't get the benefits of a dynamic CRT for sanitized runtime builds. - add_link_options($<$:/NODEFAULTLIB:libucrt.lib>) - add_link_options($<$:/DEFAULTLIB:ucrt.lib>) + add_linker_flag(/NODEFAULTLIB:libucrt.lib RELEASE) + add_linker_flag(/DEFAULTLIB:ucrt.lib RELEASE) endif() add_compile_options($<$:/ZH:SHA_256>) @@ -924,7 +928,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 ad7826b8533a8e..2f6ca03db863fb 100644 --- a/eng/native/configureplatform.cmake +++ b/eng/native/configureplatform.cmake @@ -481,7 +481,7 @@ endif() if(NOT CLR_CMAKE_TARGET_BROWSER AND NOT CLR_CMAKE_TARGET_WASI) # The default linker on Solaris also does not support PIE. if(NOT CLR_CMAKE_TARGET_ANDROID AND NOT CLR_CMAKE_TARGET_SUNOS AND NOT CLR_CMAKE_TARGET_APPLE AND NOT MSVC) - add_link_options($<$,EXECUTABLE>:-pie>) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") add_compile_options($<$,EXECUTABLE>:-fPIE>) add_compile_options($<$,SHARED_LIBRARY>:-fPIC>) endif() diff --git a/eng/native/functions.cmake b/eng/native/functions.cmake index 7222cb55371972..543722a9c0a59e 100644 --- a/eng/native/functions.cmake +++ b/eng/native/functions.cmake @@ -588,6 +588,19 @@ function(disable_pax_mprotect targetName) endif(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS) 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() + function(link_natvis_sources_for_target targetName linkKind) if (NOT CLR_CMAKE_HOST_WIN32) return() diff --git a/src/coreclr/CMakeLists.txt b/src/coreclr/CMakeLists.txt index 0985bece4de0a1..ade1e03c92efd6 100644 --- a/src/coreclr/CMakeLists.txt +++ b/src/coreclr/CMakeLists.txt @@ -98,7 +98,7 @@ if(CLR_CMAKE_HOST_UNIX) endif() if(CLR_CMAKE_TARGET_LINUX AND (CLR_CMAKE_TARGET_ARCH_I386 OR CLR_CMAKE_TARGET_ARCH_RISCV64)) - add_link_options(LINKER:-z,notext) + add_linker_flag(-Wl,-z,notext) endif() if(NOT CLR_CMAKE_HOST_MACCATALYST AND NOT CLR_CMAKE_HOST_IOS AND NOT CLR_CMAKE_HOST_TVOS) diff --git a/src/coreclr/dlls/clretwrc/CMakeLists.txt b/src/coreclr/dlls/clretwrc/CMakeLists.txt index a0913b0ca20455..2729a6072269bc 100644 --- a/src/coreclr/dlls/clretwrc/CMakeLists.txt +++ b/src/coreclr/dlls/clretwrc/CMakeLists.txt @@ -1,15 +1,21 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}) if(CLR_CMAKE_HOST_WIN32) + # remove /ltcg from resource-only libraries + string(REPLACE "/LTCG" "" CMAKE_SHARED_LINKER_FLAGS_RELEASE ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}) + string(REPLACE "/LTCG" "" CMAKE_STATIC_LINKER_FLAGS_RELEASE ${CMAKE_STATIC_LINKER_FLAGS_RELEASE}) + string(REPLACE "/LTCG" "" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO ${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}) + string(REPLACE "/LTCG" "" CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO ${CMAKE_STATIC_LINKER_FLAGS_RELWITHDEBINFO}) # remove /guard:cf, /guard:ehcont, and /CETCOMPAT from resource-only libraries set_property(DIRECTORY PROPERTY CLR_CONTROL_FLOW_GUARD OFF) if (CLR_CMAKE_HOST_ARCH_AMD64) set_property(DIRECTORY PROPERTY CLR_EH_CONTINUATION OFF) + string(REPLACE "/CETCOMPAT" "" CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (CLR_CMAKE_HOST_ARCH_AMD64) - add_link_options(/NOENTRY) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NOENTRY") endif(CLR_CMAKE_HOST_WIN32) add_definitions(-DFX_VER_INTERNALNAME_STR=clretwrc.dll) diff --git a/src/coreclr/dlls/mscordac/CMakeLists.txt b/src/coreclr/dlls/mscordac/CMakeLists.txt index 0fcdaaa5cff60d..ef6f5a8b4e0729 100644 --- a/src/coreclr/dlls/mscordac/CMakeLists.txt +++ b/src/coreclr/dlls/mscordac/CMakeLists.txt @@ -83,7 +83,7 @@ else(CLR_CMAKE_HOST_WIN32) if(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS) # 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") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -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. diff --git a/src/coreclr/dlls/mscordbi/CMakeLists.txt b/src/coreclr/dlls/mscordbi/CMakeLists.txt index 05b20dd7f3e95d..1940f64e94b092 100644 --- a/src/coreclr/dlls/mscordbi/CMakeLists.txt +++ b/src/coreclr/dlls/mscordbi/CMakeLists.txt @@ -48,7 +48,7 @@ else(CLR_CMAKE_HOST_WIN32) if(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS) # This option is necessary to ensure that the overloaded new/delete operators defined inside # of the utilcode will be used instead of the standard library delete operator. - add_link_options($<$,SHARED_LIBRARY>:LINKER:-Bsymbolic>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic") endif(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS) set_exports_linker_option(${EXPORTS_FILE}) @@ -108,7 +108,7 @@ elseif(CLR_CMAKE_HOST_UNIX) if(COMMAND check_linker_flag) check_linker_flag(CXX -Wl,--undefined-version LINKER_SUPPORTS_UNDEFINED_VERSION) if (LINKER_SUPPORTS_UNDEFINED_VERSION) - target_link_options(mscordbi PRIVATE "LINKER:--undefined-version") + add_linker_flag(-Wl,--undefined-version) endif(LINKER_SUPPORTS_UNDEFINED_VERSION) endif(COMMAND check_linker_flag) diff --git a/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt b/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt index bccf497891b003..84e4b42284a526 100644 --- a/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt +++ b/src/coreclr/dlls/mscoree/coreclr/CMakeLists.txt @@ -19,13 +19,13 @@ if (CLR_CMAKE_HOST_WIN32) # 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-l1-1-0.dll") + add_linker_flag("/DELAYLOAD:api-ms-win-core-winrt-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) @@ -38,7 +38,7 @@ else(CLR_CMAKE_HOST_WIN32) if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD OR CLR_CMAKE_TARGET_SUNOS) # 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("-Wl,-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. diff --git a/src/coreclr/dlls/mscorrc/CMakeLists.txt b/src/coreclr/dlls/mscorrc/CMakeLists.txt index fb646a3f5d66f3..a8a363b1cc34db 100644 --- a/src/coreclr/dlls/mscorrc/CMakeLists.txt +++ b/src/coreclr/dlls/mscorrc/CMakeLists.txt @@ -3,13 +3,17 @@ include_directories("../../pal/prebuilt/corerror") add_definitions(-DFX_VER_INTERNALNAME_STR=mscorrc.dll) if(CLR_CMAKE_HOST_WIN32) - add_link_options("/NOENTRY") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NOENTRY") + # remove /ltcg from resource-only libraries + string(REPLACE "/LTCG" "" CMAKE_SHARED_LINKER_FLAGS_RELEASE ${CMAKE_SHARED_LINKER_FLAGS_RELEASE}) + string(REPLACE "/LTCG" "" CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO ${CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO}) # remove /guard:cf, /guard:ehcont, and /CETCOMPAT from resource-only libraries set_property(DIRECTORY PROPERTY CLR_CONTROL_FLOW_GUARD OFF) if (CLR_CMAKE_HOST_ARCH_AMD64) set_property(DIRECTORY PROPERTY CLR_EH_CONTINUATION OFF) + string(REPLACE "/CETCOMPAT" "" CMAKE_SHARED_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS}) endif (CLR_CMAKE_HOST_ARCH_AMD64) add_library_clr(mscorrc SHARED diff --git a/src/coreclr/ilasm/CMakeLists.txt b/src/coreclr/ilasm/CMakeLists.txt index 307be0ca7efeb0..5102243fccde36 100644 --- a/src/coreclr/ilasm/CMakeLists.txt +++ b/src/coreclr/ilasm/CMakeLists.txt @@ -57,7 +57,7 @@ endif(CLR_CMAKE_HOST_UNIX) if(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS) # 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($<$,SHARED_LIBRARY>:LINKER:-Bsymbolic>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -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. diff --git a/src/coreclr/ildasm/exe/CMakeLists.txt b/src/coreclr/ildasm/exe/CMakeLists.txt index c8ee78c9fa470e..a8d629a9200bbb 100644 --- a/src/coreclr/ildasm/exe/CMakeLists.txt +++ b/src/coreclr/ildasm/exe/CMakeLists.txt @@ -50,7 +50,7 @@ endif(CLR_CMAKE_TARGET_WIN32) if(CLR_CMAKE_HOST_LINUX OR CLR_CMAKE_HOST_FREEBSD OR CLR_CMAKE_HOST_NETBSD OR CLR_CMAKE_HOST_SUNOS) # 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($<$,SHARED_LIBRARY>:LINKER:-Bsymbolic>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -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. diff --git a/src/coreclr/jit/CMakeLists.txt b/src/coreclr/jit/CMakeLists.txt index c2d873aca7bd1b..30e9ad972dab62 100644 --- a/src/coreclr/jit/CMakeLists.txt +++ b/src/coreclr/jit/CMakeLists.txt @@ -508,7 +508,7 @@ else() if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD OR CLR_CMAKE_TARGET_SUNOS) # This is required to force using our own PAL, not one that we are loaded with. - add_link_options($<$,SHARED_LIBRARY>:LINKER:-Bsymbolic>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic") endif() set_exports_linker_option(${JIT_EXPORTS_FILE}) diff --git a/src/coreclr/pal/src/CMakeLists.txt b/src/coreclr/pal/src/CMakeLists.txt index 8ea8856ab2604f..32895b2f4def58 100644 --- a/src/coreclr/pal/src/CMakeLists.txt +++ b/src/coreclr/pal/src/CMakeLists.txt @@ -98,7 +98,7 @@ if(CLR_CMAKE_TARGET_LINUX_MUSL) endif(CLR_CMAKE_TARGET_LINUX_MUSL) # turn off capability to remove unused functions (which was enabled in debug build with sanitizers) -add_link_options($<$,SHARED_LIBRARY>,$>:LINKER:--no-gc-sections>) +set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS_DEBUG} -Wl,--no-gc-sections") set(ARCH_SOURCES arch/${PAL_ARCH_SOURCES_DIR}/context2.S diff --git a/src/coreclr/pgosupport.cmake b/src/coreclr/pgosupport.cmake index d9d24adf0c2077..a0a2b2ab305dd7 100644 --- a/src/coreclr/pgosupport.cmake +++ b/src/coreclr/pgosupport.cmake @@ -18,12 +18,12 @@ endif(NOT WIN32) function(add_pgo TargetName) if(CLR_CMAKE_PGO_INSTRUMENT) if(CLR_CMAKE_HOST_WIN32) - target_link_options(${TargetName} PRIVATE $<$>,$>:/LTCG>) - target_link_options(${TargetName} PRIVATE $<$:/GENPROFILE>) + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELEASE " /LTCG /GENPROFILE") + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS_RELWITHDEBINFO " /LTCG /GENPROFILE") else(CLR_CMAKE_HOST_WIN32) if(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO) target_compile_options(${TargetName} PRIVATE -flto -fprofile-instr-generate) - target_link_options(${TargetName} PRIVATE -flto -fprofile-instr-generate) + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -flto -fprofile-instr-generate") if(CMAKE_CROSSCOMPILING AND CMAKE_C_COMPILER_ID MATCHES "Clang") if (CLR_CMAKE_HOST_ALPINE_LINUX) set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -resource-dir ${CMAKE_SYSROOT}/usr/lib/clang/${CMAKE_C_COMPILER_VERSION}") @@ -33,8 +33,8 @@ function(add_pgo TargetName) set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -resource-dir ${CMAKE_SYSROOT}/usr/lib/llvm-${CLANG_VERSION_MAJOR}/lib/clang/${CMAKE_C_COMPILER_VERSION}") endif(CLR_CMAKE_HOST_ALPINE_LINUX) endif(CMAKE_CROSSCOMPILING AND CMAKE_C_COMPILER_ID MATCHES "Clang") - if(LD_GNU) # Only use gold when it wouldn't change the LD_ value - target_link_options(${TargetName} PRIVATE "-fuse-ld=gold") + if(NOT LD_LLVM) + set_property(TARGET ${TargetName} APPEND_STRING PROPERTY LINK_FLAGS " -fuse-ld=gold") endif() endif(UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELEASE OR UPPERCASE_CMAKE_BUILD_TYPE STREQUAL RELWITHDEBINFO) endif(CLR_CMAKE_HOST_WIN32) diff --git a/src/coreclr/tools/superpmi/superpmi-shim-collector/CMakeLists.txt b/src/coreclr/tools/superpmi/superpmi-shim-collector/CMakeLists.txt index 4a98c2a8e4da7d..5ddfc257abf746 100644 --- a/src/coreclr/tools/superpmi/superpmi-shim-collector/CMakeLists.txt +++ b/src/coreclr/tools/superpmi/superpmi-shim-collector/CMakeLists.txt @@ -48,7 +48,7 @@ else() if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD OR CLR_CMAKE_TARGET_SUNOS) # This is required to force using our own PAL, not one that we are loaded with. - add_link_options($<$,SHARED_LIBRARY>:LINKER:-Bsymbolic>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic") endif() set_exports_linker_option(${SPMI_COLLECTOR_EXPORTS_FINAL_FILE}) diff --git a/src/coreclr/tools/superpmi/superpmi/CMakeLists.txt b/src/coreclr/tools/superpmi/superpmi/CMakeLists.txt index ef62c60067227e..5dd42eb5631b26 100644 --- a/src/coreclr/tools/superpmi/superpmi/CMakeLists.txt +++ b/src/coreclr/tools/superpmi/superpmi/CMakeLists.txt @@ -15,9 +15,9 @@ endif(CLR_CMAKE_HOST_WIN32) if(CLR_CMAKE_HOST_UNIX) # Make sure a public symbol is created for Instrumentor_GetInsCount if(CLR_CMAKE_HOST_APPLE) - add_link_options(LINKER:-export_dynamic) + add_linker_flag(-Wl,-export_dynamic) else() - add_link_options(LINKER:--export-dynamic) + add_linker_flag(-Wl,--export-dynamic) endif(CLR_CMAKE_HOST_APPLE) endif(CLR_CMAKE_HOST_UNIX) diff --git a/src/mono/CMakeLists.txt b/src/mono/CMakeLists.txt index 59d9aa57608769..4bf280134c0d66 100644 --- a/src/mono/CMakeLists.txt +++ b/src/mono/CMakeLists.txt @@ -225,8 +225,8 @@ elseif(CLR_CMAKE_HOST_OS STREQUAL "linux") add_definitions(-D_THREAD_SAFE) set(HAVE_CGROUP_SUPPORT 1) # Enable the "full RELRO" options (RELRO & BIND_NOW) at link time - add_link_options("LINKER:-z,relro") - add_link_options("LINKER:-z,now") + add_link_options(-Wl,-z,relro) + add_link_options(-Wl,-z,now) elseif(CLR_CMAKE_HOST_OS STREQUAL "android") set(HOST_LINUX 1) add_definitions(-D_GNU_SOURCE -D_REENTRANT) diff --git a/src/native/corehost/apphost/static/CMakeLists.txt b/src/native/corehost/apphost/static/CMakeLists.txt index ba70b65750cbb1..0a3d432e4bbf92 100644 --- a/src/native/corehost/apphost/static/CMakeLists.txt +++ b/src/native/corehost/apphost/static/CMakeLists.txt @@ -63,7 +63,7 @@ if(CLR_CMAKE_TARGET_WIN32) endif() if(CLR_CMAKE_TARGET_WIN32) - add_link_options("/DEF:${CMAKE_CURRENT_SOURCE_DIR}/singlefilehost.def") + add_linker_flag("/DEF:${CMAKE_CURRENT_SOURCE_DIR}/singlefilehost.def") else() if(CLR_CMAKE_TARGET_FREEBSD) @@ -98,17 +98,17 @@ add_definitions(-DFEATURE_STATIC_HOST=1) if(CLR_CMAKE_TARGET_WIN32) # Disable manifest generation into the file .exe on Windows - add_link_options(/MANIFEST:NO) + add_linker_flag("/MANIFEST:NO") # 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-l1-1-0.dll) + add_linker_flag("/DELAYLOAD:api-ms-win-core-winrt-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") endif() if(CLR_CMAKE_TARGET_WIN32) @@ -237,7 +237,7 @@ if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD endif(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_FREEBSD OR CLR_CMAKE_TARGET_NETBSD OR CLR_CMAKE_TARGET_SUNOS) if(CLR_CMAKE_TARGET_LINUX AND CLR_CMAKE_TARGET_ARCH_RISCV64) - add_link_options(LINKER:-z,notext) + add_linker_flag(-Wl,-z,notext) endif() if(CLR_CMAKE_TARGET_APPLE) diff --git a/src/native/corehost/common.cmake b/src/native/corehost/common.cmake index 883dd936b78705..9a5e3a6686e076 100644 --- a/src/native/corehost/common.cmake +++ b/src/native/corehost/common.cmake @@ -31,7 +31,7 @@ endif() # This is required to map a symbol reference to a matching definition local to the module (.so) # containing the reference instead of using definitions from other modules. if(CLR_CMAKE_TARGET_LINUX OR CLR_CMAKE_TARGET_SUNOS) - add_link_options($<$,SHARED_LIBRARY>:LINKER:-Bsymbolic>) + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Xlinker -Bsymbolic") endif() function(set_common_libs TargetType) diff --git a/src/native/corehost/test/nativehost/CMakeLists.txt b/src/native/corehost/test/nativehost/CMakeLists.txt index 9286837923f5c8..527ab578d39916 100644 --- a/src/native/corehost/test/nativehost/CMakeLists.txt +++ b/src/native/corehost/test/nativehost/CMakeLists.txt @@ -41,7 +41,7 @@ if(CLR_CMAKE_TARGET_WIN32) list(APPEND HEADERS ./comhost_test.h) - add_link_options($<$,EXECUTABLE>:/DELAYLOAD:nethost.dll>) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /DELAYLOAD:nethost.dll") endif() include(../../hostmisc/hostmisc.cmake) diff --git a/src/native/libs/CMakeLists.txt b/src/native/libs/CMakeLists.txt index 1228171c8ccaa5..49be22629d41ed 100644 --- a/src/native/libs/CMakeLists.txt +++ b/src/native/libs/CMakeLists.txt @@ -51,7 +51,7 @@ if (CLR_CMAKE_TARGET_UNIX OR CLR_CMAKE_TARGET_BROWSER OR CLR_CMAKE_TARGET_WASI) add_compile_options(-D_WASI_EMULATED_PROCESS_CLOCKS) add_compile_options(-D_WASI_EMULATED_SIGNAL) add_compile_options(-D_WASI_EMULATED_MMAN) - add_link_options("LINKER:-z,stack-size=1048576,--initial-memory=5242880,--max-memory=52428800,-lwasi-emulated-process-clocks,-lwasi-emulated-signal,-lwasi-emulated-mman") + add_link_options(-Wl,-z,stack-size=1048576,--initial-memory=5242880,--max-memory=52428800,-lwasi-emulated-process-clocks,-lwasi-emulated-signal,-lwasi-emulated-mman) endif () if (CLR_CMAKE_TARGET_ANDROID) diff --git a/src/native/libs/System.Globalization.Native/CMakeLists.txt b/src/native/libs/System.Globalization.Native/CMakeLists.txt index 854b52f53299fb..d8b3335ae3be7c 100644 --- a/src/native/libs/System.Globalization.Native/CMakeLists.txt +++ b/src/native/libs/System.Globalization.Native/CMakeLists.txt @@ -75,7 +75,7 @@ endif() if (CMAKE_USE_PTHREADS) add_compile_options(-pthread) - add_link_options(-pthread) + add_linker_flag(-pthread) endif() if (LOCAL_BUILD) diff --git a/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt b/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt index e1cf6eb0f0f0d2..52213b1a2d247a 100644 --- a/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt +++ b/src/native/libs/System.Security.Cryptography.Native/CMakeLists.txt @@ -79,7 +79,7 @@ if (FEATURE_DISTRO_AGNOSTIC_SSL) ) add_definitions(-DFEATURE_DISTRO_AGNOSTIC_SSL) add_compile_options(-pthread) - add_link_options(-pthread) + add_linker_flag(-pthread) endif() add_library(objlib OBJECT ${NATIVECRYPTO_SOURCES} ${VERSION_FILE_PATH})