Index: llvm/trunk/test/tools/llvm-objcopy/reloc-no-symtab.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/reloc-no-symtab.test +++ llvm/trunk/test/tools/llvm-objcopy/reloc-no-symtab.test @@ -0,0 +1,45 @@ +# Regression test for the following case: +# $ cat /tmp/a.c +# int main() { return 0; } +# $ clang -static /tmp/a.c -o /tmp/a +# $ llvm-strip /tmp/a -o /tmp/b +# llvm-strip: error: Link field value 0 in section .rela.plt is invalid. + +# RUN: yaml2obj %s > %t.original +# RUN: llvm-strip %t.original -o %t.stripped +# RUN: llvm-readobj -sections %t.original | FileCheck %s +# RUN: llvm-readobj -sections %t.stripped | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + - Name: .rela.plt + Type: SHT_RELA + Flags: [ SHF_ALLOC, SHF_INFO_LINK ] + Info: .got.plt + Link: 0 + - Name: .plt + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + - Name: .got.plt + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_WRITE ] + +# CHECK: Name: .rela.plt +# CHECK-NEXT: Type: SHT_RELA +# CHECK-NEXT: Flags [ +# CHECK-NEXT: SHF_ALLOC +# CHECK-NEXT: SHF_INFO_LINK +# CHECK-NEXT: ] +# CHECK-NEXT: Address: +# CHECK-NEXT: Offset: +# CHECK-NEXT: Size: 0 +# CHECK-NEXT: Link: 0 +# CHECK-NEXT: Info: 4 Index: llvm/trunk/tools/llvm-objcopy/Object.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/Object.cpp +++ llvm/trunk/tools/llvm-objcopy/Object.cpp @@ -375,11 +375,13 @@ template void RelocSectionWithSymtabBase::initialize( SectionTableRef SecTable) { - setSymTab(SecTable.getSectionOfType( - Link, - "Link field value " + Twine(Link) + " in section " + Name + " is invalid", - "Link field value " + Twine(Link) + " in section " + Name + - " is not a symbol table")); + if (Link != SHN_UNDEF) + setSymTab(SecTable.getSectionOfType( + Link, + "Link field value " + Twine(Link) + " in section " + Name + + " is invalid", + "Link field value " + Twine(Link) + " in section " + Name + + " is not a symbol table")); if (Info != SHN_UNDEF) setSection(SecTable.getSection(Info, "Info field value " + Twine(Info) + @@ -391,7 +393,8 @@ template void RelocSectionWithSymtabBase::finalize() { - this->Link = Symbols->Index; + this->Link = Symbols ? Symbols->Index : 0; + if (SecToApplyRel != nullptr) this->Info = SecToApplyRel->Index; }