Index: test/tools/llvm-objcopy/ELF/strip-symbol.test =================================================================== --- test/tools/llvm-objcopy/ELF/strip-symbol.test +++ test/tools/llvm-objcopy/ELF/strip-symbol.test @@ -1,4 +1,6 @@ # RUN: yaml2obj %s > %t +# RUN: llvm-strip --strip-symbol baz -N bar %t -o %t2 +# RUN: llvm-readobj --symbols --sections %t2 | FileCheck %s # RUN: llvm-objcopy --strip-symbol baz -N bar %t %t2 # RUN: llvm-readobj --symbols --sections %t2 | FileCheck %s Index: tools/llvm-objcopy/CopyConfig.cpp =================================================================== --- tools/llvm-objcopy/CopyConfig.cpp +++ tools/llvm-objcopy/CopyConfig.cpp @@ -434,7 +434,7 @@ Config.StripAllGNU = InputArgs.hasArg(STRIP_strip_all_gnu); if (!Config.StripDebug && !Config.StripUnneeded && !Config.DiscardAll && - !Config.StripAllGNU) + !Config.StripAllGNU && !InputArgs.hasArg(STRIP_strip_symbol)) Config.StripAll = true; for (auto Arg : InputArgs.filtered(STRIP_keep_section)) @@ -443,6 +443,9 @@ for (auto Arg : InputArgs.filtered(STRIP_remove_section)) Config.ToRemove.push_back(Arg->getValue()); + for (auto Arg : InputArgs.filtered(STRIP_strip_symbol)) + Config.SymbolsToRemove.push_back(Arg->getValue()); + for (auto Arg : InputArgs.filtered(STRIP_keep_symbol)) Config.SymbolsToKeep.push_back(Arg->getValue()); Index: tools/llvm-objcopy/StripOpts.td =================================================================== --- tools/llvm-objcopy/StripOpts.td +++ tools/llvm-objcopy/StripOpts.td @@ -51,6 +51,10 @@ MetaVarName<"section">; def R : JoinedOrSeparate<["-"], "R">, Alias; +defm strip_symbol : Eq<"strip-symbol", "Strip ">, + MetaVarName<"symbol">; +def N : JoinedOrSeparate<["-"], "N">, Alias; + defm keep_section : Eq<"keep-section", "Keep
">, MetaVarName<"section">; defm keep_symbol : Eq<"keep-symbol", "Do not remove symbol ">,