summaryrefslogtreecommitdiffstats
path: root/llvm/test
diff options
context:
space:
mode:
authorGeorge Rimar <grimar@accesssoftek.com>2019-05-20 15:41:48 +0000
committerGeorge Rimar <grimar@accesssoftek.com>2019-05-20 15:41:48 +0000
commit72f821d3de05448e71bff7b39d3e4993c447882a (patch)
tree1eb6c4cca48be0b0a5210287c229fb1013e66754 /llvm/test
parent055906e1e50ddc35d6c8cdccab48ed83e93b47eb (diff)
downloadbcm5719-llvm-72f821d3de05448e71bff7b39d3e4993c447882a.tar.gz
bcm5719-llvm-72f821d3de05448e71bff7b39d3e4993c447882a.zip
[llvm-readelf] - Rework how we parse the .dynamic section.
This is a result of what I found during my work on https://bugs.llvm.org/show_bug.cgi?id=41679. Previously LLVM readelf took the information about .dynamic section from its PT_DYNAMIC segment only. GNU tools have a bit different logic. They also use the information from the .dynamic section header if it is available. This patch changes the code to improve the compatibility with the GNU Binutils. Differential revision: https://reviews.llvm.org/D61937 llvm-svn: 361165
Diffstat (limited to 'llvm/test')
-rwxr-xr-xllvm/test/Object/Inputs/corrupt-invalid-dynamic-table-size.elf.x86-64bin1736 -> 1736 bytes
-rw-r--r--llvm/test/Object/corrupt.test4
-rw-r--r--llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test47
-rw-r--r--llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test5
-rw-r--r--llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test92
5 files changed, 143 insertions, 5 deletions
diff --git a/llvm/test/Object/Inputs/corrupt-invalid-dynamic-table-size.elf.x86-64 b/llvm/test/Object/Inputs/corrupt-invalid-dynamic-table-size.elf.x86-64
index ee29a4162e3..2eed83cfc37 100755
--- a/llvm/test/Object/Inputs/corrupt-invalid-dynamic-table-size.elf.x86-64
+++ b/llvm/test/Object/Inputs/corrupt-invalid-dynamic-table-size.elf.x86-64
Binary files differ
diff --git a/llvm/test/Object/corrupt.test b/llvm/test/Object/corrupt.test
index 35623b431b7..c98757885aa 100644
--- a/llvm/test/Object/corrupt.test
+++ b/llvm/test/Object/corrupt.test
@@ -62,11 +62,11 @@ RUN: not llvm-readobj --dyn-relocations \
RUN: %p/Inputs/corrupt-invalid-dynamic-table-offset.elf.x86-64 2>&1 | \
RUN: FileCheck --check-prefix=DYN-TABLE-OFFSET %s
-DYN-TABLE-OFFSET: error: Invalid data was encountered while parsing the file
+DYN-TABLE-OFFSET: error: PT_DYNAMIC segment offset + size exceeds the size of the file
RUN: not llvm-readobj --dyn-relocations \
RUN: %p/Inputs/corrupt-invalid-dynamic-table-too-large.elf.x86-64 2>&1 | \
RUN: FileCheck --check-prefix=DYN-TABLE-TOO-LARGE %s
-DYN-TABLE-TOO-LARGE: error: Invalid data was encountered while parsing the file
+DYN-TABLE-TOO-LARGE: error: PT_DYNAMIC segment offset + size exceeds the size of the file
diff --git a/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test
new file mode 100644
index 00000000000..d52ec7696fd
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/elf-dynamic-not-in-pt-dynamic.test
@@ -0,0 +1,47 @@
+## Show that llvm-readobj/llvm-readelf tools can dump the .dynamic
+## section when it is not in a PT_DYNAMIC segment.
+
+# RUN: yaml2obj %s -o %t.o
+# RUN: llvm-readobj --dynamic-table %t.o 2>&1 | FileCheck %s
+# RUN: llvm-readelf --dynamic-table %t.o 2>&1 | FileCheck %s
+
+# CHECK: warning: The SHT_DYNAMIC section '.dynamic' is not contained within the PT_DYNAMIC segment
+# CHECK: DynamicSection [ (2 entries)
+# CHECK-NEXT: Tag Type Name/Value
+# CHECK-NEXT: 0x0000000000000018 BIND_NOW 0x1
+# CHECK-NEXT: 0x0000000000000000 NULL 0x0
+# CHECK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
diff --git a/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test b/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test
index e762a27865f..db229b1b259 100644
--- a/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test
+++ b/llvm/test/tools/llvm-readobj/elf-malformed-pt-dynamic.test
@@ -1,6 +1,5 @@
# If the offset and/or size fields of the PT_DYNAMIC field become corrupted,
-# it will be impossible to read the dynamic segment validly. This test shows
-# that a sensible error message is given in this situation.
+# we should report a sensible error message.
# Creating such a malformed file is hard. The easiest way to simulate it is to
# truncate the file. Note that the section headers must first be stripped or
@@ -21,7 +20,7 @@
# RUN: %python -c "with open(r'%t.truncated2', 'r+') as f: f.truncate(0xFFF)"
# RUN: not llvm-readobj %t.truncated2 --dynamic-table 2>&1 | FileCheck %s
-# CHECK: error: Invalid data was encountered while parsing the file
+# CHECK: error: PT_DYNAMIC segment offset + size exceeds the size of the file
--- !ELF
FileHeader:
diff --git a/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test b/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test
new file mode 100644
index 00000000000..610148f26ff
--- /dev/null
+++ b/llvm/test/tools/llvm-readobj/elf-non-dynamic-in-pt-dynamic.test
@@ -0,0 +1,92 @@
+## Show that llvm-readobj/llvm-readelf tools can dump the .dynamic section which
+## is not alone in PT_DYNAMIC segment.
+
+## In the first case .text is placed before .dynamic.
+## We check that we warn about this case.
+
+# RUN: yaml2obj --docnum=1 %s -o %t.o
+# RUN: llvm-readobj --dynamic-table %t.o 2>&1 | FileCheck %s --check-prefixes=WARNING,CHECK
+# RUN: llvm-readelf --dynamic-table %t.o 2>&1 | FileCheck %s --check-prefixes=WARNING,CHECK
+
+# WARNING: warning: The SHT_DYNAMIC section '.dynamic' is not at the start of PT_DYNAMIC segment
+# CHECK: DynamicSection [ (2 entries)
+# CHECK-NEXT: Tag Type Name/Value
+# CHECK-NEXT: 0x0000000000000018 BIND_NOW 0x1
+# CHECK-NEXT: 0x0000000000000000 NULL 0x0
+# CHECK-NEXT: ]
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x100
+ Content: "00"
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .dynamic
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .dynamic
+
+## In the second case .text goes after .dynamic and we don't display any warnings.
+
+# RUN: yaml2obj --docnum=2 %s -o %t.o
+# RUN: llvm-readobj --dynamic-table %t.o | FileCheck %s --implicit-check-not="warning"
+# RUN: llvm-readelf --dynamic-table %t.o | FileCheck %s --implicit-check-not="warning"
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .dynamic
+ Type: SHT_DYNAMIC
+ Flags: [SHF_ALLOC]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Entries:
+ - Tag: DT_BIND_NOW
+ Value: 0x1
+ - Tag: DT_NULL
+ Value: 0x0
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [SHF_ALLOC]
+ Address: 0x1100
+ AddressAlign: 0x100
+ Content: "00"
+ProgramHeaders:
+ - Type: PT_LOAD
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
+ - Type: PT_DYNAMIC
+ VAddr: 0x1000
+ Sections:
+ - Section: .dynamic
+ - Section: .text
OpenPOWER on IntegriCloud