diff --git a/llvm/tools/llvm-objcopy/Object.cpp b/llvm/tools/llvm-objcopy/Object.cpp
index c7ce230..07b6036 100644
--- a/llvm/tools/llvm-objcopy/Object.cpp
+++ b/llvm/tools/llvm-objcopy/Object.cpp
@@ -202,15 +202,9 @@
   assignIndices();
 }
 
-void SymbolTableSection::localize(
-    std::function<bool(const Symbol &)> ToLocalize) {
-  for (const auto &Sym : Symbols) {
-    if (ToLocalize(*Sym))
-      Sym->Binding = STB_LOCAL;
-  }
-
-  // Now that the local symbols aren't grouped at the start we have to reorder
-  // the symbols to respect this property.
+void SymbolTableSection::updateSymbols(function_ref<void(Symbol &)> Callable) {
+  for (auto &Sym : Symbols)
+    Callable(*Sym);
   std::stable_partition(
       std::begin(Symbols), std::end(Symbols),
       [](const SymPtr &Sym) { return Sym->Binding == STB_LOCAL; });
diff --git a/llvm/tools/llvm-objcopy/Object.h b/llvm/tools/llvm-objcopy/Object.h
index ddc0da1..2598b24 100644
--- a/llvm/tools/llvm-objcopy/Object.h
+++ b/llvm/tools/llvm-objcopy/Object.h
@@ -365,8 +365,9 @@
   void addSymbolNames();
   const SectionBase *getStrTab() const { return SymbolNames; }
   const Symbol *getSymbolByIndex(uint32_t Index) const;
+  void updateSymbols(function_ref<void(Symbol &)> Callable);
+
   void removeSectionReferences(const SectionBase *Sec) override;
-  void localize(std::function<bool(const Symbol &)> ToLocalize);
   void initialize(SectionTableRef SecTable) override;
   void finalize() override;
   void accept(SectionVisitor &Visitor) const override;
diff --git a/llvm/tools/llvm-objcopy/Opts.td b/llvm/tools/llvm-objcopy/Opts.td
index a4d864a..6e71595 100644
--- a/llvm/tools/llvm-objcopy/Opts.td
+++ b/llvm/tools/llvm-objcopy/Opts.td
@@ -27,6 +27,9 @@
 defm remove_section : Eq<"remove-section">,
                       MetaVarName<"section">,
                       HelpText<"Remove <section>">;
+defm redefine_symbol : Eq<"redefine-sym">,
+                       MetaVarName<"old=new">,
+                       HelpText<"Change the name of a symbol old to new">;
 def R : JoinedOrSeparate<["-"], "R">,
         Alias<remove_section>;
 defm keep : Eq<"keep">,
@@ -57,7 +60,7 @@
 def localize_hidden : Flag<["-", "--"], "localize-hidden">,
                       HelpText<"Mark all symbols that have hidden or internal visibility as local">;
 defm localize_symbol : Eq<"localize-symbol">,
-                 MetaVarName<"symbol">,
-                 HelpText<"Mark <symbol> as local">;
+                       MetaVarName<"symbol">,
+                       HelpText<"Mark <symbol> as local">;
 def L : JoinedOrSeparate<["-"], "L">,
         Alias<localize_symbol>;
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 7158cee..a4b38cf 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -118,7 +118,8 @@
   std::vector<StringRef> Keep;
   std::vector<StringRef> OnlyKeep;
   std::vector<StringRef> AddSection;
-  std::vector<StringRef> LocalizeSymbol;
+  std::vector<StringRef> SymbolsToLocalize;
+  StringMap<StringRef> SymbolsToRename;
   bool StripAll;
   bool StripAllGNU;
   bool StripDebug;
@@ -130,7 +131,6 @@
 };
 
 using SectionPred = std::function<bool(const SectionBase &Sec)>;
-using SymbolPred = std::function<bool(const Symbol &Sym)>;
 
 bool IsDWOSection(const SectionBase &Sec) { return Sec.Name.endswith(".dwo"); }
 
@@ -190,31 +190,9 @@
     SplitDWOToFile(Config, Reader, Config.SplitDWO, OutputElfType);
   }
 
