Index: test/tools/llvm-objcopy/rename-section-multiple.test =================================================================== --- /dev/null +++ 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 Index: test/tools/llvm-objcopy/rename-section.test =================================================================== --- /dev/null +++ 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 Index: tools/llvm-objcopy/ObjcopyOpts.td =================================================================== --- tools/llvm-objcopy/ObjcopyOpts.td +++ tools/llvm-objcopy/ObjcopyOpts.td @@ -27,6 +27,9 @@ 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">; Index: tools/llvm-objcopy/Object.h =================================================================== --- tools/llvm-objcopy/Object.h +++ tools/llvm-objcopy/Object.h @@ -702,6 +702,7 @@ Range segments() { return make_pointee_range(Segments); } ConstRange segments() const { return make_pointee_range(Segments); } + void renameSections(const StringMap &SectionsToRename); void removeSections(std::function ToRemove); void removeSymbols(function_ref ToRemove); template T &addSection(Ts &&... Args) { Index: tools/llvm-objcopy/Object.cpp =================================================================== --- tools/llvm-objcopy/Object.cpp +++ tools/llvm-objcopy/Object.cpp @@ -1082,6 +1082,15 @@ Sec->removeSymbols(ToRemove); } +void Object::renameSections(const StringMap &SectionsToRename) { + for (const SecPtr &Sec : Sections) { + const auto Iter = SectionsToRename.find(Sec->Name); + if (Iter != SectionsToRename.end()) { + Sec->Name = Iter->second; + } + } +} + void Object::sortSections() { // Put all sections in offset order. Maintain the ordering as closely as // possible while meeting that demand however. Index: tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- tools/llvm-objcopy/llvm-objcopy.cpp +++ tools/llvm-objcopy/llvm-objcopy.cpp @@ -133,6 +133,7 @@ std::vector SymbolsToWeaken; std::vector SymbolsToRemove; std::vector SymbolsToKeep; + StringMap SectionsToRename; StringMap SymbolsToRename; bool StripAll = false; bool StripAllGNU = false; @@ -430,6 +431,9 @@ Obj.removeSections(RemovePred); + if (!Config.SectionsToRename.empty()) + Obj.renameSections(Config.SectionsToRename); + if (!Config.AddSection.empty()) { for (const auto &Flag : Config.AddSection) { auto SecPair = Flag.split("="); @@ -587,6 +591,14 @@ 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))