summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: d3c452a)
raw | patch | inline | side by side (parent: d3c452a)
author | Jean-Daniel Dupas <devlists@shadowlab.org> | |
Thu, 4 Dec 2014 07:37:02 +0000 (07:37 +0000) | ||
committer | Jean-Daniel Dupas <devlists@shadowlab.org> | |
Thu, 4 Dec 2014 07:37:02 +0000 (07:37 +0000) |
Summary: Add rpath load command support in Mach-O object and update llvm-objdump to use it.
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D6512
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223343 91177308-0d34-0410-b5e6-96231b3b80d8
Subscribers: llvm-commits
Differential Revision: http://reviews.llvm.org/D6512
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223343 91177308-0d34-0410-b5e6-96231b3b80d8
index 768cda6800e5bab95042fec30fa5c67223563ae6..94a4d0442f34981655dd12f65eb73f772d456f6b 100644 (file)
getDylinkerCommand(const LoadCommandInfo &L) const;
MachO::uuid_command
getUuidCommand(const LoadCommandInfo &L) const;
+ MachO::rpath_command
+ getRpathCommand(const LoadCommandInfo &L) const;
MachO::source_version_command
getSourceVersionCommand(const LoadCommandInfo &L) const;
MachO::entry_point_command
index c07bd88af403fc14b521047edda997dcf02be92d..20202bee26a5f03e400615fbd238965e636b8c81 100644 (file)
sys::swapByteOrder(u.cmdsize);
}
+ inline void swapStruct(rpath_command &r) {
+ sys::swapByteOrder(r.cmd);
+ sys::swapByteOrder(r.cmdsize);
+ sys::swapByteOrder(r.path);
+ }
+
inline void swapStruct(source_version_command &s) {
sys::swapByteOrder(s.cmd);
sys::swapByteOrder(s.cmdsize);
index bbef6390dde52cc890ff18f40f959556a0ac99e5..c6fb087484217fd86201f4feb1ac994fc7f4f2a0 100644 (file)
return getStruct<MachO::uuid_command>(this, L.Ptr);
}
+MachO::rpath_command
+MachOObjectFile::getRpathCommand(const LoadCommandInfo &L) const {
+ return getStruct<MachO::rpath_command>(this, L.Ptr);
+}
+
MachO::source_version_command
MachOObjectFile::getSourceVersionCommand(const LoadCommandInfo &L) const {
return getStruct<MachO::source_version_command>(this, L.Ptr);
index c562044b3c4e664121e2e50bcd46e6bde2140d59..d311bec58489e8bc776788b308347374f5221f8f 100644 (file)
RUN: | FileCheck %s -check-prefix ELF-i386
RUN: llvm-objdump -p %p/Inputs/program-headers.elf-x86-64 \
RUN: | FileCheck %s -check-prefix ELF-x86-64
+RUN: llvm-objdump -p %p/Inputs/macho-rpath-x86_64 \
+RUN: | FileCheck %s -check-prefix MACHO-x86_64
ELF-i386: Program Header:
ELF-i386: LOAD off 0x00000000 vaddr 0x08048000 paddr 0x08048000 align 2**12
ELF-x86-64: filesz 0x0000000000000014 memsz 0x0000000000000014 flags r--
ELF-x86-64: STACK off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**3
ELF-x86-64: filesz 0x0000000000000000 memsz 0x0000000000000000 flags rw-
+
+MACHO-x86_64: Load command 12
+MACHO-x86_64: cmd LC_RPATH
+MACHO-x86_64: cmdsize 32
+MACHO-x86_64: path @executable_path/. (offset 12)
index 3a28703ab0d6cbb2376a6cbb5af075d3789791a2..7f97d8a314b6048f4a9c7f6d671b6a639ce8ed7a 100644 (file)
outs() << "\n";
}
+static void PrintRpathLoadCommand(MachO::rpath_command rpath,
+ const char *Ptr) {
+ outs() << " cmd LC_RPATH\n";
+ outs() << " cmdsize " << rpath.cmdsize;
+ if (rpath.cmdsize < sizeof(struct MachO::rpath_command))
+ outs() << " Incorrect size\n";
+ else
+ outs() << "\n";
+ if (rpath.path >= rpath.cmdsize)
+ outs() << " path ?(bad offset " << rpath.path << ")\n";
+ else {
+ const char *P = (const char *)(Ptr) + rpath.path;
+ outs() << " path " << P << " (offset " << rpath.path << ")\n";
+ }
+}
+
static void PrintVersionMinLoadCommand(MachO::version_min_command vd) {
if (vd.cmd == MachO::LC_VERSION_MIN_MACOSX)
outs() << " cmd LC_VERSION_MIN_MACOSX\n";
} else if (Command.C.cmd == MachO::LC_UUID) {
MachO::uuid_command Uuid = Obj->getUuidCommand(Command);
PrintUuidLoadCommand(Uuid);
+ } else if (Command.C.cmd == MachO::LC_RPATH) {
+ MachO::rpath_command Rpath = Obj->getRpathCommand(Command);
+ PrintRpathLoadCommand(Rpath, Command.Ptr);
} else if (Command.C.cmd == MachO::LC_VERSION_MIN_MACOSX) {
MachO::version_min_command Vd = Obj->getVersionMinLoadCommand(Command);
PrintVersionMinLoadCommand(Vd);