mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[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
This commit is contained in:
parent
0120cd1285
commit
34a683def6
@ -43,6 +43,10 @@ the same `<rpath>` value.
|
||||
times to delete multiple rpaths. Throws an error if ``<rpath>`` 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.
|
||||
|
@ -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
|
||||
|
@ -953,6 +953,9 @@ parseInstallNameToolOptions(ArrayRef<const char *> 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<StringRef, 2> Positional;
|
||||
for (auto Arg : InputArgs.filtered(INSTALL_NAME_TOOL_UNKNOWN))
|
||||
return createStringError(errc::invalid_argument, "unknown argument '%s'",
|
||||
|
@ -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
|
||||
|
@ -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">;
|
||||
|
||||
|
@ -137,8 +137,14 @@ static Error processLoadCommands(const CopyConfig &Config, Object &Obj) {
|
||||
DenseSet<StringRef> 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);
|
||||
|
Loading…
Reference in New Issue
Block a user