diff --git a/llvm/test/tools/llvm-objcopy/strip-unneeded.test b/llvm/test/tools/llvm-objcopy/strip-unneeded.test deleted file mode 100644 index 448bc5330389..000000000000 --- a/llvm/test/tools/llvm-objcopy/strip-unneeded.test +++ /dev/null @@ -1,136 +0,0 @@ -# RUN: yaml2obj %s > %t -# RUN: llvm-objcopy --strip-unneeded %t %t2 -# RUN: llvm-readobj -symbols %t2 | FileCheck %s - -!ELF -FileHeader: - Class: ELFCLASS64 - Data: ELFDATA2LSB - Type: ET_REL - Machine: EM_X86_64 -Sections: - - Name: .text - Type: SHT_PROGBITS - Flags: [ SHF_ALLOC, SHF_EXECINSTR ] - Address: 0x1000 - AddressAlign: 0x0000000000000010 - Size: 64 - - Name: .group - Type: SHT_GROUP - Link: .symtab - AddressAlign: 0x0000000000000004 - Info: barfoo - Members: - - SectionOrType: GRP_COMDAT - - SectionOrType: .text - - Name: .rel.text - Type: SHT_REL - Link: .symtab - Info: .text - Relocations: - - Offset: 0x1000 - Symbol: foo - Type: R_X86_64_PC32 -Symbols: - Local: - - Name: foo - Type: STT_FUNC - Section: .text - Value: 0x1000 - Size: 8 - - Name: bar - Type: STT_FUNC - Size: 8 - Section: .text - Value: 0x1008 - - Name: barfoo - Type: STT_FUNC - Size: 8 - Section: .text - Value: 0x1010 - - Name: fileSymbol - Type: STT_FILE - - Name: sectionSymbol - Type: STT_SECTION - Weak: - - Name: baz - Type: STT_FUNC - Size: 8 - Section: .text - Value: 0x1018 - - Name: foobaz - Type: STT_FUNC - Global: - - Name: foobar - Type: STT_FUNC - - Name: barbaz - Type: STT_FUNC - Size: 8 - Section: .text - Value: 0x1020 - -#CHECK: Symbols [ -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: -#CHECK-NEXT: Value: 0x0 -#CHECK-NEXT: Size: 0 -#CHECK-NEXT: Binding: Local -#CHECK-NEXT: Type: None -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: Undefined -#CHECK-NEXT: } -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: foo -#CHECK-NEXT: Value: 0x1000 -#CHECK-NEXT: Size: 8 -#CHECK-NEXT: Binding: Local -#CHECK-NEXT: Type: Function -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: .text -#CHECK-NEXT: } -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: barfoo -#CHECK-NEXT: Value: 0x1010 -#CHECK-NEXT: Size: 8 -#CHECK-NEXT: Binding: Local -#CHECK-NEXT: Type: Function -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: .text -#CHECK-NEXT: } -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: fileSymbol -#CHECK-NEXT: Value: 0x0 -#CHECK-NEXT: Size: 0 -#CHECK-NEXT: Binding: Local -#CHECK-NEXT: Type: File -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: Undefined -#CHECK-NEXT: } -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: sectionSymbol -#CHECK-NEXT: Value: 0x0 -#CHECK-NEXT: Size: 0 -#CHECK-NEXT: Binding: Local -#CHECK-NEXT: Type: Section -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: Undefined -#CHECK-NEXT: } -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: barbaz -#CHECK-NEXT: Value: 0x1020 -#CHECK-NEXT: Size: 8 -#CHECK-NEXT: Binding: Global -#CHECK-NEXT: Type: Function -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: .text -#CHECK-NEXT: } -#CHECK-NEXT: Symbol { -#CHECK-NEXT: Name: baz -#CHECK-NEXT: Value: 0x1018 -#CHECK-NEXT: Size: 8 -#CHECK-NEXT: Binding: Weak -#CHECK-NEXT: Type: Function -#CHECK-NEXT: Other: 0 -#CHECK-NEXT: Section: .text -#CHECK-NEXT: } -#CHECK-NEXT:] diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td index e7c7541a32cc..9d1fb19c40c6 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td +++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td @@ -90,5 +90,3 @@ def K : JoinedOrSeparate<["-"], "K">, Alias; def only_keep_debug : Flag<["-", "--"], "only-keep-debug">, HelpText<"Currently ignored. Only for compaitability with GNU objcopy.">; -def strip_unneeded : Flag<["-", "--"], "strip-unneeded">, - HelpText<"Remove all symbols not needed by relocations">; diff --git a/llvm/tools/llvm-objcopy/Object.cpp b/llvm/tools/llvm-objcopy/Object.cpp index bd728270fb75..efb3207aa8da 100644 --- a/llvm/tools/llvm-objcopy/Object.cpp +++ b/llvm/tools/llvm-objcopy/Object.cpp @@ -185,7 +185,6 @@ void SymbolTableSection::addSymbol(StringRef Name, uint8_t Bind, uint8_t Type, Sym.Visibility = Visibility; Sym.Size = Sz; Sym.Index = Symbols.size(); - Sym.ReferenceCount = 0; Symbols.emplace_back(llvm::make_unique(Sym)); Size += this->EntrySize; } @@ -256,11 +255,6 @@ const Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) const { return Symbols[Index].get(); } -Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) { - return const_cast( - static_cast(this)->getSymbolByIndex(Index)); -} - template void ELFSectionWriter::visit(const SymbolTableSection &Sec) { uint8_t *Buf = Out.getBufferStart(); @@ -350,12 +344,6 @@ void RelocationSection::accept(SectionVisitor &Visitor) const { Visitor.visit(*this); } -RelocationSection::~RelocationSection() { - for (auto &Rel : Relocations) { - --Rel.RelocSymbol->ReferenceCount; - } -} - void RelocationSection::removeSymbols( function_ref ToRemove) { for (const Relocation &Reloc : Relocations) @@ -659,9 +647,7 @@ void initRelocations(RelocationSection *Relocs, SymbolTableSection *SymbolTable, ToAdd.Offset = Rel.r_offset; getAddend(ToAdd.Addend, Rel); ToAdd.Type = Rel.getType(false); - Symbol *Sym = SymbolTable->getSymbolByIndex(Rel.getSymbol(false)); - ++Sym->ReferenceCount; - ToAdd.RelocSymbol = Sym; + ToAdd.RelocSymbol = SymbolTable->getSymbolByIndex(Rel.getSymbol(false)); Relocs->addRelocation(ToAdd); } } diff --git a/llvm/tools/llvm-objcopy/Object.h b/llvm/tools/llvm-objcopy/Object.h index 74ef5a7ebccb..ac384c1fdfe6 100644 --- a/llvm/tools/llvm-objcopy/Object.h +++ b/llvm/tools/llvm-objcopy/Object.h @@ -344,7 +344,6 @@ struct Symbol { uint8_t Type; uint64_t Value; uint8_t Visibility; - uint32_t ReferenceCount; uint16_t getShndx() const; }; @@ -368,7 +367,6 @@ public: void addSymbolNames(); const SectionBase *getStrTab() const { return SymbolNames; } const Symbol *getSymbolByIndex(uint32_t Index) const; - Symbol *getSymbolByIndex(uint32_t Index); void updateSymbols(function_ref Callable); void removeSectionReferences(const SectionBase *Sec) override; @@ -383,7 +381,7 @@ public: }; struct Relocation { - Symbol *RelocSymbol = nullptr; + const Symbol *RelocSymbol = nullptr; uint64_t Offset; uint64_t Addend; uint32_t Type; @@ -434,7 +432,6 @@ class RelocationSection std::vector Relocations; public: - ~RelocationSection(); void addRelocation(Relocation Rel) { Relocations.push_back(Rel); } void accept(SectionVisitor &Visitor) const override; void removeSymbols(function_ref ToRemove) override; @@ -452,7 +449,7 @@ public: class GroupSection : public SectionBase { MAKE_SEC_WRITER_FRIEND const SymbolTableSection *SymTab = nullptr; - Symbol *Sym = nullptr; + const Symbol *Sym = nullptr; ELF::Elf32_Word FlagWord; SmallVector GroupMembers; @@ -462,16 +459,9 @@ public: ArrayRef Contents; explicit GroupSection(ArrayRef Data) : Contents(Data) {} - ~GroupSection() { - if (Sym) - --Sym->ReferenceCount; - } void setSymTab(const SymbolTableSection *SymTabSec) { SymTab = SymTabSec; } - void setSymbol(Symbol *S) { - Sym = S; - ++Sym->ReferenceCount; - } + void setSymbol(const Symbol *S) { Sym = S; } void setFlagWord(ELF::Elf32_Word W) { FlagWord = W; } void addMember(SectionBase *Sec) { GroupMembers.push_back(Sec); } diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 36b1b64e35d9..99cc1039f7de 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -156,7 +156,6 @@ struct CopyConfig { bool StripSections = false; bool StripNonAlloc = false; bool StripDWO = false; - bool StripUnneeded = false; bool ExtractDWO = false; bool LocalizeHidden = false; bool Weaken = false; @@ -390,13 +389,6 @@ void HandleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader, return true; } - // TODO: We might handle the 'null symbol' in a different way - // by probably handling it the same way as we handle 'null section' ? - if (Config.StripUnneeded && !Sym.ReferenceCount && Sym.Index != 0 && - (Sym.Binding == STB_LOCAL || Sym.getShndx() == SHN_UNDEF) && - Sym.Type != STT_FILE && Sym.Type != STT_SECTION) - return true; - return false; }); } @@ -487,7 +479,6 @@ CopyConfig ParseObjcopyOptions(ArrayRef ArgsArr) { Config.StripDWO = InputArgs.hasArg(OBJCOPY_strip_dwo); Config.StripSections = InputArgs.hasArg(OBJCOPY_strip_sections); Config.StripNonAlloc = InputArgs.hasArg(OBJCOPY_strip_non_alloc); - Config.StripUnneeded = InputArgs.hasArg(OBJCOPY_strip_unneeded); Config.ExtractDWO = InputArgs.hasArg(OBJCOPY_extract_dwo); Config.LocalizeHidden = InputArgs.hasArg(OBJCOPY_localize_hidden); Config.Weaken = InputArgs.hasArg(OBJCOPY_weaken);