1 //===-- ObjectFileMachO.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 "llvm/Support/MachO.h" 11 12 #include "ObjectFileMachO.h" 13 14 #include "lldb/Core/ArchSpec.h" 15 #include "lldb/Core/DataBuffer.h" 16 #include "lldb/Host/FileSpec.h" 17 #include "lldb/Core/FileSpecList.h" 18 #include "lldb/Core/Module.h" 19 #include "lldb/Core/PluginManager.h" 20 #include "lldb/Core/Section.h" 21 #include "lldb/Core/StreamFile.h" 22 #include "lldb/Core/StreamString.h" 23 #include "lldb/Core/Timer.h" 24 #include "lldb/Core/UUID.h" 25 #include "lldb/Symbol/ObjectFile.h" 26 27 28 using namespace lldb; 29 using namespace lldb_private; 30 using namespace llvm::MachO; 31 32 #define MACHO_NLIST_ARM_SYMBOL_IS_THUMB 0x0008 33 34 void 35 ObjectFileMachO::Initialize() 36 { 37 PluginManager::RegisterPlugin (GetPluginNameStatic(), 38 GetPluginDescriptionStatic(), 39 CreateInstance); 40 } 41 42 void 43 ObjectFileMachO::Terminate() 44 { 45 PluginManager::UnregisterPlugin (CreateInstance); 46 } 47 48 49 const char * 50 ObjectFileMachO::GetPluginNameStatic() 51 { 52 return "object-file.mach-o"; 53 } 54 55 const char * 56 ObjectFileMachO::GetPluginDescriptionStatic() 57 { 58 return "Mach-o object file reader (32 and 64 bit)"; 59 } 60 61 62 ObjectFile * 63 ObjectFileMachO::CreateInstance (Module* module, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length) 64 { 65 if (ObjectFileMachO::MagicBytesMatch(dataSP)) 66 { 67 std::auto_ptr<ObjectFile> objfile_ap(new ObjectFileMachO (module, dataSP, file, offset, length)); 68 if (objfile_ap.get() && objfile_ap->ParseHeader()) 69 return objfile_ap.release(); 70 } 71 return NULL; 72 } 73 74 75 static uint32_t 76 MachHeaderSizeFromMagic(uint32_t magic) 77 { 78 switch (magic) 79 { 80 case HeaderMagic32: 81 case HeaderMagic32Swapped: 82 return sizeof(struct mach_header); 83 84 case HeaderMagic64: 85 case HeaderMagic64Swapped: 86 return sizeof(struct mach_header_64); 87 break; 88 89 default: 90 break; 91 } 92 return 0; 93 } 94 95 96 bool 97 ObjectFileMachO::MagicBytesMatch (DataBufferSP& dataSP) 98 { 99 DataExtractor data(dataSP, lldb::endian::InlHostByteOrder(), 4); 100 uint32_t offset = 0; 101 uint32_t magic = data.GetU32(&offset); 102 return MachHeaderSizeFromMagic(magic) != 0; 103 } 104 105 106 ObjectFileMachO::ObjectFileMachO(Module* module, DataBufferSP& dataSP, const FileSpec* file, addr_t offset, addr_t length) : 107 ObjectFile(module, file, offset, length, dataSP), 108 m_mutex (Mutex::eMutexTypeRecursive), 109 m_header(), 110 m_sections_ap(), 111 m_symtab_ap(), 112 m_entry_point_address () 113 { 114 ::memset (&m_header, 0, sizeof(m_header)); 115 ::memset (&m_dysymtab, 0, sizeof(m_dysymtab)); 116 } 117 118 119 ObjectFileMachO::~ObjectFileMachO() 120 { 121 } 122 123 124 bool 125 ObjectFileMachO::ParseHeader () 126 { 127 lldb_private::Mutex::Locker locker(m_mutex); 128 bool can_parse = false; 129 uint32_t offset = 0; 130 m_data.SetByteOrder (lldb::endian::InlHostByteOrder()); 131 // Leave magic in the original byte order 132 m_header.magic = m_data.GetU32(&offset); 133 switch (m_header.magic) 134 { 135 case HeaderMagic32: 136 m_data.SetByteOrder (lldb::endian::InlHostByteOrder()); 137 m_data.SetAddressByteSize(4); 138 can_parse = true; 139 break; 140 141 case HeaderMagic64: 142 m_data.SetByteOrder (lldb::endian::InlHostByteOrder()); 143 m_data.SetAddressByteSize(8); 144 can_parse = true; 145 break; 146 147 case HeaderMagic32Swapped: 148 m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); 149 m_data.SetAddressByteSize(4); 150 can_parse = true; 151 break; 152 153 case HeaderMagic64Swapped: 154 m_data.SetByteOrder(lldb::endian::InlHostByteOrder() == eByteOrderBig ? eByteOrderLittle : eByteOrderBig); 155 m_data.SetAddressByteSize(8); 156 can_parse = true; 157 break; 158 159 default: 160 break; 161 } 162 163 if (can_parse) 164 { 165 m_data.GetU32(&offset, &m_header.cputype, 6); 166 167 ArchSpec mach_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype); 168 169 if (SetModulesArchitecture (mach_arch)) 170 { 171 // Read in all only the load command data 172 DataBufferSP data_sp(m_file.ReadFileContents(m_offset, m_header.sizeofcmds + MachHeaderSizeFromMagic(m_header.magic))); 173 m_data.SetData (data_sp); 174 return true; 175 } 176 } 177 else 178 { 179 memset(&m_header, 0, sizeof(struct mach_header)); 180 } 181 return false; 182 } 183 184 185 ByteOrder 186 ObjectFileMachO::GetByteOrder () const 187 { 188 lldb_private::Mutex::Locker locker(m_mutex); 189 return m_data.GetByteOrder (); 190 } 191 192 bool 193 ObjectFileMachO::IsExecutable() const 194 { 195 return m_header.filetype == HeaderFileTypeExecutable; 196 } 197 198 size_t 199 ObjectFileMachO::GetAddressByteSize () const 200 { 201 lldb_private::Mutex::Locker locker(m_mutex); 202 return m_data.GetAddressByteSize (); 203 } 204 205 AddressClass 206 ObjectFileMachO::GetAddressClass (lldb::addr_t file_addr) 207 { 208 Symtab *symtab = GetSymtab(); 209 if (symtab) 210 { 211 Symbol *symbol = symtab->FindSymbolContainingFileAddress(file_addr); 212 if (symbol) 213 { 214 const AddressRange *range_ptr = symbol->GetAddressRangePtr(); 215 if (range_ptr) 216 { 217 const Section *section = range_ptr->GetBaseAddress().GetSection(); 218 if (section) 219 { 220 const SectionType section_type = section->GetType(); 221 switch (section_type) 222 { 223 case eSectionTypeInvalid: return eAddressClassUnknown; 224 case eSectionTypeCode: 225 if (m_header.cputype == llvm::MachO::CPUTypeARM) 226 { 227 // For ARM we have a bit in the n_desc field of the symbol 228 // that tells us ARM/Thumb which is bit 0x0008. 229 if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB) 230 return eAddressClassCodeAlternateISA; 231 } 232 return eAddressClassCode; 233 234 case eSectionTypeContainer: return eAddressClassUnknown; 235 case eSectionTypeData: return eAddressClassData; 236 case eSectionTypeDataCString: return eAddressClassData; 237 case eSectionTypeDataCStringPointers: return eAddressClassData; 238 case eSectionTypeDataSymbolAddress: return eAddressClassData; 239 case eSectionTypeData4: return eAddressClassData; 240 case eSectionTypeData8: return eAddressClassData; 241 case eSectionTypeData16: return eAddressClassData; 242 case eSectionTypeDataPointers: return eAddressClassData; 243 case eSectionTypeZeroFill: return eAddressClassData; 244 case eSectionTypeDataObjCMessageRefs: return eAddressClassData; 245 case eSectionTypeDataObjCCFStrings: return eAddressClassData; 246 case eSectionTypeDebug: return eAddressClassDebug; 247 case eSectionTypeDWARFDebugAbbrev: return eAddressClassDebug; 248 case eSectionTypeDWARFDebugAranges: return eAddressClassDebug; 249 case eSectionTypeDWARFDebugFrame: return eAddressClassDebug; 250 case eSectionTypeDWARFDebugInfo: return eAddressClassDebug; 251 case eSectionTypeDWARFDebugLine: return eAddressClassDebug; 252 case eSectionTypeDWARFDebugLoc: return eAddressClassDebug; 253 case eSectionTypeDWARFDebugMacInfo: return eAddressClassDebug; 254 case eSectionTypeDWARFDebugPubNames: return eAddressClassDebug; 255 case eSectionTypeDWARFDebugPubTypes: return eAddressClassDebug; 256 case eSectionTypeDWARFDebugRanges: return eAddressClassDebug; 257 case eSectionTypeDWARFDebugStr: return eAddressClassDebug; 258 case eSectionTypeEHFrame: return eAddressClassRuntime; 259 case eSectionTypeOther: return eAddressClassUnknown; 260 } 261 } 262 } 263 264 const SymbolType symbol_type = symbol->GetType(); 265 switch (symbol_type) 266 { 267 case eSymbolTypeAny: return eAddressClassUnknown; 268 case eSymbolTypeAbsolute: return eAddressClassUnknown; 269 case eSymbolTypeExtern: return eAddressClassUnknown; 270 271 case eSymbolTypeCode: 272 case eSymbolTypeTrampoline: 273 if (m_header.cputype == llvm::MachO::CPUTypeARM) 274 { 275 // For ARM we have a bit in the n_desc field of the symbol 276 // that tells us ARM/Thumb which is bit 0x0008. 277 if (symbol->GetFlags() & MACHO_NLIST_ARM_SYMBOL_IS_THUMB) 278 return eAddressClassCodeAlternateISA; 279 } 280 return eAddressClassCode; 281 282 case eSymbolTypeData: return eAddressClassData; 283 case eSymbolTypeRuntime: return eAddressClassRuntime; 284 case eSymbolTypeException: return eAddressClassRuntime; 285 case eSymbolTypeSourceFile: return eAddressClassDebug; 286 case eSymbolTypeHeaderFile: return eAddressClassDebug; 287 case eSymbolTypeObjectFile: return eAddressClassDebug; 288 case eSymbolTypeCommonBlock: return eAddressClassDebug; 289 case eSymbolTypeBlock: return eAddressClassDebug; 290 case eSymbolTypeLocal: return eAddressClassData; 291 case eSymbolTypeParam: return eAddressClassData; 292 case eSymbolTypeVariable: return eAddressClassData; 293 case eSymbolTypeVariableType: return eAddressClassDebug; 294 case eSymbolTypeLineEntry: return eAddressClassDebug; 295 case eSymbolTypeLineHeader: return eAddressClassDebug; 296 case eSymbolTypeScopeBegin: return eAddressClassDebug; 297 case eSymbolTypeScopeEnd: return eAddressClassDebug; 298 case eSymbolTypeAdditional: return eAddressClassUnknown; 299 case eSymbolTypeCompiler: return eAddressClassDebug; 300 case eSymbolTypeInstrumentation:return eAddressClassDebug; 301 case eSymbolTypeUndefined: return eAddressClassUnknown; 302 } 303 } 304 } 305 return eAddressClassUnknown; 306 } 307 308 Symtab * 309 ObjectFileMachO::GetSymtab() 310 { 311 lldb_private::Mutex::Locker symfile_locker(m_mutex); 312 if (m_symtab_ap.get() == NULL) 313 { 314 m_symtab_ap.reset(new Symtab(this)); 315 Mutex::Locker symtab_locker (m_symtab_ap->GetMutex()); 316 ParseSymtab (true); 317 } 318 return m_symtab_ap.get(); 319 } 320 321 322 SectionList * 323 ObjectFileMachO::GetSectionList() 324 { 325 lldb_private::Mutex::Locker locker(m_mutex); 326 if (m_sections_ap.get() == NULL) 327 { 328 m_sections_ap.reset(new SectionList()); 329 ParseSections(); 330 } 331 return m_sections_ap.get(); 332 } 333 334 335 size_t 336 ObjectFileMachO::ParseSections () 337 { 338 lldb::user_id_t segID = 0; 339 lldb::user_id_t sectID = 0; 340 struct segment_command_64 load_cmd; 341 uint32_t offset = MachHeaderSizeFromMagic(m_header.magic); 342 uint32_t i; 343 //bool dump_sections = false; 344 for (i=0; i<m_header.ncmds; ++i) 345 { 346 const uint32_t load_cmd_offset = offset; 347 if (m_data.GetU32(&offset, &load_cmd, 2) == NULL) 348 break; 349 350 if (load_cmd.cmd == LoadCommandSegment32 || load_cmd.cmd == LoadCommandSegment64) 351 { 352 if (m_data.GetU8(&offset, (uint8_t*)load_cmd.segname, 16)) 353 { 354 load_cmd.vmaddr = m_data.GetAddress(&offset); 355 load_cmd.vmsize = m_data.GetAddress(&offset); 356 load_cmd.fileoff = m_data.GetAddress(&offset); 357 load_cmd.filesize = m_data.GetAddress(&offset); 358 if (m_data.GetU32(&offset, &load_cmd.maxprot, 4)) 359 { 360 361 const bool segment_is_encrypted = (load_cmd.flags & SegmentCommandFlagBitProtectedVersion1) != 0; 362 363 // Keep a list of mach segments around in case we need to 364 // get at data that isn't stored in the abstracted Sections. 365 m_mach_segments.push_back (load_cmd); 366 367 ConstString segment_name (load_cmd.segname, std::min<int>(strlen(load_cmd.segname), sizeof(load_cmd.segname))); 368 // Use a segment ID of the segment index shifted left by 8 so they 369 // never conflict with any of the sections. 370 SectionSP segment_sp; 371 if (segment_name) 372 { 373 segment_sp.reset(new Section (NULL, 374 GetModule(), // Module to which this section belongs 375 ++segID << 8, // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible 376 segment_name, // Name of this section 377 eSectionTypeContainer, // This section is a container of other sections. 378 load_cmd.vmaddr, // File VM address == addresses as they are found in the object file 379 load_cmd.vmsize, // VM size in bytes of this section 380 load_cmd.fileoff, // Offset to the data for this section in the file 381 load_cmd.filesize, // Size in bytes of this section as found in the the file 382 load_cmd.flags)); // Flags for this section 383 384 segment_sp->SetIsEncrypted (segment_is_encrypted); 385 m_sections_ap->AddSection(segment_sp); 386 } 387 388 struct section_64 sect64; 389 ::memset (§64, 0, sizeof(sect64)); 390 // Push a section into our mach sections for the section at 391 // index zero (NListSectionNoSection) if we don't have any 392 // mach sections yet... 393 if (m_mach_sections.empty()) 394 m_mach_sections.push_back(sect64); 395 uint32_t segment_sect_idx; 396 const lldb::user_id_t first_segment_sectID = sectID + 1; 397 398 399 const uint32_t num_u32s = load_cmd.cmd == LoadCommandSegment32 ? 7 : 8; 400 for (segment_sect_idx=0; segment_sect_idx<load_cmd.nsects; ++segment_sect_idx) 401 { 402 if (m_data.GetU8(&offset, (uint8_t*)sect64.sectname, sizeof(sect64.sectname)) == NULL) 403 break; 404 if (m_data.GetU8(&offset, (uint8_t*)sect64.segname, sizeof(sect64.segname)) == NULL) 405 break; 406 sect64.addr = m_data.GetAddress(&offset); 407 sect64.size = m_data.GetAddress(&offset); 408 409 if (m_data.GetU32(&offset, §64.offset, num_u32s) == NULL) 410 break; 411 412 // Keep a list of mach sections around in case we need to 413 // get at data that isn't stored in the abstracted Sections. 414 m_mach_sections.push_back (sect64); 415 416 ConstString section_name (sect64.sectname, std::min<size_t>(strlen(sect64.sectname), sizeof(sect64.sectname))); 417 if (!segment_name) 418 { 419 // We have a segment with no name so we need to conjure up 420 // segments that correspond to the section's segname if there 421 // isn't already such a section. If there is such a section, 422 // we resize the section so that it spans all sections. 423 // We also mark these sections as fake so address matches don't 424 // hit if they land in the gaps between the child sections. 425 segment_name.SetTrimmedCStringWithLength(sect64.segname, sizeof(sect64.segname)); 426 segment_sp = m_sections_ap->FindSectionByName (segment_name); 427 if (segment_sp.get()) 428 { 429 Section *segment = segment_sp.get(); 430 // Grow the section size as needed. 431 const lldb::addr_t sect64_min_addr = sect64.addr; 432 const lldb::addr_t sect64_max_addr = sect64_min_addr + sect64.size; 433 const lldb::addr_t curr_seg_byte_size = segment->GetByteSize(); 434 const lldb::addr_t curr_seg_min_addr = segment->GetFileAddress(); 435 const lldb::addr_t curr_seg_max_addr = curr_seg_min_addr + curr_seg_byte_size; 436 if (sect64_min_addr >= curr_seg_min_addr) 437 { 438 const lldb::addr_t new_seg_byte_size = sect64_max_addr - curr_seg_min_addr; 439 // Only grow the section size if needed 440 if (new_seg_byte_size > curr_seg_byte_size) 441 segment->SetByteSize (new_seg_byte_size); 442 } 443 else 444 { 445 // We need to change the base address of the segment and 446 // adjust the child section offsets for all existing children. 447 const lldb::addr_t slide_amount = sect64_min_addr - curr_seg_min_addr; 448 segment->Slide(slide_amount, false); 449 segment->GetChildren().Slide (-slide_amount, false); 450 segment->SetByteSize (curr_seg_max_addr - sect64_min_addr); 451 } 452 453 // Grow the section size as needed. 454 if (sect64.offset) 455 { 456 const lldb::addr_t segment_min_file_offset = segment->GetFileOffset(); 457 const lldb::addr_t segment_max_file_offset = segment_min_file_offset + segment->GetFileSize(); 458 459 const lldb::addr_t section_min_file_offset = sect64.offset; 460 const lldb::addr_t section_max_file_offset = section_min_file_offset + sect64.size; 461 const lldb::addr_t new_file_offset = std::min (section_min_file_offset, segment_min_file_offset); 462 const lldb::addr_t new_file_size = std::max (section_max_file_offset, segment_max_file_offset) - new_file_offset; 463 segment->SetFileOffset (new_file_offset); 464 segment->SetFileSize (new_file_size); 465 } 466 } 467 else 468 { 469 // Create a fake section for the section's named segment 470 segment_sp.reset(new Section(segment_sp.get(), // Parent section 471 GetModule(), // Module to which this section belongs 472 ++segID << 8, // Section ID is the 1 based segment index shifted right by 8 bits as not to collide with any of the 256 section IDs that are possible 473 segment_name, // Name of this section 474 eSectionTypeContainer, // This section is a container of other sections. 475 sect64.addr, // File VM address == addresses as they are found in the object file 476 sect64.size, // VM size in bytes of this section 477 sect64.offset, // Offset to the data for this section in the file 478 sect64.offset ? sect64.size : 0, // Size in bytes of this section as found in the the file 479 load_cmd.flags)); // Flags for this section 480 segment_sp->SetIsFake(true); 481 m_sections_ap->AddSection(segment_sp); 482 segment_sp->SetIsEncrypted (segment_is_encrypted); 483 } 484 } 485 assert (segment_sp.get()); 486 487 uint32_t mach_sect_type = sect64.flags & SectionFlagMaskSectionType; 488 static ConstString g_sect_name_objc_data ("__objc_data"); 489 static ConstString g_sect_name_objc_msgrefs ("__objc_msgrefs"); 490 static ConstString g_sect_name_objc_selrefs ("__objc_selrefs"); 491 static ConstString g_sect_name_objc_classrefs ("__objc_classrefs"); 492 static ConstString g_sect_name_objc_superrefs ("__objc_superrefs"); 493 static ConstString g_sect_name_objc_const ("__objc_const"); 494 static ConstString g_sect_name_objc_classlist ("__objc_classlist"); 495 static ConstString g_sect_name_cfstring ("__cfstring"); 496 497 static ConstString g_sect_name_dwarf_debug_abbrev ("__debug_abbrev"); 498 static ConstString g_sect_name_dwarf_debug_aranges ("__debug_aranges"); 499 static ConstString g_sect_name_dwarf_debug_frame ("__debug_frame"); 500 static ConstString g_sect_name_dwarf_debug_info ("__debug_info"); 501 static ConstString g_sect_name_dwarf_debug_line ("__debug_line"); 502 static ConstString g_sect_name_dwarf_debug_loc ("__debug_loc"); 503 static ConstString g_sect_name_dwarf_debug_macinfo ("__debug_macinfo"); 504 static ConstString g_sect_name_dwarf_debug_pubnames ("__debug_pubnames"); 505 static ConstString g_sect_name_dwarf_debug_pubtypes ("__debug_pubtypes"); 506 static ConstString g_sect_name_dwarf_debug_ranges ("__debug_ranges"); 507 static ConstString g_sect_name_dwarf_debug_str ("__debug_str"); 508 static ConstString g_sect_name_eh_frame ("__eh_frame"); 509 static ConstString g_sect_name_DATA ("__DATA"); 510 static ConstString g_sect_name_TEXT ("__TEXT"); 511 512 SectionType sect_type = eSectionTypeOther; 513 514 if (section_name == g_sect_name_dwarf_debug_abbrev) 515 sect_type = eSectionTypeDWARFDebugAbbrev; 516 else if (section_name == g_sect_name_dwarf_debug_aranges) 517 sect_type = eSectionTypeDWARFDebugAranges; 518 else if (section_name == g_sect_name_dwarf_debug_frame) 519 sect_type = eSectionTypeDWARFDebugFrame; 520 else if (section_name == g_sect_name_dwarf_debug_info) 521 sect_type = eSectionTypeDWARFDebugInfo; 522 else if (section_name == g_sect_name_dwarf_debug_line) 523 sect_type = eSectionTypeDWARFDebugLine; 524 else if (section_name == g_sect_name_dwarf_debug_loc) 525 sect_type = eSectionTypeDWARFDebugLoc; 526 else if (section_name == g_sect_name_dwarf_debug_macinfo) 527 sect_type = eSectionTypeDWARFDebugMacInfo; 528 else if (section_name == g_sect_name_dwarf_debug_pubnames) 529 sect_type = eSectionTypeDWARFDebugPubNames; 530 else if (section_name == g_sect_name_dwarf_debug_pubtypes) 531 sect_type = eSectionTypeDWARFDebugPubTypes; 532 else if (section_name == g_sect_name_dwarf_debug_ranges) 533 sect_type = eSectionTypeDWARFDebugRanges; 534 else if (section_name == g_sect_name_dwarf_debug_str) 535 sect_type = eSectionTypeDWARFDebugStr; 536 else if (section_name == g_sect_name_objc_selrefs) 537 sect_type = eSectionTypeDataCStringPointers; 538 else if (section_name == g_sect_name_objc_msgrefs) 539 sect_type = eSectionTypeDataObjCMessageRefs; 540 else if (section_name == g_sect_name_eh_frame) 541 sect_type = eSectionTypeEHFrame; 542 else if (section_name == g_sect_name_cfstring) 543 sect_type = eSectionTypeDataObjCCFStrings; 544 else if (section_name == g_sect_name_objc_data || 545 section_name == g_sect_name_objc_classrefs || 546 section_name == g_sect_name_objc_superrefs || 547 section_name == g_sect_name_objc_const || 548 section_name == g_sect_name_objc_classlist) 549 { 550 sect_type = eSectionTypeDataPointers; 551 } 552 553 if (sect_type == eSectionTypeOther) 554 { 555 switch (mach_sect_type) 556 { 557 // TODO: categorize sections by other flags for regular sections 558 case SectionTypeRegular: 559 if (segment_sp->GetName() == g_sect_name_TEXT) 560 sect_type = eSectionTypeCode; 561 else if (segment_sp->GetName() == g_sect_name_DATA) 562 sect_type = eSectionTypeData; 563 else 564 sect_type = eSectionTypeOther; 565 break; 566 case SectionTypeZeroFill: sect_type = eSectionTypeZeroFill; break; 567 case SectionTypeCStringLiterals: sect_type = eSectionTypeDataCString; break; // section with only literal C strings 568 case SectionType4ByteLiterals: sect_type = eSectionTypeData4; break; // section with only 4 byte literals 569 case SectionType8ByteLiterals: sect_type = eSectionTypeData8; break; // section with only 8 byte literals 570 case SectionTypeLiteralPointers: sect_type = eSectionTypeDataPointers; break; // section with only pointers to literals 571 case SectionTypeNonLazySymbolPointers: sect_type = eSectionTypeDataPointers; break; // section with only non-lazy symbol pointers 572 case SectionTypeLazySymbolPointers: sect_type = eSectionTypeDataPointers; break; // section with only lazy symbol pointers 573 case SectionTypeSymbolStubs: sect_type = eSectionTypeCode; break; // section with only symbol stubs, byte size of stub in the reserved2 field 574 case SectionTypeModuleInitFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for initialization 575 case SectionTypeModuleTermFunctionPointers: sect_type = eSectionTypeDataPointers; break; // section with only function pointers for termination 576 case SectionTypeCoalesced: sect_type = eSectionTypeOther; break; 577 case SectionTypeZeroFillLarge: sect_type = eSectionTypeZeroFill; break; 578 case SectionTypeInterposing: sect_type = eSectionTypeCode; break; // section with only pairs of function pointers for interposing 579 case SectionType16ByteLiterals: sect_type = eSectionTypeData16; break; // section with only 16 byte literals 580 case SectionTypeDTraceObjectFormat: sect_type = eSectionTypeDebug; break; 581 case SectionTypeLazyDylibSymbolPointers: sect_type = eSectionTypeDataPointers; break; 582 default: break; 583 } 584 } 585 586 SectionSP section_sp(new Section(segment_sp.get(), 587 GetModule(), 588 ++sectID, 589 section_name, 590 sect_type, 591 sect64.addr - segment_sp->GetFileAddress(), 592 sect64.size, 593 sect64.offset, 594 sect64.offset == 0 ? 0 : sect64.size, 595 sect64.flags)); 596 // Set the section to be encrypted to match the segment 597 section_sp->SetIsEncrypted (segment_is_encrypted); 598 599 segment_sp->GetChildren().AddSection(section_sp); 600 601 if (segment_sp->IsFake()) 602 { 603 segment_sp.reset(); 604 segment_name.Clear(); 605 } 606 } 607 if (m_header.filetype == HeaderFileTypeDSYM) 608 { 609 if (first_segment_sectID <= sectID) 610 { 611 lldb::user_id_t sect_uid; 612 for (sect_uid = first_segment_sectID; sect_uid <= sectID; ++sect_uid) 613 { 614 SectionSP curr_section_sp(segment_sp->GetChildren().FindSectionByID (sect_uid)); 615 SectionSP next_section_sp; 616 if (sect_uid + 1 <= sectID) 617 next_section_sp = segment_sp->GetChildren().FindSectionByID (sect_uid+1); 618 619 if (curr_section_sp.get()) 620 { 621 if (curr_section_sp->GetByteSize() == 0) 622 { 623 if (next_section_sp.get() != NULL) 624 curr_section_sp->SetByteSize ( next_section_sp->GetFileAddress() - curr_section_sp->GetFileAddress() ); 625 else 626 curr_section_sp->SetByteSize ( load_cmd.vmsize ); 627 } 628 } 629 } 630 } 631 } 632 } 633 } 634 } 635 else if (load_cmd.cmd == LoadCommandDynamicSymtabInfo) 636 { 637 m_dysymtab.cmd = load_cmd.cmd; 638 m_dysymtab.cmdsize = load_cmd.cmdsize; 639 m_data.GetU32 (&offset, &m_dysymtab.ilocalsym, (sizeof(m_dysymtab) / sizeof(uint32_t)) - 2); 640 } 641 642 offset = load_cmd_offset + load_cmd.cmdsize; 643 } 644 // if (dump_sections) 645 // { 646 // StreamFile s(stdout); 647 // m_sections_ap->Dump(&s, true); 648 // } 649 return sectID; // Return the number of sections we registered with the module 650 } 651 652 class MachSymtabSectionInfo 653 { 654 public: 655 656 MachSymtabSectionInfo (SectionList *section_list) : 657 m_section_list (section_list), 658 m_section_infos() 659 { 660 // Get the number of sections down to a depth of 1 to include 661 // all segments and their sections, but no other sections that 662 // may be added for debug map or 663 m_section_infos.resize(section_list->GetNumSections(1)); 664 } 665 666 667 Section * 668 GetSection (uint8_t n_sect, addr_t file_addr) 669 { 670 if (n_sect == 0) 671 return NULL; 672 if (n_sect < m_section_infos.size()) 673 { 674 if (m_section_infos[n_sect].section == NULL) 675 { 676 Section *section = m_section_list->FindSectionByID (n_sect).get(); 677 m_section_infos[n_sect].section = section; 678 if (section != NULL) 679 { 680 m_section_infos[n_sect].vm_range.SetBaseAddress (section->GetFileAddress()); 681 m_section_infos[n_sect].vm_range.SetByteSize (section->GetByteSize()); 682 } 683 else 684 { 685 fprintf (stderr, "error: unable to find section for section %u\n", n_sect); 686 } 687 } 688 if (m_section_infos[n_sect].vm_range.Contains(file_addr)) 689 return m_section_infos[n_sect].section; 690 } 691 return m_section_list->FindSectionContainingFileAddress(file_addr).get(); 692 } 693 694 protected: 695 struct SectionInfo 696 { 697 SectionInfo () : 698 vm_range(), 699 section (NULL) 700 { 701 } 702 703 VMRange vm_range; 704 Section *section; 705 }; 706 SectionList *m_section_list; 707 std::vector<SectionInfo> m_section_infos; 708 }; 709 710 711 712 size_t 713 ObjectFileMachO::ParseSymtab (bool minimize) 714 { 715 Timer scoped_timer(__PRETTY_FUNCTION__, 716 "ObjectFileMachO::ParseSymtab () module = %s", 717 m_file.GetFilename().AsCString("")); 718 struct symtab_command symtab_load_command; 719 uint32_t offset = MachHeaderSizeFromMagic(m_header.magic); 720 uint32_t i; 721 for (i=0; i<m_header.ncmds; ++i) 722 { 723 const uint32_t cmd_offset = offset; 724 // Read in the load command and load command size 725 if (m_data.GetU32(&offset, &symtab_load_command, 2) == NULL) 726 break; 727 // Watch for the symbol table load command 728 if (symtab_load_command.cmd == LoadCommandSymtab) 729 { 730 // Read in the rest of the symtab load command 731 if (m_data.GetU32(&offset, &symtab_load_command.symoff, 4)) // fill in symoff, nsyms, stroff, strsize fields 732 { 733 Symtab *symtab = m_symtab_ap.get(); 734 SectionList *section_list = GetSectionList(); 735 assert(section_list); 736 const size_t addr_size = m_data.GetAddressByteSize(); 737 const ByteOrder endian = m_data.GetByteOrder(); 738 bool bit_width_32 = addr_size == 4; 739 const size_t nlist_size = bit_width_32 ? sizeof(struct nlist) : sizeof(struct nlist_64); 740 741 DataBufferSP symtab_data_sp(m_file.ReadFileContents(m_offset + symtab_load_command.symoff, symtab_load_command.nsyms * nlist_size)); 742 DataBufferSP strtab_data_sp(m_file.ReadFileContents(m_offset + symtab_load_command.stroff, symtab_load_command.strsize)); 743 744 const char *strtab_data = (const char *)strtab_data_sp->GetBytes(); 745 // DataExtractor symtab_data(symtab_data_sp, endian, addr_size); 746 // DataExtractor strtab_data(strtab_data_sp, endian, addr_size); 747 748 static ConstString g_segment_name_TEXT ("__TEXT"); 749 static ConstString g_segment_name_DATA ("__DATA"); 750 static ConstString g_segment_name_OBJC ("__OBJC"); 751 static ConstString g_section_name_eh_frame ("__eh_frame"); 752 SectionSP text_section_sp(section_list->FindSectionByName(g_segment_name_TEXT)); 753 SectionSP data_section_sp(section_list->FindSectionByName(g_segment_name_DATA)); 754 SectionSP objc_section_sp(section_list->FindSectionByName(g_segment_name_OBJC)); 755 SectionSP eh_frame_section_sp; 756 if (text_section_sp.get()) 757 eh_frame_section_sp = text_section_sp->GetChildren().FindSectionByName (g_section_name_eh_frame); 758 else 759 eh_frame_section_sp = section_list->FindSectionByName (g_section_name_eh_frame); 760 761 uint8_t TEXT_eh_frame_sectID = eh_frame_section_sp.get() ? eh_frame_section_sp->GetID() : NListSectionNoSection; 762 //uint32_t symtab_offset = 0; 763 const uint8_t* nlist_data = symtab_data_sp->GetBytes(); 764 assert (symtab_data_sp->GetByteSize()/nlist_size >= symtab_load_command.nsyms); 765 766 767 if (endian != lldb::endian::InlHostByteOrder()) 768 { 769 // ... 770 assert (!"UNIMPLEMENTED: Swap all nlist entries"); 771 } 772 uint32_t N_SO_index = UINT32_MAX; 773 774 MachSymtabSectionInfo section_info (section_list); 775 std::vector<uint32_t> N_FUN_indexes; 776 std::vector<uint32_t> N_NSYM_indexes; 777 std::vector<uint32_t> N_INCL_indexes; 778 std::vector<uint32_t> N_BRAC_indexes; 779 std::vector<uint32_t> N_COMM_indexes; 780 typedef std::map <uint64_t, uint32_t> ValueToSymbolIndexMap; 781 typedef std::map <uint32_t, uint32_t> NListIndexToSymbolIndexMap; 782 ValueToSymbolIndexMap N_FUN_addr_to_sym_idx; 783 ValueToSymbolIndexMap N_STSYM_addr_to_sym_idx; 784 // Any symbols that get merged into another will get an entry 785 // in this map so we know 786 NListIndexToSymbolIndexMap m_nlist_idx_to_sym_idx; 787 uint32_t nlist_idx = 0; 788 Symbol *symbol_ptr = NULL; 789 790 uint32_t sym_idx = 0; 791 Symbol *sym = symtab->Resize (symtab_load_command.nsyms + m_dysymtab.nindirectsyms); 792 uint32_t num_syms = symtab->GetNumSymbols(); 793 794 //symtab->Reserve (symtab_load_command.nsyms + m_dysymtab.nindirectsyms); 795 for (nlist_idx = 0; nlist_idx < symtab_load_command.nsyms; ++nlist_idx) 796 { 797 struct nlist_64 nlist; 798 if (bit_width_32) 799 { 800 struct nlist* nlist32_ptr = (struct nlist*)(nlist_data + (nlist_idx * nlist_size)); 801 nlist.n_strx = nlist32_ptr->n_strx; 802 nlist.n_type = nlist32_ptr->n_type; 803 nlist.n_sect = nlist32_ptr->n_sect; 804 nlist.n_desc = nlist32_ptr->n_desc; 805 nlist.n_value = nlist32_ptr->n_value; 806 } 807 else 808 { 809 nlist = *((struct nlist_64*)(nlist_data + (nlist_idx * nlist_size))); 810 } 811 812 SymbolType type = eSymbolTypeInvalid; 813 const char* symbol_name = &strtab_data[nlist.n_strx]; 814 if (symbol_name[0] == '\0') 815 symbol_name = NULL; 816 Section* symbol_section = NULL; 817 bool add_nlist = true; 818 bool is_debug = ((nlist.n_type & NlistMaskStab) != 0); 819 820 assert (sym_idx < num_syms); 821 822 sym[sym_idx].SetDebug (is_debug); 823 824 if (is_debug) 825 { 826 switch (nlist.n_type) 827 { 828 case StabGlobalSymbol: 829 // N_GSYM -- global symbol: name,,NO_SECT,type,0 830 // Sometimes the N_GSYM value contains the address. 831 sym[sym_idx].SetExternal(true); 832 if (nlist.n_value != 0) 833 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 834 type = eSymbolTypeData; 835 break; 836 837 case StabFunctionName: 838 // N_FNAME -- procedure name (f77 kludge): name,,NO_SECT,0,0 839 type = eSymbolTypeCompiler; 840 break; 841 842 case StabFunction: 843 // N_FUN -- procedure: name,,n_sect,linenumber,address 844 if (symbol_name) 845 { 846 type = eSymbolTypeCode; 847 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 848 849 N_FUN_addr_to_sym_idx[nlist.n_value] = sym_idx; 850 // We use the current number of symbols in the symbol table in lieu of 851 // using nlist_idx in case we ever start trimming entries out 852 N_FUN_indexes.push_back(sym_idx); 853 } 854 else 855 { 856 type = eSymbolTypeCompiler; 857 858 if ( !N_FUN_indexes.empty() ) 859 { 860 // Copy the size of the function into the original STAB entry so we don't have 861 // to hunt for it later 862 symtab->SymbolAtIndex(N_FUN_indexes.back())->SetByteSize(nlist.n_value); 863 N_FUN_indexes.pop_back(); 864 // We don't really need the end function STAB as it contains the size which 865 // we already placed with the original symbol, so don't add it if we want a 866 // minimal symbol table 867 if (minimize) 868 add_nlist = false; 869 } 870 } 871 break; 872 873 case StabStaticSymbol: 874 // N_STSYM -- static symbol: name,,n_sect,type,address 875 N_STSYM_addr_to_sym_idx[nlist.n_value] = sym_idx; 876 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 877 type = eSymbolTypeData; 878 break; 879 880 case StabLocalCommon: 881 // N_LCSYM -- .lcomm symbol: name,,n_sect,type,address 882 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 883 type = eSymbolTypeCommonBlock; 884 break; 885 886 case StabBeginSymbol: 887 // N_BNSYM 888 // We use the current number of symbols in the symbol table in lieu of 889 // using nlist_idx in case we ever start trimming entries out 890 if (minimize) 891 { 892 // Skip these if we want minimal symbol tables 893 add_nlist = false; 894 } 895 else 896 { 897 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 898 N_NSYM_indexes.push_back(sym_idx); 899 type = eSymbolTypeScopeBegin; 900 } 901 break; 902 903 case StabEndSymbol: 904 // N_ENSYM 905 // Set the size of the N_BNSYM to the terminating index of this N_ENSYM 906 // so that we can always skip the entire symbol if we need to navigate 907 // more quickly at the source level when parsing STABS 908 if (minimize) 909 { 910 // Skip these if we want minimal symbol tables 911 add_nlist = false; 912 } 913 else 914 { 915 if ( !N_NSYM_indexes.empty() ) 916 { 917 symbol_ptr = symtab->SymbolAtIndex(N_NSYM_indexes.back()); 918 symbol_ptr->SetByteSize(sym_idx + 1); 919 symbol_ptr->SetSizeIsSibling(true); 920 N_NSYM_indexes.pop_back(); 921 } 922 type = eSymbolTypeScopeEnd; 923 } 924 break; 925 926 927 case StabSourceFileOptions: 928 // N_OPT - emitted with gcc2_compiled and in gcc source 929 type = eSymbolTypeCompiler; 930 break; 931 932 case StabRegisterSymbol: 933 // N_RSYM - register sym: name,,NO_SECT,type,register 934 type = eSymbolTypeVariable; 935 break; 936 937 case StabSourceLine: 938 // N_SLINE - src line: 0,,n_sect,linenumber,address 939 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 940 type = eSymbolTypeLineEntry; 941 break; 942 943 case StabStructureType: 944 // N_SSYM - structure elt: name,,NO_SECT,type,struct_offset 945 type = eSymbolTypeVariableType; 946 break; 947 948 case StabSourceFileName: 949 // N_SO - source file name 950 type = eSymbolTypeSourceFile; 951 if (symbol_name == NULL) 952 { 953 if (minimize) 954 add_nlist = false; 955 if (N_SO_index != UINT32_MAX) 956 { 957 // Set the size of the N_SO to the terminating index of this N_SO 958 // so that we can always skip the entire N_SO if we need to navigate 959 // more quickly at the source level when parsing STABS 960 symbol_ptr = symtab->SymbolAtIndex(N_SO_index); 961 symbol_ptr->SetByteSize(sym_idx + (minimize ? 0 : 1)); 962 symbol_ptr->SetSizeIsSibling(true); 963 } 964 N_NSYM_indexes.clear(); 965 N_INCL_indexes.clear(); 966 N_BRAC_indexes.clear(); 967 N_COMM_indexes.clear(); 968 N_FUN_indexes.clear(); 969 N_SO_index = UINT32_MAX; 970 } 971 else 972 { 973 // We use the current number of symbols in the symbol table in lieu of 974 // using nlist_idx in case we ever start trimming entries out 975 if (symbol_name[0] == '/') 976 N_SO_index = sym_idx; 977 else if (minimize && (N_SO_index == sym_idx - 1) && ((sym_idx - 1) < num_syms)) 978 { 979 const char *so_path = sym[sym_idx - 1].GetMangled().GetDemangledName().AsCString(); 980 if (so_path && so_path[0]) 981 { 982 std::string full_so_path (so_path); 983 if (*full_so_path.rbegin() != '/') 984 full_so_path += '/'; 985 full_so_path += symbol_name; 986 sym[sym_idx - 1].GetMangled().SetValue(full_so_path.c_str(), false); 987 add_nlist = false; 988 m_nlist_idx_to_sym_idx[nlist_idx] = sym_idx - 1; 989 } 990 } 991 } 992 993 break; 994 995 case StabObjectFileName: 996 // N_OSO - object file name: name,,0,0,st_mtime 997 type = eSymbolTypeObjectFile; 998 break; 999 1000 case StabLocalSymbol: 1001 // N_LSYM - local sym: name,,NO_SECT,type,offset 1002 type = eSymbolTypeLocal; 1003 break; 1004 1005 //---------------------------------------------------------------------- 1006 // INCL scopes 1007 //---------------------------------------------------------------------- 1008 case StabBeginIncludeFileName: 1009 // N_BINCL - include file beginning: name,,NO_SECT,0,sum 1010 // We use the current number of symbols in the symbol table in lieu of 1011 // using nlist_idx in case we ever start trimming entries out 1012 N_INCL_indexes.push_back(sym_idx); 1013 type = eSymbolTypeScopeBegin; 1014 break; 1015 1016 case StabEndIncludeFile: 1017 // N_EINCL - include file end: name,,NO_SECT,0,0 1018 // Set the size of the N_BINCL to the terminating index of this N_EINCL 1019 // so that we can always skip the entire symbol if we need to navigate 1020 // more quickly at the source level when parsing STABS 1021 if ( !N_INCL_indexes.empty() ) 1022 { 1023 symbol_ptr = symtab->SymbolAtIndex(N_INCL_indexes.back()); 1024 symbol_ptr->SetByteSize(sym_idx + 1); 1025 symbol_ptr->SetSizeIsSibling(true); 1026 N_INCL_indexes.pop_back(); 1027 } 1028 type = eSymbolTypeScopeEnd; 1029 break; 1030 1031 case StabIncludeFileName: 1032 // N_SOL - #included file name: name,,n_sect,0,address 1033 type = eSymbolTypeHeaderFile; 1034 1035 // We currently don't use the header files on darwin 1036 if (minimize) 1037 add_nlist = false; 1038 break; 1039 1040 case StabCompilerParameters: 1041 // N_PARAMS - compiler parameters: name,,NO_SECT,0,0 1042 type = eSymbolTypeCompiler; 1043 break; 1044 1045 case StabCompilerVersion: 1046 // N_VERSION - compiler version: name,,NO_SECT,0,0 1047 type = eSymbolTypeCompiler; 1048 break; 1049 1050 case StabCompilerOptLevel: 1051 // N_OLEVEL - compiler -O level: name,,NO_SECT,0,0 1052 type = eSymbolTypeCompiler; 1053 break; 1054 1055 case StabParameter: 1056 // N_PSYM - parameter: name,,NO_SECT,type,offset 1057 type = eSymbolTypeVariable; 1058 break; 1059 1060 case StabAlternateEntry: 1061 // N_ENTRY - alternate entry: name,,n_sect,linenumber,address 1062 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 1063 type = eSymbolTypeLineEntry; 1064 break; 1065 1066 //---------------------------------------------------------------------- 1067 // Left and Right Braces 1068 //---------------------------------------------------------------------- 1069 case StabLeftBracket: 1070 // N_LBRAC - left bracket: 0,,NO_SECT,nesting level,address 1071 // We use the current number of symbols in the symbol table in lieu of 1072 // using nlist_idx in case we ever start trimming entries out 1073 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 1074 N_BRAC_indexes.push_back(sym_idx); 1075 type = eSymbolTypeScopeBegin; 1076 break; 1077 1078 case StabRightBracket: 1079 // N_RBRAC - right bracket: 0,,NO_SECT,nesting level,address 1080 // Set the size of the N_LBRAC to the terminating index of this N_RBRAC 1081 // so that we can always skip the entire symbol if we need to navigate 1082 // more quickly at the source level when parsing STABS 1083 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 1084 if ( !N_BRAC_indexes.empty() ) 1085 { 1086 symbol_ptr = symtab->SymbolAtIndex(N_BRAC_indexes.back()); 1087 symbol_ptr->SetByteSize(sym_idx + 1); 1088 symbol_ptr->SetSizeIsSibling(true); 1089 N_BRAC_indexes.pop_back(); 1090 } 1091 type = eSymbolTypeScopeEnd; 1092 break; 1093 1094 case StabDeletedIncludeFile: 1095 // N_EXCL - deleted include file: name,,NO_SECT,0,sum 1096 type = eSymbolTypeHeaderFile; 1097 break; 1098 1099 //---------------------------------------------------------------------- 1100 // COMM scopes 1101 //---------------------------------------------------------------------- 1102 case StabBeginCommon: 1103 // N_BCOMM - begin common: name,,NO_SECT,0,0 1104 // We use the current number of symbols in the symbol table in lieu of 1105 // using nlist_idx in case we ever start trimming entries out 1106 type = eSymbolTypeScopeBegin; 1107 N_COMM_indexes.push_back(sym_idx); 1108 break; 1109 1110 case StabEndCommonLocal: 1111 // N_ECOML - end common (local name): 0,,n_sect,0,address 1112 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 1113 // Fall through 1114 1115 case StabEndCommon: 1116 // N_ECOMM - end common: name,,n_sect,0,0 1117 // Set the size of the N_BCOMM to the terminating index of this N_ECOMM/N_ECOML 1118 // so that we can always skip the entire symbol if we need to navigate 1119 // more quickly at the source level when parsing STABS 1120 if ( !N_COMM_indexes.empty() ) 1121 { 1122 symbol_ptr = symtab->SymbolAtIndex(N_COMM_indexes.back()); 1123 symbol_ptr->SetByteSize(sym_idx + 1); 1124 symbol_ptr->SetSizeIsSibling(true); 1125 N_COMM_indexes.pop_back(); 1126 } 1127 type = eSymbolTypeScopeEnd; 1128 break; 1129 1130 case StabLength: 1131 // N_LENG - second stab entry with length information 1132 type = eSymbolTypeAdditional; 1133 break; 1134 1135 default: break; 1136 } 1137 } 1138 else 1139 { 1140 //uint8_t n_pext = NlistMaskPrivateExternal & nlist.n_type; 1141 uint8_t n_type = NlistMaskType & nlist.n_type; 1142 sym[sym_idx].SetExternal((NlistMaskExternal & nlist.n_type) != 0); 1143 1144 if (symbol_name && ::strstr (symbol_name, ".objc") == symbol_name) 1145 { 1146 type = eSymbolTypeRuntime; 1147 } 1148 else 1149 { 1150 switch (n_type) 1151 { 1152 case NListTypeIndirect: // N_INDR - Fall through 1153 case NListTypePreboundUndefined:// N_PBUD - Fall through 1154 case NListTypeUndefined: // N_UNDF 1155 type = eSymbolTypeExtern; 1156 break; 1157 1158 case NListTypeAbsolute: // N_ABS 1159 type = eSymbolTypeAbsolute; 1160 break; 1161 1162 case NListTypeSection: // N_SECT 1163 symbol_section = section_info.GetSection (nlist.n_sect, nlist.n_value); 1164 1165 assert(symbol_section != NULL); 1166 if (TEXT_eh_frame_sectID == nlist.n_sect) 1167 { 1168 type = eSymbolTypeException; 1169 } 1170 else 1171 { 1172 uint32_t section_type = symbol_section->Get() & SectionFlagMaskSectionType; 1173 1174 switch (section_type) 1175 { 1176 case SectionTypeRegular: break; // regular section 1177 //case SectionTypeZeroFill: type = eSymbolTypeData; break; // zero fill on demand section 1178 case SectionTypeCStringLiterals: type = eSymbolTypeData; break; // section with only literal C strings 1179 case SectionType4ByteLiterals: type = eSymbolTypeData; break; // section with only 4 byte literals 1180 case SectionType8ByteLiterals: type = eSymbolTypeData; break; // section with only 8 byte literals 1181 case SectionTypeLiteralPointers: type = eSymbolTypeTrampoline; break; // section with only pointers to literals 1182 case SectionTypeNonLazySymbolPointers: type = eSymbolTypeTrampoline; break; // section with only non-lazy symbol pointers 1183 case SectionTypeLazySymbolPointers: type = eSymbolTypeTrampoline; break; // section with only lazy symbol pointers 1184 case SectionTypeSymbolStubs: type = eSymbolTypeTrampoline; break; // section with only symbol stubs, byte size of stub in the reserved2 field 1185 case SectionTypeModuleInitFunctionPointers: type = eSymbolTypeCode; break; // section with only function pointers for initialization 1186 case SectionTypeModuleTermFunctionPointers: type = eSymbolTypeCode; break; // section with only function pointers for termination 1187 //case SectionTypeCoalesced: type = eSymbolType; break; // section contains symbols that are to be coalesced 1188 //case SectionTypeZeroFillLarge: type = eSymbolTypeData; break; // zero fill on demand section (that can be larger than 4 gigabytes) 1189 case SectionTypeInterposing: type = eSymbolTypeTrampoline; break; // section with only pairs of function pointers for interposing 1190 case SectionType16ByteLiterals: type = eSymbolTypeData; break; // section with only 16 byte literals 1191 case SectionTypeDTraceObjectFormat: type = eSymbolTypeInstrumentation; break; 1192 case SectionTypeLazyDylibSymbolPointers: type = eSymbolTypeTrampoline; break; 1193 default: break; 1194 } 1195 1196 if (type == eSymbolTypeInvalid) 1197 { 1198 const char *symbol_sect_name = symbol_section->GetName().AsCString(); 1199 if (symbol_section->IsDescendant (text_section_sp.get())) 1200 { 1201 if (symbol_section->IsClear(SectionAttrUserPureInstructions | 1202 SectionAttrUserSelfModifyingCode | 1203 SectionAttrSytemSomeInstructions)) 1204 type = eSymbolTypeData; 1205 else 1206 type = eSymbolTypeCode; 1207 } 1208 else 1209 if (symbol_section->IsDescendant(data_section_sp.get())) 1210 { 1211 if (symbol_sect_name && ::strstr (symbol_sect_name, "__objc") == symbol_sect_name) 1212 { 1213 type = eSymbolTypeRuntime; 1214 } 1215 else 1216 if (symbol_sect_name && ::strstr (symbol_sect_name, "__gcc_except_tab") == symbol_sect_name) 1217 { 1218 type = eSymbolTypeException; 1219 } 1220 else 1221 { 1222 type = eSymbolTypeData; 1223 } 1224 } 1225 else 1226 if (symbol_sect_name && ::strstr (symbol_sect_name, "__IMPORT") == symbol_sect_name) 1227 { 1228 type = eSymbolTypeTrampoline; 1229 } 1230 else 1231 if (symbol_section->IsDescendant(objc_section_sp.get())) 1232 { 1233 type = eSymbolTypeRuntime; 1234 } 1235 } 1236 } 1237 break; 1238 } 1239 } 1240 } 1241 if (add_nlist) 1242 { 1243 bool symbol_name_is_mangled = false; 1244 if (symbol_name && symbol_name[0] == '_') 1245 { 1246 symbol_name_is_mangled = symbol_name[1] == '_'; 1247 symbol_name++; // Skip the leading underscore 1248 } 1249 uint64_t symbol_value = nlist.n_value; 1250 1251 if (symbol_name) 1252 sym[sym_idx].GetMangled().SetValue(symbol_name, symbol_name_is_mangled); 1253 if (is_debug == false) 1254 { 1255 if (type == eSymbolTypeCode) 1256 { 1257 // See if we can find a N_FUN entry for any code symbols. 1258 // If we do find a match, and the name matches, then we 1259 // can merge the two into just the function symbol to avoid 1260 // duplicate entries in the symbol table 1261 ValueToSymbolIndexMap::const_iterator pos = N_FUN_addr_to_sym_idx.find (nlist.n_value); 1262 if (pos != N_FUN_addr_to_sym_idx.end()) 1263 { 1264 if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) || 1265 (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName())) 1266 { 1267 m_nlist_idx_to_sym_idx[nlist_idx] = pos->second; 1268 // We just need the flags from the linker symbol, so put these flags 1269 // into the N_FUN flags to avoid duplicate symbols in the symbol table 1270 sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc); 1271 sym[sym_idx].Clear(); 1272 continue; 1273 } 1274 } 1275 } 1276 else if (type == eSymbolTypeData) 1277 { 1278 // See if we can find a N_STSYM entry for any data symbols. 1279 // If we do find a match, and the name matches, then we 1280 // can merge the two into just the Static symbol to avoid 1281 // duplicate entries in the symbol table 1282 ValueToSymbolIndexMap::const_iterator pos = N_STSYM_addr_to_sym_idx.find (nlist.n_value); 1283 if (pos != N_STSYM_addr_to_sym_idx.end()) 1284 { 1285 if ((symbol_name_is_mangled == true && sym[sym_idx].GetMangled().GetMangledName() == sym[pos->second].GetMangled().GetMangledName()) || 1286 (symbol_name_is_mangled == false && sym[sym_idx].GetMangled().GetDemangledName() == sym[pos->second].GetMangled().GetDemangledName())) 1287 { 1288 m_nlist_idx_to_sym_idx[nlist_idx] = pos->second; 1289 // We just need the flags from the linker symbol, so put these flags 1290 // into the N_STSYM flags to avoid duplicate symbols in the symbol table 1291 sym[pos->second].SetFlags (nlist.n_type << 16 | nlist.n_desc); 1292 sym[sym_idx].Clear(); 1293 continue; 1294 } 1295 } 1296 } 1297 } 1298 if (symbol_section != NULL) 1299 symbol_value -= symbol_section->GetFileAddress(); 1300 1301 sym[sym_idx].SetID (nlist_idx); 1302 sym[sym_idx].SetType (type); 1303 sym[sym_idx].GetAddressRangeRef().GetBaseAddress().SetSection (symbol_section); 1304 sym[sym_idx].GetAddressRangeRef().GetBaseAddress().SetOffset (symbol_value); 1305 sym[sym_idx].SetFlags (nlist.n_type << 16 | nlist.n_desc); 1306 1307 ++sym_idx; 1308 } 1309 else 1310 { 1311 sym[sym_idx].Clear(); 1312 } 1313 1314 } 1315 1316 // STAB N_GSYM entries end up having a symbol type eSymbolTypeGlobal and when the symbol value 1317 // is zero, the address of the global ends up being in a non-STAB entry. Try and fix up all 1318 // such entries by figuring out what the address for the global is by looking up this non-STAB 1319 // entry and copying the value into the debug symbol's value to save us the hassle in the 1320 // debug symbol parser. 1321 1322 Symbol *global_symbol = NULL; 1323 for (nlist_idx = 0; 1324 nlist_idx < symtab_load_command.nsyms && (global_symbol = symtab->FindSymbolWithType (eSymbolTypeData, Symtab::eDebugYes, Symtab::eVisibilityAny, nlist_idx)) != NULL; 1325 nlist_idx++) 1326 { 1327 if (global_symbol->GetValue().GetFileAddress() == 0) 1328 { 1329 std::vector<uint32_t> indexes; 1330 if (symtab->AppendSymbolIndexesWithName (global_symbol->GetMangled().GetName(), indexes) > 0) 1331 { 1332 std::vector<uint32_t>::const_iterator pos; 1333 std::vector<uint32_t>::const_iterator end = indexes.end(); 1334 for (pos = indexes.begin(); pos != end; ++pos) 1335 { 1336 symbol_ptr = symtab->SymbolAtIndex(*pos); 1337 if (symbol_ptr != global_symbol && symbol_ptr->IsDebug() == false) 1338 { 1339 global_symbol->SetValue(symbol_ptr->GetValue()); 1340 break; 1341 } 1342 } 1343 } 1344 } 1345 } 1346 1347 // Trim our symbols down to just what we ended up with after 1348 // removing any symbols. 1349 if (sym_idx < num_syms) 1350 { 1351 num_syms = sym_idx; 1352 sym = symtab->Resize (num_syms); 1353 } 1354 1355 // Now synthesize indirect symbols 1356 if (m_dysymtab.nindirectsyms != 0) 1357 { 1358 DataBufferSP indirect_symbol_indexes_sp(m_file.ReadFileContents(m_offset + m_dysymtab.indirectsymoff, m_dysymtab.nindirectsyms * 4)); 1359 1360 if (indirect_symbol_indexes_sp && indirect_symbol_indexes_sp->GetByteSize()) 1361 { 1362 NListIndexToSymbolIndexMap::const_iterator end_index_pos = m_nlist_idx_to_sym_idx.end(); 1363 DataExtractor indirect_symbol_index_data (indirect_symbol_indexes_sp, m_data.GetByteOrder(), m_data.GetAddressByteSize()); 1364 1365 for (uint32_t sect_idx = 1; sect_idx < m_mach_sections.size(); ++sect_idx) 1366 { 1367 if ((m_mach_sections[sect_idx].flags & SectionFlagMaskSectionType) == SectionTypeSymbolStubs) 1368 { 1369 uint32_t symbol_stub_byte_size = m_mach_sections[sect_idx].reserved2; 1370 if (symbol_stub_byte_size == 0) 1371 continue; 1372 1373 const uint32_t num_symbol_stubs = m_mach_sections[sect_idx].size / symbol_stub_byte_size; 1374 1375 if (num_symbol_stubs == 0) 1376 continue; 1377 1378 const uint32_t symbol_stub_index_offset = m_mach_sections[sect_idx].reserved1; 1379 uint32_t synthetic_stub_sym_id = symtab_load_command.nsyms; 1380 for (uint32_t stub_idx = 0; stub_idx < num_symbol_stubs; ++stub_idx) 1381 { 1382 const uint32_t symbol_stub_index = symbol_stub_index_offset + stub_idx; 1383 const lldb::addr_t symbol_stub_addr = m_mach_sections[sect_idx].addr + (stub_idx * symbol_stub_byte_size); 1384 uint32_t symbol_stub_offset = symbol_stub_index * 4; 1385 if (indirect_symbol_index_data.ValidOffsetForDataOfSize(symbol_stub_offset, 4)) 1386 { 1387 const uint32_t stub_sym_id = indirect_symbol_index_data.GetU32 (&symbol_stub_offset); 1388 if (stub_sym_id & (IndirectSymbolAbsolute | IndirectSymbolLocal)) 1389 continue; 1390 1391 NListIndexToSymbolIndexMap::const_iterator index_pos = m_nlist_idx_to_sym_idx.find (stub_sym_id); 1392 Symbol *stub_symbol = NULL; 1393 if (index_pos != end_index_pos) 1394 { 1395 // We have a remapping from the original nlist index to 1396 // a current symbol index, so just look this up by index 1397 stub_symbol = symtab->SymbolAtIndex (index_pos->second); 1398 } 1399 else 1400 { 1401 // We need to lookup a symbol using the original nlist 1402 // symbol index since this index is coming from the 1403 // S_SYMBOL_STUBS 1404 stub_symbol = symtab->FindSymbolByID (stub_sym_id); 1405 } 1406 1407 assert (stub_symbol); 1408 if (stub_symbol) 1409 { 1410 Address so_addr(symbol_stub_addr, section_list); 1411 1412 if (stub_symbol->GetType() == eSymbolTypeExtern) 1413 { 1414 // Change the external symbol into a trampoline that makes sense 1415 // These symbols were N_UNDF N_EXT, and are useless to us, so we 1416 // can re-use them so we don't have to make up a synthetic symbol 1417 // for no good reason. 1418 stub_symbol->SetType (eSymbolTypeTrampoline); 1419 stub_symbol->SetExternal (false); 1420 stub_symbol->GetAddressRangeRef().GetBaseAddress() = so_addr; 1421 stub_symbol->GetAddressRangeRef().SetByteSize (symbol_stub_byte_size); 1422 } 1423 else 1424 { 1425 // Make a synthetic symbol to describe the trampoline stub 1426 if (sym_idx >= num_syms) 1427 sym = symtab->Resize (++num_syms); 1428 sym[sym_idx].SetID (synthetic_stub_sym_id++); 1429 sym[sym_idx].GetMangled() = stub_symbol->GetMangled(); 1430 sym[sym_idx].SetType (eSymbolTypeTrampoline); 1431 sym[sym_idx].SetIsSynthetic (true); 1432 sym[sym_idx].GetAddressRangeRef().GetBaseAddress() = so_addr; 1433 sym[sym_idx].GetAddressRangeRef().SetByteSize (symbol_stub_byte_size); 1434 ++sym_idx; 1435 } 1436 } 1437 } 1438 } 1439 } 1440 } 1441 } 1442 } 1443 1444 return symtab->GetNumSymbols(); 1445 } 1446 } 1447 offset = cmd_offset + symtab_load_command.cmdsize; 1448 } 1449 return 0; 1450 } 1451 1452 1453 void 1454 ObjectFileMachO::Dump (Stream *s) 1455 { 1456 lldb_private::Mutex::Locker locker(m_mutex); 1457 s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 1458 s->Indent(); 1459 if (m_header.magic == HeaderMagic64 || m_header.magic == HeaderMagic64Swapped) 1460 s->PutCString("ObjectFileMachO64"); 1461 else 1462 s->PutCString("ObjectFileMachO32"); 1463 1464 ArchSpec header_arch(eArchTypeMachO, m_header.cputype, m_header.cpusubtype); 1465 1466 *s << ", file = '" << m_file << "', arch = " << header_arch.GetArchitectureName() << "\n"; 1467 1468 if (m_sections_ap.get()) 1469 m_sections_ap->Dump(s, NULL, true, UINT32_MAX); 1470 1471 if (m_symtab_ap.get()) 1472 m_symtab_ap->Dump(s, NULL, eSortOrderNone); 1473 } 1474 1475 1476 bool 1477 ObjectFileMachO::GetUUID (lldb_private::UUID* uuid) 1478 { 1479 lldb_private::Mutex::Locker locker(m_mutex); 1480 struct uuid_command load_cmd; 1481 uint32_t offset = MachHeaderSizeFromMagic(m_header.magic); 1482 uint32_t i; 1483 for (i=0; i<m_header.ncmds; ++i) 1484 { 1485 const uint32_t cmd_offset = offset; 1486 if (m_data.GetU32(&offset, &load_cmd, 2) == NULL) 1487 break; 1488 1489 if (load_cmd.cmd == LoadCommandUUID) 1490 { 1491 const uint8_t *uuid_bytes = m_data.PeekData(offset, 16); 1492 if (uuid_bytes) 1493 { 1494 uuid->SetBytes (uuid_bytes); 1495 return true; 1496 } 1497 return false; 1498 } 1499 offset = cmd_offset + load_cmd.cmdsize; 1500 } 1501 return false; 1502 } 1503 1504 1505 uint32_t 1506 ObjectFileMachO::GetDependentModules (FileSpecList& files) 1507 { 1508 lldb_private::Mutex::Locker locker(m_mutex); 1509 struct load_command load_cmd; 1510 uint32_t offset = MachHeaderSizeFromMagic(m_header.magic); 1511 uint32_t count = 0; 1512 const bool resolve_path = false; // Don't resolve the dependend file paths since they may not reside on this system 1513 uint32_t i; 1514 for (i=0; i<m_header.ncmds; ++i) 1515 { 1516 const uint32_t cmd_offset = offset; 1517 if (m_data.GetU32(&offset, &load_cmd, 2) == NULL) 1518 break; 1519 1520 switch (load_cmd.cmd) 1521 { 1522 case LoadCommandDylibLoad: 1523 case LoadCommandDylibLoadWeak: 1524 case LoadCommandDylibReexport: 1525 case LoadCommandDynamicLinkerLoad: 1526 case LoadCommandFixedVMShlibLoad: 1527 case LoadCommandDylibLoadUpward: 1528 { 1529 uint32_t name_offset = cmd_offset + m_data.GetU32(&offset); 1530 const char *path = m_data.PeekCStr(name_offset); 1531 // Skip any path that starts with '@' since these are usually: 1532 // @executable_path/.../file 1533 // @rpath/.../file 1534 if (path && path[0] != '@') 1535 { 1536 FileSpec file_spec(path, resolve_path); 1537 if (files.AppendIfUnique(file_spec)) 1538 count++; 1539 } 1540 } 1541 break; 1542 1543 default: 1544 break; 1545 } 1546 offset = cmd_offset + load_cmd.cmdsize; 1547 } 1548 return count; 1549 } 1550 1551 lldb_private::Address 1552 ObjectFileMachO::GetEntryPointAddress () 1553 { 1554 // If the object file is not an executable it can't hold the entry point. m_entry_point_address 1555 // is initialized to an invalid address, so we can just return that. 1556 // If m_entry_point_address is valid it means we've found it already, so return the cached value. 1557 1558 if (!IsExecutable() || m_entry_point_address.IsValid()) 1559 return m_entry_point_address; 1560 1561 // Otherwise, look for the UnixThread or Thread command. The data for the Thread command is given in 1562 // /usr/include/mach-o.h, but it is basically: 1563 // 1564 // uint32_t flavor - this is the flavor argument you would pass to thread_get_state 1565 // uint32_t count - this is the count of longs in the thread state data 1566 // struct XXX_thread_state state - this is the structure from <machine/thread_status.h> corresponding to the flavor. 1567 // <repeat this trio> 1568 // 1569 // So we just keep reading the various register flavors till we find the GPR one, then read the PC out of there. 1570 // FIXME: We will need to have a "RegisterContext data provider" class at some point that can get all the registers 1571 // out of data in this form & attach them to a given thread. That should underlie the MacOS X User process plugin, 1572 // and we'll also need it for the MacOS X Core File process plugin. When we have that we can also use it here. 1573 // 1574 // For now we hard-code the offsets and flavors we need: 1575 // 1576 // 1577 1578 lldb_private::Mutex::Locker locker(m_mutex); 1579 struct load_command load_cmd; 1580 uint32_t offset = MachHeaderSizeFromMagic(m_header.magic); 1581 uint32_t i; 1582 lldb::addr_t start_address = LLDB_INVALID_ADDRESS; 1583 bool done = false; 1584 1585 for (i=0; i<m_header.ncmds; ++i) 1586 { 1587 const uint32_t cmd_offset = offset; 1588 if (m_data.GetU32(&offset, &load_cmd, 2) == NULL) 1589 break; 1590 1591 switch (load_cmd.cmd) 1592 { 1593 case LoadCommandUnixThread: 1594 case LoadCommandThread: 1595 { 1596 while (offset < cmd_offset + load_cmd.cmdsize) 1597 { 1598 uint32_t flavor = m_data.GetU32(&offset); 1599 uint32_t count = m_data.GetU32(&offset); 1600 if (count == 0) 1601 { 1602 // We've gotten off somehow, log and exit; 1603 return m_entry_point_address; 1604 } 1605 1606 switch (m_header.cputype) 1607 { 1608 case llvm::MachO::CPUTypeARM: 1609 if (flavor == 1) // ARM_THREAD_STATE from mach/arm/thread_status.h 1610 { 1611 offset += 60; // This is the offset of pc in the GPR thread state data structure. 1612 start_address = m_data.GetU32(&offset); 1613 done = true; 1614 } 1615 break; 1616 case llvm::MachO::CPUTypeI386: 1617 if (flavor == 1) // x86_THREAD_STATE32 from mach/i386/thread_status.h 1618 { 1619 offset += 40; // This is the offset of eip in the GPR thread state data structure. 1620 start_address = m_data.GetU32(&offset); 1621 done = true; 1622 } 1623 break; 1624 case llvm::MachO::CPUTypeX86_64: 1625 if (flavor == 4) // x86_THREAD_STATE64 from mach/i386/thread_status.h 1626 { 1627 offset += 16 * 8; // This is the offset of rip in the GPR thread state data structure. 1628 start_address = m_data.GetU64(&offset); 1629 done = true; 1630 } 1631 break; 1632 default: 1633 return m_entry_point_address; 1634 } 1635 // Haven't found the GPR flavor yet, skip over the data for this flavor: 1636 if (done) 1637 break; 1638 offset += count * 4; 1639 } 1640 } 1641 break; 1642 1643 default: 1644 break; 1645 } 1646 if (done) 1647 break; 1648 1649 // Go to the next load command: 1650 offset = cmd_offset + load_cmd.cmdsize; 1651 } 1652 1653 if (start_address != LLDB_INVALID_ADDRESS) 1654 { 1655 // We got the start address from the load commands, so now resolve that address in the sections 1656 // of this ObjectFile: 1657 if (!m_entry_point_address.ResolveAddressUsingFileSections (start_address, GetSectionList())) 1658 { 1659 m_entry_point_address.Clear(); 1660 } 1661 } 1662 else 1663 { 1664 // We couldn't read the UnixThread load command - maybe it wasn't there. As a fallback look for the 1665 // "start" symbol in the main executable. 1666 1667 SymbolContextList contexts; 1668 SymbolContext context; 1669 if (!m_module->FindSymbolsWithNameAndType(ConstString ("start"), eSymbolTypeCode, contexts)) 1670 return m_entry_point_address; 1671 1672 contexts.GetContextAtIndex(0, context); 1673 1674 m_entry_point_address = context.symbol->GetValue(); 1675 } 1676 1677 return m_entry_point_address; 1678 1679 } 1680 1681 ObjectFile::Type 1682 ObjectFileMachO::CalculateType() 1683 { 1684 switch (m_header.filetype) 1685 { 1686 case HeaderFileTypeObject: // 0x1u MH_OBJECT 1687 if (GetAddressByteSize () == 4) 1688 { 1689 // 32 bit kexts are just object files, but they do have a valid 1690 // UUID load command. 1691 UUID uuid; 1692 if (GetUUID(&uuid)) 1693 { 1694 // this checking for the UUID load command is not enough 1695 // we could eventually look for the symbol named 1696 // "OSKextGetCurrentIdentifier" as this is required of kexts 1697 if (m_strata == eStrataInvalid) 1698 m_strata = eStrataKernel; 1699 return eTypeSharedLibrary; 1700 } 1701 } 1702 return eTypeObjectFile; 1703 1704 case HeaderFileTypeExecutable: return eTypeExecutable; // 0x2u MH_EXECUTE 1705 case HeaderFileTypeFixedVMShlib: return eTypeSharedLibrary; // 0x3u MH_FVMLIB 1706 case HeaderFileTypeCore: return eTypeCoreFile; // 0x4u MH_CORE 1707 case HeaderFileTypePreloadedExecutable: return eTypeSharedLibrary; // 0x5u MH_PRELOAD 1708 case HeaderFileTypeDynamicShlib: return eTypeSharedLibrary; // 0x6u MH_DYLIB 1709 case HeaderFileTypeDynamicLinkEditor: return eTypeDynamicLinker; // 0x7u MH_DYLINKER 1710 case HeaderFileTypeBundle: return eTypeSharedLibrary; // 0x8u MH_BUNDLE 1711 case HeaderFileTypeDynamicShlibStub: return eTypeStubLibrary; // 0x9u MH_DYLIB_STUB 1712 case HeaderFileTypeDSYM: return eTypeDebugInfo; // 0xAu MH_DSYM 1713 case HeaderFileTypeKextBundle: return eTypeSharedLibrary; // 0xBu MH_KEXT_BUNDLE 1714 default: 1715 break; 1716 } 1717 return eTypeUnknown; 1718 } 1719 1720 ObjectFile::Strata 1721 ObjectFileMachO::CalculateStrata() 1722 { 1723 switch (m_header.filetype) 1724 { 1725 case HeaderFileTypeObject: // 0x1u MH_OBJECT 1726 { 1727 // 32 bit kexts are just object files, but they do have a valid 1728 // UUID load command. 1729 UUID uuid; 1730 if (GetUUID(&uuid)) 1731 { 1732 // this checking for the UUID load command is not enough 1733 // we could eventually look for the symbol named 1734 // "OSKextGetCurrentIdentifier" as this is required of kexts 1735 if (m_type == eTypeInvalid) 1736 m_type = eTypeSharedLibrary; 1737 1738 return eStrataKernel; 1739 } 1740 } 1741 return eStrataUnknown; 1742 1743 case HeaderFileTypeExecutable: // 0x2u MH_EXECUTE 1744 // Check for the MH_DYLDLINK bit in the flags 1745 if (m_header.flags & HeaderFlagBitIsDynamicLinkObject) 1746 return eStrataUser; 1747 return eStrataKernel; 1748 1749 case HeaderFileTypeFixedVMShlib: return eStrataUser; // 0x3u MH_FVMLIB 1750 case HeaderFileTypeCore: return eStrataUnknown; // 0x4u MH_CORE 1751 case HeaderFileTypePreloadedExecutable: return eStrataUser; // 0x5u MH_PRELOAD 1752 case HeaderFileTypeDynamicShlib: return eStrataUser; // 0x6u MH_DYLIB 1753 case HeaderFileTypeDynamicLinkEditor: return eStrataUser; // 0x7u MH_DYLINKER 1754 case HeaderFileTypeBundle: return eStrataUser; // 0x8u MH_BUNDLE 1755 case HeaderFileTypeDynamicShlibStub: return eStrataUser; // 0x9u MH_DYLIB_STUB 1756 case HeaderFileTypeDSYM: return eStrataUnknown; // 0xAu MH_DSYM 1757 case HeaderFileTypeKextBundle: return eStrataKernel; // 0xBu MH_KEXT_BUNDLE 1758 default: 1759 break; 1760 } 1761 return eStrataUnknown; 1762 } 1763 1764 1765 bool 1766 ObjectFileMachO::GetArchitecture (ArchSpec &arch) 1767 { 1768 lldb_private::Mutex::Locker locker(m_mutex); 1769 arch.SetArchitecture (eArchTypeMachO, m_header.cputype, m_header.cpusubtype); 1770 return true; 1771 } 1772 1773 1774 //------------------------------------------------------------------ 1775 // PluginInterface protocol 1776 //------------------------------------------------------------------ 1777 const char * 1778 ObjectFileMachO::GetPluginName() 1779 { 1780 return "ObjectFileMachO"; 1781 } 1782 1783 const char * 1784 ObjectFileMachO::GetShortPluginName() 1785 { 1786 return GetPluginNameStatic(); 1787 } 1788 1789 uint32_t 1790 ObjectFileMachO::GetPluginVersion() 1791 { 1792 return 1; 1793 } 1794 1795