From db2036e1f5b74876c5574ec526a44d042101fb3b Mon Sep 17 00:00:00 2001 From: Jordan Rupprecht Date: Fri, 20 Jul 2018 19:54:24 +0000 Subject: [PATCH] [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 llvm-svn: 337604 --- .../llvm-objcopy/rename-section-multiple.test | 41 ++++++++++++++++++++++ llvm/test/tools/llvm-objcopy/rename-section.test | 30 ++++++++++++++++ llvm/tools/llvm-objcopy/ObjcopyOpts.td | 3 ++ llvm/tools/llvm-objcopy/llvm-objcopy.cpp | 17 +++++++++ 4 files changed, 91 insertions(+) create mode 100644 llvm/test/tools/llvm-objcopy/rename-section-multiple.test create mode 100644 llvm/test/tools/llvm-objcopy/rename-section.test diff --git a/llvm/test/tools/llvm-objcopy/rename-section-multiple.test b/llvm/test/tools/llvm-objcopy/rename-section-multiple.test new file mode 100644 index 0000000..8feff9f --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/rename-section-multiple.test @@ -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 diff --git a/llvm/test/tools/llvm-objcopy/rename-section.test b/llvm/test/tools/llvm-objcopy/rename-section.test new file mode 100644 index 0000000..6285c77 --- /dev/null +++ b/llvm/test/tools/llvm-objcopy/rename-section.test @@ -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 diff --git a/llvm/tools/llvm-objcopy/ObjcopyOpts.td b/llvm/tools/llvm-objcopy/ObjcopyOpts.td index 4e337e6..2af2108 100644 --- a/llvm/tools/llvm-objcopy/ObjcopyOpts.td +++ b/llvm/tools/llvm-objcopy/ObjcopyOpts.td @@ -27,6 +27,9 @@ defm add_gnu_debuglink : Eq<"add-gnu-debuglink">, defm remove_section : Eq<"remove-section">, MetaVarName<"section">, HelpText<"Remove
">; +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">; diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp index 12e9ca1..3a25e3f 100644 --- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp @@ -133,6 +133,7 @@ struct CopyConfig { std::vector SymbolsToWeaken; std::vector SymbolsToRemove; std::vector SymbolsToKeep; + StringMap SectionsToRename; StringMap SymbolsToRename; bool StripAll = false; bool StripAllGNU = false; @@ -430,6 +431,14 @@ static void HandleArgs(const CopyConfig &Config, Object &Obj, 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(ArrayRef ArgsArr) { 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)) -- 2.7.4