Index: test/tools/llvm-objcopy/basic-keep.test =================================================================== --- test/tools/llvm-objcopy/basic-keep.test +++ test/tools/llvm-objcopy/basic-keep.test @@ -1,6 +1,8 @@ # RUN: yaml2obj %s > %t # RUN: llvm-objcopy -strip-non-alloc -keep=.test %t %t2 +# RUN: llvm-strip --strip-all -keep=.test %t -o %t3 # RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s +# RUN: cmp %t2 %t3 !ELF FileHeader: Index: test/tools/llvm-objcopy/strip-all-gnu.test =================================================================== --- test/tools/llvm-objcopy/strip-all-gnu.test +++ test/tools/llvm-objcopy/strip-all-gnu.test @@ -1,7 +1,9 @@ # RUN: yaml2obj %s > %t # RUN: cp %t %t1 # RUN: llvm-objcopy --strip-all-gnu %t %t2 +# RUN: llvm-strip --strip-all-gnu %t -o %t3 # RUN: llvm-readobj -file-headers -sections %t2 | FileCheck %s +# RUN: cmp %t2 %t3 !ELF FileHeader: Index: tools/llvm-objcopy/CopyConfig.cpp =================================================================== --- tools/llvm-objcopy/CopyConfig.cpp +++ tools/llvm-objcopy/CopyConfig.cpp @@ -401,10 +401,15 @@ Config.DiscardAll = InputArgs.hasArg(STRIP_discard_all); Config.StripUnneeded = InputArgs.hasArg(STRIP_strip_unneeded); Config.StripAll = InputArgs.hasArg(STRIP_strip_all); + Config.StripAllGNU = InputArgs.hasArg(STRIP_strip_all_gnu); - if (!Config.StripDebug && !Config.StripUnneeded && !Config.DiscardAll) + if (!Config.StripDebug && !Config.StripUnneeded && !Config.DiscardAll && + !Config.StripAllGNU) Config.StripAll = true; + for (auto Arg : InputArgs.filtered(STRIP_keep)) + Config.Keep.push_back(Arg->getValue()); + for (auto Arg : InputArgs.filtered(STRIP_remove_section)) Config.ToRemove.push_back(Arg->getValue()); Index: tools/llvm-objcopy/StripOpts.td =================================================================== --- tools/llvm-objcopy/StripOpts.td +++ tools/llvm-objcopy/StripOpts.td @@ -22,6 +22,9 @@ def s : Flag<["-"], "s">, Alias; +def strip_all_gnu : Flag<["-", "--"], "strip-all-gnu">, + HelpText<"Compaitable with GNU strip's --strip-all">; + def strip_debug : Flag<["-", "--"], "strip-debug">, HelpText<"Remove debugging symbols only">; @@ -41,6 +44,8 @@ def R : JoinedOrSeparate<["-"], "R">, Alias; +defm keep : Eq<"keep">, MetaVarName<"section">, HelpText<"Keep
">; + defm keep_symbol : Eq<"keep-symbol">, MetaVarName<"symbol">, HelpText<"Do not remove symbol ">;