From fc6a4b045ff797f036f2f800e54a47154da01522 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Thu, 7 Apr 2016 21:04:51 +0000 Subject: [PATCH] ELF: Add --strip-debug option. If --strip-debug option is given, then all sections whose names start with ".debug" are removed from output. llvm-svn: 265722 --- lld/ELF/Config.h | 1 + lld/ELF/Driver.cpp | 10 ++++++++-- lld/ELF/InputFiles.cpp | 7 ++++++- lld/ELF/Options.td | 3 +++ lld/test/ELF/strip-debug.s | 23 +++++++++++++++++++++++ 5 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 lld/test/ELF/strip-debug.s diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 8c48996..2cf9459 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 72e4bae..612b220 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 6eb2dc65..1aa0318 100644 --- a/lld/ELF/InputFiles.cpp +++ b/lld/ELF/InputFiles.cpp @@ -262,8 +262,13 @@ elf::ObjectFile::createInputSection(const Elf_Shdr &Sec) { if (Name == ".note.GNU-stack") return &InputSection::Discarded; - if (Name == ".note.GNU-split-stack") + if (Name == ".note.GNU-split-stack") { error("objects using splitstacks are not supported"); + return &InputSection::Discarded; + } + + if (Config->StripDebug && Name.startswith(".debug")) + return &InputSection::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 b1881f2..1cd250e 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 0000000..4075fe6 --- /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 -- 2.7.4