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

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


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lld

Author: Mingming Liu (mingmingl-llvm)

<details>
<summary>Changes</summary>

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.

---
Full diff: https://github.com/llvm/llvm-project/pull/163497.diff


2 Files Affected:

- (modified) lld/ELF/Driver.cpp (+9) 
- (modified) lld/test/ELF/linkerscript/default-script.s (+12) 


``````````diff
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 : {}
 }
+

``````````

</details>


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


More information about the llvm-commits mailing list