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 path = searchScript(ctx, arg->getValue())) { if (std::optional 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..d1aae029de404 100644 --- a/lld/test/ELF/linkerscript/default-script.s +++ b/lld/test/ELF/linkerscript/default-script.s @@ -32,6 +32,16 @@ # 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