Index: test/tools/llvm-objcopy/ELF/redefine-symbol.test =================================================================== --- test/tools/llvm-objcopy/ELF/redefine-symbol.test +++ test/tools/llvm-objcopy/ELF/redefine-symbol.test @@ -3,6 +3,10 @@ # RUN: llvm-readobj --symbols %t2 | FileCheck %s # RUN: not llvm-objcopy --redefine-sym barbar %t %t2 2>&1 | FileCheck %s --check-prefix=BAD-FORMAT # RUN: not llvm-objcopy --redefine-sym foo=f1 --redefine-sym foo=f2 %t %t2 2>&1 | FileCheck %s --check-prefix=MULTIPLE-REDEFINITION +# RUN: echo " foo oof #rename foo " > %t.rename.txt +# RUN: echo "empty" >> %t.rename.txt +# RUN: llvm-objcopy --redefine-syms %t.rename.txt %t %t3 +# RUN: cmp %t2 %t3 !ELF FileHeader: Index: tools/llvm-objcopy/CopyConfig.cpp =================================================================== --- tools/llvm-objcopy/CopyConfig.cpp +++ tools/llvm-objcopy/CopyConfig.cpp @@ -244,6 +244,22 @@ } } +static void addSymbolsToRenameFromFile(StringMap &SymbolsToRename, + StringRef Filename) { + SmallVector Lines; + auto BufOrErr = MemoryBuffer::getFile(Filename); + if (!BufOrErr) + reportError(Filename, BufOrErr.getError()); + + BufOrErr.get()->getBuffer().split(Lines, '\n'); + for (StringRef Line : Lines) { + auto TrimmedLine = Line.split('#').first.trim(); + if (!TrimmedLine.empty()) { + auto Pair = TrimmedLine.split(' '); + SymbolsToRename.insert({Pair.first, Pair.second.trim()}); + } + } +} // ParseObjcopyOptions returns the config and sets the input arguments. If a // help flag is set then ParseObjcopyOptions will print the help messege and // exit. @@ -346,6 +362,9 @@ error("Multiple redefinition of symbol " + Old2New.first); } + for (auto Arg : InputArgs.filtered(OBJCOPY_redefine_symbols)) + addSymbolsToRenameFromFile(Config.SymbolsToRename, Arg->getValue()); + for (auto Arg : InputArgs.filtered(OBJCOPY_rename_section)) { SectionRename SR = parseRenameSectionValue(StringRef(Arg->getValue())); if (!Config.SectionsToRename.try_emplace(SR.OriginalName, SR).second) Index: tools/llvm-objcopy/ObjcopyOpts.td =================================================================== --- tools/llvm-objcopy/ObjcopyOpts.td +++ tools/llvm-objcopy/ObjcopyOpts.td @@ -76,6 +76,16 @@ defm redefine_symbol : Eq<"redefine-sym", "Change the name of a symbol old to new">, MetaVarName<"old=new">; +defm redefine_symbols + : Eq<"redefine-syms", + "Reads a list of symbol pairs from and runs as if " + "--redefine-sym== is set for each one. " + "contains two symbol per line separated with whitespace and may " + "contain comments beginning with '#'. Leading and trailing " + "whitespace is stripped from each line. May be repeated to read " + "symbols from many files.">, + MetaVarName<"filename">; + defm keep_section : Eq<"keep-section", "Keep
">, MetaVarName<"section">; defm only_section : Eq<"only-section", "Remove all but
">,