[llvm-objcopy] Add support for --only-keep/-j and --keep
This change adds support for the --only-keep option and the -j alias as well.
A common use case for these being used together is to dump a specific section's
data. Additionally the --keep option is added (GNU objcopy doesn't have this)
to avoid removing a bunch of things. This allows people to err on the side of
stripping aggressively and then to keep the specific bits that they need for
their application.
Differential Revision: https://reviews.llvm.org/D39021
llvm-svn: 319467
diff --git a/llvm/test/tools/llvm-objcopy/basic-keep.test b/llvm/test/tools/llvm-objcopy/basic-keep.test
new file mode 100644
index 0000000..2ea4ea3
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/basic-keep.test
@@ -0,0 +1,19 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -strip-non-alloc -keep=.test %t %t2
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 3
+
+# CHECK: Name: .test
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/basic-only-keep.test b/llvm/test/tools/llvm-objcopy/basic-only-keep.test
new file mode 100644
index 0000000..4d97012
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/basic-only-keep.test
@@ -0,0 +1,23 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -only-keep=.test %t %t2
+# RUN: llvm-objcopy -j=.test %t %t3
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+# RUN: diff %t2 %t3
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 5
+
+# CHECK: Name: .test
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/dump-section.test b/llvm/test/tools/llvm-objcopy/dump-section.test
new file mode 100644
index 0000000..123f473
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/dump-section.test
@@ -0,0 +1,28 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -O binary -j .text %t %t2
+# RUN: llvm-objcopy -O binary -only-keep .text %t %t3
+# RUN: od -t x1 %t2 | FileCheck %s
+# RUN: wc -c %t2 | FileCheck %s --check-prefix=SIZE
+# RUN: diff %t2 %t3
+
+!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: 0x0000000000001000
+ Content: "DEADBEEF"
+ProgramHeaders:
+- Type: PT_LOAD
+ Flags: [ PF_X, PF_R ]
+ Sections:
+ - Section: .text
+
+#CHECK: 0000000 de ad be ef
+
+#SIZE: 4
diff --git a/llvm/test/tools/llvm-objcopy/explicit-keep-remove.test b/llvm/test/tools/llvm-objcopy/explicit-keep-remove.test
new file mode 100644
index 0000000..5ebd2a5
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/explicit-keep-remove.test
@@ -0,0 +1,21 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -R=.test -keep=.test %t %t2
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 5
+
+# CHECK: Name: .test
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/explicit-only-keep-remove.test b/llvm/test/tools/llvm-objcopy/explicit-only-keep-remove.test
new file mode 100644
index 0000000..10d49e1
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/explicit-only-keep-remove.test
@@ -0,0 +1,21 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -R=.test -only-keep=.test %t %t2
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 5
+
+# CHECK: Name: .test
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/keep-many.test b/llvm/test/tools/llvm-objcopy/keep-many.test
new file mode 100644
index 0000000..6627377
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/keep-many.test
@@ -0,0 +1,27 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -strip-non-alloc -keep=.test -keep=.test3 %t %t2
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ - Name: .test2
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ - Name: .test3
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+
+# CHECK: SectionHeaderCount: 4
+
+# CHECK: Name: .test
+# CHECK: Name: .test3
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/keep-only-keep.test b/llvm/test/tools/llvm-objcopy/keep-only-keep.test
new file mode 100644
index 0000000..b1f08fe
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/keep-only-keep.test
@@ -0,0 +1,27 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -keep=.test2 -only-keep=.test %t %t2
+# RUN: llvm-objcopy -j=.test -keep=.test2 %t %t3
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+# RUN: diff %t2 %t3
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ - Name: .test2
+ Type: SHT_PROGBITS
+ - Name: .test3
+ Type: SHT_PROGBITS
+
+# CHECK: SectionHeaderCount: 6
+
+# CHECK: Name: .test
+# CHECK: Name: .test2
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/only-keep-many.test b/llvm/test/tools/llvm-objcopy/only-keep-many.test
new file mode 100644
index 0000000..2f95623
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/only-keep-many.test
@@ -0,0 +1,28 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -j .test1 -j .test2 %t %t2
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test1
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ - Name: .test2
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ - Name: .test3
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 6
+
+# CHECK: Name: .test1
+# CHECK: Name: .test2
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/only-keep-remove-strtab.test b/llvm/test/tools/llvm-objcopy/only-keep-remove-strtab.test
new file mode 100644
index 0000000..c8946d3
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/only-keep-remove-strtab.test
@@ -0,0 +1,21 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -R .symtab -R .strtab -only-keep=.test %t %t2
+# RUN: llvm-objcopy -j=.test -R .strtab -R .symtab %t %t3
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+# RUN: diff %t2 %t3
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 3
+
+# CHECK: Name: .test
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/only-keep-strip-non-alloc.test b/llvm/test/tools/llvm-objcopy/only-keep-strip-non-alloc.test
new file mode 100644
index 0000000..bad0022
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/only-keep-strip-non-alloc.test
@@ -0,0 +1,19 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -strip-non-alloc -only-keep=.test %t %t2
+# RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+
+# CHECK: SectionHeaderCount: 3
+
+# CHECK: Name: .test
+# CHECK: Name: .shstrtab
diff --git a/llvm/test/tools/llvm-objcopy/strip-sections-keep.test b/llvm/test/tools/llvm-objcopy/strip-sections-keep.test
new file mode 100644
index 0000000..dcf6968
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/strip-sections-keep.test
@@ -0,0 +1,13 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -strip-sections -keep=.shstrtab %t %t2
+# RUN: od -Ax -t c %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+
+# CHECK: \0 . s h s t r t a b \0
diff --git a/llvm/test/tools/llvm-objcopy/strip-sections-only-keep.test b/llvm/test/tools/llvm-objcopy/strip-sections-only-keep.test
new file mode 100644
index 0000000..2c9400c
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/strip-sections-only-keep.test
@@ -0,0 +1,20 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -strip-sections -only-keep=.test %t %t2
+# RUN: od -Ax -t x1 %t2 | FileCheck %s
+# RUN: od -Ax -t c %t2 | FileCheck %s -check-prefix=TEXT
+
+!ELF
+FileHeader:
+ Class: ELFCLASS64
+ Data: ELFDATA2LSB
+ Type: ET_REL
+ Machine: EM_X86_64
+Sections:
+ - Name: .test
+ Type: SHT_PROGBITS
+ Flags: [ ]
+ Content: "DEADBEEF"
+
+# CHECK: de ad be ef
+
+# TEXT-NOT: t e s t