summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-objcopy
diff options
context:
space:
mode:
authorJake Ehrlich <jakehehrlich@google.com>2017-11-15 19:13:31 +0000
committerJake Ehrlich <jakehehrlich@google.com>2017-11-15 19:13:31 +0000
commitd49c92b12433a641b089611fa3ca8f53005c97a0 (patch)
tree175d62e0f9c9528899e620669daccc36bbbda937 /llvm/test/tools/llvm-objcopy
parent03d0cd6a81db286369eb55b31e9279dc9d3d7f56 (diff)
downloadbcm5719-llvm-d49c92b12433a641b089611fa3ca8f53005c97a0.tar.gz
bcm5719-llvm-d49c92b12433a641b089611fa3ca8f53005c97a0.zip
[llvm-objcopy] Change -O binary to respect section removal and behave like GNU objcopy
The original -O binary implementation just copied segment data from the object and dumped it into a file. This doesn't take into account any operations performed on objects such as section removal. GNU objcopy has some specific behavior that we'd also like to respect. For instance using -O binary and -j <some_section> will dump <some_section> to a file. This change implements GNU objcopy style -O binary to as close of an approximation as I can determine. Differential Revision: https://reviews.llvm.org/D39713 llvm-svn: 318324
Diffstat (limited to 'llvm/test/tools/llvm-objcopy')
-rw-r--r--llvm/test/tools/llvm-objcopy/binary-first-seg-offset-zero.test34
-rw-r--r--llvm/test/tools/llvm-objcopy/binary-remove-all-but-one.test46
-rw-r--r--llvm/test/tools/llvm-objcopy/binary-remove-end.test47
-rw-r--r--llvm/test/tools/llvm-objcopy/binary-remove-middle.test48
-rw-r--r--llvm/test/tools/llvm-objcopy/parent-loop-check.test50
-rw-r--r--llvm/test/tools/llvm-objcopy/two-seg-remove-end.test61
-rw-r--r--llvm/test/tools/llvm-objcopy/two-seg-remove-first.test61
-rw-r--r--llvm/test/tools/llvm-objcopy/two-seg-remove-third-sec.test62
8 files changed, 409 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/binary-first-seg-offset-zero.test b/llvm/test/tools/llvm-objcopy/binary-first-seg-offset-zero.test
new file mode 100644
index 00000000000..edab5ca6d20
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/binary-first-seg-offset-zero.test
@@ -0,0 +1,34 @@
+# 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
+
+# CHECK: 000000 de ad be ef
diff --git a/llvm/test/tools/llvm-objcopy/binary-remove-all-but-one.test b/llvm/test/tools/llvm-objcopy/binary-remove-all-but-one.test
new file mode 100644
index 00000000000..e1ef7d6b0a4
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/binary-remove-all-but-one.test
@@ -0,0 +1,46 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R .text -R .text3 -O binary %t %t2
+# RUN: od -Ax -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s -check-prefix=SIZE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "c3c3c3c3"
+ Size: 0x1000
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x2000
+ AddressAlign: 0x1000
+ Content: "DEADBEEF"
+ Size: 0x1000
+ - Name: .text3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x3000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .text2
+ - Section: .text3
+
+# CHECK: 000000 de ad be ef
+
+# SIZE: 4096
diff --git a/llvm/test/tools/llvm-objcopy/binary-remove-end.test b/llvm/test/tools/llvm-objcopy/binary-remove-end.test
new file mode 100644
index 00000000000..1c2994bf852
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/binary-remove-end.test
@@ -0,0 +1,47 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R .text3 -O binary %t %t2
+# RUN: od -Ax -v -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s -check-prefix=SIZE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "c3c3c3c3"
+ Size: 0x1000
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x2000
+ AddressAlign: 0x1000
+ Content: "DEADBEEF"
+ Size: 0x1000
+ - Name: .text3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x3000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .text2
+ - Section: .text3
+
+# CHECK: 000000 c3 c3 c3 c3
+# CHECK: 001000 de ad be ef
+
+# SIZE: 8192
diff --git a/llvm/test/tools/llvm-objcopy/binary-remove-middle.test b/llvm/test/tools/llvm-objcopy/binary-remove-middle.test
new file mode 100644
index 00000000000..6d69907a4a7
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/binary-remove-middle.test
@@ -0,0 +1,48 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R .text2 -O binary %t %t2
+# RUN: od -Ax -v -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s -check-prefix=SIZE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "c3c3c3c3"
+ Size: 0x1000
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x2000
+ AddressAlign: 0x1000
+ Content: "DEADBEEF"
+ Size: 0x1000
+ - Name: .text3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x3000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .text2
+ - Section: .text3
+
+# CHECK: 000000 c3 c3 c3 c3
+# CHECK: 001000 00 00 00 00
+# CHECK: 002000 32 32 32 32
+
+# SIZE: 12288
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
diff --git a/llvm/test/tools/llvm-objcopy/two-seg-remove-end.test b/llvm/test/tools/llvm-objcopy/two-seg-remove-end.test
new file mode 100644
index 00000000000..9f625fb5f0b
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/two-seg-remove-end.test
@@ -0,0 +1,61 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R .text4 -O binary %t %t2
+# RUN: od -Ax -v -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s -check-prefix=SIZE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "c3c3c3c3"
+ Size: 0x1000
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x2000
+ AddressAlign: 0x1000
+ Content: "DEADBEEF"
+ Size: 0x1000
+ - Name: .text3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x3000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 0x1000
+ - Name: .text4
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x4000
+ AddressAlign: 0x1000
+ Content: "FFFFFFFF"
+ Size: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .text2
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text3
+ - Section: .text4
+
+# CHECK: 000000 c3 c3 c3 c3
+# CHECK: 001000 de ad be ef
+# CHECK: 002000 32 32 32 32
+
+# SIZE: 12288
diff --git a/llvm/test/tools/llvm-objcopy/two-seg-remove-first.test b/llvm/test/tools/llvm-objcopy/two-seg-remove-first.test
new file mode 100644
index 00000000000..96b39ee3f79
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/two-seg-remove-first.test
@@ -0,0 +1,61 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R .text -O binary %t %t2
+# RUN: od -Ax -v -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s -check-prefix=SIZE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "c3c3c3c3"
+ Size: 0x1000
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x2000
+ AddressAlign: 0x1000
+ Content: "DEADBEEF"
+ Size: 0x1000
+ - Name: .text3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x3000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 0x1000
+ - Name: .text4
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x4000
+ AddressAlign: 0x1000
+ Content: "FFFFFFFF"
+ Size: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .text2
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text3
+ - Section: .text4
+
+# CHECK: 000000 de ad be ef
+# CHECK: 001000 32 32 32 32
+# CHECK: 002000 ff ff ff ff
+
+# SIZE: 12288
diff --git a/llvm/test/tools/llvm-objcopy/two-seg-remove-third-sec.test b/llvm/test/tools/llvm-objcopy/two-seg-remove-third-sec.test
new file mode 100644
index 00000000000..ad7af7f1221
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/two-seg-remove-third-sec.test
@@ -0,0 +1,62 @@
+# RUN: yaml2obj %s -o %t
+# RUN: llvm-objcopy -R .text3 -O binary %t %t2
+# RUN: od -Ax -v -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s -check-prefix=SIZE
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_EXEC
+ Machine: EM_X86_64
+Sections:
+ - Name: .text
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x1000
+ AddressAlign: 0x1000
+ Content: "c3c3c3c3"
+ Size: 0x1000
+ - Name: .text2
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x2000
+ AddressAlign: 0x1000
+ Content: "DEADBEEF"
+ Size: 0x1000
+ - Name: .text3
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x3000
+ AddressAlign: 0x1000
+ Content: "32323232"
+ Size: 0x1000
+ - Name: .text4
+ Type: SHT_PROGBITS
+ Flags: [ SHF_ALLOC, SHF_EXECINSTR ]
+ Address: 0x4000
+ AddressAlign: 0x1000
+ Content: "FFFFFFFF"
+ Size: 0x1000
+ProgramHeaders:
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text
+ - Section: .text2
+ - Type: PT_LOAD
+ Flags: [ PF_R ]
+ VAddr: 0x1000
+ PAddr: 0x1000
+ Sections:
+ - Section: .text3
+ - Section: .text4
+
+# CHECK: 000000 c3 c3 c3 c3
+# CHECK: 001000 de ad be ef
+# CHECK: 002000 00 00 00 00
+# CHECK: 003000 ff ff ff ff
+
+# SIZE: 16384
OpenPOWER on IntegriCloud