[llvm] r315385 - [llvm-objcopy] Add ability to remove multiple sections by name

Jake Ehrlich via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 10 16:02:43 PDT 2017


Author: jakehehrlich
Date: Tue Oct 10 16:02:43 2017
New Revision: 315385

URL: http://llvm.org/viewvc/llvm-project?rev=315385&view=rev
Log:
[llvm-objcopy] Add ability to remove multiple sections by name

This change adds the ability to use the "-R"/"-remove-section" option
multiple times.

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

Added:
    llvm/trunk/test/tools/llvm-objcopy/remove-multiple-sections.test
Modified:
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp

Added: llvm/trunk/test/tools/llvm-objcopy/remove-multiple-sections.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/remove-multiple-sections.test?rev=315385&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/remove-multiple-sections.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/remove-multiple-sections.test Tue Oct 10 16:02:43 2017
@@ -0,0 +1,130 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy -R .test2 -R .test3 -R .test5 %t %t2
+# RUN: llvm-readobj -sections %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_EXEC
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .test1
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+  - Name:            .test2
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+  - Name:            .test3
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+  - Name:            .test4
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+  - Name:            .test5
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+  - Name:            .test6
+    Type:            SHT_PROGBITS
+    Flags:           [ ]
+
+# CHECK: Sections [
+# CHECK:   Section {
+# CHECK:     Index: 0
+# CHECK:     Name:  (0)
+# CHECK:     Type: SHT_NULL (0x0)
+# CHECK:     Flags [ (0x0)
+# CHECK:     ]
+# CHECK:     Address: 0x0
+# CHECK:     Offset:
+# CHECK:     Size:
+# CHECK:     Link: 0
+# CHECK:     Info: 0
+# CHECK:     AddressAlignment: 0
+# CHECK:     EntrySize: 0
+# CHECK:   }
+# CHECK:   Section {
+# CHECK:     Index: 1
+# CHECK:     Name: .test1
+# CHECK:     Type: SHT_PROGBITS (0x1)
+# CHECK:     Flags [ (0x0)
+# CHECK:     ]
+# CHECK:     Address: 0x0
+# CHECK:     Offset:
+# CHECK:     Size:
+# CHECK:     Link: 0
+# CHECK:     Info: 0
+# CHECK:     AddressAlignment: 0
+# CHECK:     EntrySize: 0
+# CHECK:   }
+# CHECK:   Section {
+# CHECK:     Index: 2
+# CHECK:     Name: .test4
+# CHECK:     Type: SHT_PROGBITS (0x1)
+# CHECK:     Flags [ (0x0)
+# CHECK:     ]
+# CHECK:     Address: 0x0
+# CHECK:     Offset:
+# CHECK:     Size:
+# CHECK:     Link: 0
+# CHECK:     Info: 0
+# CHECK:     AddressAlignment: 0
+# CHECK:     EntrySize: 0
+# CHECK:   }
+# CHECK:   Section {
+# CHECK:     Index: 3
+# CHECK:     Name: .test6
+# CHECK:     Type: SHT_PROGBITS (0x1)
+# CHECK:     Flags [ (0x0)
+# CHECK:     ]
+# CHECK:     Address: 0x0
+# CHECK:     Offset:
+# CHECK:     Size:
+# CHECK:     Link: 0
+# CHECK:     Info: 0
+# CHECK:     AddressAlignment: 0
+# CHECK:     EntrySize: 0
+# 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)
+# CHECK:     ]
+# CHECK:     Address: 0x0
+# CHECK:     Offset:
+# CHECK:     Size:
+# CHECK:     Link: 0
+# CHECK:     Info: 0
+# CHECK:     AddressAlignment: 1
+# CHECK:     EntrySize: 0
+# CHECK:   }
+# CHECK: ]

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=315385&r1=315384&r2=315385&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Tue Oct 10 16:02:43 2017
@@ -56,10 +56,11 @@ cl::opt<std::string> OutputFilename(cl::
 cl::opt<std::string>
     OutputFormat("O", cl::desc("set output format to one of the following:"
                                "\n\tbinary"));
-// TODO: make this a cl::list to support removing multiple sections
-cl::opt<std::string> ToRemove("remove-section",
-                              cl::desc("Remove a specific section"));
-cl::alias ToRemoveA("R", cl::desc("Alias for remove-section"), cl::aliasopt(ToRemove));
+
+cl::list<std::string> ToRemove("remove-section",
+                               cl::desc("Remove a specific section"));
+cl::alias ToRemoveA("R", cl::desc("Alias for remove-section"),
+                    cl::aliasopt(ToRemove));
 
 void CopyBinary(const ELFObjectFile<ELF64LE> &ObjFile) {
   std::unique_ptr<FileOutputBuffer> Buffer;
@@ -71,8 +72,10 @@ void CopyBinary(const ELFObjectFile<ELF6
   else
     Obj = llvm::make_unique<ELFObject<ELF64LE>>(ObjFile);
   if (!ToRemove.empty()) {
-    Obj->removeSections(
-        [&](const SectionBase &Sec) { return ToRemove == Sec.Name; });
+    Obj->removeSections([&](const SectionBase &Sec) {
+      return std::find(std::begin(ToRemove), std::end(ToRemove), Sec.Name) !=
+             std::end(ToRemove);
+    });
   }
   Obj->finalize();
   ErrorOr<std::unique_ptr<FileOutputBuffer>> BufferOrErr =




More information about the llvm-commits mailing list