diff options
-rw-r--r-- | lld/ELF/Config.h | 1 | ||||
-rw-r--r-- | lld/ELF/Driver.cpp | 10 | ||||
-rw-r--r-- | lld/ELF/InputFiles.cpp | 7 | ||||
-rw-r--r-- | lld/ELF/Options.td | 3 | ||||
-rw-r--r-- | lld/test/ELF/strip-debug.s | 23 |
5 files changed, 41 insertions, 3 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 8c48996aaa6..2cf945918cd 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -79,6 +79,7 @@ struct Configuration { bool Shared; bool Static = false; bool StripAll; + bool StripDebug; bool SysvHash = true; bool Threads; bool Trace; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 72e4bae505d..612b2203023 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -291,6 +291,7 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->SaveTemps = Args.hasArg(OPT_save_temps); Config->Shared = Args.hasArg(OPT_shared); Config->StripAll = Args.hasArg(OPT_strip_all); + Config->StripDebug = Args.hasArg(OPT_strip_debug); Config->Threads = Args.hasArg(OPT_threads); Config->Trace = Args.hasArg(OPT_trace); Config->Verbose = Args.hasArg(OPT_verbose); @@ -315,11 +316,16 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { Config->ZOrigin = hasZOption(Args, "origin"); Config->ZRelro = !hasZOption(Args, "norelro"); - Config->Pic = Config->Pie || Config->Shared; - if (Config->Relocatable) Config->StripAll = false; + // --strip-all implies --strip-debug. + if (Config->StripAll) + Config->StripDebug = true; + + // Config->Pic is true if we are generating position-independent code. + Config->Pic = Config->Pie || Config->Shared; + if (auto *Arg = Args.getLastArg(OPT_hash_style)) { StringRef S = Arg->getValue(); if (S == "gnu") { diff --git a/lld/ELF/InputFiles.cpp b/lld/ELF/InputFiles.cpp index 6eb2dc65e6c..1aa03189dcc 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -262,8 +262,13 @@ elf::ObjectFile<ELFT>::createInputSection(const Elf_Shdr &Sec) { if (Name == ".note.GNU-stack") return &InputSection<ELFT>::Discarded; - if (Name == ".note.GNU-split-stack") + if (Name == ".note.GNU-split-stack") { error("objects using splitstacks are not supported"); + return &InputSection<ELFT>::Discarded; + } + + if (Config->StripDebug && Name.startswith(".debug")) + return &InputSection<ELFT>::Discarded; // A MIPS object file has a special section that contains register // usage info, which needs to be handled by the linker specially. diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index b1881f21fab..1cd250e5f2f 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -133,6 +133,9 @@ def start_lib : Flag<["--"], "start-lib">, def strip_all : Flag<["--"], "strip-all">, HelpText<"Strip all symbols">; +def strip_debug : Flag<["--"], "strip-debug">, + HelpText<"Strip debugging information">; + def sysroot : Joined<["--"], "sysroot=">, HelpText<"Set the system root">; diff --git a/lld/test/ELF/strip-debug.s b/lld/test/ELF/strip-debug.s new file mode 100644 index 00000000000..4075fe604e6 --- /dev/null +++ b/lld/test/ELF/strip-debug.s @@ -0,0 +1,23 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux -g %s -o %t +# RUN: ld.lld %t -o %t2 +# RUN: llvm-readobj -sections -symbols %t2 | FileCheck -check-prefix=DEFAULT %s +# RUN: ld.lld %t -o %t2 --strip-debug +# RUN: llvm-readobj -sections -symbols %t2 | FileCheck -check-prefix=STRIP %s +# RUN: ld.lld %t -o %t2 --strip-all +# RUN: llvm-readobj -sections -symbols %t2 | FileCheck -check-prefix=STRIP %s + +# DEFAULT: Name: .debug_info +# DEFAULT: Name: .debug_abbrev +# DEFAULT: Name: .debug_aranges +# DEFAULT: Name: .debug_line + +# STRIP-NOT: Name: .debug_info +# STRIP-NOT: Name: .debug_abbrev +# STRIP-NOT: Name: .debug_aranges +# STRIP-NOT: Name: .debug_line + +.globl _start +_start: + ret |