1 //===-- DynamicLoaderDarwinKernel.cpp -----------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/Breakpoint/StoppointCallbackContext.h" 11 #include "lldb/Core/DataBuffer.h" 12 #include "lldb/Core/DataBufferHeap.h" 13 #include "lldb/Core/Debugger.h" 14 #include "lldb/Core/Log.h" 15 #include "lldb/Core/Module.h" 16 #include "lldb/Core/PluginManager.h" 17 #include "lldb/Core/State.h" 18 #include "lldb/Symbol/ObjectFile.h" 19 #include "lldb/Target/ObjCLanguageRuntime.h" 20 #include "lldb/Target/RegisterContext.h" 21 #include "lldb/Target/Target.h" 22 #include "lldb/Target/Thread.h" 23 #include "lldb/Target/ThreadPlanRunToAddress.h" 24 #include "lldb/Target/StackFrame.h" 25 26 #include "DynamicLoaderDarwinKernel.h" 27 28 //#define ENABLE_DEBUG_PRINTF // COMMENT THIS LINE OUT PRIOR TO CHECKIN 29 #ifdef ENABLE_DEBUG_PRINTF 30 #include <stdio.h> 31 #define DEBUG_PRINTF(fmt, ...) printf(fmt, ## __VA_ARGS__) 32 #else 33 #define DEBUG_PRINTF(fmt, ...) 34 #endif 35 36 using namespace lldb; 37 using namespace lldb_private; 38 39 /// FIXME - The ObjC Runtime trampoline handler doesn't really belong here. 40 /// I am putting it here so I can invoke it in the Trampoline code here, but 41 /// it should be moved to the ObjC Runtime support when it is set up. 42 43 44 //---------------------------------------------------------------------- 45 // Create an instance of this class. This function is filled into 46 // the plugin info class that gets handed out by the plugin factory and 47 // allows the lldb to instantiate an instance of this class. 48 //---------------------------------------------------------------------- 49 DynamicLoader * 50 DynamicLoaderDarwinKernel::CreateInstance (Process* process, bool force) 51 { 52 bool create = force; 53 if (!create) 54 { 55 Module* exe_module = process->GetTarget().GetExecutableModulePointer(); 56 if (exe_module) 57 { 58 ObjectFile *object_file = exe_module->GetObjectFile(); 59 if (object_file) 60 { 61 SectionList *section_list = object_file->GetSectionList(); 62 if (section_list) 63 { 64 static ConstString g_kld_section_name ("__KLD"); 65 if (section_list->FindSectionByName (g_kld_section_name)) 66 { 67 create = true; 68 } 69 } 70 } 71 } 72 73 if (create) 74 { 75 const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple(); 76 create = triple_ref.getOS() == llvm::Triple::Darwin && triple_ref.getVendor() == llvm::Triple::Apple; 77 } 78 } 79 80 if (create) 81 return new DynamicLoaderDarwinKernel (process); 82 return NULL; 83 } 84 85 //---------------------------------------------------------------------- 86 // Constructor 87 //---------------------------------------------------------------------- 88 DynamicLoaderDarwinKernel::DynamicLoaderDarwinKernel (Process* process) : 89 DynamicLoader(process), 90 m_kernel(), 91 m_kext_summary_header_ptr_addr (), 92 m_kext_summary_header_addr (), 93 m_kext_summary_header (), 94 m_break_id (LLDB_INVALID_BREAK_ID), 95 m_kext_summaries(), 96 m_mutex(Mutex::eMutexTypeRecursive) 97 { 98 } 99 100 //---------------------------------------------------------------------- 101 // Destructor 102 //---------------------------------------------------------------------- 103 DynamicLoaderDarwinKernel::~DynamicLoaderDarwinKernel() 104 { 105 Clear(true); 106 } 107 108 void 109 DynamicLoaderDarwinKernel::UpdateIfNeeded() 110 { 111 LoadKernelModuleIfNeeded(); 112 SetNotificationBreakpointIfNeeded (); 113 } 114 //------------------------------------------------------------------ 115 /// Called after attaching a process. 116 /// 117 /// Allow DynamicLoader plug-ins to execute some code after 118 /// attaching to a process. 119 //------------------------------------------------------------------ 120 void 121 DynamicLoaderDarwinKernel::DidAttach () 122 { 123 PrivateInitialize(m_process); 124 UpdateIfNeeded(); 125 } 126 127 //------------------------------------------------------------------ 128 /// Called after attaching a process. 129 /// 130 /// Allow DynamicLoader plug-ins to execute some code after 131 /// attaching to a process. 132 //------------------------------------------------------------------ 133 void 134 DynamicLoaderDarwinKernel::DidLaunch () 135 { 136 PrivateInitialize(m_process); 137 UpdateIfNeeded(); 138 } 139 140 141 //---------------------------------------------------------------------- 142 // Clear out the state of this class. 143 //---------------------------------------------------------------------- 144 void 145 DynamicLoaderDarwinKernel::Clear (bool clear_process) 146 { 147 Mutex::Locker locker(m_mutex); 148 149 if (m_process->IsAlive() && LLDB_BREAK_ID_IS_VALID(m_break_id)) 150 m_process->ClearBreakpointSiteByID(m_break_id); 151 152 if (clear_process) 153 m_process = NULL; 154 m_kernel.Clear(false); 155 m_kext_summary_header_ptr_addr.Clear(); 156 m_kext_summary_header_addr.Clear(); 157 m_kext_summaries.clear(); 158 m_break_id = LLDB_INVALID_BREAK_ID; 159 } 160 161 162 //---------------------------------------------------------------------- 163 // Load the kernel module and initialize the "m_kernel" member. Return 164 // true _only_ if the kernel is loaded the first time through (subsequent 165 // calls to this function should return false after the kernel has been 166 // already loaded). 167 //---------------------------------------------------------------------- 168 void 169 DynamicLoaderDarwinKernel::LoadKernelModuleIfNeeded() 170 { 171 if (!m_kext_summary_header_ptr_addr.IsValid()) 172 { 173 m_kernel.Clear(false); 174 m_kernel.module_sp = m_process->GetTarget().GetExecutableModule(); 175 if (m_kernel.module_sp) 176 { 177 static ConstString mach_header_name ("_mh_execute_header"); 178 static ConstString kext_summary_symbol ("gLoadedKextSummaries"); 179 const Symbol *symbol = NULL; 180 symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData); 181 if (symbol) 182 m_kext_summary_header_ptr_addr = symbol->GetValue(); 183 184 symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (mach_header_name, eSymbolTypeAbsolute); 185 if (symbol) 186 { 187 // The "_mh_execute_header" symbol is absolute and not a section based 188 // symbol that will have a valid address, so we need to resolve it... 189 m_process->GetTarget().GetImages().ResolveFileAddress (symbol->GetValue().GetFileAddress(), m_kernel.so_address); 190 DataExtractor data; // Load command data 191 if (ReadMachHeader (m_kernel, &data)) 192 { 193 if (m_kernel.header.filetype == llvm::MachO::HeaderFileTypeExecutable) 194 { 195 if (ParseLoadCommands (data, m_kernel)) 196 UpdateImageLoadAddress (m_kernel); 197 198 // Update all image infos 199 ReadAllKextSummaries (); 200 } 201 } 202 else 203 { 204 m_kernel.Clear(false); 205 } 206 } 207 } 208 } 209 } 210 211 bool 212 DynamicLoaderDarwinKernel::FindTargetModule (OSKextLoadedKextSummary &image_info, bool can_create, bool *did_create_ptr) 213 { 214 if (did_create_ptr) 215 *did_create_ptr = false; 216 217 const bool image_info_uuid_is_valid = image_info.uuid.IsValid(); 218 219 if (image_info.module_sp) 220 { 221 if (image_info_uuid_is_valid) 222 { 223 if (image_info.module_sp->GetUUID() == image_info.uuid) 224 return true; 225 else 226 image_info.module_sp.reset(); 227 } 228 else 229 return true; 230 } 231 232 ModuleList &target_images = m_process->GetTarget().GetImages(); 233 if (image_info_uuid_is_valid) 234 image_info.module_sp = target_images.FindModule(image_info.uuid); 235 236 if (image_info.module_sp) 237 return true; 238 239 ArchSpec arch (image_info.GetArchitecture ()); 240 if (can_create) 241 { 242 if (image_info_uuid_is_valid) 243 { 244 image_info.module_sp = m_process->GetTarget().GetSharedModule (FileSpec(), 245 arch, 246 &image_info.uuid); 247 if (did_create_ptr) 248 *did_create_ptr = image_info.module_sp; 249 } 250 } 251 return image_info.module_sp; 252 } 253 254 bool 255 DynamicLoaderDarwinKernel::UpdateCommPageLoadAddress(Module *module) 256 { 257 bool changed = false; 258 if (module) 259 { 260 ObjectFile *image_object_file = module->GetObjectFile(); 261 if (image_object_file) 262 { 263 SectionList *section_list = image_object_file->GetSectionList (); 264 if (section_list) 265 { 266 uint32_t num_sections = section_list->GetSize(); 267 for (uint32_t i=0; i<num_sections; ++i) 268 { 269 Section* section = section_list->GetSectionAtIndex (i).get(); 270 if (section) 271 { 272 const addr_t new_section_load_addr = section->GetFileAddress (); 273 const addr_t old_section_load_addr = m_process->GetTarget().GetSectionLoadList().GetSectionLoadAddress (section); 274 if (old_section_load_addr == LLDB_INVALID_ADDRESS || 275 old_section_load_addr != new_section_load_addr) 276 { 277 if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress ())) 278 changed = true; 279 } 280 } 281 } 282 } 283 } 284 } 285 return changed; 286 } 287 288 //---------------------------------------------------------------------- 289 // Update the load addresses for all segments in MODULE using the 290 // updated INFO that is passed in. 291 //---------------------------------------------------------------------- 292 bool 293 DynamicLoaderDarwinKernel::UpdateImageLoadAddress (OSKextLoadedKextSummary& info) 294 { 295 Module *module = info.module_sp.get(); 296 bool changed = false; 297 if (module) 298 { 299 ObjectFile *image_object_file = module->GetObjectFile(); 300 if (image_object_file) 301 { 302 SectionList *section_list = image_object_file->GetSectionList (); 303 if (section_list) 304 { 305 // We now know the slide amount, so go through all sections 306 // and update the load addresses with the correct values. 307 uint32_t num_segments = info.segments.size(); 308 for (uint32_t i=0; i<num_segments; ++i) 309 { 310 const addr_t new_section_load_addr = info.segments[i].vmaddr; 311 if (section_list->FindSectionByName(info.segments[i].name)) 312 { 313 SectionSP section_sp(section_list->FindSectionByName(info.segments[i].name)); 314 if (section_sp) 315 { 316 const addr_t old_section_load_addr = m_process->GetTarget().GetSectionLoadList().GetSectionLoadAddress (section_sp.get()); 317 if (old_section_load_addr == LLDB_INVALID_ADDRESS || 318 old_section_load_addr != new_section_load_addr) 319 { 320 if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section_sp.get(), new_section_load_addr)) 321 changed = true; 322 } 323 } 324 else 325 { 326 fprintf (stderr, 327 "warning: unable to find and load segment named '%s' at 0x%llx in '%s/%s' in macosx dynamic loader plug-in.\n", 328 info.segments[i].name.AsCString("<invalid>"), 329 (uint64_t)new_section_load_addr, 330 image_object_file->GetFileSpec().GetDirectory().AsCString(), 331 image_object_file->GetFileSpec().GetFilename().AsCString()); 332 } 333 } 334 else 335 { 336 // The segment name is empty which means this is a .o file. 337 // Object files in LLDB end up getting reorganized so that 338 // the segment name that is in the section is promoted into 339 // an actual segment, so we just need to go through all sections 340 // and slide them by a single amount. 341 342 uint32_t num_sections = section_list->GetSize(); 343 for (uint32_t i=0; i<num_sections; ++i) 344 { 345 Section* section = section_list->GetSectionAtIndex (i).get(); 346 if (section) 347 { 348 if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress() + new_section_load_addr)) 349 changed = true; 350 } 351 } 352 } 353 } 354 } 355 } 356 } 357 return changed; 358 } 359 360 //---------------------------------------------------------------------- 361 // Update the load addresses for all segments in MODULE using the 362 // updated INFO that is passed in. 363 //---------------------------------------------------------------------- 364 bool 365 DynamicLoaderDarwinKernel::UnloadImageLoadAddress (OSKextLoadedKextSummary& info) 366 { 367 Module *module = info.module_sp.get(); 368 bool changed = false; 369 if (module) 370 { 371 ObjectFile *image_object_file = module->GetObjectFile(); 372 if (image_object_file) 373 { 374 SectionList *section_list = image_object_file->GetSectionList (); 375 if (section_list) 376 { 377 uint32_t num_segments = info.segments.size(); 378 for (uint32_t i=0; i<num_segments; ++i) 379 { 380 SectionSP section_sp(section_list->FindSectionByName(info.segments[i].name)); 381 if (section_sp) 382 { 383 const addr_t old_section_load_addr = info.segments[i].vmaddr; 384 if (m_process->GetTarget().GetSectionLoadList().SetSectionUnloaded (section_sp.get(), old_section_load_addr)) 385 changed = true; 386 } 387 else 388 { 389 fprintf (stderr, 390 "warning: unable to find and unload segment named '%s' in '%s/%s' in macosx dynamic loader plug-in.\n", 391 info.segments[i].name.AsCString("<invalid>"), 392 image_object_file->GetFileSpec().GetDirectory().AsCString(), 393 image_object_file->GetFileSpec().GetFilename().AsCString()); 394 } 395 } 396 } 397 } 398 } 399 return changed; 400 } 401 402 403 //---------------------------------------------------------------------- 404 // Static callback function that gets called when our DYLD notification 405 // breakpoint gets hit. We update all of our image infos and then 406 // let our super class DynamicLoader class decide if we should stop 407 // or not (based on global preference). 408 //---------------------------------------------------------------------- 409 bool 410 DynamicLoaderDarwinKernel::BreakpointHitCallback (void *baton, 411 StoppointCallbackContext *context, 412 user_id_t break_id, 413 user_id_t break_loc_id) 414 { 415 return static_cast<DynamicLoaderDarwinKernel*>(baton)->BreakpointHit (context, break_id, break_loc_id); 416 } 417 418 bool 419 DynamicLoaderDarwinKernel::BreakpointHit (StoppointCallbackContext *context, 420 user_id_t break_id, 421 user_id_t break_loc_id) 422 { 423 LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 424 if (log) 425 log->Printf ("DynamicLoaderDarwinKernel::BreakpointHit (...)\n"); 426 427 ReadAllKextSummaries (); 428 429 if (log) 430 PutToLog(log.get()); 431 432 return GetStopWhenImagesChange(); 433 } 434 435 436 bool 437 DynamicLoaderDarwinKernel::ReadKextSummaryHeader () 438 { 439 Mutex::Locker locker(m_mutex); 440 441 // the all image infos is already valid for this process stop ID 442 443 m_kext_summaries.clear(); 444 if (m_kext_summary_header_ptr_addr.IsValid()) 445 { 446 const uint32_t addr_size = m_kernel.GetAddressByteSize (); 447 const ByteOrder byte_order = m_kernel.GetByteOrder(); 448 Error error; 449 // Read enough bytes for a "OSKextLoadedKextSummaryHeader" structure 450 // which is currenty 4 uint32_t and a pointer. 451 uint8_t buf[24]; 452 DataExtractor data (buf, sizeof(buf), byte_order, addr_size); 453 const size_t count = 4 * sizeof(uint32_t) + addr_size; 454 const bool prefer_file_cache = false; 455 if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr, 456 prefer_file_cache, 457 error, 458 m_kext_summary_header_addr)) 459 { 460 // We got a valid address for our kext summary header and make sure it isn't NULL 461 if (m_kext_summary_header_addr.IsValid() && 462 m_kext_summary_header_addr.GetFileAddress() != 0) 463 { 464 const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error); 465 if (bytes_read == count) 466 { 467 uint32_t offset = 0; 468 m_kext_summary_header.version = data.GetU32(&offset); 469 if (m_kext_summary_header.version >= 2) 470 { 471 m_kext_summary_header.entry_size = data.GetU32(&offset); 472 } 473 else 474 { 475 // Versions less than 2 didn't have an entry size, it was hard coded 476 m_kext_summary_header.entry_size = KERNEL_MODULE_ENTRY_SIZE_VERSION_1; 477 } 478 m_kext_summary_header.entry_count = data.GetU32(&offset); 479 return true; 480 } 481 } 482 } 483 } 484 m_kext_summary_header_addr.Clear(); 485 return false; 486 } 487 488 489 bool 490 DynamicLoaderDarwinKernel::ParseKextSummaries (const Address &kext_summary_addr, 491 uint32_t count) 492 { 493 OSKextLoadedKextSummary::collection kext_summaries; 494 LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 495 if (log) 496 log->Printf ("Adding %d modules.\n"); 497 498 Mutex::Locker locker(m_mutex); 499 500 if (!ReadKextSummaries (kext_summary_addr, count, kext_summaries)) 501 return false; 502 503 Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream(); 504 for (uint32_t i = 0; i < count; i++) 505 { 506 if (s) 507 { 508 const uint8_t *u = (const uint8_t *)kext_summaries[i].uuid.GetBytes(); 509 if (u) 510 { 511 s->Printf("Loading kext: %2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X 0x%16.16llx \"%s\"...\n", 512 u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7], 513 u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15], 514 kext_summaries[i].address, kext_summaries[i].name); 515 } 516 else 517 { 518 s->Printf("0x%16.16llx \"%s\"...\n", kext_summaries[i].address, kext_summaries[i].name); 519 } 520 } 521 522 DataExtractor data; // Load command data 523 if (ReadMachHeader (kext_summaries[i], &data)) 524 { 525 ParseLoadCommands (data, kext_summaries[i]); 526 } 527 528 if (s) 529 { 530 if (kext_summaries[i].module_sp) 531 s->Printf(" found kext: %s/%s\n", 532 kext_summaries[i].module_sp->GetFileSpec().GetDirectory().AsCString(), 533 kext_summaries[i].module_sp->GetFileSpec().GetFilename().AsCString()); 534 } 535 536 if (log) 537 kext_summaries[i].PutToLog (log.get()); 538 } 539 bool return_value = AddModulesUsingImageInfos (kext_summaries); 540 return return_value; 541 } 542 543 // Adds the modules in image_infos to m_kext_summaries. 544 // NB don't call this passing in m_kext_summaries. 545 546 bool 547 DynamicLoaderDarwinKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::collection &image_infos) 548 { 549 // Now add these images to the main list. 550 ModuleList loaded_module_list; 551 552 for (uint32_t idx = 0; idx < image_infos.size(); ++idx) 553 { 554 m_kext_summaries.push_back(image_infos[idx]); 555 556 if (FindTargetModule (image_infos[idx], true, NULL)) 557 { 558 // UpdateImageLoadAddress will return true if any segments 559 // change load address. We need to check this so we don't 560 // mention that all loaded shared libraries are newly loaded 561 // each time we hit out dyld breakpoint since dyld will list all 562 // shared libraries each time. 563 if (UpdateImageLoadAddress (image_infos[idx])) 564 { 565 loaded_module_list.AppendIfNeeded (image_infos[idx].module_sp); 566 } 567 } 568 } 569 570 if (loaded_module_list.GetSize() > 0) 571 { 572 // FIXME: This should really be in the Runtime handlers class, which should get 573 // called by the target's ModulesDidLoad, but we're doing it all locally for now 574 // to save time. 575 // Also, I'm assuming there can be only one libobjc dylib loaded... 576 577 ObjCLanguageRuntime *objc_runtime = m_process->GetObjCLanguageRuntime(); 578 if (objc_runtime != NULL && !objc_runtime->HasReadObjCLibrary()) 579 { 580 size_t num_modules = loaded_module_list.GetSize(); 581 for (int i = 0; i < num_modules; i++) 582 { 583 if (objc_runtime->IsModuleObjCLibrary (loaded_module_list.GetModuleAtIndex (i))) 584 { 585 objc_runtime->ReadObjCLibrary (loaded_module_list.GetModuleAtIndex (i)); 586 break; 587 } 588 } 589 } 590 // if (log) 591 // loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderDarwinKernel::ModulesDidLoad"); 592 m_process->GetTarget().ModulesDidLoad (loaded_module_list); 593 } 594 return true; 595 } 596 597 598 uint32_t 599 DynamicLoaderDarwinKernel::ReadKextSummaries (const Address &kext_summary_addr, 600 uint32_t image_infos_count, 601 OSKextLoadedKextSummary::collection &image_infos) 602 { 603 const ByteOrder endian = m_kernel.GetByteOrder(); 604 const uint32_t addr_size = m_kernel.GetAddressByteSize(); 605 606 image_infos.resize(image_infos_count); 607 const size_t count = image_infos.size() * m_kext_summary_header.entry_size; 608 DataBufferHeap data(count, 0); 609 Error error; 610 611 Stream *s = &m_process->GetTarget().GetDebugger().GetOutputStream(); 612 613 if (s) 614 s->Printf ("Reading %u kext summaries...\n", image_infos_count); 615 const bool prefer_file_cache = false; 616 const size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary_addr, 617 prefer_file_cache, 618 data.GetBytes(), 619 data.GetByteSize(), 620 error); 621 if (bytes_read == count) 622 { 623 624 DataExtractor extractor (data.GetBytes(), data.GetByteSize(), endian, addr_size); 625 uint32_t i=0; 626 for (uint32_t kext_summary_offset = 0; 627 i < image_infos.size() && extractor.ValidOffsetForDataOfSize(kext_summary_offset, m_kext_summary_header.entry_size); 628 ++i, kext_summary_offset += m_kext_summary_header.entry_size) 629 { 630 uint32_t offset = kext_summary_offset; 631 const void *name_data = extractor.GetData(&offset, KERNEL_MODULE_MAX_NAME); 632 if (name_data == NULL) 633 break; 634 memcpy (image_infos[i].name, name_data, KERNEL_MODULE_MAX_NAME); 635 image_infos[i].uuid.SetBytes(extractor.GetData (&offset, 16)); 636 image_infos[i].address = extractor.GetU64(&offset); 637 if (!image_infos[i].so_address.SetLoadAddress (image_infos[i].address, &m_process->GetTarget())) 638 m_process->GetTarget().GetImages().ResolveFileAddress (image_infos[i].address, image_infos[i].so_address); 639 image_infos[i].size = extractor.GetU64(&offset); 640 image_infos[i].version = extractor.GetU64(&offset); 641 image_infos[i].load_tag = extractor.GetU32(&offset); 642 image_infos[i].flags = extractor.GetU32(&offset); 643 if ((offset - kext_summary_offset) < m_kext_summary_header.entry_size) 644 { 645 image_infos[i].reference_list = extractor.GetU64(&offset); 646 } 647 else 648 { 649 image_infos[i].reference_list = 0; 650 } 651 } 652 if (i < image_infos.size()) 653 image_infos.resize(i); 654 } 655 else 656 { 657 image_infos.clear(); 658 } 659 return image_infos.size(); 660 } 661 662 bool 663 DynamicLoaderDarwinKernel::ReadAllKextSummaries () 664 { 665 LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER)); 666 667 Mutex::Locker locker(m_mutex); 668 669 if (ReadKextSummaryHeader ()) 670 { 671 if (m_kext_summary_header.entry_count > 0 && m_kext_summary_header_addr.IsValid()) 672 { 673 Address summary_addr (m_kext_summary_header_addr); 674 summary_addr.Slide(m_kext_summary_header.GetSize()); 675 if (!ParseKextSummaries (summary_addr, m_kext_summary_header.entry_count)) 676 { 677 m_kext_summaries.clear(); 678 } 679 return true; 680 } 681 } 682 return false; 683 } 684 685 //---------------------------------------------------------------------- 686 // Read a mach_header at ADDR into HEADER, and also fill in the load 687 // command data into LOAD_COMMAND_DATA if it is non-NULL. 688 // 689 // Returns true if we succeed, false if we fail for any reason. 690 //---------------------------------------------------------------------- 691 bool 692 DynamicLoaderDarwinKernel::ReadMachHeader (OSKextLoadedKextSummary& kext_summary, DataExtractor *load_command_data) 693 { 694 DataBufferHeap header_bytes(sizeof(llvm::MachO::mach_header), 0); 695 Error error; 696 const bool prefer_file_cache = false; 697 size_t bytes_read = m_process->GetTarget().ReadMemory (kext_summary.so_address, 698 prefer_file_cache, 699 header_bytes.GetBytes(), 700 header_bytes.GetByteSize(), 701 error); 702 if (bytes_read == sizeof(llvm::MachO::mach_header)) 703 { 704 uint32_t offset = 0; 705 ::memset (&kext_summary.header, 0, sizeof(kext_summary.header)); 706 707 // Get the magic byte unswapped so we can figure out what we are dealing with 708 DataExtractor data(header_bytes.GetBytes(), header_bytes.GetByteSize(), endian::InlHostByteOrder(), 4); 709 kext_summary.header.magic = data.GetU32(&offset); 710 Address load_cmd_addr = kext_summary.so_address; 711 data.SetByteOrder(DynamicLoaderDarwinKernel::GetByteOrderFromMagic(kext_summary.header.magic)); 712 switch (kext_summary.header.magic) 713 { 714 case llvm::MachO::HeaderMagic32: 715 case llvm::MachO::HeaderMagic32Swapped: 716 data.SetAddressByteSize(4); 717 load_cmd_addr.Slide (sizeof(llvm::MachO::mach_header)); 718 break; 719 720 case llvm::MachO::HeaderMagic64: 721 case llvm::MachO::HeaderMagic64Swapped: 722 data.SetAddressByteSize(8); 723 load_cmd_addr.Slide (sizeof(llvm::MachO::mach_header_64)); 724 break; 725 726 default: 727 return false; 728 } 729 730 // Read the rest of dyld's mach header 731 if (data.GetU32(&offset, &kext_summary.header.cputype, (sizeof(llvm::MachO::mach_header)/sizeof(uint32_t)) - 1)) 732 { 733 if (load_command_data == NULL) 734 return true; // We were able to read the mach_header and weren't asked to read the load command bytes 735 736 DataBufferSP load_cmd_data_sp(new DataBufferHeap(kext_summary.header.sizeofcmds, 0)); 737 738 size_t load_cmd_bytes_read = m_process->GetTarget().ReadMemory (load_cmd_addr, 739 prefer_file_cache, 740 load_cmd_data_sp->GetBytes(), 741 load_cmd_data_sp->GetByteSize(), 742 error); 743 744 if (load_cmd_bytes_read == kext_summary.header.sizeofcmds) 745 { 746 // Set the load command data and also set the correct endian 747 // swap settings and the correct address size 748 load_command_data->SetData(load_cmd_data_sp, 0, kext_summary.header.sizeofcmds); 749 load_command_data->SetByteOrder(data.GetByteOrder()); 750 load_command_data->SetAddressByteSize(data.GetAddressByteSize()); 751 return true; // We successfully read the mach_header and the load command data 752 } 753 754 return false; // We weren't able to read the load command data 755 } 756 } 757 return false; // We failed the read the mach_header 758 } 759 760 761 //---------------------------------------------------------------------- 762 // Parse the load commands for an image 763 //---------------------------------------------------------------------- 764 uint32_t 765 DynamicLoaderDarwinKernel::ParseLoadCommands (const DataExtractor& data, OSKextLoadedKextSummary& image_info) 766 { 767 uint32_t offset = 0; 768 uint32_t cmd_idx; 769 Segment segment; 770 image_info.Clear (true); 771 772 for (cmd_idx = 0; cmd_idx < image_info.header.ncmds; cmd_idx++) 773 { 774 // Clear out any load command specific data from image_info since 775 // we are about to read it. 776 777 if (data.ValidOffsetForDataOfSize (offset, sizeof(llvm::MachO::load_command))) 778 { 779 llvm::MachO::load_command load_cmd; 780 uint32_t load_cmd_offset = offset; 781 load_cmd.cmd = data.GetU32 (&offset); 782 load_cmd.cmdsize = data.GetU32 (&offset); 783 switch (load_cmd.cmd) 784 { 785 case llvm::MachO::LoadCommandSegment32: 786 { 787 segment.name.SetTrimmedCStringWithLength ((const char *)data.GetData(&offset, 16), 16); 788 // We are putting 4 uint32_t values 4 uint64_t values so 789 // we have to use multiple 32 bit gets below. 790 segment.vmaddr = data.GetU32 (&offset); 791 segment.vmsize = data.GetU32 (&offset); 792 segment.fileoff = data.GetU32 (&offset); 793 segment.filesize = data.GetU32 (&offset); 794 // Extract maxprot, initprot, nsects and flags all at once 795 data.GetU32(&offset, &segment.maxprot, 4); 796 image_info.segments.push_back (segment); 797 } 798 break; 799 800 case llvm::MachO::LoadCommandSegment64: 801 { 802 segment.name.SetTrimmedCStringWithLength ((const char *)data.GetData(&offset, 16), 16); 803 // Extract vmaddr, vmsize, fileoff, and filesize all at once 804 data.GetU64(&offset, &segment.vmaddr, 4); 805 // Extract maxprot, initprot, nsects and flags all at once 806 data.GetU32(&offset, &segment.maxprot, 4); 807 image_info.segments.push_back (segment); 808 } 809 break; 810 811 case llvm::MachO::LoadCommandUUID: 812 image_info.uuid.SetBytes(data.GetData (&offset, 16)); 813 break; 814 815 default: 816 break; 817 } 818 // Set offset to be the beginning of the next load command. 819 offset = load_cmd_offset + load_cmd.cmdsize; 820 } 821 } 822 #if 0 823 // No slide in the kernel... 824 825 // All sections listed in the dyld image info structure will all 826 // either be fixed up already, or they will all be off by a single 827 // slide amount that is determined by finding the first segment 828 // that is at file offset zero which also has bytes (a file size 829 // that is greater than zero) in the object file. 830 831 // Determine the slide amount (if any) 832 const size_t num_sections = image_info.segments.size(); 833 for (size_t i = 0; i < num_sections; ++i) 834 { 835 // Iterate through the object file sections to find the 836 // first section that starts of file offset zero and that 837 // has bytes in the file... 838 if (image_info.segments[i].fileoff == 0 && image_info.segments[i].filesize > 0) 839 { 840 image_info.slide = image_info.address - image_info.segments[i].vmaddr; 841 // We have found the slide amount, so we can exit 842 // this for loop. 843 break; 844 } 845 } 846 #endif 847 if (image_info.uuid.IsValid()) 848 { 849 bool did_create = false; 850 if (FindTargetModule(image_info, true, &did_create)) 851 { 852 if (did_create) 853 image_info.module_create_stop_id = m_process->GetStopID(); 854 } 855 } 856 return cmd_idx; 857 } 858 859 //---------------------------------------------------------------------- 860 // Dump a Segment to the file handle provided. 861 //---------------------------------------------------------------------- 862 void 863 DynamicLoaderDarwinKernel::Segment::PutToLog (Log *log, addr_t slide) const 864 { 865 if (log) 866 { 867 if (slide == 0) 868 log->Printf ("\t\t%16s [0x%16.16llx - 0x%16.16llx)", 869 name.AsCString(""), 870 vmaddr + slide, 871 vmaddr + slide + vmsize); 872 else 873 log->Printf ("\t\t%16s [0x%16.16llx - 0x%16.16llx) slide = 0x%llx", 874 name.AsCString(""), 875 vmaddr + slide, 876 vmaddr + slide + vmsize, 877 slide); 878 } 879 } 880 881 const DynamicLoaderDarwinKernel::Segment * 882 DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::FindSegment (const ConstString &name) const 883 { 884 const size_t num_segments = segments.size(); 885 for (size_t i=0; i<num_segments; ++i) 886 { 887 if (segments[i].name == name) 888 return &segments[i]; 889 } 890 return NULL; 891 } 892 893 894 //---------------------------------------------------------------------- 895 // Dump an image info structure to the file handle provided. 896 //---------------------------------------------------------------------- 897 void 898 DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::PutToLog (Log *log) const 899 { 900 if (log == NULL) 901 return; 902 const uint8_t *u = (uint8_t *)uuid.GetBytes(); 903 904 if (address == LLDB_INVALID_ADDRESS) 905 { 906 if (u) 907 { 908 log->Printf("\tuuid=%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X name=\"%s\" (UNLOADED)", 909 u[ 0], u[ 1], u[ 2], u[ 3], 910 u[ 4], u[ 5], u[ 6], u[ 7], 911 u[ 8], u[ 9], u[10], u[11], 912 u[12], u[13], u[14], u[15], 913 name); 914 } 915 else 916 log->Printf("\tname=\"%s\" (UNLOADED)", name); 917 } 918 else 919 { 920 if (u) 921 { 922 log->Printf("\taddr=0x%16.16llx size=0x%16.16llx version=0x%16.16llx load-tag=0x%8.8x flags=0x%8.8x ref-list=0x%16.16llx uuid=%2.2X%2.2X%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X-%2.2X%2.2X%2.2X%2.2X%2.2X%2.2X name=\"%s\"", 923 address, size, version, load_tag, flags, reference_list, 924 u[ 0], u[ 1], u[ 2], u[ 3], u[ 4], u[ 5], u[ 6], u[ 7], 925 u[ 8], u[ 9], u[10], u[11], u[12], u[13], u[14], u[15], 926 name); 927 } 928 else 929 { 930 log->Printf("\t[0x%16.16llx - 0x%16.16llx) version=0x%16.16llx load-tag=0x%8.8x flags=0x%8.8x ref-list=0x%16.16llx name=\"%s\"", 931 address, address+size, version, load_tag, flags, reference_list, 932 name); 933 } 934 for (uint32_t i=0; i<segments.size(); ++i) 935 segments[i].PutToLog(log, 0); 936 } 937 } 938 939 //---------------------------------------------------------------------- 940 // Dump the _dyld_all_image_infos members and all current image infos 941 // that we have parsed to the file handle provided. 942 //---------------------------------------------------------------------- 943 void 944 DynamicLoaderDarwinKernel::PutToLog(Log *log) const 945 { 946 if (log == NULL) 947 return; 948 949 Mutex::Locker locker(m_mutex); 950 log->Printf("gLoadedKextSummaries = 0x%16.16llx { version=%u, entry_size=%u, entry_count=%u }", 951 m_kext_summary_header_addr.GetFileAddress(), 952 m_kext_summary_header.version, 953 m_kext_summary_header.entry_size, 954 m_kext_summary_header.entry_count); 955 956 size_t i; 957 const size_t count = m_kext_summaries.size(); 958 if (count > 0) 959 { 960 log->PutCString("Loaded:"); 961 for (i = 0; i<count; i++) 962 m_kext_summaries[i].PutToLog(log); 963 } 964 } 965 966 void 967 DynamicLoaderDarwinKernel::PrivateInitialize(Process *process) 968 { 969 DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 970 Clear(true); 971 m_process = process; 972 m_process->GetTarget().GetSectionLoadList().Clear(); 973 } 974 975 void 976 DynamicLoaderDarwinKernel::SetNotificationBreakpointIfNeeded () 977 { 978 if (m_break_id == LLDB_INVALID_BREAK_ID) 979 { 980 DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState())); 981 982 983 const bool internal_bp = false; 984 const LazyBool skip_prologue = eLazyBoolNo; 985 Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&m_kernel.module_sp->GetFileSpec(), 986 "OSKextLoadedKextSummariesUpdated", 987 eFunctionNameTypeFull, 988 internal_bp, 989 skip_prologue).get(); 990 991 bp->SetCallback (DynamicLoaderDarwinKernel::BreakpointHitCallback, this, true); 992 m_break_id = bp->GetID(); 993 } 994 } 995 996 //---------------------------------------------------------------------- 997 // Member function that gets called when the process state changes. 998 //---------------------------------------------------------------------- 999 void 1000 DynamicLoaderDarwinKernel::PrivateProcessStateChanged (Process *process, StateType state) 1001 { 1002 DEBUG_PRINTF("DynamicLoaderDarwinKernel::%s(%s)\n", __FUNCTION__, StateAsCString(state)); 1003 switch (state) 1004 { 1005 case eStateConnected: 1006 case eStateAttaching: 1007 case eStateLaunching: 1008 case eStateInvalid: 1009 case eStateUnloaded: 1010 case eStateExited: 1011 case eStateDetached: 1012 Clear(false); 1013 break; 1014 1015 case eStateStopped: 1016 UpdateIfNeeded(); 1017 break; 1018 1019 case eStateRunning: 1020 case eStateStepping: 1021 case eStateCrashed: 1022 case eStateSuspended: 1023 break; 1024 1025 default: 1026 break; 1027 } 1028 } 1029 1030 ThreadPlanSP 1031 DynamicLoaderDarwinKernel::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others) 1032 { 1033 ThreadPlanSP thread_plan_sp; 1034 LogSP log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP)); 1035 if (log) 1036 log->Printf ("Could not find symbol for step through."); 1037 return thread_plan_sp; 1038 } 1039 1040 Error 1041 DynamicLoaderDarwinKernel::CanLoadImage () 1042 { 1043 Error error; 1044 error.SetErrorString("always unsafe to load or unload shared libraries in the darwin kernel"); 1045 return error; 1046 } 1047 1048 void 1049 DynamicLoaderDarwinKernel::Initialize() 1050 { 1051 PluginManager::RegisterPlugin (GetPluginNameStatic(), 1052 GetPluginDescriptionStatic(), 1053 CreateInstance); 1054 } 1055 1056 void 1057 DynamicLoaderDarwinKernel::Terminate() 1058 { 1059 PluginManager::UnregisterPlugin (CreateInstance); 1060 } 1061 1062 1063 const char * 1064 DynamicLoaderDarwinKernel::GetPluginNameStatic() 1065 { 1066 return "dynamic-loader.macosx-kernel"; 1067 } 1068 1069 const char * 1070 DynamicLoaderDarwinKernel::GetPluginDescriptionStatic() 1071 { 1072 return "Dynamic loader plug-in that watches for shared library loads/unloads in the MacOSX kernel."; 1073 } 1074 1075 1076 //------------------------------------------------------------------ 1077 // PluginInterface protocol 1078 //------------------------------------------------------------------ 1079 const char * 1080 DynamicLoaderDarwinKernel::GetPluginName() 1081 { 1082 return "DynamicLoaderDarwinKernel"; 1083 } 1084 1085 const char * 1086 DynamicLoaderDarwinKernel::GetShortPluginName() 1087 { 1088 return GetPluginNameStatic(); 1089 } 1090 1091 uint32_t 1092 DynamicLoaderDarwinKernel::GetPluginVersion() 1093 { 1094 return 1; 1095 } 1096 1097