[lld] [lld][ELF]Emit warning when both scripts are specified (PR #163497)

Mingming Liu via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 14 22:03:18 PDT 2025


https://github.com/mingmingl-llvm created https://github.com/llvm/llvm-project/pull/163497

For lld ELF, there are two ways of specifying linker script, `-Wl,--script` and `-Wl,--default-script`. The latter one is used if the former one is absent, and the former one takes precedence.

This patch proposes to emit warning for compiler user information when both are specified.

>From b0f593ab438100e57457ea6615b6d9fa0f56f1d7 Mon Sep 17 00:00:00 2001
From: mingmingl <mingmingl at google.com>
Date: Tue, 14 Oct 2025 22:00:54 -0700
Subject: [PATCH] [lld][ELF]Emit warning when both scripts are specified

---
 lld/ELF/Driver.cpp                         |  9 +++++++++
 lld/test/ELF/linkerscript/default-script.s | 12 ++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 62f7fffce7dbe..c8cce0810ef9a 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -2091,6 +2091,7 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
   nextGroupId = 0;
   isInGroup = false;
   bool hasInput = false, hasScript = false;
+  StringRef scriptFilePath, defaultScriptFilePath;
   for (auto *arg : args) {
     switch (arg->getOption().getID()) {
     case OPT_library:
@@ -2106,7 +2107,11 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
       break;
     }
     case OPT_script:
+      scriptFilePath = arg->getValue();
+      [[fallthrough]];
     case OPT_default_script:
+      if (arg->getOption().matches(OPT_default_script))
+        defaultScriptFilePath = arg->getValue();
       if (std::optional<std::string> path =
               searchScript(ctx, arg->getValue())) {
         if (std::optional<MemoryBufferRef> mb = readFile(ctx, *path)) {
@@ -2201,6 +2206,10 @@ void LinkerDriver::createFiles(opt::InputArgList &args) {
 
   if (defaultScript && !hasScript)
     readLinkerScript(ctx, *defaultScript);
+  if (defaultScript && hasScript)
+    Warn(ctx) << "--script at path " << scriptFilePath
+              << " will override --default-script at path "
+              << defaultScriptFilePath;
   if (files.empty() && !hasInput && errCount(ctx) == 0)
     ErrAlways(ctx) << "no input files";
 }
diff --git a/lld/test/ELF/linkerscript/default-script.s b/lld/test/ELF/linkerscript/default-script.s
index bb716a5fe0cdd..a06f96b7165d4 100644
--- a/lld/test/ELF/linkerscript/default-script.s
+++ b/lld/test/ELF/linkerscript/default-script.s
@@ -32,6 +32,17 @@
 # CHECK1-NEXT: 3: 000000000000002a     0 NOTYPE  GLOBAL DEFAULT   ABS def
 # CHECK1-EMPTY:
 
+## When both --script and --default-script are specified, --script overrides
+## --default-script.
+# RUN: ld.lld --default-script def.t --script b.t a.o -o out2 2>warn.txt
+# RUN: llvm-readelf -Ss out2 | FileCheck %s --check-prefix=OVERRIDE
+# OVERRIDE:      .foo0
+# OVERRIDE-NEXT: foo1
+# OVERRIDE-NEXT: foo2
+# RUN: cat warn.txt | FileCheck %s --check-prefix=WARNING
+# WARNING: --script at path b.t will override --default-script at path def.t
+
+
 # RUN: not ld.lld --default-script not-exist.t b.t -T a.t a.o 2>&1 | FileCheck %s --check-prefix=ERR
 # ERR: error: cannot find linker script not-exist.t
 
@@ -61,3 +72,4 @@ SECTIONS {
   .foo1 : {}
   .foo0 : {}
 }
+



More information about the llvm-commits mailing list