Index: test/tools/llvm-readobj/stack-sizes.test =================================================================== --- test/tools/llvm-readobj/stack-sizes.test +++ test/tools/llvm-readobj/stack-sizes.test @@ -596,3 +596,29 @@ Value: 0x10 Type: STT_FUNC Binding: STB_GLOBAL + +## Check that we report an error when we find a relocation that has a valid type, but +## cannot be resolved. Here we have a 32-bit object, but 64-bit relocation. + +# RUN: yaml2obj --docnum=12 %s > %t17 +# RUN: not llvm-readelf --stack-sizes %t17 2>&1 | FileCheck %s -DFILE=%t17 --check-prefix=UNSUPPRELOC2 +# RUN: not llvm-readobj --stack-sizes %t17 2>&1 | FileCheck %s -DFILE=%t17 --check-prefix=UNSUPPRELOC2 + +# UNSUPPRELOC2: error: '[[FILE]]': unsupported relocation type in section .rela.stack_sizes: R_X86_64_64 + +--- !ELF +FileHeader: + Class: ELFCLASS32 + Data: ELFDATA2MSB + Type: ET_REL + Machine: EM_X86_64 +Sections: + - Name: .stack_sizes + Type: SHT_PROGBITS + Content: "00" + - Name: .rela.stack_sizes + Type: SHT_RELA + Info: .stack_sizes + Relocations: + - Offset: 0 + Type: R_X86_64_64 Index: tools/llvm-readobj/ELFDumper.cpp =================================================================== --- tools/llvm-readobj/ELFDumper.cpp +++ tools/llvm-readobj/ELFDumper.cpp @@ -4935,7 +4935,7 @@ auto Contents = unwrapOrError(this->FileName, StackSizesSec.getContents()); DataExtractor Data(Contents, Obj->isLittleEndian(), sizeof(Elf_Addr)); for (const RelocationRef &Reloc : RelocSec.relocations()) { - if (!IsSupportedFn(Reloc.getType())) + if (!IsSupportedFn || !IsSupportedFn(Reloc.getType())) reportError(createStringError( object_error::parse_failed, "unsupported relocation type in section %s: %s",