diff --git a/driver/linker-gcc.cpp b/driver/linker-gcc.cpp index c9d67b73ff..b1e5038dbf 100644 --- a/driver/linker-gcc.cpp +++ b/driver/linker-gcc.cpp @@ -577,7 +577,9 @@ void ArgsBuilder::addLinker() { // Default to ld.gold on Linux due to ld.bfd issues with ThinLTO (see #2278) // and older bfd versions stripping llvm.used symbols (e.g., ModuleInfo // refs) with --gc-sections (see #2870). - args.push_back("-fuse-ld=gold"); + // Can be overridden by `-linker=` (explicitly empty). + if (opts::linker.getNumOccurrences() == 0) + args.push_back("-fuse-ld=gold"); } } diff --git a/driver/tool.cpp b/driver/tool.cpp index aeb1fb167d..d1dd8b3c7d 100644 --- a/driver/tool.cpp +++ b/driver/tool.cpp @@ -27,10 +27,12 @@ ////////////////////////////////////////////////////////////////////////////// namespace opts { -llvm::cl::opt - linker("linker", llvm::cl::ZeroOrMore, llvm::cl::desc("Linker to use"), - llvm::cl::value_desc("lld-link|lld|gold|bfd|..."), - llvm::cl::cat(opts::linkingCategory)); +llvm::cl::opt linker( + "linker", llvm::cl::ZeroOrMore, + llvm::cl::value_desc("lld-link|lld|gold|bfd|..."), + llvm::cl::desc("Set the linker to use. When explicitly set to '' " + "(nothing), prevents LDC from passing `-fuse-ld` to `cc`."), + llvm::cl::cat(opts::linkingCategory)); } static llvm::cl::opt diff --git a/tests/linking/linker_empty.d b/tests/linking/linker_empty.d new file mode 100644 index 0000000000..f66d3d56d0 --- /dev/null +++ b/tests/linking/linker_empty.d @@ -0,0 +1,9 @@ +// Check that the user can override LDC passing `-fuse-ld` to `cc`. + +// REQUIRES: target_X86 + +// RUN: %ldc --gcc=echo --mtriple=x86_64-linux --linker= %s | FileCheck %s + +// CHECK-NOT: -fuse-ld +// CHECK: linker_empty +// CHECK-NOT: -fuse-ld