summaryrefslogtreecommitdiffstats
path: root/llvm/test/tools/llvm-objcopy
diff options
context:
space:
mode:
authorJake Ehrlich <jakehehrlich@google.com>2018-07-16 19:48:52 +0000
committerJake Ehrlich <jakehehrlich@google.com>2018-07-16 19:48:52 +0000
commitc7f8ac7896cf4147adca21220e7c4599bcee5743 (patch)
treec2e07977deb0545309510a17339c84cbc938a254 /llvm/test/tools/llvm-objcopy
parent88feedd7c7564fd2792a6499ad9c3312695a949a (diff)
downloadbcm5719-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.gzbin0 -> 155402 bytes
-rw-r--r--llvm/test/tools/llvm-objcopy/Inputs/ungzip.py5
-rw-r--r--llvm/test/tools/llvm-objcopy/auto-remove-shndx.test5
-rw-r--r--llvm/test/tools/llvm-objcopy/many-sections.test53
-rw-r--r--llvm/test/tools/llvm-objcopy/remove-shndx.test7
-rw-r--r--llvm/test/tools/llvm-objcopy/strict-no-add.test10
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
new file mode 100644
index 00000000000..e71add0ff13
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/Inputs/many-sections.o.gz
Binary files differ
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
OpenPOWER on IntegriCloud