[llvm] r337604 - [llvm-objcopy] Add basic support for --rename-section

Jordan Rupprecht via llvm-commits llvm-commits at lists.llvm.org
Fri Jul 20 12:54:24 PDT 2018


Author: rupprecht
Date: Fri Jul 20 12:54:24 2018
New Revision: 337604

URL: http://llvm.org/viewvc/llvm-project?rev=337604&view=rev
Log:
[llvm-objcopy] Add basic support for --rename-section

Summary:
Add basic support for --rename-section=old=new to llvm-objcopy.

A full replacement for GNU objcopy requires also modifying flags (i.e. --rename-section=old=new,flag1,flag2); I'd like to keep that in a separate change to keep this simple.

Reviewers: jakehehrlich, alexshap

Subscribers: llvm-commits

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

Added:
    llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test
    llvm/trunk/test/tools/llvm-objcopy/rename-section.test
Modified:
    llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td
    llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp

Added: llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test?rev=337604&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test Fri Jul 20 12:54:24 2018
@@ -0,0 +1,41 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy --rename-section=.test1=.test2 --rename-section=.test3=.test4 --rename-section=.test5=.test6 %t %t2
+# RUN: llvm-readobj -file-headers -sections -section-data %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .test1
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Content:        "c3c3c3c3"
+  - Name:            .test3
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Content:        "abababab"
+  - Name:            .test7
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Content:        "37373737"
+
+# CHECK: SectionHeaderCount: 7
+
+# CHECK: Name: .test2
+# CHECK: SectionData (
+# CHECK-NEXT:   0000: C3C3C3C3
+# CHECK-NEXT: )
+# CHECK: Name: .test4
+# CHECK: SectionData (
+# CHECK-NEXT:   0000: ABABABAB
+# CHECK-NEXT: )
+# CHECK: Name: .test7
+# CHECK: SectionData (
+# CHECK-NEXT:   0000: 37373737
+# CHECK-NEXT: )
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab

Added: llvm/trunk/test/tools/llvm-objcopy/rename-section.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objcopy/rename-section.test?rev=337604&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objcopy/rename-section.test (added)
+++ llvm/trunk/test/tools/llvm-objcopy/rename-section.test Fri Jul 20 12:54:24 2018
@@ -0,0 +1,30 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy --rename-section=.foo=.bar %t %t2
+# RUN: llvm-readobj -file-headers -sections -section-data %t2 | FileCheck %s
+# RUN: not llvm-objcopy --rename-section=.foo.bar --rename-section=.foo=.other %t %t2 2>&1 | FileCheck %s --check-prefix=BAD-FORMAT
+# RUN: not llvm-objcopy --rename-section=.foo=.bar --rename-section=.foo=.other %t %t2 2>&1 | FileCheck %s --check-prefix=MULTIPLE-RENAMES
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .foo
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Content:        "c3c3c3c3"
+
+# CHECK: SectionHeaderCount: 5
+
+# CHECK: Name: .bar
+# CHECK: SectionData (
+# CHECK-NEXT:   0000: C3C3C3C3
+# CHECK-NEXT: )
+# CHECK: Name: .symtab
+# CHECK: Name: .strtab
+# CHECK: Name: .shstrtab
+
+#BAD-FORMAT: Bad format for --rename-section
+#MULTIPLE-RENAMES: Already have a section rename for .foo

Modified: llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td?rev=337604&r1=337603&r2=337604&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td (original)
+++ llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td Fri Jul 20 12:54:24 2018
@@ -27,6 +27,9 @@ defm add_gnu_debuglink : Eq<"add-gnu-deb
 defm remove_section : Eq<"remove-section">,
                       MetaVarName<"section">,
                       HelpText<"Remove <section>">;
+defm rename_section : Eq<"rename-section">,
+                      MetaVarName<"old=new">,
+                      HelpText<"Renames a section from old to new">;
 defm redefine_symbol : Eq<"redefine-sym">,
                        MetaVarName<"old=new">,
                        HelpText<"Change the name of a symbol old to new">;

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=337604&r1=337603&r2=337604&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp (original)
+++ llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp Fri Jul 20 12:54:24 2018
@@ -133,6 +133,7 @@ struct CopyConfig {
   std::vector<StringRef> SymbolsToWeaken;
   std::vector<StringRef> SymbolsToRemove;
   std::vector<StringRef> SymbolsToKeep;
+  StringMap<StringRef> SectionsToRename;
   StringMap<StringRef> SymbolsToRename;
   bool StripAll = false;
   bool StripAllGNU = false;
@@ -430,6 +431,14 @@ static void HandleArgs(const CopyConfig
 
   Obj.removeSections(RemovePred);
 
+  if (!Config.SectionsToRename.empty()) {
+    for (auto &Sec : Obj.sections()) {
+      const auto Iter = Config.SectionsToRename.find(Sec.Name);
+      if (Iter != Config.SectionsToRename.end())
+        Sec.Name = Iter->second;
+    }
+  }
+
   if (!Config.AddSection.empty()) {
     for (const auto &Flag : Config.AddSection) {
       auto SecPair = Flag.split("=");
@@ -587,6 +596,14 @@ static CopyConfig ParseObjcopyOptions(Ar
       error("Multiple redefinition of symbol " + Old2New.first);
   }
 
+  for (auto Arg : InputArgs.filtered(OBJCOPY_rename_section)) {
+    if (!StringRef(Arg->getValue()).contains('='))
+      error("Bad format for --rename-section");
+    auto Old2New = StringRef(Arg->getValue()).split('=');
+    if (!Config.SectionsToRename.insert(Old2New).second)
+      error("Already have a section rename for " + Old2New.first);
+  }
+
   for (auto Arg : InputArgs.filtered(OBJCOPY_remove_section))
     Config.ToRemove.push_back(Arg->getValue());
   for (auto Arg : InputArgs.filtered(OBJCOPY_keep))




More information about the llvm-commits mailing list