diff options
| -rw-r--r-- | lld/ELF/Driver.cpp | 10 | ||||
| -rw-r--r-- | lld/ELF/Options.td | 4 | ||||
| -rw-r--r-- | lld/test/ELF/no-dynamic-linker.s | 12 |
3 files changed, 23 insertions, 3 deletions
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index fcde0eb32df..891948ddd04 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -434,6 +434,13 @@ static DiscardPolicy getDiscardOption(opt::InputArgList &Args) { return DiscardPolicy::None; } +static StringRef getDynamicLinkerOption(opt::InputArgList &Args) { + auto *Arg = Args.getLastArg(OPT_dynamic_linker, OPT_no_dynamic_linker); + if (!Arg || Arg->getOption().getID() == OPT_no_dynamic_linker) + return ""; + return Arg->getValue(); +} + static StripPolicy getStripOption(opt::InputArgList &Args) { if (auto *Arg = Args.getLastArg(OPT_strip_all, OPT_strip_debug)) { if (Arg->getOption().getID() == OPT_strip_all) @@ -548,8 +555,6 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->Trace = Args.hasArg(OPT_trace); Config->Verbose = Args.hasArg(OPT_verbose); Config->WarnCommon = Args.hasArg(OPT_warn_common); - - Config->DynamicLinker = getString(Args, OPT_dynamic_linker); Config->Entry = getString(Args, OPT_entry); Config->Fini = getString(Args, OPT_fini, "_fini"); Config->Init = getString(Args, OPT_init, "_init"); @@ -582,6 +587,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->ZStackSize = getZOptionValue(Args, "stack-size", 0); Config->ZWxneeded = hasZOption(Args, "wxneeded"); + Config->DynamicLinker = getDynamicLinkerOption(Args); Config->OFormatBinary = isOutputFormatBinary(Args); Config->SectionStartMap = getSectionStartMap(Args); Config->SortSection = getSortKind(Args); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 23fbcbdc559..508ab320533 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -148,6 +148,9 @@ def no_define_common: F<"no-define-common">, def no_demangle: F<"no-demangle">, HelpText<"Do not demangle symbol names">; +def no_dynamic_linker: F<"no-dynamic-linker">, + HelpText<"Inhibit output of .interp section">; + def no_export_dynamic: F<"no-export-dynamic">; def no_fatal_warnings: F<"no-fatal-warnings">; @@ -357,7 +360,6 @@ def no_add_needed: F<"no-add-needed">; def no_allow_shlib_undefined: F<"no-allow-shlib-undefined">; def no_copy_dt_needed_entries: F<"no-copy-dt-needed-entries">, Alias<no_add_needed>; -def no_dynamic_linker: F<"no-dynamic-linker">; def no_mmap_output_file: F<"no-mmap-output-file">; def no_warn_common: F<"no-warn-common">; def no_warn_mismatch: F<"no-warn-mismatch">; diff --git a/lld/test/ELF/no-dynamic-linker.s b/lld/test/ELF/no-dynamic-linker.s new file mode 100644 index 00000000000..f5c7f4b8d07 --- /dev/null +++ b/lld/test/ELF/no-dynamic-linker.s @@ -0,0 +1,12 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/shared.s -o %tso.o +# RUN: ld.lld -shared %tso.o -o %t.so +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o + +# RUN: ld.lld -dynamic-linker foo --no-dynamic-linker %t.o %t.so -o %t +# RUN: llvm-readobj --program-headers %t | FileCheck %s --check-prefix=NODL +# NODL-NOT: PT_INTERP + +# RUN: ld.lld --no-dynamic-linker -dynamic-linker foo %t.o %t.so -o %t +# RUN: llvm-readobj --program-headers %t | FileCheck %s --check-prefix=WITHDL +# WITHDL: PT_INTERP |

