paulsemel created this revision.
paulsemel added reviewers: jakehehrlich, echristo.
Herald added a subscriber: llvm-commits.

This option permit to localize a symbol by given its name.


Repository:
  rL LLVM

https://reviews.llvm.org/D46064

Files:
  test/tools/llvm-objcopy/localize.test
  tools/llvm-objcopy/Opts.td
  tools/llvm-objcopy/llvm-objcopy.cpp

Index: tools/llvm-objcopy/llvm-objcopy.cpp
===================================================================
--- tools/llvm-objcopy/llvm-objcopy.cpp
+++ tools/llvm-objcopy/llvm-objcopy.cpp
@@ -118,6 +118,7 @@
   std::vector<StringRef> Keep;
   std::vector<StringRef> OnlyKeep;
   std::vector<StringRef> AddSection;
+  std::vector<StringRef> LocalizeSymbol;
   bool StripAll;
   bool StripAllGNU;
   bool StripDebug;
@@ -196,6 +197,14 @@
     });
   }
 
+  if (!Config.LocalizeSymbol.empty()) {
+    Obj.SymbolTable->localize([&Config](const Symbol &Sym) {
+      return std::find(std::begin(Config.LocalizeSymbol),
+                       std::end(Config.LocalizeSymbol),
+                       Sym.Name) != std::end(Config.LocalizeSymbol);
+    });
+  }
+
   SectionPred RemovePred = [](const SectionBase &) { return false; };
 
   // Removes:
@@ -398,6 +407,8 @@
   Config.StripNonAlloc = InputArgs.hasArg(OBJCOPY_strip_non_alloc);
   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());
 
   return Config;
 }
Index: tools/llvm-objcopy/Opts.td
===================================================================
--- tools/llvm-objcopy/Opts.td
+++ tools/llvm-objcopy/Opts.td
@@ -56,3 +56,8 @@
                   HelpText<"Remove all sections that are not DWARF .dwo sections from file">;
 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<"Localize <symbol>">;
+def L : JoinedOrSeparate<["-"], "L">,
+        Alias<localize_symbol>;
Index: test/tools/llvm-objcopy/localize.test
===================================================================
--- /dev/null
+++ test/tools/llvm-objcopy/localize.test
@@ -0,0 +1,104 @@
+# RUN: yaml2obj %s > %t
+# RUN: llvm-objcopy --localize-symbol defaultGlobal  %t %t2
+# RUN: llvm-readobj -symbols %t2 | FileCheck %s
+
+!ELF
+FileHeader:
+  Class:           ELFCLASS64
+  Data:            ELFDATA2LSB
+  Type:            ET_REL
+  Machine:         EM_X86_64
+Sections:
+  - Name:            .text
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC, SHF_EXECINSTR ]
+    Address:         0x1000
+    AddressAlign:    0x0000000000000010
+    Size:            64
+  - Name:            .data
+    Type:            SHT_PROGBITS
+    Flags:           [ SHF_ALLOC ]
+    Address:         0x2000
+    AddressAlign:    0x0000000000000010
+    Content:         "0000000000000000"
+Symbols:
+  Local:
+    - Name:     hiddenLocal
+      Type:     STT_FUNC
+      Section:  .text
+      Value:    0x1008
+      Size:     8
+      Visibility: STV_HIDDEN
+  Weak:
+    - Name:     hiddenWeak
+      Type:     STT_FUNC
+      Section:  .text
+      Value:    0x1010
+      Size:     8
+      Visibility: STV_HIDDEN
+  Global:
+    - Name:     defaultGlobal
+      Type:     STT_FUNC
+      Size:     8
+      Section:  .text
+      Value:    0x1000
+    - Name:     hiddenGlobal
+      Type:     STT_OBJECT
+      Section:  .data
+      Value:    0x2006
+      Size:     2
+      Visibility: STV_HIDDEN
+
+#CHECK: Symbols [
+#CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name:
+#CHECK-NEXT:    Value: 0x0
+#CHECK-NEXT:    Size: 0
+#CHECK-NEXT:    Binding: Local
+#CHECK-NEXT:    Type: None
+#CHECK-NEXT:    Other: 0
+#CHECK-NEXT:    Section: Undefined
+#CHECK-NEXT:  }
+#CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name: hiddenLocal
+#CHECK-NEXT:    Value: 0x1008
+#CHECK-NEXT:    Size: 8
+#CHECK-NEXT:    Binding: Local
+#CHECK-NEXT:    Type: Function
+#CHECK-NEXT:    Other [
+#CHECK-NEXT:      STV_HIDDEN
+#CHECK-NEXT:    ]
+#CHECK-NEXT:    Section: .text
+#CHECK-NEXT:  }
+#CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name: defaultGlobal
+#CHECK-NEXT:    Value: 0x1000
+#CHECK-NEXT:    Size: 8
+#CHECK-NEXT:    Binding: Local
+#CHECK-NEXT:    Type: Function
+#CHECK-NEXT:    Other: 0
+#CHECK-NEXT:    Section: .text
+#CHECK-NEXT:  }
+#CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name: hiddenGlobal
+#CHECK-NEXT:    Value: 0x2006
+#CHECK-NEXT:    Size: 2
+#CHECK-NEXT:    Binding: Global
+#CHECK-NEXT:    Type: Object
+#CHECK-NEXT:    Other [
+#CHECK-NEXT:      STV_HIDDEN
+#CHECK-NEXT:    ]
+#CHECK-NEXT:    Section: .data
+#CHECK-NEXT:  }
+#CHECK-NEXT:  Symbol {
+#CHECK-NEXT:    Name: hiddenWeak
+#CHECK-NEXT:    Value: 0x1010
+#CHECK-NEXT:    Size: 8
+#CHECK-NEXT:    Binding: Weak
+#CHECK-NEXT:    Type: Function
+#CHECK-NEXT:    Other [
+#CHECK-NEXT:      STV_HIDDEN
+#CHECK-NEXT:    ]
+#CHECK-NEXT:    Section: .text
+#CHECK-NEXT:  }
+#CHECK-NEXT:]
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to