summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-09-25 10:14:50 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-09-25 10:14:50 +0000
commit5b9a408113ee2e3c25d51b13cbe6e6281401e25a (patch)
tree3f248122cf4e903f7dbe425cca7cdb7d6b373ea9
parent1b16b94eef50b952c13fbd601203ae698a8ce545 (diff)
downloadbcm5719-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.test26
-rw-r--r--llvm/tools/llvm-readobj/ELFDumper.cpp2
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",
OpenPOWER on IntegriCloud