diff options
| author | George Rimar <grimar@accesssoftek.com> | 2015-10-24 08:52:46 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2015-10-24 08:52:46 +0000 |
| commit | 5dad7c1d4c41cd7e9ecce648de2c8f3f4226b9cb (patch) | |
| tree | 9195d65a8274f52b7159fc84df87dd64c1c766d9 | |
| parent | b1b67f4daf3e981800ae978068efc94b78087a40 (diff) | |
| download | bcm5719-llvm-5dad7c1d4c41cd7e9ecce648de2c8f3f4226b9cb.tar.gz bcm5719-llvm-5dad7c1d4c41cd7e9ecce648de2c8f3f4226b9cb.zip | |
Reapply r251144: fixed test.
llvm-svn: 251184
| -rw-r--r-- | lld/ELF/Config.h | 1 | ||||
| -rw-r--r-- | lld/ELF/Driver.cpp | 1 | ||||
| -rw-r--r-- | lld/ELF/Options.td | 5 | ||||
| -rw-r--r-- | lld/ELF/Writer.cpp | 22 | ||||
| -rw-r--r-- | lld/test/elf2/strip-all.s | 25 |
5 files changed, 46 insertions, 8 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index 612ad8fa347..3d2d63d967c 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -58,6 +58,7 @@ struct Configuration { bool NoUndefined; bool Shared; bool Static = false; + bool StripAll; bool SysvHash = true; bool Verbose; bool ZNodelete = false; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index ee74722d5b7..5a428801a38 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -146,6 +146,7 @@ void LinkerDriver::createFiles(opt::InputArgList &Args) { Config->NoInhibitExec = Args.hasArg(OPT_noinhibit_exec); Config->NoUndefined = Args.hasArg(OPT_no_undefined); Config->Shared = Args.hasArg(OPT_shared); + Config->StripAll = Args.hasArg(OPT_strip_all); Config->Verbose = Args.hasArg(OPT_verbose); Config->DynamicLinker = getString(Args, OPT_dynamic_linker); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 3bf076eb808..b5aa4e6ffd0 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -90,6 +90,9 @@ def shared : Flag<["-"], "shared">, def soname : Joined<["-"], "soname=">, HelpText<"Set DT_SONAME">; +def strip_all : Flag<["--"], "strip-all">, + HelpText<"Strip all symbols">; + def sysroot : Joined<["--"], "sysroot=">, HelpText<"Set the system root">; @@ -124,6 +127,7 @@ def alias_shared_Bshareable : Flag<["-"], "Bshareable">, Alias<shared>; def alias_soname_h : Separate<["-"], "h">, Alias<soname>; def alias_soname_soname : Separate<["-"], "soname">, Alias<soname>; def alias_script_T : Separate<["-"], "T">, Alias<script>; +def alias_strip_all: Flag<["-"], "s">, Alias<strip_all>; def alias_undefined_u : Separate<["-"], "u">, Alias<undefined>; // Options listed below are silently ignored now. @@ -135,7 +139,6 @@ def no_add_needed : Flag<["--"], "no-add-needed">; def no_fatal_warnings : Flag<["--"], "no-fatal-warnings">; def no_warn_mismatch : Flag<["--"], "no-warn-mismatch">; def start_group : Flag<["--"], "start-group">; -def strip_all : Flag<["--"], "strip-all">; def version_script : Separate<["--"], "version-script">; def warn_common : Flag<["--"], "warn-common">; def warn_shared_textrel : Flag<["--"], "warn-shared-textrel">; diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 96fe3acfddf..229d2fe5572 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -99,7 +99,8 @@ template <class ELFT> void lld::elf2::writeResult(SymbolTable<ELFT> *Symtab) { StringTableSection<ELFT> ShStrTab(".shstrtab", false); Out<ELFT>::ShStrTab = &ShStrTab; StringTableSection<ELFT> StrTab(".strtab", false); - Out<ELFT>::StrTab = &StrTab; + if (!Config->StripAll) + Out<ELFT>::StrTab = &StrTab; StringTableSection<ELFT> DynStrTab(".dynstr", true); Out<ELFT>::DynStrTab = &DynStrTab; OutputSection<ELFT> Bss(".bss", SHT_NOBITS, SHF_ALLOC | SHF_WRITE); @@ -111,8 +112,11 @@ template <class ELFT> void lld::elf2::writeResult(SymbolTable<ELFT> *Symtab) { Out<ELFT>::GotPlt = &GotPlt; PltSection<ELFT> Plt; Out<ELFT>::Plt = &Plt; - SymbolTableSection<ELFT> SymTab(*Symtab, *Out<ELFT>::StrTab); - Out<ELFT>::SymTab = &SymTab; + std::unique_ptr<SymbolTableSection<ELFT>> SymTab; + if (!Config->StripAll) { + SymTab.reset(new SymbolTableSection<ELFT>(*Symtab, *Out<ELFT>::StrTab)); + Out<ELFT>::SymTab = SymTab.get(); + } SymbolTableSection<ELFT> DynSymTab(*Symtab, *Out<ELFT>::DynStrTab); Out<ELFT>::DynSymTab = &DynSymTab; HashTableSection<ELFT> HashTab; @@ -288,7 +292,8 @@ template <class ELFT> void Writer<ELFT>::copyLocalSymbols() { StringRef SymName = *SymNameOrErr; if (!shouldKeepInSymtab<ELFT>(*F, SymName, Sym)) continue; - Out<ELFT>::SymTab->addLocalSymbol(SymName); + if (Out<ELFT>::SymTab) + Out<ELFT>::SymTab->addLocalSymbol(SymName); } } } @@ -513,7 +518,8 @@ template <class ELFT> void Writer<ELFT>::createSections() { CommonSymbols.push_back(C); if (!includeInSymtab<ELFT>(*Body)) continue; - Out<ELFT>::SymTab->addSymbol(Body); + if (Out<ELFT>::SymTab) + Out<ELFT>::SymTab->addSymbol(Body); if (isOutputDynamic() && includeInDynamicSymtab(*Body)) Out<ELFT>::DynSymTab->addSymbol(Body); @@ -522,9 +528,11 @@ template <class ELFT> void Writer<ELFT>::createSections() { // This order is not the same as the final output order // because we sort the sections using their attributes below. - OutputSections.push_back(Out<ELFT>::SymTab); + if (Out<ELFT>::SymTab) + OutputSections.push_back(Out<ELFT>::SymTab); OutputSections.push_back(Out<ELFT>::ShStrTab); - OutputSections.push_back(Out<ELFT>::StrTab); + if (Out<ELFT>::StrTab) + OutputSections.push_back(Out<ELFT>::StrTab); if (isOutputDynamic()) { OutputSections.push_back(Out<ELFT>::DynSymTab); if (Out<ELFT>::GnuHashTab) diff --git a/lld/test/elf2/strip-all.s b/lld/test/elf2/strip-all.s new file mode 100644 index 00000000000..1c9a98dff4f --- /dev/null +++ b/lld/test/elf2/strip-all.s @@ -0,0 +1,25 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o +# RUN: ld.lld2 %t.o -o %t1 +#RUN: llvm-objdump -section-headers %t1 | FileCheck %s -check-prefix BEFORE +#BEFORE: 4 .symtab 00000030 +#BEFORE-NEXT: 5 .shstrtab 0000002c +#BEFORE-NEXT: 6 .strtab 00000008 + +#RUN: ld.lld2 %t.o --strip-all -o %t1 +#RUN: llvm-objdump -section-headers %t1 | FileCheck %s -check-prefix AFTER +#AFTER-NOT: .symtab +#AFTER: 4 .shstrtab 0000001c +#AFTER-NOT: .strtab + +# Test alias -s +#RUN: ld.lld2 %t.o -s -o %t1 +#RUN: llvm-objdump -section-headers %t1 | FileCheck %s -check-prefix AFTER + +# exits with return code 42 on linux +.globl _start; +_start: + mov $60, %rax + mov $42, %rdi + syscall |

