Index: test/tools/llvm-objcopy/COFF/strip-unneeded.yaml =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/COFF/strip-unneeded.yaml @@ -0,0 +1,63 @@ +# RUN: yaml2obj %s > %t.in.o + +# RUN: llvm-objdump -t %t.in.o | FileCheck %s --check-prefixes=SYMBOLS,SYMBOLS-PRE + +# RUN: llvm-objcopy --strip-unneeded %t.in.o %t.out.o +# RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS + +# Despite the name, --discard-all (-x) also only removes unreferenced +# local symbols. + +# RUN: llvm-objcopy --discard-all %t.in.o %t.out.o +# RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS + +# RUN: llvm-objcopy -x %t.in.o %t.out.o +# RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS + +# RUN: cp %t.in.o %t.out.o +# RUN: llvm-strip -x %t.out.o +# RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS + +# RUN: cp %t.in.o %t.out.o +# RUN: llvm-strip --discard-all %t.out.o +# RUN: llvm-objdump -t %t.out.o | FileCheck %s --check-prefix=SYMBOLS + +# SYMBOLS: SYMBOL TABLE: +# SYMBOLS-NEXT: external +# SYMBOLS-PRE-NEXT: local_unreferenced +# SYMBOLS-NEXT: local_referenced +# SYMBOLS-EMPTY: + +--- !COFF +header: + Machine: IMAGE_FILE_MACHINE_AMD64 + Characteristics: [ ] +sections: + - Name: .text + Characteristics: [ ] + Alignment: 4 + SectionData: E800000000C3C3C3 + Relocations: + - VirtualAddress: 1 + SymbolName: local_referenced + Type: IMAGE_REL_AMD64_REL32 +symbols: + - Name: external + Value: 0 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_EXTERNAL + - Name: local_unreferenced + Value: 6 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC + - Name: local_referenced + Value: 7 + SectionNumber: 1 + SimpleType: IMAGE_SYM_TYPE_NULL + ComplexType: IMAGE_SYM_DTYPE_NULL + StorageClass: IMAGE_SYM_CLASS_STATIC +... Index: tools/llvm-objcopy/COFF/COFFObjcopy.cpp =================================================================== --- tools/llvm-objcopy/COFF/COFFObjcopy.cpp +++ tools/llvm-objcopy/COFF/COFFObjcopy.cpp @@ -29,7 +29,8 @@ static Error handleArgs(const CopyConfig &Config, Object &Obj) { // If we need to do per-symbol removals, initialize the Referenced field. - if (!Config.SymbolsToRemove.empty()) + if (Config.StripUnneeded || Config.DiscardAll || + !Config.SymbolsToRemove.empty()) if (Error E = Obj.markSymbols()) return E; @@ -46,6 +47,12 @@ return true; } + // GNU objcopy keeps referenced local symbols and external symbols + // if Config.DiscaredAll is set, similar to what StripUnneeded does. + if ((Config.StripUnneeded || Config.DiscardAll) && !Sym.Referenced && + Sym.Sym.StorageClass == IMAGE_SYM_CLASS_STATIC) + return true; + return false; }); return Error::success();