diff --git a/lld/CMakeLists.txt b/lld/CMakeLists.txt --- a/lld/CMakeLists.txt +++ b/lld/CMakeLists.txt @@ -186,6 +186,15 @@ add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1") endif() +option(LLD_DEFAULT_NOSTART_STOP_GC + "Default ld.lld to -z nostart-stop-gc. If ON, C identifier name sections are + forced retained by __start_/__stop_ references. This may increase output size + for many instrumentations, but is compatible with GNU ld newer than 2015-10" + OFF) +if (LLD_DEFAULT_NOSTART_STOP_GC) + add_definitions("-DLLD_DEFAULT_NOSTART_STOP_GC=1") +endif() + if (MSVC) add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.' add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header. diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -1184,8 +1184,17 @@ config->zSeparate = getZSeparate(args); config->zShstk = hasZOption(args, "shstk"); config->zStackSize = args::getZOptionValue(args, OPT_z, "stack-size", 0); +#ifdef LLD_DEFAULT_NOSTART_STOP_GC + // -z start-stop-gc default matches GNU ld<2015-10 and ld64 section$start + // symbols and can decrease file size for many instrumentations. However, + // some users need time to accommodate the -z nostart-stop-gc default, so this + // is added as a temporary workaround. + config->zStartStopGC = + getZFlag(args, "start-stop-gc", "nostart-stop-gc", false); +#else config->zStartStopGC = getZFlag(args, "start-stop-gc", "nostart-stop-gc", true); +#endif config->zStartStopVisibility = getZStartStopVisibility(args); config->zText = getZFlag(args, "text", "notext", true); config->zWxneeded = hasZOption(args, "wxneeded"); diff --git a/lld/test/CMakeLists.txt b/lld/test/CMakeLists.txt --- a/lld/test/CMakeLists.txt +++ b/lld/test/CMakeLists.txt @@ -11,6 +11,7 @@ LLVM_ENABLE_ZLIB LLVM_ENABLE_LIBXML2 LLD_DEFAULT_LD_LLD_IS_MINGW + LLD_DEFAULT_NOSTART_STOP_GC LLVM_HAVE_LIBXAR ) diff --git a/lld/test/ELF/gc-sections-metadata-startstop.s b/lld/test/ELF/gc-sections-metadata-startstop.s --- a/lld/test/ELF/gc-sections-metadata-startstop.s +++ b/lld/test/ELF/gc-sections-metadata-startstop.s @@ -1,4 +1,5 @@ # REQUIRES: x86 +# UNSUPPORTED: default-nostart-stop-gc # LINK_ORDER cnamed sections are not kept alive by the __start_* reference. # RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o diff --git a/lld/test/ELF/gc-sections-startstop-hint.s b/lld/test/ELF/gc-sections-startstop-hint.s --- a/lld/test/ELF/gc-sections-startstop-hint.s +++ b/lld/test/ELF/gc-sections-startstop-hint.s @@ -1,4 +1,5 @@ # REQUIRES: x86 +# UNSUPPORTED: default-nostart-stop-gc ## Some projects may not work with GNU ld<2015-10 (ld.lld 13.0.0) --gc-sections behavior. ## Give a hint. diff --git a/lld/test/ELF/gc-sections-startstop.s b/lld/test/ELF/gc-sections-startstop.s --- a/lld/test/ELF/gc-sections-startstop.s +++ b/lld/test/ELF/gc-sections-startstop.s @@ -1,6 +1,7 @@ ## Check that group members are retained or discarded as a unit. # REQUIRES: x86 +# UNSUPPORTED: default-nostart-stop-gc # RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o # RUN: ld.lld %t.o --gc-sections -o %t diff --git a/lld/test/lit.cfg.py b/lld/test/lit.cfg.py --- a/lld/test/lit.cfg.py +++ b/lld/test/lit.cfg.py @@ -131,3 +131,6 @@ # ELF tests expect the default target for ld.lld to be ELF. if config.ld_lld_default_mingw: config.excludes.append('ELF') + +if config.ld_lld_default_nostart_stop_gc: + config.available_features.add('default-nostart-stop-gc') diff --git a/lld/test/lit.site.cfg.py.in b/lld/test/lit.site.cfg.py.in --- a/lld/test/lit.site.cfg.py.in +++ b/lld/test/lit.site.cfg.py.in @@ -19,6 +19,7 @@ config.have_libxml2 = @LLVM_ENABLE_LIBXML2@ config.sizeof_void_p = @CMAKE_SIZEOF_VOID_P@ config.ld_lld_default_mingw = @LLD_DEFAULT_LD_LLD_IS_MINGW@ +config.ld_lld_default_nostart_stop_gc = @LLD_DEFAULT_NOSTART_STOP_GC@ # Support substitution of the tools and libs dirs with user parameters. This is # used when we can't determine the tool dir at configuration time.