summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/tools/llvm-objcopy/rename-section-multiple.test41
-rw-r--r--llvm/test/tools/llvm-objcopy/rename-section.test30
-rw-r--r--llvm/tools/llvm-objcopy/ObjcopyOpts.td3
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp17
4 files changed, 91 insertions, 0 deletions
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 00000000000..8feff9fda74
--- /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 00000000000..6285c77d813
--- /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 4e337e6db9e..2af2108d98d 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 <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/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 12e9ca17e19..3a25e3f690b 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<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))
OpenPOWER on IntegriCloud