summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/ObjectFile
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2014-02-07 22:54:47 +0000
committerGreg Clayton <gclayton@apple.com>2014-02-07 22:54:47 +0000
commit751caf65c26cf20b805e73ef650d688cfe7f7bc6 (patch)
treecfe358359bb94866b91dd339f4549370621215d6 /lldb/source/Plugins/ObjectFile
parentc7fb225cdc4662535340acb5ee0749a5c6d3c7d3 (diff)
downloadbcm5719-llvm-751caf65c26cf20b805e73ef650d688cfe7f7bc6.tar.gz
bcm5719-llvm-751caf65c26cf20b805e73ef650d688cfe7f7bc6.zip
Modified ObjectFile::SetLoadAddress() to now be:
ObjectFile::SetLoadAddress (Target &target, lldb::addr_t value, bool value_is_offset); Now "value" is a slide if "value_is_offset" is true, and "value" is an image base address otherwise. All previous usage of this API was using slides. Updated the ObjectFileELF and ObjectFileMachO SetLoadAddress methods to do the right thing. Also updated the ObjectFileMachO::SetLoadAddress() function to not load __LINKEDIT when it isn't needed and to only load sections that belong to the executable object file. llvm-svn: 201003
Diffstat (limited to 'lldb/source/Plugins/ObjectFile')
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp37
-rw-r--r--lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h4
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp103
-rw-r--r--lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h4
4 files changed, 112 insertions, 36 deletions
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
index 2f3cd8b78cf..02db05b3c6b 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp
@@ -464,7 +464,9 @@ ObjectFileELF::IsExecutable() const
}
bool
-ObjectFileELF::SetLoadAddress(Target &target, addr_t base_addr)
+ObjectFileELF::SetLoadAddress (Target &target,
+ lldb::addr_t value,
+ bool value_is_offset)
{
bool changed = false;
ModuleSP module_sp = GetModule();
@@ -474,23 +476,32 @@ ObjectFileELF::SetLoadAddress(Target &target, addr_t base_addr)
SectionList *section_list = GetSectionList ();
if (section_list)
{
- const size_t num_sections = section_list->GetSize();
- size_t sect_idx = 0;
- for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
+ if (value_is_offset)
{
- // Iterate through the object file sections to find all
- // of the sections that have SHF_ALLOC in their flag bits.
- SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
- // if (section_sp && !section_sp->IsThreadSpecific())
- if (section_sp && section_sp->Test(SHF_ALLOC))
+ const size_t num_sections = section_list->GetSize();
+ size_t sect_idx = 0;
+
+ for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
{
- if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + base_addr))
- ++num_loaded_sections;
+ // Iterate through the object file sections to find all
+ // of the sections that have SHF_ALLOC in their flag bits.
+ SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
+ // if (section_sp && !section_sp->IsThreadSpecific())
+ if (section_sp && section_sp->Test(SHF_ALLOC))
+ {
+ if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + value))
+ ++num_loaded_sections;
+ }
}
+ changed = num_loaded_sections > 0;
+ return num_loaded_sections > 0;
+ }
+ else
+ {
+ // Not sure how to slide an ELF file given the base address
+ // of the ELF file in memory
}
}
- changed = num_loaded_sections > 0;
- return num_loaded_sections > 0;
}
return changed;
}
diff --git a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
index 4fb0250108a..9b7c073d902 100644
--- a/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
+++ b/lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.h
@@ -119,7 +119,9 @@ public:
ParseHeader();
virtual bool
- SetLoadAddress(lldb_private::Target &target, lldb::addr_t base_addr);
+ SetLoadAddress (lldb_private::Target &target,
+ lldb::addr_t value,
+ bool value_is_offset);
virtual lldb::ByteOrder
GetByteOrder() const;
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 5cbb31ef5b2..a4bfc5caec5 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -4706,7 +4706,9 @@ ObjectFileMachO::GetPluginVersion()
bool
-ObjectFileMachO::SetLoadAddress(Target &target, addr_t base_addr)
+ObjectFileMachO::SetLoadAddress (Target &target,
+ lldb::addr_t value,
+ bool value_is_offset)
{
bool changed = false;
ModuleSP module_sp = GetModule();
@@ -4719,36 +4721,95 @@ ObjectFileMachO::SetLoadAddress(Target &target, addr_t base_addr)
lldb::addr_t mach_base_file_addr = LLDB_INVALID_ADDRESS;
const size_t num_sections = section_list->GetSize();
- // First find the address of the mach header which is the first non-zero
- // file sized section whose file offset is zero as this will be subtracted
- // from each other valid section's vmaddr and then get "base_addr" added to
- // it when loading the module in the target
- for (size_t sect_idx = 0;
- sect_idx < num_sections && mach_base_file_addr == LLDB_INVALID_ADDRESS;
- ++sect_idx)
+ const bool is_memory_image = (bool)m_process_wp.lock();
+ const Strata strata = GetStrata();
+ static ConstString g_linkedit_segname ("__LINKEDIT");
+ if (value_is_offset)
{
- // Iterate through the object file sections to find all
- // of the sections that size on disk (to avoid __PAGEZERO)
- // and load them
- Section *section = section_list->GetSectionAtIndex (sect_idx).get();
- if (section && section->GetFileSize() > 0 && section->GetFileOffset() == 0)
+ // "value" is an offset to apply to each top level segment
+ for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx)
{
- mach_base_file_addr = section->GetFileAddress();
+ // Iterate through the object file sections to find all
+ // of the sections that size on disk (to avoid __PAGEZERO)
+ // and load them
+ SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
+ if (section_sp &&
+ section_sp->GetFileSize() > 0 &&
+ section_sp->IsThreadSpecific() == false &&
+ module_sp.get() == section_sp->GetModule().get())
+ {
+ // Ignore __LINKEDIT and __DWARF segments
+ if (section_sp->GetName() == g_linkedit_segname)
+ {
+ // Only map __LINKEDIT if we have an in memory image and this isn't
+ // a kernel binary like a kext or mach_kernel.
+ if (is_memory_image == false || strata == eStrataKernel)
+ continue;
+ }
+ if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() + value))
+ ++num_loaded_sections;
+ }
}
}
-
- if (mach_base_file_addr != LLDB_INVALID_ADDRESS)
+ else
{
- for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx)
+ // "value" is the new base address of the mach_header, adjust each
+ // section accordingly
+
+ // First find the address of the mach header which is the first non-zero
+ // file sized section whose file offset is zero as this will be subtracted
+ // from each other valid section's vmaddr and then get "base_addr" added to
+ // it when loading the module in the target
+ for (size_t sect_idx = 0;
+ sect_idx < num_sections && mach_base_file_addr == LLDB_INVALID_ADDRESS;
+ ++sect_idx)
{
// Iterate through the object file sections to find all
// of the sections that size on disk (to avoid __PAGEZERO)
// and load them
- SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
- if (section_sp && section_sp->GetFileSize() > 0 && !section_sp->IsThreadSpecific())
+ Section *section = section_list->GetSectionAtIndex (sect_idx).get();
+ if (section &&
+ section->GetFileSize() > 0 &&
+ section->GetFileOffset() == 0 &&
+ section->IsThreadSpecific() == false &&
+ module_sp.get() == section->GetModule().get())
{
- if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() - mach_base_file_addr + base_addr))
- ++num_loaded_sections;
+ // Ignore __LINKEDIT and __DWARF segments
+ if (section->GetName() == g_linkedit_segname)
+ {
+ // Only map __LINKEDIT if we have an in memory image and this isn't
+ // a kernel binary like a kext or mach_kernel.
+ if (is_memory_image == false || strata == eStrataKernel)
+ continue;
+ }
+ mach_base_file_addr = section->GetFileAddress();
+ }
+ }
+
+ if (mach_base_file_addr != LLDB_INVALID_ADDRESS)
+ {
+ for (size_t sect_idx = 0; sect_idx < num_sections; ++sect_idx)
+ {
+ // Iterate through the object file sections to find all
+ // of the sections that size on disk (to avoid __PAGEZERO)
+ // and load them
+ SectionSP section_sp (section_list->GetSectionAtIndex (sect_idx));
+ if (section_sp &&
+ section_sp->GetFileSize() > 0 &&
+ section_sp->IsThreadSpecific() == false &&
+ module_sp.get() == section_sp->GetModule().get())
+ {
+ // Ignore __LINKEDIT and __DWARF segments
+ if (section_sp->GetName() == g_linkedit_segname)
+ {
+ // Only map __LINKEDIT if we have an in memory image and this isn't
+ // a kernel binary like a kext or mach_kernel.
+ if (is_memory_image == false || strata == eStrataKernel)
+ continue;
+ }
+ if (target.GetSectionLoadList().SetSectionLoadAddress (section_sp, section_sp->GetFileAddress() - mach_base_file_addr + value))
+ ++num_loaded_sections;
+ }
}
}
}
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index e1ab99959b5..f6b0e3a89cc 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -90,7 +90,9 @@ public:
ParseHeader ();
virtual bool
- SetLoadAddress(lldb_private::Target &target, lldb::addr_t base_addr);
+ SetLoadAddress(lldb_private::Target &target,
+ lldb::addr_t value,
+ bool value_is_offset);
virtual lldb::ByteOrder
GetByteOrder () const;
OpenPOWER on IntegriCloud