summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-objcopy/ELF/overlapping-sections.test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/llvm-objcopy/ELF/overlapping-sections.test')
-rw-r--r--llvm/test/tools/llvm-objcopy/ELF/overlapping-sections.test56
1 files changed, 56 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/ELF/overlapping-sections.test b/llvm/test/tools/llvm-objcopy/ELF/overlapping-sections.test
new file mode 100644
index 00000000000..2c46b09d6c3
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/overlapping-sections.test
@@ -0,0 +1,56 @@
+## This test shows that llvm-objcopy does not baulk at overlapping sections.
+## These don't really make sense, but the tool should still handle invalid
+## inputs somehow.
+# RUN: yaml2obj %s -o %t.o
+
+## First, check that the section header table appears immediately after the ELF
+## header.
+# RUN: llvm-readobj --file-headers %t.o | FileCheck %s --check-prefix=SHDRS-OFFSET
+# SHDRS-OFFSET: SectionHeaderOffset: 0x40{{$}}
+
+## Binary edit the section header sh_offset field of the second section to
+## overlap the first one.
+# RUN: %python -c "with open('%/t.o', 'r+b') as input: import struct; bytes = struct.pack('<Q', 0x1001); input.seek(216); input.write(bytes)"
+
+## Sanity check that the binary editing modified the correct field.
+# RUN: llvm-readobj --section-headers %t.o | FileCheck %s --check-prefix=VALIDATE
+
+# VALIDATE: Name: .first
+# VALIDATE: Offset: 0x1000
+# VALIDATE: Name: .second
+# VALIDATE: Offset: 0x1001
+
+## Check that the contents are as expected before the copy.
+# RUN: llvm-readobj -x .first -x .second %t.o | FileCheck %s --check-prefix=CONTENTS
+
+## Now check that the section contents are still correct after the copy.
+## Also characterize the behavior of llvm-objcopy in that it "unoverlaps" the
+## two sections.
+# RUN: llvm-objcopy %t.o %t2.o
+# RUN: llvm-readobj --section-headers %t2.o | FileCheck %s
+# RUN: llvm-readobj -x .first -x .second %t2.o | FileCheck %s --check-prefix=CONTENTS
+
+# CHECK: Name: .first
+# CHECK: Offset: 0x1000
+# CHECK: Name: .second
+# CHECK: Offset: 0x1004
+
+# CONTENTS: Hex dump of section '.first':
+# CONTENTS-NEXT: 0x00000000 01234567
+# CONTENTS-NEXT: Hex dump of section '.second':
+# CONTENTS-NEXT: 0x00000000 23456789
+
+--- !ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .first
+ Type: SHT_PROGBITS
+ Content: '01234567'
+ AddressAlign: 0x1000
+ - Name: .second
+ Type: SHT_PROGBITS
+ Content: '89abcdef'
OpenPOWER on IntegriCloud