Index: test/tools/llvm-objcopy/ELF/only-sesction-strip-undefined.test =================================================================== --- /dev/null +++ test/tools/llvm-objcopy/ELF/only-sesction-strip-undefined.test @@ -0,0 +1,42 @@ +## Here we want to check that llvm-objcopy removes the undefined symbol +## if the source of reference was stripped. + +# RUN: yaml2obj %s -o %t.o +# RUN: llvm-objcopy -j .other.section %t.o %t2.o +# RUN: llvm-readobj --symbols %t2.o | FileCheck %s --implicit-check-not=bar + +# RUN: llvm-objcopy -j .text -j .rela.text %t.o %t2.o +# RUN: llvm-readobj --symbols %t2.o | FileCheck %s --check-prefix=BAR +# BAR: bar + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x0000000000000001 + Content: BA00000000 + - Name: .rela.text + Type: SHT_RELA + Flags: [ SHF_INFO_LINK ] + Link: .symtab + AddressAlign: 0x0000000000000008 + EntSize: 0x0000000000000018 + Info: .text + Relocations: + - Offset: 0x0000000000000001 + Symbol: bar + Type: R_X86_64_32 + - Name: .other.section + Type: SHT_PROGBITS + AddressAlign: 0x0000000000000001 + Content: '90' +Symbols: + - Name: bar + Binding: STB_GLOBAL +... Index: tools/llvm-objcopy/ELF/ELFObjcopy.cpp =================================================================== --- tools/llvm-objcopy/ELF/ELFObjcopy.cpp +++ tools/llvm-objcopy/ELF/ELFObjcopy.cpp @@ -387,7 +387,8 @@ // The purpose of this loop is to mark symbols referenced by sections // (like GroupSection or RelocationSection). This way, we know which // symbols are still 'needed' and which are not. - if (Config.StripUnneeded || !Config.UnneededSymbolsToRemove.empty()) { + if (Config.StripUnneeded || !Config.UnneededSymbolsToRemove.empty() || + !Config.OnlySection.empty()) { for (auto &Section : Obj.sections()) Section.markSymbols(); } @@ -415,6 +416,12 @@ isUnneededSymbol(Sym)) return true; + // We want to remove the undefined symbols if the source of reference, + // like relocation section was stripped. + if (!Config.OnlySection.empty() && !Sym.Referenced && + Sym.getShndx() == SHN_UNDEF) + return true; + return false; };