[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
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 @@
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 @@
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))