diff options
author | Jake Ehrlich <jakehehrlich@google.com> | 2017-11-15 19:13:31 +0000 |
---|---|---|
committer | Jake Ehrlich <jakehehrlich@google.com> | 2017-11-15 19:13:31 +0000 |
commit | d49c92b12433a641b089611fa3ca8f53005c97a0 (patch) | |
tree | 175d62e0f9c9528899e620669daccc36bbbda937 /llvm/test/tools/llvm-objcopy | |
parent | 03d0cd6a81db286369eb55b31e9279dc9d3d7f56 (diff) | |
download | bcm5719-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')
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 |