summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2012-02-14 00:14:24 +0000
committerGreg Clayton <gclayton@apple.com>2012-02-14 00:14:24 +0000
commitbae2f2f8128ded0b0f502eeb1463ed71e2d11942 (patch)
treeb60e5405ab68d7bfbd3ed1091145e255bea38842 /lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
parent1b66d8c287c0f8eba484994e12270d257e911dba (diff)
downloadbcm5719-llvm-bae2f2f8128ded0b0f502eeb1463ed71e2d11942.tar.gz
bcm5719-llvm-bae2f2f8128ded0b0f502eeb1463ed71e2d11942.zip
Made loading sections in the DynamicLoaderDarwinKernel more robust as it
seems that sections in the memory module might be quite different from the sections in the file module. Now we find all segments in the on disk file and find that segment by name in the memory module and it is ok if any sections from the file are missing in the memory image. llvm-svn: 150443
Diffstat (limited to 'lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp')
-rw-r--r--lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp59
1 files changed, 28 insertions, 31 deletions
diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
index c719654998c..21bf70675ac 100644
--- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
+++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
@@ -210,37 +210,34 @@ DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule (
SectionList *memory_section_list = memory_object_file->GetSectionList ();
if (memory_section_list && ondisk_section_list)
{
- const uint32_t num_sections = ondisk_section_list->GetSize();
+ const uint32_t num_ondisk_sections = ondisk_section_list->GetSize();
// There may be CTF sections in the memory image so we can't
// always just compare the number of sections (which are actually
// segments in mach-o parlance)
uint32_t sect_idx = 0;
- const Section *memory_section;
- const Section *ondisk_section;
- // Always use the number of sections from the on disk file
- // in case there are extra sections added to the memory image.
- for (sect_idx=0; sect_idx<num_sections; ++sect_idx)
+
+
+ // We now iterate through all sections in the file module
+ // and look to see if the memory module has a load address
+ // for that section.
+ uint32_t num_sections_loaded = 0;
+ for (sect_idx=0; sect_idx<num_ondisk_sections; ++sect_idx)
{
- memory_section = memory_section_list->GetSectionAtIndex(sect_idx).get();
- ondisk_section = ondisk_section_list->GetSectionAtIndex(sect_idx).get();
- if (memory_section->GetName() != ondisk_section->GetName())
+ const Section *ondisk_section = ondisk_section_list->GetSectionAtIndex(sect_idx).get();
+ if (ondisk_section)
{
- // Section count was the same, but the sections themselves do not match
- module_sp.reset();
- break;
+ const Section *memory_section = memory_section_list->FindSectionByName(ondisk_section->GetName()).get();
+ if (memory_section)
+ {
+ target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section, memory_section->GetFileAddress());
+ ++num_sections_loaded;
+ }
}
}
- if (module_sp)
- {
- for (sect_idx=0; sect_idx<num_sections; ++sect_idx)
- {
- memory_section = memory_section_list->GetSectionAtIndex(sect_idx).get();
- ondisk_section = ondisk_section_list->GetSectionAtIndex(sect_idx).get();
- target.GetSectionLoadList().SetSectionLoadAddress (ondisk_section, memory_section->GetFileAddress());
- }
- if (num_sections > 0)
- load_process_stop_id = process->GetStopID();
- }
+ if (num_sections_loaded > 0)
+ load_process_stop_id = process->GetStopID();
+ else
+ module_sp.reset(); // No sections were loaded
}
else
module_sp.reset(); // One or both section lists
@@ -569,14 +566,14 @@ DynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr,
{
image_infos[i].reference_list = 0;
}
- printf ("[%3u] %*.*s: address=0x%16.16llx, size=0x%16.16llx, version=0x%16.16llx, load_tag=0x%8.8x, flags=0x%8.8x\n",
- i,
- KERNEL_MODULE_MAX_NAME, KERNEL_MODULE_MAX_NAME, (char *)name_data,
- image_infos[i].address,
- image_infos[i].size,
- image_infos[i].version,
- image_infos[i].load_tag,
- image_infos[i].flags);
+// printf ("[%3u] %*.*s: address=0x%16.16llx, size=0x%16.16llx, version=0x%16.16llx, load_tag=0x%8.8x, flags=0x%8.8x\n",
+// i,
+// KERNEL_MODULE_MAX_NAME, KERNEL_MODULE_MAX_NAME, (char *)name_data,
+// image_infos[i].address,
+// image_infos[i].size,
+// image_infos[i].version,
+// image_infos[i].load_tag,
+// image_infos[i].flags);
}
if (i < image_infos.size())
image_infos.resize(i);
OpenPOWER on IntegriCloud