[llvm] r318092 - [llvm-objcopy] Add --strip-all option to llvm-objcopy

Jake Ehrlich via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 13 14:02:07 PST 2017


Author: jakehehrlich
Date: Mon Nov 13 14:02:07 2017
New Revision: 318092

URL: http://llvm.org/viewvc/llvm-project?rev=318092&view=rev
Log:
[llvm-objcopy] Add --strip-all option to llvm-objcopy

This change adds a slightly less extreme form of stripping. It should
remove any section that starts with ".debug" and should remove any
symbol table or relocations. In general this strips out most of the
stuff you don't need to execute but leaves a number of things around.
This behavior has been designed to be compatible with GNU strip/objcopy
--strip-all so that anywhere you currently use --strip-all you should be
able to use llvm-objcopy as a drop in replacement.

Differential Revision: https://reviews.llvm.org/D39769

Added:
    llvm/trunk/test/tools/llvm-objcopy/strip-all.test
Modified:
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp

Added: llvm/trunk/test/tools/llvm-objcopy/strip-all.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/strip-all.test?rev=318092&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/strip-all.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/strip-all.test Mon Nov 13 14:02:07 2017
@@ -0,0 +1,54 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy --strip-all %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:            .dynstr
+    Type:            SHT_STRTAB
+    Flags:           [ SHF_ALLOC ]
+  - Name:            .symtab.dyn
+    Type:            SHT_SYMTAB
+    Flags:           [ SHF_ALLOC ]
+    Type:            SHT_NOBITS
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Size:            4
+  - Name:            .debug_info
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+    AddressAlign:    0x1
+    Size:            4
+  - Name:            .debug_loc
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    AddressAlign:    0x1
+    Size:            4
+  - Name:            .comment
+    Type:            SHT_PROGBITS
+  - Name:            .random_section_name
+    Type:            SHT_PROGBITS
+  - Name:            .debug_not_a_real_debug_section
+    Type:            SHT_PROGBITS
+  - Name:            .rel.text
+    Type:            SHT_REL
+    Info:            .text
+  - Name:            .rela.text
+    Type:            SHT_RELA
+    Info:            .text
+
+# CHECK: SectionHeaderCount: 8
+
+# CHECK:      Name: .dynstr
+# CHECK:      Name: .symtab.dyn
+# CHECK:      Name: .text
+# CHECK:      Name: .debug_loc
+# CHECK:      Name: .comment
+# CHECK:      Name: .random_section_name
+# CHECK:      Name: .shstrtab

Modified: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp?rev=318092&r1=318091&r2=318092&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Mon Nov 13 14:02:07 2017
@@ -81,6 +81,8 @@ static cl::list<std::string> ToRemove("r
                                       cl::desc("Remove a specific section"));
 static cl::alias ToRemoveA("R", cl::desc("Alias for remove-section"),
                            cl::aliasopt(ToRemove));
+static cl::opt<bool> StripAll("strip-all",
+                              cl::desc("Removes symbol, relocation, and debug information"));
 static cl::opt<bool> StripSections("strip-sections",
                                    cl::desc("Remove all section headers"));
 static cl::opt<bool>
@@ -170,6 +172,24 @@ void CopyBinary(const ELFObjectFile<ELF6
       return OnlyKeepDWOPred(*Obj, Sec) || RemovePred(Sec);
     };
 
+  if (StripAll)
+    RemovePred = [RemovePred, &Obj](const SectionBase &Sec) {
+      if (RemovePred(Sec))
+        return true;
+      if ((Sec.Flags & SHF_ALLOC) != 0)
+        return false;
+      if (&Sec == Obj->getSectionHeaderStrTab())
+        return false;
+      switch(Sec.Type) {
+      case SHT_SYMTAB:
+      case SHT_REL:
+      case SHT_RELA:
+      case SHT_STRTAB:
+        return true;
+      }
+      return Sec.Name.startswith(".debug");
+    };
+
   if (StripSections) {
     RemovePred = [RemovePred](const SectionBase &Sec) {
       return RemovePred(Sec) || (Sec.Flags & SHF_ALLOC) == 0;




More information about the llvm-commits mailing list