[llvm-objcopy] Add --localize-hidden option

This change adds support in llvm-objcopy for GNU objcopy's --localize-hidden
option. This option changes every hidden or internal symbol into a local symbol.

llvm-svn: 321884
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 20ce93b..eb1d0de 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -117,6 +117,10 @@
     "add-section",
     cl::desc("Make a section named <section> with the contents of <file>."),
     cl::value_desc("section=file"));
+static cl::opt<bool> LocalizeHidden(
+    "localize-hidden",
+    cl::desc(
+        "Mark all symbols that have hidden or internal visibility as local"));
 
 using SectionPred = std::function<bool(const SectionBase &Sec)>;
 
@@ -180,6 +184,14 @@
   if (!SplitDWO.empty())
     SplitDWOToFile<ELFT>(ObjFile, SplitDWO.getValue());
 
+  // Localize:
+
+  if (LocalizeHidden) {
+    Obj->getSymTab()->localize([](const Symbol &Sym) {
+      return Sym.Visibility == STV_HIDDEN || Sym.Visibility == STV_INTERNAL;
+    });
+  }
+
   SectionPred RemovePred = [](const SectionBase &) { return false; };
 
   // Removes: