diff options
| author | Ed Maste <emaste@freebsd.org> | 2013-10-10 16:09:31 +0000 |
|---|---|---|
| committer | Ed Maste <emaste@freebsd.org> | 2013-10-10 16:09:31 +0000 |
| commit | bb59e049ba5c60d300a4fa15907bb4197c0d8915 (patch) | |
| tree | 5248b8ff694c2071ee8413cf0e55353279378f1f /lldb/source/Plugins/DynamicLoader | |
| parent | 3431b38067240ec37a97f51f55bfebe8c3b3639a (diff) | |
| download | bcm5719-llvm-bb59e049ba5c60d300a4fa15907bb4197c0d8915.tar.gz bcm5719-llvm-bb59e049ba5c60d300a4fa15907bb4197c0d8915.zip | |
POSIX dyld: handle extra MIPS link map field
On at least FreeBSD and NetBSD there is an extra field in the dyld link
map struct. I've left an assert for other OSes (i.e., Linux/mips) until
it's determined if they do the same.
llvm-svn: 192358
Diffstat (limited to 'lldb/source/Plugins/DynamicLoader')
| -rw-r--r-- | lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp index 524e7720533..556df606248 100644 --- a/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp +++ b/lldb/source/Plugins/DynamicLoader/POSIX-DYLD/DYLDRendezvous.cpp @@ -287,6 +287,21 @@ DYLDRendezvous::ReadSOEntryFromMemory(lldb::addr_t addr, SOEntry &entry) if (!(addr = ReadPointer(addr, &entry.base_addr))) return false; + + // mips adds an extra load offset field to the link map struct on + // FreeBSD and NetBSD (need to validate other OSes). + // http://svnweb.freebsd.org/base/head/sys/sys/link_elf.h?revision=217153&view=markup#l57 + const ArchSpec &arch = m_process->GetTarget().GetArchitecture(); + if (arch.GetCore() == ArchSpec::eCore_mips64) + { + assert (arch.GetTriple().getOS() == llvm::Triple::FreeBSD || + arch.GetTriple().getOS() == llvm::Triple::NetBSD); + addr_t mips_l_offs; + if (!(addr = ReadPointer(addr, &mips_l_offs))) + return false; + if (mips_l_offs != 0 && mips_l_offs != entry.base_addr) + return false; + } if (!(addr = ReadPointer(addr, &entry.path_addr))) return false; |

