diff options
author | Jake Ehrlich <jakehehrlich@google.com> | 2017-09-19 21:37:35 +0000 |
---|---|---|
committer | Jake Ehrlich <jakehehrlich@google.com> | 2017-09-19 21:37:35 +0000 |
commit | 7098693fab3001dcc06cc34070c0b80e8050b706 (patch) | |
tree | 9031b5daf45191c4b772fe45ba2546f984487e97 /test | |
parent | ee28e9a4fa1e849550817b9a8110212ebd25cec9 (diff) |
Reland "[llvm-objcopy] Add support for nested and overlapping segments"
I didn't initialize a pointer to be nullptr that I needed to.
This change adds support for nested and even overlapping segments. This means
that PT_PHDR, PT_GNU_RELRO, PT_TLS, and PT_DYNAMIC can be supported properly.
Differential Revision: https://reviews.llvm.org/D36558
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313682 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r-- | test/tools/llvm-objcopy/adjacent-segments.test | 62 | ||||
-rw-r--r-- | test/tools/llvm-objcopy/identical-segments.test | 82 | ||||
-rw-r--r-- | test/tools/llvm-objcopy/overlap-chain.test | 117 | ||||
-rw-r--r-- | test/tools/llvm-objcopy/pt-phdr.test | 71 | ||||
-rw-r--r-- | test/tools/llvm-objcopy/triple-overlap.test | 123 |
5 files changed, 455 insertions, 0 deletions
diff --git a/test/tools/llvm-objcopy/adjacent-segments.test b/test/tools/llvm-objcopy/adjacent-segments.test new file mode 100644 index 00000000000..45f4224f7e8 --- /dev/null +++ b/test/tools/llvm-objcopy/adjacent-segments.test @@ -0,0 +1,62 @@ +# This test tests that if two non-overlapping segments are right next to each +# other no problems arise. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj --program-headers %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 24 + - Name: .text2 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x10 + Size: 16 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text2 + +#CHECK: ProgramHeaders [ +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x1000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 24 +#CHECK-NEXT: MemSize: 24 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x1020 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 16 +#CHECK-NEXT: MemSize: 16 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 16 +#CHECK-NEXT: } +#CHECK-NEXT:] diff --git a/test/tools/llvm-objcopy/identical-segments.test b/test/tools/llvm-objcopy/identical-segments.test new file mode 100644 index 00000000000..7273416da7a --- /dev/null +++ b/test/tools/llvm-objcopy/identical-segments.test @@ -0,0 +1,82 @@ +# This test tests that if two possible parent segments have the same offset that +# they're disambiguated based on their original index. This ensures that cycles +# do not occur. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj --program-headers %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text2 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text2 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text + - Section: .text2 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text + - Section: .text2 + +#CHECK: ProgramHeaders [ +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x2000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 4096 +#CHECK-NEXT: MemSize: 4096 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x1000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x1000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT:] diff --git a/test/tools/llvm-objcopy/overlap-chain.test b/test/tools/llvm-objcopy/overlap-chain.test new file mode 100644 index 00000000000..a084abbb5ba --- /dev/null +++ b/test/tools/llvm-objcopy/overlap-chain.test @@ -0,0 +1,117 @@ +# This test tests how ParentSegment is set for Segments. In particular this test +# tests that if a chain of parents forms, the offsets are chosen for parents +# first despite the order of the list. It also tests multiple branches of the +# code that assigns parents. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj -program-headers %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text2 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text3 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text4 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text5 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text + - Section: .text2 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text4 + - Section: .text5 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text3 + - Section: .text4 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text2 + - Section: .text3 + +#CHECK: ProgramHeaders [ +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x1000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x4000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x3000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x2000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT:] diff --git a/test/tools/llvm-objcopy/pt-phdr.test b/test/tools/llvm-objcopy/pt-phdr.test new file mode 100644 index 00000000000..336ce769770 --- /dev/null +++ b/test/tools/llvm-objcopy/pt-phdr.test @@ -0,0 +1,71 @@ +# This test simply tests a simple but common real world example of overlapping +# segments. + +# RUN: llvm-objcopy %p/Inputs/pt-phdr.elf %t +# RUN: llvm-readobj -program-headers %t | FileCheck %s + +#CHECK: ProgramHeaders [ +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_PHDR +#CHECK-NEXT: Offset: 0x40 +#CHECK-NEXT: VirtualAddress: 0x200040 +#CHECK-NEXT: PhysicalAddress: 0x200040 +#CHECK-NEXT: FileSize: 280 +#CHECK-NEXT: MemSize: 280 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 8 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD +#CHECK-NEXT: Offset: 0x0 +#CHECK-NEXT: VirtualAddress: 0x200000 +#CHECK-NEXT: PhysicalAddress: 0x200000 +#CHECK-NEXT: FileSize: 344 +#CHECK-NEXT: MemSize: 344 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD +#CHECK-NEXT: Offset: 0x1000 +#CHECK-NEXT: VirtualAddress: 0x201000 +#CHECK-NEXT: PhysicalAddress: 0x201000 +#CHECK-NEXT: FileSize: 1 +#CHECK-NEXT: MemSize: 1 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: PF_X +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD +#CHECK-NEXT: Offset: 0x2000 +#CHECK-NEXT: VirtualAddress: 0x202000 +#CHECK-NEXT: PhysicalAddress: 0x202000 +#CHECK-NEXT: FileSize: 14 +#CHECK-NEXT: MemSize: 14 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: PF_W +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_GNU_STACK (0x6474E551) +#CHECK-NEXT: Offset: 0x0 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 0 +#CHECK-NEXT: MemSize: 0 +#CHECK-NEXT: Flags [ +#CHECK-NEXT: PF_R +#CHECK-NEXT: PF_W +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 0 +#CHECK-NEXT: } +#CHECK-NEXT:] diff --git a/test/tools/llvm-objcopy/triple-overlap.test b/test/tools/llvm-objcopy/triple-overlap.test new file mode 100644 index 00000000000..503a9075f4a --- /dev/null +++ b/test/tools/llvm-objcopy/triple-overlap.test @@ -0,0 +1,123 @@ +# This test tests that each segment is assigned a canonical parent segment. +# Importantly if two segments could be the parent segment of a segment this test +# should cover the case where a new parent replaces the old parent and the case +# where an old parent is not replaced by a new parent. + +# RUN: yaml2obj %s -o %t +# RUN: llvm-objcopy %t %t2 +# RUN: llvm-readobj --program-headers %t2 | FileCheck %s + +!ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: .text + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text2 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text3 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text4 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 + - Name: .text5 + Type: SHT_PROGBITS + Flags: [ SHF_ALLOC, SHF_EXECINSTR ] + AddressAlign: 0x1000 + Size: 4096 +ProgramHeaders: + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text4 + - Section: .text5 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text3 + - Section: .text4 + - Section: .text5 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text + - Section: .text2 + - Section: .text3 + - Section: .text4 + - Section: .text5 + - Type: PT_LOAD + Flags: [ PF_X, PF_R ] + Sections: + - Section: .text2 + - Section: .text3 + - Section: .text4 + - Section: .text5 + +#CHECK: ProgramHeaders [ +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x4000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 8192 +#CHECK-NEXT: MemSize: 8192 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x3000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 12288 +#CHECK-NEXT: MemSize: 12288 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x1000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 20480 +#CHECK-NEXT: MemSize: 20480 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT: ProgramHeader { +#CHECK-NEXT: Type: PT_LOAD (0x1) +#CHECK-NEXT: Offset: 0x2000 +#CHECK-NEXT: VirtualAddress: 0x0 +#CHECK-NEXT: PhysicalAddress: 0x0 +#CHECK-NEXT: FileSize: 16384 +#CHECK-NEXT: MemSize: 16384 +#CHECK-NEXT: Flags [ (0x5) +#CHECK-NEXT: PF_R (0x4) +#CHECK-NEXT: PF_X (0x1) +#CHECK-NEXT: ] +#CHECK-NEXT: Alignment: 4096 +#CHECK-NEXT: } +#CHECK-NEXT:] |