[llvm-objcopy] Allow strip symtab in executables and DSOs

Re-commit of the patch after addressing -Wl,--emit-relocs case.
Differential revision: https://reviews.llvm.org/D61672

llvm-svn: 366787
diff --git a/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test b/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
index 9dc63d7..3352313 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/preserve-segment-contents-ehdr-phdrs.test
@@ -13,7 +13,7 @@
 # BEFORE:      Type: PT_LOAD
 # BEFORE-NEXT: Offset: 0x240
 
-# AFTER:      SectionHeaderCount: 5
+# AFTER:      SectionHeaderCount: 3
 # AFTER:      Type: PT_LOAD
 # AFTER-NEXT: Offset: 0x0
 # AFTER:      Type: PT_LOAD
diff --git a/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test b/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
index 1f1bc4c..a162303 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/remove-multiple-sections.test
@@ -87,34 +87,6 @@
 # CHECK:   }
 # CHECK:   Section {
 # CHECK:     Index: 4
-# CHECK:     Name: .symtab
-# CHECK:     Type: SHT_SYMTAB (0x2)
-# CHECK:     Flags [ (0x0)
-# CHECK:     ]
-# CHECK:     Address: 0x0
-# CHECK:     Offset:
-# CHECK:     Size:
-# CHECK:     Link: 5
-# CHECK:     Info: 1
-# CHECK:     AddressAlignment: 8
-# CHECK:     EntrySize: 24
-# CHECK:   }
-# CHECK:   Section {
-# CHECK:     Index: 5
-# CHECK:     Name: .strtab
-# CHECK:     Type: SHT_STRTAB (0x3)
-# CHECK:     Flags [ (0x0)
-# CHECK:     ]
-# CHECK:     Address: 0x0
-# CHECK:     Offset:
-# CHECK:     Size:
-# CHECK:     Link: 0
-# CHECK:     Info: 0
-# CHECK:     AddressAlignment: 1
-# CHECK:     EntrySize: 0
-# CHECK:   }
-# CHECK:   Section {
-# CHECK:     Index: 6
 # CHECK:     Name: .shstrtab
 # CHECK:     Type: SHT_STRTAB (0x3)
 # CHECK:     Flags [ (0x0)
diff --git a/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test b/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
index 563a9e3..cef783c 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/segment-shift-section-remove.test
@@ -41,7 +41,7 @@
     Sections:
       - Section: .text3
 
-#CHECK: SectionHeaderCount: 6
+#CHECK: SectionHeaderCount: 4
 
 # CHECK:           Sections [
 # CHECK-NEXT:        Section {
@@ -92,34 +92,6 @@
 # CHECK-NEXT:        }
 # CHECK-NEXT:        Section {
 # CHECK-NEXT:          Index: 3
-# CHECK-NEXT:          Name: .symtab
-# CHECK-NEXT:          Type: SHT_SYMTAB (0x2)
-# CHECK-NEXT:          Flags [ (0x0)
-# CHECK-NEXT:          ]
-# CHECK-NEXT:          Address: 0x0
-# CHECK-NEXT:          Offset: 0x3000
-# CHECK-NEXT:          Size: 24
-# CHECK-NEXT:          Link: 4
-# CHECK-NEXT:          Info: 1
-# CHECK-NEXT:          AddressAlignment: 8
-# CHECK-NEXT:          EntrySize: 24
-# CHECK-NEXT:        }
-# CHECK-NEXT:        Section {
-# CHECK-NEXT:          Index: 4
-# CHECK-NEXT:          Name: .strtab
-# CHECK-NEXT:          Type: SHT_STRTAB (0x3)
-# CHECK-NEXT:          Flags [ (0x0)
-# CHECK-NEXT:          ]
-# CHECK-NEXT:          Address: 0x0
-# CHECK-NEXT:          Offset: 0x3018
-# CHECK-NEXT:          Size:
-# CHECK-NEXT:          Link: 0
-# CHECK-NEXT:          Info: 0
-# CHECK-NEXT:          AddressAlignment: 1
-# CHECK-NEXT:          EntrySize: 0
-# CHECK-NEXT:        }
-# CHECK-NEXT:        Section {
-# CHECK-NEXT:          Index: 5
 # CHECK-NEXT:          Name: .shstrtab
 # CHECK-NEXT:          Type: SHT_STRTAB (0x3)
 # CHECK-NEXT:          Flags [ (0x0)
diff --git a/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test b/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
index f9a5dd7..60cd5f3 100644
--- a/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
+++ b/llvm/test/tools/llvm-objcopy/ELF/segment-test-remove-section.test
@@ -46,7 +46,7 @@
 # Make sure that when we remove a section we overwrite it with zeros
 # DATA: {{^[^[:blank:]]+}} 00 00 00 00
 
-#CHECK: SectionHeaderCount: 6
+#CHECK: SectionHeaderCount: 4
 
 # CHECK: Sections [
 # CHECK:   Section {
@@ -97,34 +97,6 @@
 # CHECK-NEXT:   }
 # CHECK-NEXT:   Section {
 # CHECK-NEXT:     Index: 3
-# CHECK-NEXT:     Name: .symtab
-# CHECK-NEXT:     Type: SHT_SYMTAB (0x2)
-# CHECK-NEXT:     Flags [ (0x0)
-# CHECK-NEXT:     ]
-# CHECK-NEXT:     Address: 0x0
-# CHECK-NEXT:     Offset:
-# CHECK-NEXT:     Size:
-# CHECK-NEXT:     Link: 4
-# CHECK-NEXT:     Info: 1
-# CHECK-NEXT:     AddressAlignment: 8
-# CHECK-NEXT:     EntrySize: 24
-# CHECK-NEXT:   }
-# CHECK-NEXT:   Section {
-# CHECK-NEXT:     Index: 4
-# CHECK-NEXT:     Name: .strtab
-# CHECK-NEXT:     Type: SHT_STRTAB (0x3)
-# CHECK-NEXT:     Flags [ (0x0)
-# CHECK-NEXT:     ]
-# CHECK-NEXT:     Address: 0x0
-# CHECK-NEXT:     Offset:
-# CHECK-NEXT:     Size:
-# CHECK-NEXT:     Link: 0
-# CHECK-NEXT:     Info: 0
-# CHECK-NEXT:     AddressAlignment: 1
-# CHECK-NEXT:     EntrySize: 0
-# CHECK-NEXT:   }
-# CHECK-NEXT:   Section {
-# CHECK-NEXT:     Index: 5
 # CHECK-NEXT:     Name: .shstrtab
 # CHECK-NEXT:     Type: SHT_STRTAB (0x3)
 # CHECK-NEXT:     Flags [ (0x0)
diff --git a/llvm/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test b/llvm/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test
new file mode 100644
index 0000000..e2fd420
--- /dev/null
+++ b/llvm/test/tools/llvm-objcopy/ELF/strip-unneeded-all-symbols.test
@@ -0,0 +1,21 @@
+## Stripping unneeded symbols from execuatble/DSO should
+## eliminate the static symbol table, because it's not used
+## by the dynamic loader. 
+
+# RUN: yaml2obj %s > %t
+# RUN: cp %t %t1
+# RUN: llvm-objcopy --strip-unneeded %t %t2
+# RUN: llvm-readobj --section-headers %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+  Class:    ELFCLASS64
+  Data:     ELFDATA2LSB
+  Type:     ET_EXEC
+  Machine:  EM_X86_64
+Symbols:
+  - Name:     bar
+  - Name:     foo
+    Binding:  STB_GLOBAL
+
+# CHECK-NOT: .symtab