diff options
author | Keith Smiley <keithbsmiley@gmail.com> | 2020-10-23 15:00:25 -0700 |
---|---|---|
committer | Alexander Shaposhnikov <alexshap@fb.com> | 2020-10-23 15:01:03 -0700 |
commit | 77cbf2595331b11018c2cffb76eb5b8db69f4577 (patch) | |
tree | 23a11b8f8dcba8cf90132e9b76623b7fa43a6220 /llvm/tools/llvm-objcopy/CopyConfig.cpp | |
parent | 71e1a56de153536b9ff655fe740ccbf3f6b1faf0 (diff) | |
download | llvm-77cbf2595331b11018c2cffb76eb5b8db69f4577.zip llvm-77cbf2595331b11018c2cffb76eb5b8db69f4577.tar.gz llvm-77cbf2595331b11018c2cffb76eb5b8db69f4577.tar.bz2 |
[llvm-install-name-tool] Add -prepend_rpath option
This diff adds the option -prepend_rpath which inserts an rpath as
the first rpath in the binary.
Test plan: make check-all
Differential revision: https://reviews.llvm.org/D89605
Diffstat (limited to 'llvm/tools/llvm-objcopy/CopyConfig.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/CopyConfig.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/llvm/tools/llvm-objcopy/CopyConfig.cpp b/llvm/tools/llvm-objcopy/CopyConfig.cpp index cdd9147..1bab7cd 100644 --- a/llvm/tools/llvm-objcopy/CopyConfig.cpp +++ b/llvm/tools/llvm-objcopy/CopyConfig.cpp @@ -895,6 +895,9 @@ parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) { for (auto Arg : InputArgs.filtered(INSTALL_NAME_TOOL_add_rpath)) Config.RPathToAdd.push_back(Arg->getValue()); + for (auto *Arg : InputArgs.filtered(INSTALL_NAME_TOOL_prepend_rpath)) + Config.RPathToPrepend.push_back(Arg->getValue()); + for (auto Arg : InputArgs.filtered(INSTALL_NAME_TOOL_delete_rpath)) { StringRef RPath = Arg->getValue(); @@ -904,6 +907,11 @@ parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) { errc::invalid_argument, "cannot specify both -add_rpath %s and -delete_rpath %s", RPath.str().c_str(), RPath.str().c_str()); + if (is_contained(Config.RPathToPrepend, RPath)) + return createStringError( + errc::invalid_argument, + "cannot specify both -prepend_rpath %s and -delete_rpath %s", + RPath.str().c_str(), RPath.str().c_str()); Config.RPathsToRemove.insert(RPath); } @@ -940,6 +948,13 @@ parseInstallNameToolOptions(ArrayRef<const char *> ArgsArr) { "cannot specify both -add_rpath " + *It3 + " and -rpath " + Old + " " + New); + // Cannot specify the same rpath under both -prepend_rpath and -rpath. + auto It4 = find_if(Config.RPathToPrepend, Match); + if (It4 != Config.RPathToPrepend.end()) + return createStringError(errc::invalid_argument, + "cannot specify both -prepend_rpath " + *It4 + + " and -rpath " + Old + " " + New); + Config.RPathsToUpdate.insert({Old, New}); } |