Index: test/tools/llvm-objcopy/ELF/strip-unneeded2.test =================================================================== --- test/tools/llvm-objcopy/ELF/strip-unneeded2.test +++ test/tools/llvm-objcopy/ELF/strip-unneeded2.test @@ -0,0 +1,77 @@ +# RUN: yaml2obj %s > %t +# RUN: cp %t %t1 +# RUN: llvm-objcopy --strip-unneeded %t %t2 +# RUN: llvm-readobj --symbols %t2 | FileCheck %s --check-prefix=SYMTAB +# RUN: llvm-readobj --dyn-symbols %t2 | FileCheck %s --check-prefix=DYNSYM + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + Address: 0x1000 + AddressAlign: 0x0000000000000010 + Size: 64 +DynamicSymbols: + - Name: foo + Type: STT_FUNC + Binding: STB_GLOBAL + Section: .text + Value: 0x1000 + Size: 8 +Symbols: + - Name: bar + Type: STT_FUNC + Size: 8 + Section: .text + Value: 0x1008 + - Name: barfoo + Type: STT_FUNC + Size: 8 + Section: .text + Value: 0x1010 + - Name: foo + Type: STT_FUNC + Binding: STB_GLOBAL + Section: .text + Value: 0x1000 + Size: 8 + +# SYMTAB: Symbols [ +# SYMTAB-NEXT: Symbol { +# SYMTAB-NEXT: Name: (0) +# SYMTAB-NEXT: Value: 0x0 +# SYMTAB-NEXT: Size: 0 +# SYMTAB-NEXT: Binding: Local (0x0) +# SYMTAB-NEXT: Type: None (0x0) +# SYMTAB-NEXT: Other: 0 +# SYMTAB-NEXT: Section: Undefined (0x0) +# SYMTAB-NEXT: } +# SYMTAB-NEXT: ] + +# DYNSYM: DynamicSymbols [ +# DYNSYM-NEXT: Symbol { +# DYNSYM-NEXT: Name: (0) +# DYNSYM-NEXT: Value: 0x0 +# DYNSYM-NEXT: Size: 0 +# DYNSYM-NEXT: Binding: Local (0x0) +# DYNSYM-NEXT: Type: None (0x0) +# DYNSYM-NEXT: Other: 0 +# DYNSYM-NEXT: Section: Undefined (0x0) +# DYNSYM-NEXT: } +# DYNSYM-NEXT: Symbol { +# DYNSYM-NEXT: Name: foo (1) +# DYNSYM-NEXT: Value: 0x1000 +# DYNSYM-NEXT: Size: 8 +# DYNSYM-NEXT: Binding: Global (0x1) +# DYNSYM-NEXT: Type: Function (0x2) +# DYNSYM-NEXT: Other: 0 +# DYNSYM-NEXT: Section: .text (0x1) +# DYNSYM-NEXT: } +# DYNSYM-NEXT: ] + Index: tools/llvm-objcopy/ELF/ELFObjcopy.cpp =================================================================== --- tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -321,7 +321,7 @@ }; } -static bool isUnneededSymbol(const Symbol &Sym) { +static bool isUnneededSymbol(const Symbol &Sym) { return !Sym.Referenced && (Sym.Binding == STB_LOCAL || Sym.getShndx() == SHN_UNDEF) && Sym.Type != STT_FILE && Sym.Type != STT_SECTION; @@ -405,7 +405,7 @@ if ((Config.StripUnneeded || is_contained(Config.UnneededSymbolsToRemove, Sym.Name)) && - isUnneededSymbol(Sym)) + (Obj.Type == ET_EXEC || Obj.Type == ET_DYN || isUnneededSymbol(Sym))) return true; return false;