Index: llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/rename-section-multiple.test +++ llvm/trunk/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: llvm/trunk/test/tools/llvm-objcopy/rename-section.test =================================================================== --- llvm/trunk/test/tools/llvm-objcopy/rename-section.test +++ llvm/trunk/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: llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td =================================================================== --- llvm/trunk/tools/llvm-objcopy/ObjcopyOpts.td +++ llvm/trunk/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: llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp =================================================================== --- llvm/trunk/tools/llvm-objcopy/llvm-objcopy.cpp +++ llvm/trunk/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,14 @@ 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 @@ 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))