Skip to content

Commit

Permalink
llvm-objdump: add --rpaths to macho support
Browse files Browse the repository at this point in the history
This prints the rpaths for the given binary

Reviewed By: kastiglione

Differential Revision: https://reviews.llvm.org/D100681
  • Loading branch information
keith committed Apr 22, 2021
1 parent af91065 commit 86b98c6
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 2 deletions.
4 changes: 4 additions & 0 deletions llvm/docs/CommandGuide/llvm-objdump.rst
Expand Up @@ -367,6 +367,10 @@ MACH-O ONLY OPTIONS AND COMMANDS

Display rebasing information.

.. option:: --rpaths

Display runtime search paths for the binary.

.. option:: --universal-headers

Display universal headers.
Expand Down
13 changes: 13 additions & 0 deletions llvm/test/tools/llvm-objdump/MachO/rpaths.test
@@ -0,0 +1,13 @@
## Validate fetching rpaths from a binary results in the correct output.
# RUN: llvm-objdump --macho --rpaths --arch x86_64 %p/Inputs/Objc2.64bit.exe.macho-x86_64 | FileCheck --implicit-check-not={{.}} %s
# RUN: llvm-objdump --macho --rpaths %p/Inputs/Objc2.64bit.exe.macho-x86_64 | FileCheck --implicit-check-not={{.}} %s

# CHECK: {{.*}}Objc2.64bit.exe.macho-x86_64:
# CHECK: @executable_path/../Frameworks

## Validate binaries with no rpaths should print nothing.
# RUN: llvm-objdump --macho --no-leading-headers --rpaths %p/Inputs/hello.exe.macho-i386 | count 0

## Validate passing --rpaths without --macho fails.
# RUN: not llvm-objdump --rpaths %p/Inputs/hello.exe.macho-i386 2>&1 | FileCheck --check-prefix=ERROR %s
# ERROR: USAGE
16 changes: 15 additions & 1 deletion llvm/tools/llvm-objdump/MachODump.cpp
Expand Up @@ -66,6 +66,7 @@ using namespace llvm::objdump;
bool objdump::FirstPrivateHeader;
bool objdump::ExportsTrie;
bool objdump::Rebase;
bool objdump::Rpaths;
bool objdump::Bind;
bool objdump::LazyBind;
bool objdump::WeakBind;
Expand Down Expand Up @@ -95,6 +96,7 @@ void objdump::parseMachOOptions(const llvm::opt::InputArgList &InputArgs) {
FirstPrivateHeader = InputArgs.hasArg(OBJDUMP_private_header);
ExportsTrie = InputArgs.hasArg(OBJDUMP_exports_trie);
Rebase = InputArgs.hasArg(OBJDUMP_rebase);
Rpaths = InputArgs.hasArg(OBJDUMP_rpaths);
Bind = InputArgs.hasArg(OBJDUMP_bind);
LazyBind = InputArgs.hasArg(OBJDUMP_lazy_bind);
WeakBind = InputArgs.hasArg(OBJDUMP_weak_bind);
Expand Down Expand Up @@ -1233,6 +1235,16 @@ static void PrintDylibs(MachOObjectFile *O, bool JustId) {
}
}

static void printRpaths(MachOObjectFile *O) {
for (const auto &Command : O->load_commands()) {
if (Command.C.cmd == MachO::LC_RPATH) {
auto Rpath = O->getRpathCommand(Command);
const char *P = (const char *)(Command.Ptr) + Rpath.path;
outs() << P << "\n";
}
}
}

typedef DenseMap<uint64_t, StringRef> SymbolAddressMap;

static void CreateSymbolAddressMap(MachOObjectFile *O,
Expand Down Expand Up @@ -1885,7 +1897,7 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF,
if (Disassemble || Relocations || PrivateHeaders || ExportsTrie || Rebase ||
Bind || SymbolTable || LazyBind || WeakBind || IndirectSymbols ||
DataInCode || FunctionStarts || LinkOptHints || DylibsUsed || DylibId ||
ObjcMetaData || (!FilterSections.empty())) {
Rpaths || ObjcMetaData || (!FilterSections.empty())) {
if (LeadingHeaders) {
outs() << Name;
if (!ArchiveMemberName.empty())
Expand Down Expand Up @@ -1974,6 +1986,8 @@ static void ProcessMachO(StringRef Name, MachOObjectFile *MachOOF,
printExportsTrie(MachOOF);
if (Rebase)
printRebaseTable(MachOOF);
if (Rpaths)
printRpaths(MachOOF);
if (Bind)
printBindTable(MachOOF);
if (LazyBind)
Expand Down
1 change: 1 addition & 0 deletions llvm/tools/llvm-objdump/MachODump.h
Expand Up @@ -49,6 +49,7 @@ extern bool LeadingHeaders;
extern bool LinkOptHints;
extern bool ObjcMetaData;
extern bool Rebase;
extern bool Rpaths;
extern bool SymbolicOperands;
extern bool UniversalHeaders;
extern bool Verbose;
Expand Down
5 changes: 5 additions & 0 deletions llvm/tools/llvm-objdump/ObjdumpOpts.td
Expand Up @@ -396,6 +396,11 @@ def dylib_id : Flag<["--"], "dylib-id">,
"dylib Mach-O file (requires --macho)">,
Group<grp_mach_o>;

def rpaths : Flag<["--"], "rpaths">,
HelpText<"Print the runtime search paths for the "
"Mach-O file (requires --macho)">,
Group<grp_mach_o>;

def non_verbose : Flag<["--"], "non-verbose">,
HelpText<"Print the info for Mach-O objects in non-verbose or "
"numeric form (requires --macho)">,
Expand Down
2 changes: 1 addition & 1 deletion llvm/tools/llvm-objdump/llvm-objdump.cpp
Expand Up @@ -3075,7 +3075,7 @@ int main(int argc, char **argv) {
!(MachOOpt &&
(Bind || DataInCode || DylibId || DylibsUsed || ExportsTrie ||
FirstPrivateHeader || FunctionStarts || IndirectSymbols || InfoPlist ||
LazyBind || LinkOptHints || ObjcMetaData || Rebase ||
LazyBind || LinkOptHints || ObjcMetaData || Rebase || Rpaths ||
UniversalHeaders || WeakBind || !FilterSections.empty()))) {
T->printHelp(ToolName);
return 2;
Expand Down

0 comments on commit 86b98c6

Please sign in to comment.