-  SymbolPred LocalizePred = [](const Symbol &) { return false; };
-
-  // Localize:
-
-  if (Config.LocalizeHidden) {
-    LocalizePred = [](const Symbol &Sym) {
-      return Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL;
-    };
-  }
-
-  if (!Config.LocalizeSymbol.empty()) {
-    LocalizePred = [LocalizePred, &Config](const Symbol &Sym) {
-      return LocalizePred(Sym) ||
-             std::find(std::begin(Config.LocalizeSymbol),
-                       std::end(Config.LocalizeSymbol),
-                       Sym.Name) != std::end(Config.LocalizeSymbol);
-    };
-  }
-
-  Obj.SymbolTable->localize(LocalizePred);
-
   SectionPred RemovePred = [](const SectionBase &) { return false; };
 
   // Removes:
-
   if (!Config.ToRemove.empty()) {
     RemovePred = [&Config](const SectionBase &Sec) {
       return std::find(std::begin(Config.ToRemove), std::end(Config.ToRemove),
@@ -283,7 +261,6 @@
     };
 
   // Explicit copies:
-
   if (!Config.OnlyKeep.empty()) {
     RemovePred = [&Config, RemovePred, &Obj](const SectionBase &Sec) {
       // Explicitly keep these sections regardless of previous removes.
@@ -335,8 +312,23 @@
     }
   }
 
-  if (!Config.AddGnuDebugLink.empty()) {
+  if (!Config.AddGnuDebugLink.empty())
     Obj.addSection<GnuDebugLinkSection>(Config.AddGnuDebugLink);
+
+  if (Obj.SymbolTable) {
+    Obj.SymbolTable->updateSymbols([&](Symbol &Sym) {
+      if ((Config.LocalizeHidden &&
+           (Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL)) ||
+          (!Config.SymbolsToLocalize.empty() &&
+           std::find(std::begin(Config.SymbolsToLocalize),
+                     std::end(Config.SymbolsToLocalize),
+                     Sym.Name) != std::end(Config.SymbolsToLocalize)))
+        Sym.Binding = STB_LOCAL;
+
+      const auto I = Config.SymbolsToRename.find(Sym.Name);
+      if (I != Config.SymbolsToRename.end())
+        Sym.Name = I->getValue();
+    });
   }
 }
 
@@ -397,6 +389,15 @@
 
   Config.SplitDWO = InputArgs.getLastArgValue(OBJCOPY_split_dwo);
   Config.AddGnuDebugLink = InputArgs.getLastArgValue(OBJCOPY_add_gnu_debuglink);
+
+  for (auto Arg : InputArgs.filtered(OBJCOPY_redefine_symbol)) {
+    if (!StringRef(Arg->getValue()).contains('='))
+      error("Bad format for --redefine-sym");
+    auto Old2New = StringRef(Arg->getValue()).split('=');
+    if (!Config.SymbolsToRename.insert(Old2New).second)
+      error("Multiple redefinition of symbol " + Old2New.first);
+  }
+
   for (auto Arg : InputArgs.filtered(OBJCOPY_remove_section))
     Config.ToRemove.push_back(Arg->getValue());
   for (auto Arg : InputArgs.filtered(OBJCOPY_keep))
@@ -414,7 +415,7 @@
   Config.ExtractDWO = InputArgs.hasArg(OBJCOPY_extract_dwo);
   Config.LocalizeHidden = InputArgs.hasArg(OBJCOPY_localize_hidden);
   for (auto Arg : InputArgs.filtered(OBJCOPY_localize_symbol))
-    Config.LocalizeSymbol.push_back(Arg->getValue());
+    Config.SymbolsToLocalize.push_back(Arg->getValue());
 
   return Config;
 }
