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.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
index 2c2c9926447..0a5b5b0d066 100644
--- a/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
+++ b/llvm/tools/llvm-objcopy/llvm-objcopy.cpp
@@ -168,6 +168,7 @@ struct CopyConfig {
bool StripSections = false;
bool StripNonAlloc = false;
bool StripDWO = false;
+ bool StripUnneeded = false;
bool ExtractDWO = false;
bool LocalizeHidden = false;
bool Weaken = false;
@@ -263,6 +264,14 @@ void HandleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader,
Sym.Name = I->getValue();
});
+ // The purpose of this loop is to mark symbols referenced by sections
+ // (like GroupSection or RelocationSection). This way, we know which
+ // symbols are still 'needed' and wich are not.
+ if (Config.StripUnneeded) {
+ for (auto &Section : Obj.sections())
+ Section.markSymbols();
+ }
+
Obj.removeSymbols([&](const Symbol &Sym) {
if (!Config.SymbolsToKeep.empty() &&
is_contained(Config.SymbolsToKeep, Sym.Name))
@@ -281,6 +290,13 @@ void HandleArgs(const CopyConfig &Config, Object &Obj, const Reader &Reader,
return true;
}
+ // TODO: We might handle the 'null symbol' in a different way
+ // by probably handling it the same way as we handle 'null section' ?
+ if (Config.StripUnneeded && !Sym.Referenced && Sym.Index != 0 &&
+ (Sym.Binding == STB_LOCAL || Sym.getShndx() == SHN_UNDEF) &&
+ Sym.Type != STT_FILE && Sym.Type != STT_SECTION)
+ return true;
+
return false;
});
}
@@ -509,6 +525,7 @@ CopyConfig ParseObjcopyOptions(ArrayRef<const char *> ArgsArr) {
Config.StripDWO = InputArgs.hasArg(OBJCOPY_strip_dwo);
Config.StripSections = InputArgs.hasArg(OBJCOPY_strip_sections);
Config.StripNonAlloc = InputArgs.hasArg(OBJCOPY_strip_non_alloc);
+ Config.StripUnneeded = InputArgs.hasArg(OBJCOPY_strip_unneeded);
Config.ExtractDWO = InputArgs.hasArg(OBJCOPY_extract_dwo);
Config.LocalizeHidden = InputArgs.hasArg(OBJCOPY_localize_hidden);
Config.Weaken = InputArgs.hasArg(OBJCOPY_weaken);
OpenPOWER on IntegriCloud