diff options
| author | Jake Ehrlich <jakehehrlich@google.com> | 2018-07-16 19:48:52 +0000 | 
|---|---|---|
| committer | Jake Ehrlich <jakehehrlich@google.com> | 2018-07-16 19:48:52 +0000 | 
| commit | c7f8ac7896cf4147adca21220e7c4599bcee5743 (patch) | |
| tree | c2e07977deb0545309510a17339c84cbc938a254 /llvm/test/tools/llvm-objcopy | |
| parent | 88feedd7c7564fd2792a6499ad9c3312695a949a (diff) | |
| download | bcm5719-llvm-c7f8ac7896cf4147adca21220e7c4599bcee5743.tar.gz bcm5719-llvm-c7f8ac7896cf4147adca21220e7c4599bcee5743.zip  | |
[llvm-objcopy] Add support for large indexes
This patch is an update of an older patch that never landed
(see here: https://reviews.llvm.org/D42516)
Recently various users have run into this issue and it just 100%
has to be solved at this point. The main difference in this patch
is that I use gunzip instead of unzip which should hopefully allow
tests to pass. Please review this as if it is a new patch however.
I found some issues along the way and made some minor modifications.
The binary used in this patch for testing (a zip file to make it small)
can be found here:
https://drive.google.com/file/d/1UjsnTO9edLttZibbr-2T1bJl92KEQFAO/view?usp=sharing
Differential Revision: https://reviews.llvm.org/D49206
llvm-svn: 337204
Diffstat (limited to 'llvm/test/tools/llvm-objcopy')
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/Inputs/many-sections.o.gz | bin | 0 -> 155402 bytes | |||
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/Inputs/ungzip.py | 5 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/auto-remove-shndx.test | 5 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/many-sections.test | 53 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/remove-shndx.test | 7 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objcopy/strict-no-add.test | 10 | 
6 files changed, 80 insertions, 0 deletions
diff --git a/llvm/test/tools/llvm-objcopy/Inputs/many-sections.o.gz b/llvm/test/tools/llvm-objcopy/Inputs/many-sections.o.gz Binary files differnew file mode 100644 index 00000000000..e71add0ff13 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/Inputs/many-sections.o.gz diff --git a/llvm/test/tools/llvm-objcopy/Inputs/ungzip.py b/llvm/test/tools/llvm-objcopy/Inputs/ungzip.py new file mode 100644 index 00000000000..41f858edae2 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/Inputs/ungzip.py @@ -0,0 +1,5 @@ +import gzip +import sys + +with gzip.open(sys.argv[1], 'rb') as f: +  sys.stdout.write(f.read()) diff --git a/llvm/test/tools/llvm-objcopy/auto-remove-shndx.test b/llvm/test/tools/llvm-objcopy/auto-remove-shndx.test new file mode 100644 index 00000000000..54525fd208e --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/auto-remove-shndx.test @@ -0,0 +1,5 @@ +# RUN: python %p/Inputs/ungzip.py %p/Inputs/many-sections.o.gz > %t +# RUN: llvm-objcopy -R .text -R s0 -R s1 -R s2 -R s3 -R s4 -R s5 -R s6 %t %t2 +# RUN: llvm-readobj -sections %t2 | FileCheck --check-prefix=SECS %s + +# SECS-NOT: Name: .symtab_shndx diff --git a/llvm/test/tools/llvm-objcopy/many-sections.test b/llvm/test/tools/llvm-objcopy/many-sections.test new file mode 100644 index 00000000000..29148ca01f3 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/many-sections.test @@ -0,0 +1,53 @@ +RUN: python %p/Inputs/ungzip.py %p/Inputs/many-sections.o.gz > %t +RUN: llvm-objcopy %t %t2 +RUN: llvm-readobj -file-headers %t2 | FileCheck --check-prefix=EHDR %s +RUN: llvm-readobj -sections %t2 | FileCheck --check-prefix=SECS %s +RUN: llvm-readobj -symbols %t2 | grep "Symbol {" | wc -l | FileCheck --check-prefix=SYMS %s + +EHDR:      Format: ELF64-x86-64 +EHDR-NEXT: Arch: x86_64 +EHDR-NEXT: AddressSize: 64bit +EHDR-NEXT: LoadName: +EHDR-NEXT: ElfHeader { +EHDR-NEXT:   Ident { +EHDR-NEXT:     Magic: (7F 45 4C 46) +EHDR-NEXT:     Class: 64-bit (0x2) +EHDR-NEXT:     DataEncoding: LittleEndian (0x1) +EHDR-NEXT:     FileVersion: 1 +EHDR-NEXT:     OS/ABI: SystemV (0x0) +EHDR-NEXT:     ABIVersion: 0 +EHDR-NEXT:     Unused: (00 00 00 00 00 00 00) +EHDR-NEXT:   } +EHDR-NEXT:   Type: Relocatable (0x1) +EHDR-NEXT:   Machine: EM_X86_64 (0x3E) +EHDR-NEXT:   Version: 1 +EHDR-NEXT:   Entry: 0x0 +EHDR-NEXT:   ProgramHeaderOffset: 0x40 +EHDR-NEXT:   SectionHeaderOffset: +EHDR-NEXT:   Flags [ (0x0) +EHDR-NEXT:   ] +EHDR-NEXT:   HeaderSize: 64 +EHDR-NEXT:   ProgramHeaderEntrySize: 56 +EHDR-NEXT:   ProgramHeaderCount: 0 +EHDR-NEXT:   SectionHeaderEntrySize: 64 +EHDR-NEXT:   SectionHeaderCount: 0 +EHDR-NEXT:   StringTableSectionIndex: 65535 +EHDR-NEXT: } + +SECS: Index: 65285 +SECS-NEXT: Name: .symtab +SECS-NEXT: Type: SHT_SYMTAB +SECS: Name: .symtab_shndx +SECS-NEXT: Type: SHT_SYMTAB_SHNDX +SECS-NEXT: Flags [ (0x0) +SECS-NEXT: ] +SECS-NEXT: Address: 0x0 +SECS-NEXT: Offset: +# There should be #syms * EntrySize bytes. +SECS-NEXT: Size: 261136 +SECS-NEXT: Link: 65285 +SECS-NEXT: Info: +SECS-NEXT: AddressAlignment: 4 +SECS-NEXT: EntrySize: 4 +SECS: Index: 65287 +SYMS: 65284 diff --git a/llvm/test/tools/llvm-objcopy/remove-shndx.test b/llvm/test/tools/llvm-objcopy/remove-shndx.test new file mode 100644 index 00000000000..c20e29a7e4c --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/remove-shndx.test @@ -0,0 +1,7 @@ +# This test checks to see that a .symtab_shndx section is added to any binary +# that needs it, even if the original was removed. +RUN: python %p/Inputs/ungzip.py %p/Inputs/many-sections.o.gz > %t +RUN: llvm-objcopy -R .symtab_shndx %t %t2 +RUN: llvm-readobj -sections %t2 | FileCheck %s + +CHECK: Name: .symtab_shndx ( diff --git a/llvm/test/tools/llvm-objcopy/strict-no-add.test b/llvm/test/tools/llvm-objcopy/strict-no-add.test new file mode 100644 index 00000000000..54656262d60 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/strict-no-add.test @@ -0,0 +1,10 @@ +# This test makes sure that sections added at the end that don't have symbols +# defined in them don't trigger the creation of a large index table. + +RUN: python %p/Inputs/ungzip.py %p/Inputs/many-sections.o.gz > %t.0 +RUN: cat %p/Inputs/alloc-symtab.o > %t +RUN: llvm-objcopy -R .text -R s0 -R s1 -R s2 -R s3 -R s4 -R s5 -R s6 %t.0 %t2 +RUN: llvm-objcopy -add-section=.s0=%t -add-section=.s1=%t -add-section=.s2=%t %t2 %t2 +RUN: llvm-readobj -sections %t2 | FileCheck --check-prefix=SECS %s + +SECS-NOT: Name: .symtab_shndx  | 

