From 6cdbb14cf95284d1fe949c13fb3e478dca101d48 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 14 May 2026 22:25:35 +0000 Subject: [PATCH 01/10] Globally enable linker dead-code elimination on Unix Co-authored-by: elinor-fung <47805090+elinor-fung@users.noreply.github.com> --- eng/native/configurecompiler.cmake | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index e3669f462a9efc..4ca1fb70c1e854 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -321,6 +321,21 @@ if(CLR_CMAKE_HOST_UNIX) endforeach() endif(CLR_CMAKE_HOST_UNIX) +# Strip unreferenced sections at link time, paired with -ffunction-sections/-fdata-sections +# (set in the Unix/WASI compile-options block below). Gated to non-Debug builds so Debug +# keeps full symbols and incremental linking. Windows uses /OPT:REF, configured above. +if(CLR_CMAKE_HOST_UNIX) + if(CLR_CMAKE_HOST_APPLE) + add_linker_flag(-Wl,-dead_strip CHECKED) + add_linker_flag(-Wl,-dead_strip RELEASE) + add_linker_flag(-Wl,-dead_strip RELWITHDEBINFO) + else() + add_linker_flag(-Wl,--gc-sections CHECKED) + add_linker_flag(-Wl,--gc-sections RELEASE) + add_linker_flag(-Wl,--gc-sections RELWITHDEBINFO) + endif() +endif() + if(CLR_CMAKE_HOST_LINUX) add_compile_options($<$:-Wa,--noexecstack>) add_linker_flag(-Wl,--build-id=sha1) @@ -740,8 +755,11 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) # We mark the function which needs exporting with DLLEXPORT add_compile_options(-fvisibility=hidden) - # Separate functions so linker can remove them. + # Separate functions and data into their own sections so the linker can remove + # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O), which are + # enabled below for non-Debug configurations. add_compile_options(-ffunction-sections) + add_compile_options(-fdata-sections) # Specify the minimum supported version of macOS # Mac Catalyst needs a special CFLAG, exclusive with mmacosx-version-min From 41177a5560210b67a17f52ce581c6187fb65e719 Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Thu, 14 May 2026 18:22:04 -0700 Subject: [PATCH 02/10] Update eng/native/configurecompiler.cmake Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com> --- eng/native/configurecompiler.cmake | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 4ca1fb70c1e854..847697fb0dc66d 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -326,13 +326,9 @@ endif(CLR_CMAKE_HOST_UNIX) # keeps full symbols and incremental linking. Windows uses /OPT:REF, configured above. if(CLR_CMAKE_HOST_UNIX) if(CLR_CMAKE_HOST_APPLE) - add_linker_flag(-Wl,-dead_strip CHECKED) - add_linker_flag(-Wl,-dead_strip RELEASE) - add_linker_flag(-Wl,-dead_strip RELWITHDEBINFO) + add_linker_flag($<$:-Wl,-dead_strip>) else() - add_linker_flag(-Wl,--gc-sections CHECKED) - add_linker_flag(-Wl,--gc-sections RELEASE) - add_linker_flag(-Wl,--gc-sections RELWITHDEBINFO) + add_linker_flag($<$:-Wl,--gc-sections>) endif() endif() From 1b6ca5222348526f595ef8da8137f0d7381f2d91 Mon Sep 17 00:00:00 2001 From: Elinor Fung Date: Fri, 15 May 2026 08:40:07 -0700 Subject: [PATCH 03/10] Apply suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- eng/native/configurecompiler.cmake | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 847697fb0dc66d..c4c438106ed20c 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -326,9 +326,9 @@ endif(CLR_CMAKE_HOST_UNIX) # keeps full symbols and incremental linking. Windows uses /OPT:REF, configured above. if(CLR_CMAKE_HOST_UNIX) if(CLR_CMAKE_HOST_APPLE) - add_linker_flag($<$:-Wl,-dead_strip>) + add_linker_flag(-Wl,-dead_strip CHECKED RELEASE RELWITHDEBINFO) else() - add_linker_flag($<$:-Wl,--gc-sections>) + add_linker_flag(-Wl,--gc-sections CHECKED RELEASE RELWITHDEBINFO) endif() endif() @@ -753,7 +753,7 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) # Separate functions and data into their own sections so the linker can remove # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O), which are - # enabled below for non-Debug configurations. + # enabled earlier in this file for non-Debug configurations. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) From 0884acd63ec9c96378ed429be6ebd9fc3f7ea5f5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 May 2026 01:48:09 +0000 Subject: [PATCH 04/10] Move section-GC linker flags next to compile options Co-authored-by: elinor-fung <47805090+elinor-fung@users.noreply.github.com> --- eng/native/configurecompiler.cmake | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index c4c438106ed20c..c8f2009d566a12 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -321,17 +321,6 @@ if(CLR_CMAKE_HOST_UNIX) endforeach() endif(CLR_CMAKE_HOST_UNIX) -# Strip unreferenced sections at link time, paired with -ffunction-sections/-fdata-sections -# (set in the Unix/WASI compile-options block below). Gated to non-Debug builds so Debug -# keeps full symbols and incremental linking. Windows uses /OPT:REF, configured above. -if(CLR_CMAKE_HOST_UNIX) - if(CLR_CMAKE_HOST_APPLE) - add_linker_flag(-Wl,-dead_strip CHECKED RELEASE RELWITHDEBINFO) - else() - add_linker_flag(-Wl,--gc-sections CHECKED RELEASE RELWITHDEBINFO) - endif() -endif() - if(CLR_CMAKE_HOST_LINUX) add_compile_options($<$:-Wa,--noexecstack>) add_linker_flag(-Wl,--build-id=sha1) @@ -752,10 +741,18 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) add_compile_options(-fvisibility=hidden) # Separate functions and data into their own sections so the linker can remove - # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O), which are - # enabled earlier in this file for non-Debug configurations. + # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O). Gated to + # non-Debug builds so Debug keeps full symbols and incremental linking. Windows + # uses /OPT:REF, configured above. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) + if(CLR_CMAKE_HOST_UNIX) + if(CLR_CMAKE_HOST_APPLE) + add_linker_flag(-Wl,-dead_strip CHECKED RELEASE RELWITHDEBINFO) + else() + add_linker_flag(-Wl,--gc-sections CHECKED RELEASE RELWITHDEBINFO) + endif() + endif() # Specify the minimum supported version of macOS # Mac Catalyst needs a special CFLAG, exclusive with mmacosx-version-min From 19b73c8a3efcae3fed6d52676248b856530d960d Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 18 May 2026 18:54:35 -0700 Subject: [PATCH 05/10] Apply suggestion from @jkotas --- eng/native/configurecompiler.cmake | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index c8f2009d566a12..1b61d5574bcc13 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -746,12 +746,10 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) # uses /OPT:REF, configured above. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) - if(CLR_CMAKE_HOST_UNIX) - if(CLR_CMAKE_HOST_APPLE) - add_linker_flag(-Wl,-dead_strip CHECKED RELEASE RELWITHDEBINFO) - else() - add_linker_flag(-Wl,--gc-sections CHECKED RELEASE RELWITHDEBINFO) - endif() + if(CLR_CMAKE_HOST_APPLE) + add_linker_flag(-Wl,-dead_strip CHECKED RELEASE RELWITHDEBINFO) + else() + add_linker_flag(-Wl,--gc-sections CHECKED RELEASE RELWITHDEBINFO) endif() # Specify the minimum supported version of macOS From 479c6d0cb15293f6ed66666d4ce9b1ed315ed0ce Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 18 May 2026 18:57:58 -0700 Subject: [PATCH 06/10] Apply suggestion from @jkotas --- eng/native/configurecompiler.cmake | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 1b61d5574bcc13..ffa75498a34b6c 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -742,8 +742,7 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) # Separate functions and data into their own sections so the linker can remove # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O). Gated to - # non-Debug builds so Debug keeps full symbols and incremental linking. Windows - # uses /OPT:REF, configured above. + # non-Debug builds so Debug keeps full symbols. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) if(CLR_CMAKE_HOST_APPLE) From 774bd043b881655e47381ffdad32709d95a50bd3 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 18 May 2026 19:04:57 -0700 Subject: [PATCH 07/10] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- eng/native/configurecompiler.cmake | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index ffa75498a34b6c..a6a54e4e9ef616 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -741,8 +741,9 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) add_compile_options(-fvisibility=hidden) # Separate functions and data into their own sections so the linker can remove - # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O). Gated to - # non-Debug builds so Debug keeps full symbols. + # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O). + # The compile options apply to all configurations; only the linker GC flags + # below are gated to non-Debug builds so Debug keeps full symbols. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) if(CLR_CMAKE_HOST_APPLE) From d39b76e3ca3d9f0aac284cd3382af361f5549ef8 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 18 May 2026 19:05:55 -0700 Subject: [PATCH 08/10] Apply suggestion from @jkotas --- eng/native/configurecompiler.cmake | 2 -- 1 file changed, 2 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index a6a54e4e9ef616..615a9b00091aa5 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -742,8 +742,6 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) # Separate functions and data into their own sections so the linker can remove # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O). - # The compile options apply to all configurations; only the linker GC flags - # below are gated to non-Debug builds so Debug keeps full symbols. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) if(CLR_CMAKE_HOST_APPLE) From 8c2e66c2e7984769b57650395f65d78dd4deb609 Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Mon, 18 May 2026 19:08:34 -0700 Subject: [PATCH 09/10] Apply suggestion from @jkotas --- eng/native/configurecompiler.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 615a9b00091aa5..0e4b5b7d54f9c1 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -741,7 +741,7 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) add_compile_options(-fvisibility=hidden) # Separate functions and data into their own sections so the linker can remove - # unreferenced ones via --gc-sections (ELF) / -dead_strip (Mach-O). + # unreferenced ones. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) if(CLR_CMAKE_HOST_APPLE) From 3218da6ec03bdb7e70e50c3000d3ef44b931b09e Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Tue, 19 May 2026 06:39:02 -0700 Subject: [PATCH 10/10] Update eng/native/configurecompiler.cmake Co-authored-by: Adeel Mujahid <3840695+am11@users.noreply.github.com> --- eng/native/configurecompiler.cmake | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eng/native/configurecompiler.cmake b/eng/native/configurecompiler.cmake index 0e4b5b7d54f9c1..5945819bd95152 100644 --- a/eng/native/configurecompiler.cmake +++ b/eng/native/configurecompiler.cmake @@ -744,9 +744,9 @@ if (CLR_CMAKE_HOST_UNIX OR CLR_CMAKE_HOST_WASI) # unreferenced ones. add_compile_options(-ffunction-sections) add_compile_options(-fdata-sections) - if(CLR_CMAKE_HOST_APPLE) + if(LD_OSX) add_linker_flag(-Wl,-dead_strip CHECKED RELEASE RELWITHDEBINFO) - else() + elseif(NOT LD_SOLARIS) add_linker_flag(-Wl,--gc-sections CHECKED RELEASE RELWITHDEBINFO) endif()