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,16 @@ # RUN: llvm-strip --keep-file-symbols --strip-symbol foo %t -o %t4 # RUN: llvm-readobj --symbols %t4 | FileCheck %s --check-prefix=STRIP +# RUN: llvm-objcopy --keep-file-symbols --strip-debug %t %t5 +# RUN: llvm-readobj --symbols %t5 | FileCheck %s --check-prefix=STRIPDEBUG +# RUN: llvm-objcopy --keep-file-symbols --strip-unneeded %t %t6 +# RUN: llvm-readobj --symbols %t6 | FileCheck %s --check-prefix=STRIPDEBUG + +# RUN: llvm-strip --keep-file-symbols --strip-debug %t -o %t7 +# RUN: llvm-readobj --symbols %t7 | FileCheck %s --check-prefix=STRIPDEBUG +# RUN: llvm-strip --keep-file-symbols --strip-unneeded %t -o %t8 +# RUN: llvm-readobj --symbols %t8 | FileCheck %s --check-prefix=STRIPDEBUG + !ELF FileHeader: Class: ELFCLASS64 @@ -16,6 +26,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 +43,9 @@ Type: STT_FUNC Section: .text Binding: STB_GLOBAL + - Name: debugfoo + Section: .debugfoo + Binding: STB_GLOBAL #STRIPALL: Symbols [ #STRIPALL-NEXT: Symbol { @@ -80,4 +96,43 @@ #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:] \ No newline at end of file Index: llvm/test/tools/llvm-objcopy/ELF/strip-debug.test =================================================================== --- llvm/test/tools/llvm-objcopy/ELF/strip-debug.test +++ llvm/test/tools/llvm-objcopy/ELF/strip-debug.test @@ -116,6 +116,8 @@ - Name: debugfoo Section: .debugfoo Binding: STB_GLOBAL + - Name: filesymbol + Type: STT_FILE # CHECK: SectionHeaderCount: 5 @@ -124,7 +126,7 @@ # CHECK: Name: .strtab # CHECK: Name: .shstrtab -# Check that *only* foo is copied and not debugfoo +# Check that *only* foo is copied and not debugfoo or filesymbol. # CHECK: Symbols [ # CHECK-NEXT: Symbol { # CHECK-NEXT: Name: Index: llvm/tools/llvm-objcopy/CopyConfig.cpp =================================================================== --- llvm/tools/llvm-objcopy/CopyConfig.cpp +++ llvm/tools/llvm-objcopy/CopyConfig.cpp @@ -667,8 +667,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))) @@ -938,8 +940,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,12 @@ if (Config.StripAll || Config.StripAllGNU) return true; + // StripDebug removes STT_FILE symbols, unless KeepFileSymbols is explicitly + // set to true. True case of Config.KeepFileSymbols is already handled above + // no need to check again. + if (Config.StripDebug && Sym.Type == STT_FILE) + return true; + if (Config.SymbolsToRemove.matches(Sym.Name)) return true;