diff options
| author | George Rimar <grimar@accesssoftek.com> | 2019-09-25 10:14:50 +0000 |
|---|---|---|
| committer | George Rimar <grimar@accesssoftek.com> | 2019-09-25 10:14:50 +0000 |
| commit | 5b9a408113ee2e3c25d51b13cbe6e6281401e25a (patch) | |
| tree | 3f248122cf4e903f7dbe425cca7cdb7d6b373ea9 | |
| parent | 1b16b94eef50b952c13fbd601203ae698a8ce545 (diff) | |
| download | bcm5719-llvm-5b9a408113ee2e3c25d51b13cbe6e6281401e25a.tar.gz bcm5719-llvm-5b9a408113ee2e3c25d51b13cbe6e6281401e25a.zip | |
[llvm-readobj] - Don't crash when dumping .stack_sizes and unable to find a relocation resolver.
The crash might happen when we have either a broken or unsupported object
and trying to resolve relocations when dumping the .stack_sizes section.
For the test case I used a 32-bits ELF header and a 64-bit relocation.
In this case a null pointer is returned by the code instead of the relocation
resolver function and then we crash.
Differential revision: https://reviews.llvm.org/D67962
llvm-svn: 372838
| -rw-r--r-- | llvm/test/tools/llvm-readobj/stack-sizes.test | 26 | ||||
| -rw-r--r-- | llvm/tools/llvm-readobj/ELFDumper.cpp | 2 |
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/test/tools/llvm-readobj/stack-sizes.test b/llvm/test/tools/llvm-readobj/stack-sizes.test index a3d5f929412..46eac7b2489 100644 --- a/llvm/test/tools/llvm-readobj/stack-sizes.test +++ b/llvm/test/tools/llvm-readobj/stack-sizes.test @@ -597,3 +597,29 @@ Symbols: Value: 0x10 Type: STT_FUNC Binding: STB_GLOBAL + +## Check that we report an error when we are unable to resolve a relocation for a given ELF architecture. +## Here we have a 64-bit relocation used in a 32-bit object. + +# 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 diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index 17d85c27ae0..e8fdf22c7b6 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -4935,7 +4935,7 @@ void DumpStyle<ELFT>::printRelocatableStackSizes( 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", |

