summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/llvm-objcopy/llvm-objcopy.cpp')
-rw-r--r--llvm/tools/llvm-objcopy/llvm-objcopy.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 1fa87622a3f..7158ceed53f 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -118,6 +118,7 @@ struct CopyConfig {
std::vector<StringRef> Keep;
std::vector<StringRef> OnlyKeep;
std::vector<StringRef> AddSection;
+ std::vector<StringRef> LocalizeSymbol;
bool StripAll;
bool StripAllGNU;
bool StripDebug;
@@ -129,6 +130,7 @@ struct CopyConfig {
};
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"); }
@@ -188,14 +190,27 @@ void HandleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader,
SplitDWOToFile(Config, Reader, Config.SplitDWO, OutputElfType);
}
+ SymbolPred LocalizePred = [](const Symbol &) { return false; };
+
// Localize:
if (Config.LocalizeHidden) {
- Obj.SymbolTable->localize([](const Symbol &Sym) {
+ 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:
@@ -398,6 +413,8 @@ CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
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;
}
OpenPOWER on IntegriCloud