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,11 @@ # 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-unneeded %t -o %t6 +# RUN: llvm-readobj --symbols %t6 | FileCheck %s --check-prefix=STRIPFILE + !ELF FileHeader: Class: ELFCLASS64 @@ -81,3 +86,25 @@ #STRIP-NEXT: Section: .text #STRIP-NEXT: } #STRIP-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:] + 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;