From cd6681160ba6b6da8a54fec963e16211524114c8 Mon Sep 17 00:00:00 2001 From: Georgii Rymar Date: Mon, 10 Aug 2020 17:50:16 +0300 Subject: [PATCH] [llvm-readobj/elf] - Refine the warning about the broken PT_DYNAMIC segment. Splitted out from D85519. Currently we report "PT_DYNAMIC segment offset + size exceeds the size of the file", this changes it to "PT_DYNAMIC segment offset (0x1234) + file size (0x5678) exceeds the size of the file (0x68ab)" Differential revision: https://reviews.llvm.org/D85654 --- test/Object/invalid.test | 6 ++++-- test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test | 10 +++++++--- tools/llvm-readobj/ELFDumper.cpp | 10 ++++++---- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/test/Object/invalid.test b/test/Object/invalid.test index c3dc175f399..8d9068a1ba0 100644 --- a/test/Object/invalid.test +++ b/test/Object/invalid.test @@ -489,7 +489,7 @@ Sections: # RUN: yaml2obj %s --docnum=22 -o %t22 # RUN: llvm-readobj --dyn-relocations %t22 2>&1 | FileCheck -DFILE=%t22 --check-prefix=DYN-TABLE-PHDR %s -# DYN-TABLE-PHDR: warning: '[[FILE]]': PT_DYNAMIC segment offset + size exceeds the size of the file +# DYN-TABLE-PHDR: warning: '[[FILE]]': PT_DYNAMIC segment offset (0xffff0000) + file size (0x0) exceeds the size of the file (0x150) --- !ELF FileHeader: @@ -506,7 +506,9 @@ ProgramHeaders: # RUN: yaml2obj %s --docnum=23 -o %t23 # RUN: llvm-readobj --dyn-relocations %t23 2>&1 \ -# RUN: | FileCheck -DFILE=%t23 --check-prefix=DYN-TABLE-PHDR %s +# RUN: | FileCheck -DFILE=%t23 --check-prefix=DYN-TABLE-PHDR2 %s + +# DYN-TABLE-PHDR2: warning: '[[FILE]]': PT_DYNAMIC segment offset (0x78) + file size (0xffff0000) exceeds the size of the file (0x1a8) --- !ELF FileHeader: diff --git a/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test b/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test index a6aa2915aa4..3ffdd57486a 100644 --- a/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test +++ b/test/tools/llvm-readobj/ELF/malformed-pt-dynamic.test @@ -13,14 +13,18 @@ # within the file. # RUN: cp %t.stripped %t.truncated1 # RUN: %python -c "with open(r'%t.truncated1', 'r+') as f: f.truncate(0x1001)" -# RUN: llvm-readobj %t.truncated1 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated1 %s +# RUN: llvm-readobj %t.truncated1 --dynamic-table 2>&1 | \ +# RUN: FileCheck -DFILE=%t.truncated1 %s --check-prefix=WARN1 + +# WARN1: warning: '[[FILE]]': PT_DYNAMIC segment offset (0x1000) + file size (0x10) exceeds the size of the file (0x1001) # Test case where the offset is too large to be in the file. # RUN: cp %t.stripped %t.truncated2 # RUN: %python -c "with open(r'%t.truncated2', 'r+') as f: f.truncate(0xFFF)" -# RUN: llvm-readobj %t.truncated2 --dynamic-table 2>&1 | FileCheck -DFILE=%t.truncated2 %s +# RUN: llvm-readobj %t.truncated2 --dynamic-table 2>&1 | \ +# RUN: FileCheck -DFILE=%t.truncated2 %s --check-prefix=WARN2 -# CHECK: warning: '[[FILE]]': PT_DYNAMIC segment offset + size exceeds the size of the file +# WARN2: warning: '[[FILE]]': PT_DYNAMIC segment offset (0x1000) + file size (0x10) exceeds the size of the file (0xfff) --- !ELF FileHeader: diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index b18c841ead9..461d1894d1e 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -1894,10 +1894,12 @@ ELFDumper::findDynamic(const ELFFile *Obj) { if (DynamicPhdr && DynamicPhdr->p_offset + DynamicPhdr->p_filesz > ObjF->getMemoryBufferRef().getBufferSize()) { - reportWarning( - createError( - "PT_DYNAMIC segment offset + size exceeds the size of the file"), - ObjF->getFileName()); + reportUniqueWarning(createError( + "PT_DYNAMIC segment offset (0x" + + Twine::utohexstr(DynamicPhdr->p_offset) + ") + file size (0x" + + Twine::utohexstr(DynamicPhdr->p_filesz) + + ") exceeds the size of the file (0x" + + Twine::utohexstr(ObjF->getMemoryBufferRef().getBufferSize()) + ")")); // Don't use the broken dynamic header. DynamicPhdr = nullptr; }