From 2bb88ab5e0c2a980c5cd723f362bafd9e0a3e927 Mon Sep 17 00:00:00 2001 From: George Rimar Date: Mon, 19 Dec 2016 18:00:52 +0000 Subject: [PATCH] [ELF] - Implemented --retain-symbols-file option --retain-symbols-file=filename Retain only the symbols listed in the file filename, discarding all others. filename is simply a flat file, with one symbol name per line. This option is especially useful in environments (such as VxWorks) where a large global symbol table is accumulated gradually, to conserve run-time memory. Note: though documentation says "--retain-symbols-file does not discard undefined symbols, or symbols needed for relocations.", both bfd and gold do that, and this patch too, like testcase show. Differential revision: https://reviews.llvm.org/D27716 llvm-svn: 290122 --- lld/ELF/Config.h | 6 ++++-- lld/ELF/Driver.cpp | 35 ++++++++++++++++++++++++++---- lld/ELF/Options.td | 4 ++++ lld/ELF/Writer.cpp | 6 ++++++ lld/test/ELF/retain-symbols-file.s | 44 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 89 insertions(+), 6 deletions(-) create mode 100644 lld/test/ELF/retain-symbols-file.s diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index d8e78e0..efeadf2 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -12,6 +12,7 @@ #include "llvm/ADT/MapVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringSet.h" #include "llvm/Support/ELF.h" #include @@ -33,8 +34,8 @@ enum ELFKind { // For --build-id. enum class BuildIdKind { None, Fast, Md5, Sha1, Hexstring, Uuid }; -// For --discard-{all,locals,none}. -enum class DiscardPolicy { Default, All, Locals, None }; +// For --discard-{all,locals,none} and --retain-symbols-file. +enum class DiscardPolicy { Default, All, Locals, RetainFile, None }; // For --strip-{all,debug}. enum class StripPolicy { None, All, Debug }; @@ -83,6 +84,7 @@ struct Configuration { llvm::StringRef OutputFile; llvm::StringRef SoName; llvm::StringRef Sysroot; + llvm::StringSet<> RetainSymbolsFile; std::string RPath; std::vector VersionDefinitions; std::vector AuxiliaryList; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 935da5d..a567cce 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -478,16 +478,35 @@ static SortSectionPolicy getSortKind(opt::InputArgList &Args) { return SortSectionPolicy::Default; } +static std::vector getLines(MemoryBufferRef MB) { + std::vector Ret; + SmallVector Arr; + MB.getBuffer().split(Arr, '\n'); + for (StringRef S : Arr) { + S = S.trim(); + if (!S.empty()) + Ret.push_back(S); + } + return Ret; +} + // Parse the --symbol-ordering-file argument. File has form: // symbolName1 // [...] // symbolNameN static void parseSymbolOrderingList(MemoryBufferRef MB) { unsigned I = 0; - SmallVector Arr; - MB.getBuffer().split(Arr, '\n'); - for (StringRef S : Arr) - Config->SymbolOrderingFile.insert({S.trim(), I++}); + for (StringRef S : getLines(MB)) + Config->SymbolOrderingFile.insert({S, I++}); +} + +// Parse the --retain-symbols-file argument. File has form: +// symbolName1 +// [...] +// symbolNameN +static void parseRetainSymbolsList(MemoryBufferRef MB) { + for (StringRef S : getLines(MB)) + Config->RetainSymbolsFile.insert(S); } // Initializes Config members by the command line options. @@ -636,6 +655,14 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) { if (Optional Buffer = readFile(Arg->getValue())) parseSymbolOrderingList(*Buffer); + // If --retain-symbol-file is used, we'll retail only the symbols listed in + // the file and discard all others. + if (auto *Arg = Args.getLastArg(OPT_retain_symbols_file)) { + Config->Discard = DiscardPolicy::RetainFile; + if (Optional Buffer = readFile(Arg->getValue())) + parseRetainSymbolsList(*Buffer); + } + for (auto *Arg : Args.filtered(OPT_export_dynamic_symbol)) Config->VersionScriptGlobals.push_back( {Arg->getValue(), /*IsExternCpp*/ false, /*HasWildcard*/ false}); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 98505e6..d7a699a 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -176,6 +176,9 @@ def rpath: S<"rpath">, HelpText<"Add a DT_RUNPATH to the output">; def relocatable: F<"relocatable">, HelpText<"Create relocatable object file">; +def retain_symbols_file: J<"retain-symbols-file=">, MetaVarName<"">, + HelpText<"Retain only the symbols listed in the file">; + def script: S<"script">, HelpText<"Read linker script">; def section_start: S<"section-start">, MetaVarName<"
">, @@ -269,6 +272,7 @@ def alias_o_output: Joined<["--"], "output=">, Alias; def alias_o_output2 : Separate<["--"], "output">, Alias; def alias_pie_pic_executable: F<"pic-executable">, Alias; def alias_relocatable_r: Flag<["-"], "r">, Alias; +def alias_retain_symbols_file: S<"retain-symbols-file">, Alias; def alias_rpath_R: JoinedOrSeparate<["-"], "R">, Alias; def alias_rpath_rpath: J<"rpath=">, Alias; def alias_script_T: JoinedOrSeparate<["-"], "T">, Alias