From 61133e0b1110d03e35d0acc9ccfda2b6d9fb03cd Mon Sep 17 00:00:00 2001 From: Tobias Hieta Date: Tue, 13 Oct 2020 00:45:14 -0700 Subject: [PATCH] [llvm-install-name-tool] Add -delete_all_rpaths option This diff adds an option to remove all rpaths from a Mach-O binary. Test plan: make check-all Differential revision: https://reviews.llvm.org/D88674 --- llvm/docs/CommandGuide/llvm-install-name-tool.rst | 4 ++++ .../MachO/install-name-tool-delete-rpath.test | 15 +++++++++++++++ llvm/tools/llvm-objcopy/CopyConfig.cpp | 3 +++ llvm/tools/llvm-objcopy/CopyConfig.h | 3 +++ llvm/tools/llvm-objcopy/InstallNameToolOpts.td | 3 +++ llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp | 8 +++++++- 6 files changed, 35 insertions(+), 1 deletion(-) diff --git a/llvm/docs/CommandGuide/llvm-install-name-tool.rst b/llvm/docs/CommandGuide/llvm-install-name-tool.rst index 87775d4..33eb998 100644 --- a/llvm/docs/CommandGuide/llvm-install-name-tool.rst +++ b/llvm/docs/CommandGuide/llvm-install-name-tool.rst @@ -43,6 +43,10 @@ the same `` value. times to delete multiple rpaths. Throws an error if ```` is not listed in the binary. +.. option:: -delete_all_rpaths + + Deletes all rpaths from the binary. + .. option:: --help, -h Print a summary of command line options. diff --git a/llvm/test/tools/llvm-objcopy/MachO/install-name-tool-delete-rpath.test b/llvm/test/tools/llvm-objcopy/MachO/install-name-tool-delete-rpath.test index b5e6abb..77dd6d5 100644 --- a/llvm/test/tools/llvm-objcopy/MachO/install-name-tool-delete-rpath.test +++ b/llvm/test/tools/llvm-objcopy/MachO/install-name-tool-delete-rpath.test @@ -42,6 +42,21 @@ # COMBINED: cannot specify both -add_rpath @executable_b/. and -delete_rpath @executable_b/. +## Remove all RPATHS +# RUN: yaml2obj %s -o %t2 +# RUN: llvm-install-name-tool -delete_all_rpaths %t2 +# RUN: llvm-objdump -p %t2 | FileCheck %s + +# CHECK-NOT: LC_RPATH + +## Remove all RPATHS and add a new one. +# RUN: yaml2obj %s -o %t3 +# RUN: llvm-install-name-tool --delete_all_rpaths -add_rpath @executable_b/. %t3 +# RUN: llvm-objdump -p %t3 | \ +# RUN: FileCheck %s --check-prefix=DELETE_AND_ADD --implicit-check-not=@executable + +# DELETE_AND_ADD: @executable_b/. + --- !mach-o FileHeader: magic: 0xFEEDFACF diff --git a/llvm/tools/llvm-objcopy/CopyConfig.cpp b/llvm/tools/llvm-objcopy/CopyConfig.cpp index a98c16e..cdd9147 100644 --- a/llvm/tools/llvm-objcopy/CopyConfig.cpp +++ b/llvm/tools/llvm-objcopy/CopyConfig.cpp @@ -953,6 +953,9 @@ parseInstallNameToolOptions(ArrayRef ArgsArr) { for (auto *Arg : InputArgs.filtered(INSTALL_NAME_TOOL_change)) Config.InstallNamesToUpdate.insert({Arg->getValue(0), Arg->getValue(1)}); + Config.RemoveAllRpaths = + InputArgs.hasArg(INSTALL_NAME_TOOL_delete_all_rpaths); + SmallVector Positional; for (auto Arg : InputArgs.filtered(INSTALL_NAME_TOOL_UNKNOWN)) return createStringError(errc::invalid_argument, "unknown argument '%s'", diff --git a/llvm/tools/llvm-objcopy/CopyConfig.h b/llvm/tools/llvm-objcopy/CopyConfig.h index 666d0d4..af763f2 100644 --- a/llvm/tools/llvm-objcopy/CopyConfig.h +++ b/llvm/tools/llvm-objcopy/CopyConfig.h @@ -230,6 +230,9 @@ struct CopyConfig { bool StripUnneeded = false; bool Weaken = false; bool DecompressDebugSections = false; + // install-name-tool's --delete_all_rpaths + bool RemoveAllRpaths = false; + DebugCompressionType CompressionType = DebugCompressionType::None; // parseELFConfig performs ELF-specific command-line parsing. Fills `ELF` on diff --git a/llvm/tools/llvm-objcopy/InstallNameToolOpts.td b/llvm/tools/llvm-objcopy/InstallNameToolOpts.td index 7998041..1c4e37f 100644 --- a/llvm/tools/llvm-objcopy/InstallNameToolOpts.td +++ b/llvm/tools/llvm-objcopy/InstallNameToolOpts.td @@ -21,6 +21,9 @@ def add_rpath : Option<["-", "--"], "add_rpath", KIND_SEPARATE>, def delete_rpath: Option<["-", "--"], "delete_rpath", KIND_SEPARATE>, HelpText<"Delete specified rpath">; +def delete_all_rpaths: Flag<["-", "--"], "delete_all_rpaths">, + HelpText<"Delete all rpath directives">; + def rpath: MultiArg<["-", "--"], "rpath", 2>, HelpText<"Change rpath path name">; diff --git a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp index 337c448..4dbf1dab 100644 --- a/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp +++ b/llvm/tools/llvm-objcopy/MachO/MachOObjcopy.cpp @@ -137,8 +137,14 @@ static Error processLoadCommands(const CopyConfig &Config, Object &Obj) { DenseSet RPathsToRemove(Config.RPathsToRemove.begin(), Config.RPathsToRemove.end()); - LoadCommandPred RemovePred = [&RPathsToRemove](const LoadCommand &LC) { + LoadCommandPred RemovePred = [&RPathsToRemove, + &Config](const LoadCommand &LC) { if (LC.MachOLoadCommand.load_command_data.cmd == MachO::LC_RPATH) { + // When removing all RPaths we don't need to care + // about what it contains + if (Config.RemoveAllRpaths) + return true; + StringRef RPath = getPayloadString(LC); if (RPathsToRemove.count(RPath)) { RPathsToRemove.erase(RPath); -- 2.7.4