From 1bcc7bac8f1bf50d73b7505ea069f7a0efa620ce Mon Sep 17 00:00:00 2001 From: "Bhushan D. Attarde" Date: Tue, 15 Sep 2015 05:45:29 +0000 Subject: [LLDB][MIPS] Add support for DT_MIPS_RLD_MAP_REL SUMMARY: This patch provides support for MIPS specific DT_MIPS_RLD_MAP_REL tag in LLDB. This tag allows debugging of MIPS position independent executables and provides access to shared library information. Reviewers: clayborg Subscribers: mohit.bhakkad, sagar, jaydeep, lldb-commits Differential Revision: http://reviews.llvm.org/D12794 llvm-svn: 247666 --- .../Plugins/ObjectFile/ELF/ObjectFileELF.cpp | 27 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) (limited to 'lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp') diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp index 565f95d..a846bee 100644 --- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -1097,16 +1097,35 @@ ObjectFileELF::GetImageInfoAddress(Target *target) addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize(); return Address(dynsym_section_sp, offset); } - else if (symbol.d_tag == DT_MIPS_RLD_MAP && target) + // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP exists in non-PIE. + else if ((symbol.d_tag == DT_MIPS_RLD_MAP || symbol.d_tag == DT_MIPS_RLD_MAP_REL) && target) { addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize(); addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target); if (dyn_base == LLDB_INVALID_ADDRESS) return Address(); - Address addr; + Error error; - if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr)) - return addr; + if (symbol.d_tag == DT_MIPS_RLD_MAP) + { + // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer. + Address addr; + if (target->ReadPointerFromMemory(dyn_base + offset, false, error, addr)) + return addr; + } + if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) + { + // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer, relative to the address of the tag. + uint64_t rel_offset; + rel_offset = target->ReadUnsignedIntegerFromMemory(dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error); + if (error.Success() && rel_offset != UINT64_MAX) + { + Address addr; + addr_t debug_ptr_address = dyn_base + (offset - GetAddressByteSize()) + rel_offset; + addr.SetOffset (debug_ptr_address); + return addr; + } + } } } -- cgit v1.1