summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-objcopy/parent-loop-check.test
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/test/tools/llvm-objcopy/parent-loop-check.test')
-rw-r--r--llvm/test/tools/llvm-objcopy/parent-loop-check.test50
1 files changed, 50 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/parent-loop-check.test b/llvm/test/tools/llvm-objcopy/parent-loop-check.test
new file mode 100644
index 00000000000..a1ba4cb60c1
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/parent-loop-check.test
@@ -0,0 +1,50 @@
+# This test has a subtle purpose. Because of the specifics of the layout
+# algorithm if we're not careful cycles can occur when we resolve the order
+# that we should layout segments in. In this test we're making sure that the
+# PT_LOAD segment won't set the PT_NOTE segment as the first to be laid out
+# while the PT_NOTE segment sets the PT_LOAD load to be the first to be laid
+# out. This problem becomes visible if the layout of the file changes due to
+# the removal of a section. We use -O binary here because removing a section
+# in this way won't cause the location of the PT_LOAD segment to change if we
+# don't.
+
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R=.note -O binary %t %t2
+# RUN: od -Ax -t x1 %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .note
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 32
+ - Name: .rodata
+ Flags: [ SHF_ALLOC ]
+ Type: SHT_PROGBITS
+ Address: 0x1020
+ Size: 4064
+ Content: "DEADBEEF"
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .note
+ - Section: .rodata
+ - Type: PT_NOTE
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .note
+
+# CHECK: 000000 de ad be ef
OpenPOWER on IntegriCloud