diff options
author | Jordan Rupprecht <rupprecht@google.com> | 2018-07-20 19:54:24 +0000 |
---|---|---|
committer | Jordan Rupprecht <rupprecht@google.com> | 2018-07-20 19:54:24 +0000 |
commit | ff83113c2f5bc8b2313269523ee1e28935e586f4 (patch) | |
tree | d10a3e1a97ed50f4ab9966613428a3713b2aef85 | |
parent | 502e1bf614169af7dd73d8f28445bf397b9fc45b (diff) |
[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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337604 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/tools/llvm-objcopy/rename-section-multiple.test | 41 | ||||
-rw-r--r-- | test/tools/llvm-objcopy/rename-section.test | 30 | ||||
-rw-r--r-- | tools/llvm-objcopy/ObjcopyOpts.td | 3 | ||||
-rw-r--r-- | tools/llvm-objcopy/llvm-objcopy.cpp | 17 |
4 files changed, 91 insertions, 0 deletions
diff --git a/test/tools/llvm-objcopy/rename-section-multiple.test b/test/tools/llvm-objcopy/rename-section-multiple.test new file mode 100644 index 00000000000..8feff9fda74 --- /dev/null +++ b/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/test/tools/llvm-objcopy/rename-section.test b/test/tools/llvm-objcopy/rename-section.test new file mode 100644 index 00000000000..6285c77d813 --- /dev/null +++ b/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/tools/llvm-objcopy/ObjcopyOpts.td b/tools/llvm-objcopy/ObjcopyOpts.td index 4e337e6db9e..2af2108d98d 100644 --- a/tools/llvm-objcopy/ObjcopyOpts.td +++ b/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 <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">; diff --git a/tools/llvm-objcopy/llvm-objcopy.cpp b/tools/llvm-objcopy/llvm-objcopy.cpp index 12e9ca17e19..3a25e3f690b 100644 --- a/tools/llvm-objcopy/llvm-objcopy.cpp +++ b/tools/llvm-objcopy/llvm-objcopy.cpp @@ -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 &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<const char *> 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)) |