Index: llvm/test/tools/llvm-objcopy/ELF/keep-file-symbols.test =================================================================== --- llvm/test/tools/llvm-objcopy/ELF/keep-file-symbols.test +++ llvm/test/tools/llvm-objcopy/ELF/keep-file-symbols.test @@ -9,6 +9,15 @@ # RUN: llvm-strip --keep-file-symbols --strip-symbol foo %t -o %t4 # RUN: llvm-readobj --symbols %t4 | FileCheck %s --check-prefix=STRIP +# RUN: llvm-strip --strip-debug %t -o %t5 +# RUN: llvm-readobj --symbols %t5 | FileCheck %s --check-prefix=STRIPFILE +# RUN: llvm-strip --strip-debug --keep-file-symbols %t -o %t6 +# RUN: llvm-readobj --symbols %t6 | FileCheck %s --check-prefix=STRIPDEBUG +# RUN: llvm-strip --strip-unneeded %t -o %t7 +# RUN: llvm-readobj --symbols %t7 | FileCheck %s --check-prefix=STRIPFILE +# RUN: llvm-strip --strip-unneeded --keep-file-symbols %t -o %t8 +# RUN: llvm-readobj --symbols %t8 | FileCheck %s --check-prefix=STRIPDEBUG + !ELF FileHeader: Class: ELFCLASS64 @@ -16,6 +25,9 @@ Type: ET_REL Machine: EM_X86_64 Sections: + - Name: .debugfoo + Type: SHT_PROGBITS + Content: "00000000" - Name: .text Type: SHT_PROGBITS Flags: [ SHF_ALLOC, SHF_EXECINSTR ] @@ -30,6 +42,9 @@ Type: STT_FUNC Section: .text Binding: STB_GLOBAL + - Name: debugfoo + Section: .debugfoo + Binding: STB_GLOBAL #STRIPALL: Symbols [ #STRIPALL-NEXT: Symbol { @@ -80,4 +95,64 @@ #STRIP-NEXT: Other: 0 #STRIP-NEXT: Section: .text #STRIP-NEXT: } +#STRIP-NEXT: Symbol { +#STRIP-NEXT: Name: debugfoo +#STRIP-NEXT: Value: 0x0 +#STRIP-NEXT: Size: 0 +#STRIP-NEXT: Binding: Global +#STRIP-NEXT: Type: None +#STRIP-NEXT: Other: 0 +#STRIP-NEXT: Section: .debugfoo +#STRIP-NEXT: } #STRIP-NEXT:] + +#STRIPDEBUG: Symbols [ +#STRIPDEBUG-NEXT: Symbol { +#STRIPDEBUG-NEXT: Name: +#STRIPDEBUG-NEXT: Value: 0x0 +#STRIPDEBUG-NEXT: Size: 0 +#STRIPDEBUG-NEXT: Binding: Local +#STRIPDEBUG-NEXT: Type: None +#STRIPDEBUG-NEXT: Other: 0 +#STRIPDEBUG-NEXT: Section: Undefined +#STRIPDEBUG-NEXT: } +#STRIPDEBUG-NEXT: Symbol { +#STRIPDEBUG-NEXT: Name: foo +#STRIPDEBUG-NEXT: Value: 0x0 +#STRIPDEBUG-NEXT: Size: 0 +#STRIPDEBUG-NEXT: Binding: Local +#STRIPDEBUG-NEXT: Type: File +#STRIPDEBUG-NEXT: Other: 0 +#STRIPDEBUG-NEXT: Section: .text +#STRIPDEBUG-NEXT: } +#STRIPDEBUG-NEXT: Symbol { +#STRIPDEBUG-NEXT: Name: bar +#STRIPDEBUG-NEXT: Value: 0x0 +#STRIPDEBUG-NEXT: Size: 0 +#STRIPDEBUG-NEXT: Binding: Global +#STRIPDEBUG-NEXT: Type: Function +#STRIPDEBUG-NEXT: Other: 0 +#STRIPDEBUG-NEXT: Section: .text +#STRIPDEBUG-NEXT: } +#STRIPDEBUG-NEXT:] + +#STRIPFILE: Symbols [ +#STRIPFILE-NEXT: Symbol { +#STRIPFILE-NEXT: Name: +#STRIPFILE-NEXT: Value: 0x0 +#STRIPFILE-NEXT: Size: 0 +#STRIPFILE-NEXT: Binding: Local +#STRIPFILE-NEXT: Type: None +#STRIPFILE-NEXT: Other: 0 +#STRIPFILE-NEXT: Section: Undefined +#STRIPFILE-NEXT: } +#STRIPFILE-NEXT: Symbol { +#STRIPFILE-NEXT: Name: bar +#STRIPFILE-NEXT: Value: 0x0 +#STRIPFILE-NEXT: Size: 0 +#STRIPFILE-NEXT: Binding: Global +#STRIPFILE-NEXT: Type: Function +#STRIPFILE-NEXT: Other: 0 +#STRIPFILE-NEXT: Section: .text +#STRIPFILE-NEXT: } +#STRIPFILE-NEXT:] \ No newline at end of file Index: llvm/tools/llvm-objcopy/CopyConfig.cpp =================================================================== --- llvm/tools/llvm-objcopy/CopyConfig.cpp +++ llvm/tools/llvm-objcopy/CopyConfig.cpp @@ -666,8 +666,10 @@ Config.KeepFileSymbols = InputArgs.hasArg(OBJCOPY_keep_file_symbols); Config.DecompressDebugSections = InputArgs.hasArg(OBJCOPY_decompress_debug_sections); - if (Config.DiscardMode == DiscardType::All) + if (Config.DiscardMode == DiscardType::All) { Config.StripDebug = true; + Config.KeepFileSymbols = true; + } for (auto Arg : InputArgs.filtered(OBJCOPY_localize_symbol)) if (Error E = Config.SymbolsToLocalize.addMatcher(NameOrPattern::create( Arg->getValue(), SymbolMatchStyle, ErrorCallback))) @@ -937,8 +939,10 @@ !Config.StripAllGNU && Config.SymbolsToRemove.empty()) Config.StripAll = true; - if (Config.DiscardMode == DiscardType::All) + if (Config.DiscardMode == DiscardType::All) { Config.StripDebug = true; + Config.KeepFileSymbols = true; + } Config.DeterministicArchives = InputArgs.hasFlag(STRIP_enable_deterministic_archives, Index: llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp =================================================================== --- llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ llvm/tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -420,6 +420,10 @@ if (Config.StripAll || Config.StripAllGNU) return true; + if ((Config.StripDebug || Config.StripUnneeded) && + !Config.KeepFileSymbols && Sym.Type == STT_FILE) + return true; + if (Config.SymbolsToRemove.matches(Sym.Name)) return true;