1 //===-- ObjectFileELF.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 "ObjectFileELF.h" 11 12 #include <cassert> 13 #include <algorithm> 14 15 #include "lldb/Core/ArchSpec.h" 16 #include "lldb/Core/DataBuffer.h" 17 #include "lldb/Core/Error.h" 18 #include "lldb/Core/FileSpecList.h" 19 #include "lldb/Core/Module.h" 20 #include "lldb/Core/ModuleSpec.h" 21 #include "lldb/Core/PluginManager.h" 22 #include "lldb/Core/Section.h" 23 #include "lldb/Core/Stream.h" 24 #include "lldb/Symbol/SymbolContext.h" 25 #include "lldb/Host/Host.h" 26 27 #include "llvm/ADT/PointerUnion.h" 28 29 #define CASE_AND_STREAM(s, def, width) \ 30 case def: s->Printf("%-*s", width, #def); break; 31 32 using namespace lldb; 33 using namespace lldb_private; 34 using namespace elf; 35 using namespace llvm::ELF; 36 37 namespace { 38 //===----------------------------------------------------------------------===// 39 /// @class ELFRelocation 40 /// @brief Generic wrapper for ELFRel and ELFRela. 41 /// 42 /// This helper class allows us to parse both ELFRel and ELFRela relocation 43 /// entries in a generic manner. 44 class ELFRelocation 45 { 46 public: 47 48 /// Constructs an ELFRelocation entry with a personality as given by @p 49 /// type. 50 /// 51 /// @param type Either DT_REL or DT_RELA. Any other value is invalid. 52 ELFRelocation(unsigned type); 53 54 ~ELFRelocation(); 55 56 bool 57 Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 58 59 static unsigned 60 RelocType32(const ELFRelocation &rel); 61 62 static unsigned 63 RelocType64(const ELFRelocation &rel); 64 65 static unsigned 66 RelocSymbol32(const ELFRelocation &rel); 67 68 static unsigned 69 RelocSymbol64(const ELFRelocation &rel); 70 71 private: 72 typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion; 73 74 RelocUnion reloc; 75 }; 76 77 ELFRelocation::ELFRelocation(unsigned type) 78 { 79 if (type == DT_REL) 80 reloc = new ELFRel(); 81 else if (type == DT_RELA) 82 reloc = new ELFRela(); 83 else { 84 assert(false && "unexpected relocation type"); 85 reloc = static_cast<ELFRel*>(NULL); 86 } 87 } 88 89 ELFRelocation::~ELFRelocation() 90 { 91 if (reloc.is<ELFRel*>()) 92 delete reloc.get<ELFRel*>(); 93 else 94 delete reloc.get<ELFRela*>(); 95 } 96 97 bool 98 ELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset) 99 { 100 if (reloc.is<ELFRel*>()) 101 return reloc.get<ELFRel*>()->Parse(data, offset); 102 else 103 return reloc.get<ELFRela*>()->Parse(data, offset); 104 } 105 106 unsigned 107 ELFRelocation::RelocType32(const ELFRelocation &rel) 108 { 109 if (rel.reloc.is<ELFRel*>()) 110 return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>()); 111 else 112 return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>()); 113 } 114 115 unsigned 116 ELFRelocation::RelocType64(const ELFRelocation &rel) 117 { 118 if (rel.reloc.is<ELFRel*>()) 119 return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>()); 120 else 121 return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>()); 122 } 123 124 unsigned 125 ELFRelocation::RelocSymbol32(const ELFRelocation &rel) 126 { 127 if (rel.reloc.is<ELFRel*>()) 128 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>()); 129 else 130 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>()); 131 } 132 133 unsigned 134 ELFRelocation::RelocSymbol64(const ELFRelocation &rel) 135 { 136 if (rel.reloc.is<ELFRel*>()) 137 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>()); 138 else 139 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>()); 140 } 141 142 } // end anonymous namespace 143 144 //------------------------------------------------------------------ 145 // Static methods. 146 //------------------------------------------------------------------ 147 void 148 ObjectFileELF::Initialize() 149 { 150 PluginManager::RegisterPlugin(GetPluginNameStatic(), 151 GetPluginDescriptionStatic(), 152 CreateInstance, 153 CreateMemoryInstance, 154 GetModuleSpecifications); 155 } 156 157 void 158 ObjectFileELF::Terminate() 159 { 160 PluginManager::UnregisterPlugin(CreateInstance); 161 } 162 163 lldb_private::ConstString 164 ObjectFileELF::GetPluginNameStatic() 165 { 166 static ConstString g_name("elf"); 167 return g_name; 168 } 169 170 const char * 171 ObjectFileELF::GetPluginDescriptionStatic() 172 { 173 return "ELF object file reader."; 174 } 175 176 ObjectFile * 177 ObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp, 178 DataBufferSP &data_sp, 179 lldb::offset_t data_offset, 180 const lldb_private::FileSpec* file, 181 lldb::offset_t file_offset, 182 lldb::offset_t length) 183 { 184 if (!data_sp) 185 { 186 data_sp = file->MemoryMapFileContents(file_offset, length); 187 data_offset = 0; 188 } 189 190 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) 191 { 192 const uint8_t *magic = data_sp->GetBytes() + data_offset; 193 if (ELFHeader::MagicBytesMatch(magic)) 194 { 195 // Update the data to contain the entire file if it doesn't already 196 if (data_sp->GetByteSize() < length) { 197 data_sp = file->MemoryMapFileContents(file_offset, length); 198 data_offset = 0; 199 magic = data_sp->GetBytes(); 200 } 201 unsigned address_size = ELFHeader::AddressSizeInBytes(magic); 202 if (address_size == 4 || address_size == 8) 203 { 204 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, data_offset, file, file_offset, length)); 205 ArchSpec spec; 206 if (objfile_ap->GetArchitecture(spec) && 207 objfile_ap->SetModulesArchitecture(spec)) 208 return objfile_ap.release(); 209 } 210 } 211 } 212 return NULL; 213 } 214 215 216 ObjectFile* 217 ObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp, 218 DataBufferSP& data_sp, 219 const lldb::ProcessSP &process_sp, 220 lldb::addr_t header_addr) 221 { 222 return NULL; 223 } 224 225 bool 226 ObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp, 227 lldb::addr_t data_offset, 228 lldb::addr_t data_length) 229 { 230 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) 231 { 232 const uint8_t *magic = data_sp->GetBytes() + data_offset; 233 return ELFHeader::MagicBytesMatch(magic); 234 } 235 return false; 236 } 237 238 /* 239 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c 240 * 241 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or 242 * code or tables extracted from it, as desired without restriction. 243 */ 244 static uint32_t 245 calc_gnu_debuglink_crc32(const void *buf, size_t size) 246 { 247 static const uint32_t g_crc32_tab[] = 248 { 249 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 250 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 251 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 252 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 253 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 254 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 255 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 256 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 257 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 258 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 259 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 260 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 261 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 262 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 263 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 264 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 265 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 266 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 267 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 268 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 269 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 270 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 271 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 272 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 273 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 274 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 275 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 276 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 277 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 278 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 279 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 280 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 281 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 282 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 283 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 284 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 285 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 286 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 287 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 288 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 289 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 290 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 291 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 292 }; 293 const uint8_t *p = (const uint8_t *)buf; 294 uint32_t crc; 295 296 crc = ~0U; 297 while (size--) 298 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); 299 return crc ^ ~0U; 300 } 301 302 size_t 303 ObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file, 304 lldb::DataBufferSP& data_sp, 305 lldb::offset_t data_offset, 306 lldb::offset_t file_offset, 307 lldb::offset_t length, 308 lldb_private::ModuleSpecList &specs) 309 { 310 const size_t initial_count = specs.GetSize(); 311 312 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) 313 { 314 DataExtractor data; 315 data.SetData(data_sp); 316 elf::ELFHeader header; 317 if (header.Parse(data, &data_offset)) 318 { 319 if (data_sp) 320 { 321 ModuleSpec spec; 322 spec.GetFileSpec() = file; 323 spec.GetArchitecture().SetArchitecture(eArchTypeELF, 324 header.e_machine, 325 LLDB_INVALID_CPUTYPE); 326 if (spec.GetArchitecture().IsValid()) 327 { 328 // We could parse the ABI tag information (in .note, .notes, or .note.ABI-tag) to get the 329 // machine information. However, this info isn't guaranteed to exist or be correct. Details: 330 // http://refspecs.linuxfoundation.org/LSB_1.2.0/gLSB/noteabitag.html 331 // Instead of passing potentially incorrect information down the pipeline, grab 332 // the host information and use it. 333 spec.GetArchitecture().GetTriple().setOSName (Host::GetOSString().GetCString()); 334 spec.GetArchitecture().GetTriple().setVendorName(Host::GetVendorString().GetCString()); 335 336 // Try to get the UUID from the section list. Usually that's at the end, so 337 // map the file in if we don't have it already. 338 size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize; 339 if (section_header_end > data_sp->GetByteSize()) 340 { 341 data_sp = file.MemoryMapFileContents (file_offset, section_header_end); 342 data.SetData(data_sp); 343 } 344 345 uint32_t gnu_debuglink_crc = 0; 346 std::string gnu_debuglink_file; 347 SectionHeaderColl section_headers; 348 lldb_private::UUID &uuid = spec.GetUUID(); 349 GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc); 350 351 if (!uuid.IsValid()) 352 { 353 if (!gnu_debuglink_crc) 354 { 355 // Need to map entire file into memory to calculate the crc. 356 data_sp = file.MemoryMapFileContents (file_offset, SIZE_MAX); 357 data.SetData(data_sp); 358 gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize()); 359 } 360 if (gnu_debuglink_crc) 361 { 362 // Use 4 bytes of crc from the .gnu_debuglink section. 363 uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 }; 364 uuid.SetBytes (uuidt, sizeof(uuidt)); 365 } 366 } 367 368 specs.Append(spec); 369 } 370 } 371 } 372 } 373 374 return specs.GetSize() - initial_count; 375 } 376 377 //------------------------------------------------------------------ 378 // PluginInterface protocol 379 //------------------------------------------------------------------ 380 lldb_private::ConstString 381 ObjectFileELF::GetPluginName() 382 { 383 return GetPluginNameStatic(); 384 } 385 386 uint32_t 387 ObjectFileELF::GetPluginVersion() 388 { 389 return m_plugin_version; 390 } 391 //------------------------------------------------------------------ 392 // ObjectFile protocol 393 //------------------------------------------------------------------ 394 395 ObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp, 396 DataBufferSP& data_sp, 397 lldb::offset_t data_offset, 398 const FileSpec* file, 399 lldb::offset_t file_offset, 400 lldb::offset_t length) : 401 ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset), 402 m_header(), 403 m_program_headers(), 404 m_section_headers(), 405 m_filespec_ap() 406 { 407 if (file) 408 m_file = *file; 409 ::memset(&m_header, 0, sizeof(m_header)); 410 m_gnu_debuglink_crc = 0; 411 m_gnu_debuglink_file.clear(); 412 } 413 414 ObjectFileELF::~ObjectFileELF() 415 { 416 } 417 418 bool 419 ObjectFileELF::IsExecutable() const 420 { 421 return m_header.e_entry != 0; 422 } 423 424 ByteOrder 425 ObjectFileELF::GetByteOrder() const 426 { 427 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB) 428 return eByteOrderBig; 429 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB) 430 return eByteOrderLittle; 431 return eByteOrderInvalid; 432 } 433 434 uint32_t 435 ObjectFileELF::GetAddressByteSize() const 436 { 437 return m_data.GetAddressByteSize(); 438 } 439 440 size_t 441 ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) 442 { 443 return std::distance(m_section_headers.begin(), I) + 1u; 444 } 445 446 size_t 447 ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const 448 { 449 return std::distance(m_section_headers.begin(), I) + 1u; 450 } 451 452 bool 453 ObjectFileELF::ParseHeader() 454 { 455 lldb::offset_t offset = 0; 456 return m_header.Parse(m_data, &offset); 457 } 458 459 bool 460 ObjectFileELF::GetUUID(lldb_private::UUID* uuid) 461 { 462 // Need to parse the section list to get the UUIDs, so make sure that's been done. 463 if (!ParseSectionHeaders()) 464 return false; 465 466 if (m_uuid.IsValid()) 467 { 468 // We have the full build id uuid. 469 *uuid = m_uuid; 470 return true; 471 } 472 else 473 { 474 if (!m_gnu_debuglink_crc) 475 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize()); 476 if (m_gnu_debuglink_crc) 477 { 478 // Use 4 bytes of crc from the .gnu_debuglink section. 479 uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 }; 480 uuid->SetBytes (uuidt, sizeof(uuidt)); 481 return true; 482 } 483 } 484 485 return false; 486 } 487 488 lldb_private::FileSpecList 489 ObjectFileELF::GetDebugSymbolFilePaths() 490 { 491 FileSpecList file_spec_list; 492 493 if (!m_gnu_debuglink_file.empty()) 494 { 495 FileSpec file_spec (m_gnu_debuglink_file.c_str(), false); 496 file_spec_list.Append (file_spec); 497 } 498 return file_spec_list; 499 } 500 501 uint32_t 502 ObjectFileELF::GetDependentModules(FileSpecList &files) 503 { 504 size_t num_modules = ParseDependentModules(); 505 uint32_t num_specs = 0; 506 507 for (unsigned i = 0; i < num_modules; ++i) 508 { 509 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i))) 510 num_specs++; 511 } 512 513 return num_specs; 514 } 515 516 Address 517 ObjectFileELF::GetImageInfoAddress() 518 { 519 if (!ParseDynamicSymbols()) 520 return Address(); 521 522 SectionList *section_list = GetSectionList(); 523 if (!section_list) 524 return Address(); 525 526 // Find the SHT_DYNAMIC (.dynamic) section. 527 SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true)); 528 if (!dynsym_section_sp) 529 return Address(); 530 assert (dynsym_section_sp->GetObjectFile() == this); 531 532 user_id_t dynsym_id = dynsym_section_sp->GetID(); 533 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id); 534 if (!dynsym_hdr) 535 return Address(); 536 537 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) 538 { 539 ELFDynamic &symbol = m_dynamic_symbols[i]; 540 541 if (symbol.d_tag == DT_DEBUG) 542 { 543 // Compute the offset as the number of previous entries plus the 544 // size of d_tag. 545 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize(); 546 return Address(dynsym_section_sp, offset); 547 } 548 } 549 550 return Address(); 551 } 552 553 lldb_private::Address 554 ObjectFileELF::GetEntryPointAddress () 555 { 556 if (m_entry_point_address.IsValid()) 557 return m_entry_point_address; 558 559 if (!ParseHeader() || !IsExecutable()) 560 return m_entry_point_address; 561 562 SectionList *section_list = GetSectionList(); 563 addr_t offset = m_header.e_entry; 564 565 if (!section_list) 566 m_entry_point_address.SetOffset(offset); 567 else 568 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list); 569 return m_entry_point_address; 570 } 571 572 //---------------------------------------------------------------------- 573 // ParseDependentModules 574 //---------------------------------------------------------------------- 575 size_t 576 ObjectFileELF::ParseDependentModules() 577 { 578 if (m_filespec_ap.get()) 579 return m_filespec_ap->GetSize(); 580 581 m_filespec_ap.reset(new FileSpecList()); 582 583 if (!ParseSectionHeaders()) 584 return 0; 585 586 SectionList *section_list = GetSectionList(); 587 if (!section_list) 588 return 0; 589 590 // Find the SHT_DYNAMIC section. 591 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get(); 592 if (!dynsym) 593 return 0; 594 assert (dynsym->GetObjectFile() == this); 595 596 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID()); 597 if (!header) 598 return 0; 599 // sh_link: section header index of string table used by entries in the section. 600 Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get(); 601 if (!dynstr) 602 return 0; 603 604 DataExtractor dynsym_data; 605 DataExtractor dynstr_data; 606 if (ReadSectionData(dynsym, dynsym_data) && 607 ReadSectionData(dynstr, dynstr_data)) 608 { 609 ELFDynamic symbol; 610 const lldb::offset_t section_size = dynsym_data.GetByteSize(); 611 lldb::offset_t offset = 0; 612 613 // The only type of entries we are concerned with are tagged DT_NEEDED, 614 // yielding the name of a required library. 615 while (offset < section_size) 616 { 617 if (!symbol.Parse(dynsym_data, &offset)) 618 break; 619 620 if (symbol.d_tag != DT_NEEDED) 621 continue; 622 623 uint32_t str_index = static_cast<uint32_t>(symbol.d_val); 624 const char *lib_name = dynstr_data.PeekCStr(str_index); 625 m_filespec_ap->Append(FileSpec(lib_name, true)); 626 } 627 } 628 629 return m_filespec_ap->GetSize(); 630 } 631 632 //---------------------------------------------------------------------- 633 // ParseProgramHeaders 634 //---------------------------------------------------------------------- 635 size_t 636 ObjectFileELF::ParseProgramHeaders() 637 { 638 // We have already parsed the program headers 639 if (!m_program_headers.empty()) 640 return m_program_headers.size(); 641 642 // If there are no program headers to read we are done. 643 if (m_header.e_phnum == 0) 644 return 0; 645 646 m_program_headers.resize(m_header.e_phnum); 647 if (m_program_headers.size() != m_header.e_phnum) 648 return 0; 649 650 const size_t ph_size = m_header.e_phnum * m_header.e_phentsize; 651 const elf_off ph_offset = m_header.e_phoff; 652 DataExtractor data; 653 if (GetData (ph_offset, ph_size, data) != ph_size) 654 return 0; 655 656 uint32_t idx; 657 lldb::offset_t offset; 658 for (idx = 0, offset = 0; idx < m_header.e_phnum; ++idx) 659 { 660 if (m_program_headers[idx].Parse(data, &offset) == false) 661 break; 662 } 663 664 if (idx < m_program_headers.size()) 665 m_program_headers.resize(idx); 666 667 return m_program_headers.size(); 668 } 669 670 static bool 671 ParseNoteGNUBuildID(DataExtractor &data, lldb_private::UUID &uuid) 672 { 673 // Try to parse the note section (ie .note.gnu.build-id|.notes|.note|...) and get the build id. 674 // BuildID documentation: https://fedoraproject.org/wiki/Releases/FeatureBuildId 675 struct 676 { 677 uint32_t name_len; // Length of note name 678 uint32_t desc_len; // Length of note descriptor 679 uint32_t type; // Type of note (1 is ABI_TAG, 3 is BUILD_ID) 680 } notehdr; 681 lldb::offset_t offset = 0; 682 static const uint32_t g_gnu_build_id = 3; // NT_GNU_BUILD_ID from elf.h 683 684 while (true) 685 { 686 if (data.GetU32 (&offset, ¬ehdr, 3) == NULL) 687 return false; 688 689 notehdr.name_len = llvm::RoundUpToAlignment (notehdr.name_len, 4); 690 notehdr.desc_len = llvm::RoundUpToAlignment (notehdr.desc_len, 4); 691 692 lldb::offset_t offset_next_note = offset + notehdr.name_len + notehdr.desc_len; 693 694 // 16 bytes is UUID|MD5, 20 bytes is SHA1 695 if ((notehdr.type == g_gnu_build_id) && (notehdr.name_len == 4) && 696 (notehdr.desc_len == 16 || notehdr.desc_len == 20)) 697 { 698 char name[4]; 699 if (data.GetU8 (&offset, name, 4) == NULL) 700 return false; 701 if (!strcmp(name, "GNU")) 702 { 703 uint8_t uuidbuf[20]; 704 if (data.GetU8 (&offset, &uuidbuf, notehdr.desc_len) == NULL) 705 return false; 706 uuid.SetBytes (uuidbuf, notehdr.desc_len); 707 return true; 708 } 709 } 710 offset = offset_next_note; 711 } 712 return false; 713 } 714 715 //---------------------------------------------------------------------- 716 // GetSectionHeaderInfo 717 //---------------------------------------------------------------------- 718 size_t 719 ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 720 lldb_private::DataExtractor &object_data, 721 const elf::ELFHeader &header, 722 lldb_private::UUID &uuid, 723 std::string &gnu_debuglink_file, 724 uint32_t &gnu_debuglink_crc) 725 { 726 // We have already parsed the section headers 727 if (!section_headers.empty()) 728 return section_headers.size(); 729 730 // If there are no section headers we are done. 731 if (header.e_shnum == 0) 732 return 0; 733 734 section_headers.resize(header.e_shnum); 735 if (section_headers.size() != header.e_shnum) 736 return 0; 737 738 const size_t sh_size = header.e_shnum * header.e_shentsize; 739 const elf_off sh_offset = header.e_shoff; 740 DataExtractor sh_data; 741 if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size) 742 return 0; 743 744 uint32_t idx; 745 lldb::offset_t offset; 746 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) 747 { 748 if (section_headers[idx].Parse(sh_data, &offset) == false) 749 break; 750 } 751 if (idx < section_headers.size()) 752 section_headers.resize(idx); 753 754 const unsigned strtab_idx = header.e_shstrndx; 755 if (strtab_idx && strtab_idx < section_headers.size()) 756 { 757 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx]; 758 const size_t byte_size = sheader.sh_size; 759 const Elf64_Off offset = sheader.sh_offset; 760 lldb_private::DataExtractor shstr_data; 761 762 if (shstr_data.SetData (object_data, offset, byte_size) == byte_size) 763 { 764 for (SectionHeaderCollIter I = section_headers.begin(); 765 I != section_headers.end(); ++I) 766 { 767 static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink"); 768 const ELFSectionHeaderInfo &header = *I; 769 const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 770 ConstString name(shstr_data.PeekCStr(I->sh_name)); 771 772 I->section_name = name; 773 774 if (name == g_sect_name_gnu_debuglink) 775 { 776 DataExtractor data; 777 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) 778 { 779 lldb::offset_t gnu_debuglink_offset = 0; 780 gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset); 781 gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4); 782 data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1); 783 } 784 } 785 786 if (header.sh_type == SHT_NOTE && !uuid.IsValid()) 787 { 788 DataExtractor data; 789 if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) 790 { 791 ParseNoteGNUBuildID (data, uuid); 792 } 793 } 794 } 795 796 return section_headers.size(); 797 } 798 } 799 800 section_headers.clear(); 801 return 0; 802 } 803 804 size_t 805 ObjectFileELF::GetProgramHeaderCount() 806 { 807 return ParseProgramHeaders(); 808 } 809 810 const elf::ELFProgramHeader * 811 ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id) 812 { 813 if (!id || !ParseProgramHeaders()) 814 return NULL; 815 816 if (--id < m_program_headers.size()) 817 return &m_program_headers[id]; 818 819 return NULL; 820 } 821 822 DataExtractor 823 ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id) 824 { 825 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id); 826 if (segment_header == NULL) 827 return DataExtractor(); 828 return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz); 829 } 830 831 //---------------------------------------------------------------------- 832 // ParseSectionHeaders 833 //---------------------------------------------------------------------- 834 size_t 835 ObjectFileELF::ParseSectionHeaders() 836 { 837 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc); 838 } 839 840 const ObjectFileELF::ELFSectionHeaderInfo * 841 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) 842 { 843 if (!id || !ParseSectionHeaders()) 844 return NULL; 845 846 if (--id < m_section_headers.size()) 847 return &m_section_headers[id]; 848 849 return NULL; 850 } 851 852 void 853 ObjectFileELF::CreateSections(SectionList &unified_section_list) 854 { 855 if (!m_sections_ap.get() && ParseSectionHeaders()) 856 { 857 m_sections_ap.reset(new SectionList()); 858 859 for (SectionHeaderCollIter I = m_section_headers.begin(); 860 I != m_section_headers.end(); ++I) 861 { 862 const ELFSectionHeaderInfo &header = *I; 863 864 ConstString& name = I->section_name; 865 const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 866 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0; 867 868 static ConstString g_sect_name_text (".text"); 869 static ConstString g_sect_name_data (".data"); 870 static ConstString g_sect_name_bss (".bss"); 871 static ConstString g_sect_name_tdata (".tdata"); 872 static ConstString g_sect_name_tbss (".tbss"); 873 static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev"); 874 static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges"); 875 static ConstString g_sect_name_dwarf_debug_frame (".debug_frame"); 876 static ConstString g_sect_name_dwarf_debug_info (".debug_info"); 877 static ConstString g_sect_name_dwarf_debug_line (".debug_line"); 878 static ConstString g_sect_name_dwarf_debug_loc (".debug_loc"); 879 static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo"); 880 static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames"); 881 static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes"); 882 static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges"); 883 static ConstString g_sect_name_dwarf_debug_str (".debug_str"); 884 static ConstString g_sect_name_eh_frame (".eh_frame"); 885 886 SectionType sect_type = eSectionTypeOther; 887 888 bool is_thread_specific = false; 889 890 if (name == g_sect_name_text) sect_type = eSectionTypeCode; 891 else if (name == g_sect_name_data) sect_type = eSectionTypeData; 892 else if (name == g_sect_name_bss) sect_type = eSectionTypeZeroFill; 893 else if (name == g_sect_name_tdata) 894 { 895 sect_type = eSectionTypeData; 896 is_thread_specific = true; 897 } 898 else if (name == g_sect_name_tbss) 899 { 900 sect_type = eSectionTypeZeroFill; 901 is_thread_specific = true; 902 } 903 // .debug_abbrev Abbreviations used in the .debug_info section 904 // .debug_aranges Lookup table for mapping addresses to compilation units 905 // .debug_frame Call frame information 906 // .debug_info The core DWARF information section 907 // .debug_line Line number information 908 // .debug_loc Location lists used in DW_AT_location attributes 909 // .debug_macinfo Macro information 910 // .debug_pubnames Lookup table for mapping object and function names to compilation units 911 // .debug_pubtypes Lookup table for mapping type names to compilation units 912 // .debug_ranges Address ranges used in DW_AT_ranges attributes 913 // .debug_str String table used in .debug_info 914 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html 915 // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644 916 // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo 917 else if (name == g_sect_name_dwarf_debug_abbrev) sect_type = eSectionTypeDWARFDebugAbbrev; 918 else if (name == g_sect_name_dwarf_debug_aranges) sect_type = eSectionTypeDWARFDebugAranges; 919 else if (name == g_sect_name_dwarf_debug_frame) sect_type = eSectionTypeDWARFDebugFrame; 920 else if (name == g_sect_name_dwarf_debug_info) sect_type = eSectionTypeDWARFDebugInfo; 921 else if (name == g_sect_name_dwarf_debug_line) sect_type = eSectionTypeDWARFDebugLine; 922 else if (name == g_sect_name_dwarf_debug_loc) sect_type = eSectionTypeDWARFDebugLoc; 923 else if (name == g_sect_name_dwarf_debug_macinfo) sect_type = eSectionTypeDWARFDebugMacInfo; 924 else if (name == g_sect_name_dwarf_debug_pubnames) sect_type = eSectionTypeDWARFDebugPubNames; 925 else if (name == g_sect_name_dwarf_debug_pubtypes) sect_type = eSectionTypeDWARFDebugPubTypes; 926 else if (name == g_sect_name_dwarf_debug_ranges) sect_type = eSectionTypeDWARFDebugRanges; 927 else if (name == g_sect_name_dwarf_debug_str) sect_type = eSectionTypeDWARFDebugStr; 928 else if (name == g_sect_name_eh_frame) sect_type = eSectionTypeEHFrame; 929 930 switch (header.sh_type) 931 { 932 case SHT_SYMTAB: 933 assert (sect_type == eSectionTypeOther); 934 sect_type = eSectionTypeELFSymbolTable; 935 break; 936 case SHT_DYNSYM: 937 assert (sect_type == eSectionTypeOther); 938 sect_type = eSectionTypeELFDynamicSymbols; 939 break; 940 case SHT_RELA: 941 case SHT_REL: 942 assert (sect_type == eSectionTypeOther); 943 sect_type = eSectionTypeELFRelocationEntries; 944 break; 945 case SHT_DYNAMIC: 946 assert (sect_type == eSectionTypeOther); 947 sect_type = eSectionTypeELFDynamicLinkInfo; 948 break; 949 } 950 951 SectionSP section_sp (new Section(GetModule(), // Module to which this section belongs. 952 this, // ObjectFile to which this section belongs and should read section data from. 953 SectionIndex(I), // Section ID. 954 name, // Section name. 955 sect_type, // Section type. 956 header.sh_addr, // VM address. 957 vm_size, // VM size in bytes of this section. 958 header.sh_offset, // Offset of this section in the file. 959 file_size, // Size of the section as found in the file. 960 header.sh_flags)); // Flags for this section. 961 962 if (is_thread_specific) 963 section_sp->SetIsThreadSpecific (is_thread_specific); 964 m_sections_ap->AddSection(section_sp); 965 } 966 } 967 968 if (m_sections_ap.get()) 969 { 970 if (GetType() == eTypeDebugInfo) 971 { 972 static const SectionType g_sections[] = 973 { 974 eSectionTypeDWARFDebugAranges, 975 eSectionTypeDWARFDebugInfo, 976 eSectionTypeDWARFDebugAbbrev, 977 eSectionTypeDWARFDebugFrame, 978 eSectionTypeDWARFDebugLine, 979 eSectionTypeDWARFDebugStr, 980 eSectionTypeDWARFDebugLoc, 981 eSectionTypeDWARFDebugMacInfo, 982 eSectionTypeDWARFDebugPubNames, 983 eSectionTypeDWARFDebugPubTypes, 984 eSectionTypeDWARFDebugRanges, 985 eSectionTypeELFSymbolTable, 986 }; 987 SectionList *elf_section_list = m_sections_ap.get(); 988 for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx) 989 { 990 SectionType section_type = g_sections[idx]; 991 SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true)); 992 if (section_sp) 993 { 994 SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true)); 995 if (module_section_sp) 996 unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp); 997 else 998 unified_section_list.AddSection (section_sp); 999 } 1000 } 1001 } 1002 else 1003 { 1004 unified_section_list = *m_sections_ap; 1005 } 1006 } 1007 } 1008 1009 // private 1010 unsigned 1011 ObjectFileELF::ParseSymbols (Symtab *symtab, 1012 user_id_t start_id, 1013 SectionList *section_list, 1014 const size_t num_symbols, 1015 const DataExtractor &symtab_data, 1016 const DataExtractor &strtab_data) 1017 { 1018 ELFSymbol symbol; 1019 lldb::offset_t offset = 0; 1020 1021 static ConstString text_section_name(".text"); 1022 static ConstString init_section_name(".init"); 1023 static ConstString fini_section_name(".fini"); 1024 static ConstString ctors_section_name(".ctors"); 1025 static ConstString dtors_section_name(".dtors"); 1026 1027 static ConstString data_section_name(".data"); 1028 static ConstString rodata_section_name(".rodata"); 1029 static ConstString rodata1_section_name(".rodata1"); 1030 static ConstString data2_section_name(".data1"); 1031 static ConstString bss_section_name(".bss"); 1032 1033 //StreamFile strm(stdout, false); 1034 unsigned i; 1035 for (i = 0; i < num_symbols; ++i) 1036 { 1037 if (symbol.Parse(symtab_data, &offset) == false) 1038 break; 1039 1040 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 1041 1042 // No need to add symbols that have no names 1043 if (symbol_name == NULL || symbol_name[0] == '\0') 1044 continue; 1045 1046 //symbol.Dump (&strm, i, &strtab_data, section_list); 1047 1048 SectionSP symbol_section_sp; 1049 SymbolType symbol_type = eSymbolTypeInvalid; 1050 Elf64_Half symbol_idx = symbol.st_shndx; 1051 1052 switch (symbol_idx) 1053 { 1054 case SHN_ABS: 1055 symbol_type = eSymbolTypeAbsolute; 1056 break; 1057 case SHN_UNDEF: 1058 symbol_type = eSymbolTypeUndefined; 1059 break; 1060 default: 1061 symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx); 1062 break; 1063 } 1064 1065 // If a symbol is undefined do not process it further even if it has a STT type 1066 if (symbol_type != eSymbolTypeUndefined) 1067 { 1068 switch (symbol.getType()) 1069 { 1070 default: 1071 case STT_NOTYPE: 1072 // The symbol's type is not specified. 1073 break; 1074 1075 case STT_OBJECT: 1076 // The symbol is associated with a data object, such as a variable, 1077 // an array, etc. 1078 symbol_type = eSymbolTypeData; 1079 break; 1080 1081 case STT_FUNC: 1082 // The symbol is associated with a function or other executable code. 1083 symbol_type = eSymbolTypeCode; 1084 break; 1085 1086 case STT_SECTION: 1087 // The symbol is associated with a section. Symbol table entries of 1088 // this type exist primarily for relocation and normally have 1089 // STB_LOCAL binding. 1090 break; 1091 1092 case STT_FILE: 1093 // Conventionally, the symbol's name gives the name of the source 1094 // file associated with the object file. A file symbol has STB_LOCAL 1095 // binding, its section index is SHN_ABS, and it precedes the other 1096 // STB_LOCAL symbols for the file, if it is present. 1097 symbol_type = eSymbolTypeSourceFile; 1098 break; 1099 1100 case STT_GNU_IFUNC: 1101 // The symbol is associated with an indirect function. The actual 1102 // function will be resolved if it is referenced. 1103 symbol_type = eSymbolTypeResolver; 1104 break; 1105 } 1106 } 1107 1108 if (symbol_type == eSymbolTypeInvalid) 1109 { 1110 if (symbol_section_sp) 1111 { 1112 const ConstString §_name = symbol_section_sp->GetName(); 1113 if (sect_name == text_section_name || 1114 sect_name == init_section_name || 1115 sect_name == fini_section_name || 1116 sect_name == ctors_section_name || 1117 sect_name == dtors_section_name) 1118 { 1119 symbol_type = eSymbolTypeCode; 1120 } 1121 else if (sect_name == data_section_name || 1122 sect_name == data2_section_name || 1123 sect_name == rodata_section_name || 1124 sect_name == rodata1_section_name || 1125 sect_name == bss_section_name) 1126 { 1127 symbol_type = eSymbolTypeData; 1128 } 1129 } 1130 } 1131 1132 // If the symbol section we've found has no data (SHT_NOBITS), then check the module section 1133 // list. This can happen if we're parsing the debug file and it has no .text section, for example. 1134 if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0)) 1135 { 1136 ModuleSP module_sp(GetModule()); 1137 if (module_sp) 1138 { 1139 SectionList *module_section_list = module_sp->GetSectionList(); 1140 if (module_section_list && module_section_list != section_list) 1141 { 1142 const ConstString §_name = symbol_section_sp->GetName(); 1143 lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name)); 1144 if (section_sp && section_sp->GetFileSize()) 1145 { 1146 symbol_section_sp = section_sp; 1147 } 1148 } 1149 } 1150 } 1151 1152 uint64_t symbol_value = symbol.st_value; 1153 if (symbol_section_sp) 1154 symbol_value -= symbol_section_sp->GetFileAddress(); 1155 bool is_global = symbol.getBinding() == STB_GLOBAL; 1156 uint32_t flags = symbol.st_other << 8 | symbol.st_info; 1157 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false; 1158 Symbol dc_symbol( 1159 i + start_id, // ID is the original symbol table index. 1160 symbol_name, // Symbol name. 1161 is_mangled, // Is the symbol name mangled? 1162 symbol_type, // Type of this symbol 1163 is_global, // Is this globally visible? 1164 false, // Is this symbol debug info? 1165 false, // Is this symbol a trampoline? 1166 false, // Is this symbol artificial? 1167 symbol_section_sp, // Section in which this symbol is defined or null. 1168 symbol_value, // Offset in section or symbol value. 1169 symbol.st_size, // Size in bytes of this symbol. 1170 true, // Size is valid 1171 flags); // Symbol flags. 1172 symtab->AddSymbol(dc_symbol); 1173 } 1174 1175 return i; 1176 } 1177 1178 unsigned 1179 ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab) 1180 { 1181 if (symtab->GetObjectFile() != this) 1182 { 1183 // If the symbol table section is owned by a different object file, have it do the 1184 // parsing. 1185 ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile()); 1186 return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab); 1187 } 1188 1189 // Get section list for this object file. 1190 SectionList *section_list = m_sections_ap.get(); 1191 if (!section_list) 1192 return 0; 1193 1194 user_id_t symtab_id = symtab->GetID(); 1195 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 1196 assert(symtab_hdr->sh_type == SHT_SYMTAB || 1197 symtab_hdr->sh_type == SHT_DYNSYM); 1198 1199 // sh_link: section header index of associated string table. 1200 // Section ID's are ones based. 1201 user_id_t strtab_id = symtab_hdr->sh_link + 1; 1202 Section *strtab = section_list->FindSectionByID(strtab_id).get(); 1203 1204 unsigned num_symbols = 0; 1205 if (symtab && strtab) 1206 { 1207 assert (symtab->GetObjectFile() == this); 1208 assert (strtab->GetObjectFile() == this); 1209 1210 DataExtractor symtab_data; 1211 DataExtractor strtab_data; 1212 if (ReadSectionData(symtab, symtab_data) && 1213 ReadSectionData(strtab, strtab_data)) 1214 { 1215 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize; 1216 1217 num_symbols = ParseSymbols(symbol_table, start_id, 1218 section_list, num_symbols, 1219 symtab_data, strtab_data); 1220 } 1221 } 1222 1223 return num_symbols; 1224 } 1225 1226 size_t 1227 ObjectFileELF::ParseDynamicSymbols() 1228 { 1229 if (m_dynamic_symbols.size()) 1230 return m_dynamic_symbols.size(); 1231 1232 SectionList *section_list = GetSectionList(); 1233 if (!section_list) 1234 return 0; 1235 1236 // Find the SHT_DYNAMIC section. 1237 Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get(); 1238 if (!dynsym) 1239 return 0; 1240 assert (dynsym->GetObjectFile() == this); 1241 1242 ELFDynamic symbol; 1243 DataExtractor dynsym_data; 1244 if (ReadSectionData(dynsym, dynsym_data)) 1245 { 1246 const lldb::offset_t section_size = dynsym_data.GetByteSize(); 1247 lldb::offset_t cursor = 0; 1248 1249 while (cursor < section_size) 1250 { 1251 if (!symbol.Parse(dynsym_data, &cursor)) 1252 break; 1253 1254 m_dynamic_symbols.push_back(symbol); 1255 } 1256 } 1257 1258 return m_dynamic_symbols.size(); 1259 } 1260 1261 const ELFDynamic * 1262 ObjectFileELF::FindDynamicSymbol(unsigned tag) 1263 { 1264 if (!ParseDynamicSymbols()) 1265 return NULL; 1266 1267 DynamicSymbolCollIter I = m_dynamic_symbols.begin(); 1268 DynamicSymbolCollIter E = m_dynamic_symbols.end(); 1269 for ( ; I != E; ++I) 1270 { 1271 ELFDynamic *symbol = &*I; 1272 1273 if (symbol->d_tag == tag) 1274 return symbol; 1275 } 1276 1277 return NULL; 1278 } 1279 1280 unsigned 1281 ObjectFileELF::PLTRelocationType() 1282 { 1283 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL); 1284 1285 if (symbol) 1286 return symbol->d_val; 1287 1288 return 0; 1289 } 1290 1291 static unsigned 1292 ParsePLTRelocations(Symtab *symbol_table, 1293 user_id_t start_id, 1294 unsigned rel_type, 1295 const ELFHeader *hdr, 1296 const ELFSectionHeader *rel_hdr, 1297 const ELFSectionHeader *plt_hdr, 1298 const ELFSectionHeader *sym_hdr, 1299 const lldb::SectionSP &plt_section_sp, 1300 DataExtractor &rel_data, 1301 DataExtractor &symtab_data, 1302 DataExtractor &strtab_data) 1303 { 1304 ELFRelocation rel(rel_type); 1305 ELFSymbol symbol; 1306 lldb::offset_t offset = 0; 1307 const elf_xword plt_entsize = plt_hdr->sh_entsize; 1308 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 1309 1310 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 1311 reloc_info_fn reloc_type; 1312 reloc_info_fn reloc_symbol; 1313 1314 if (hdr->Is32Bit()) 1315 { 1316 reloc_type = ELFRelocation::RelocType32; 1317 reloc_symbol = ELFRelocation::RelocSymbol32; 1318 } 1319 else 1320 { 1321 reloc_type = ELFRelocation::RelocType64; 1322 reloc_symbol = ELFRelocation::RelocSymbol64; 1323 } 1324 1325 unsigned slot_type = hdr->GetRelocationJumpSlotType(); 1326 unsigned i; 1327 for (i = 0; i < num_relocations; ++i) 1328 { 1329 if (rel.Parse(rel_data, &offset) == false) 1330 break; 1331 1332 if (reloc_type(rel) != slot_type) 1333 continue; 1334 1335 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; 1336 uint64_t plt_index = (i + 1) * plt_entsize; 1337 1338 if (!symbol.Parse(symtab_data, &symbol_offset)) 1339 break; 1340 1341 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 1342 bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false; 1343 1344 Symbol jump_symbol( 1345 i + start_id, // Symbol table index 1346 symbol_name, // symbol name. 1347 is_mangled, // is the symbol name mangled? 1348 eSymbolTypeTrampoline, // Type of this symbol 1349 false, // Is this globally visible? 1350 false, // Is this symbol debug info? 1351 true, // Is this symbol a trampoline? 1352 true, // Is this symbol artificial? 1353 plt_section_sp, // Section in which this symbol is defined or null. 1354 plt_index, // Offset in section or symbol value. 1355 plt_entsize, // Size in bytes of this symbol. 1356 true, // Size is valid 1357 0); // Symbol flags. 1358 1359 symbol_table->AddSymbol(jump_symbol); 1360 } 1361 1362 return i; 1363 } 1364 1365 unsigned 1366 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, 1367 user_id_t start_id, 1368 const ELFSectionHeaderInfo *rel_hdr, 1369 user_id_t rel_id) 1370 { 1371 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 1372 1373 // The link field points to the associated symbol table. The info field 1374 // points to the section holding the plt. 1375 user_id_t symtab_id = rel_hdr->sh_link; 1376 user_id_t plt_id = rel_hdr->sh_info; 1377 1378 if (!symtab_id || !plt_id) 1379 return 0; 1380 1381 // Section ID's are ones based; 1382 symtab_id++; 1383 plt_id++; 1384 1385 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id); 1386 if (!plt_hdr) 1387 return 0; 1388 1389 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id); 1390 if (!sym_hdr) 1391 return 0; 1392 1393 SectionList *section_list = m_sections_ap.get(); 1394 if (!section_list) 1395 return 0; 1396 1397 Section *rel_section = section_list->FindSectionByID(rel_id).get(); 1398 if (!rel_section) 1399 return 0; 1400 1401 SectionSP plt_section_sp (section_list->FindSectionByID(plt_id)); 1402 if (!plt_section_sp) 1403 return 0; 1404 1405 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 1406 if (!symtab) 1407 return 0; 1408 1409 // sh_link points to associated string table. 1410 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get(); 1411 if (!strtab) 1412 return 0; 1413 1414 DataExtractor rel_data; 1415 if (!ReadSectionData(rel_section, rel_data)) 1416 return 0; 1417 1418 DataExtractor symtab_data; 1419 if (!ReadSectionData(symtab, symtab_data)) 1420 return 0; 1421 1422 DataExtractor strtab_data; 1423 if (!ReadSectionData(strtab, strtab_data)) 1424 return 0; 1425 1426 unsigned rel_type = PLTRelocationType(); 1427 if (!rel_type) 1428 return 0; 1429 1430 return ParsePLTRelocations (symbol_table, 1431 start_id, 1432 rel_type, 1433 &m_header, 1434 rel_hdr, 1435 plt_hdr, 1436 sym_hdr, 1437 plt_section_sp, 1438 rel_data, 1439 symtab_data, 1440 strtab_data); 1441 } 1442 1443 Symtab * 1444 ObjectFileELF::GetSymtab() 1445 { 1446 ModuleSP module_sp(GetModule()); 1447 if (!module_sp) 1448 return NULL; 1449 1450 // We always want to use the main object file so we (hopefully) only have one cached copy 1451 // of our symtab, dynamic sections, etc. 1452 ObjectFile *module_obj_file = module_sp->GetObjectFile(); 1453 if (module_obj_file && module_obj_file != this) 1454 return module_obj_file->GetSymtab(); 1455 1456 if (m_symtab_ap.get() == NULL) 1457 { 1458 SectionList *section_list = GetSectionList(); 1459 if (!section_list) 1460 return NULL; 1461 1462 uint64_t symbol_id = 0; 1463 lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 1464 1465 m_symtab_ap.reset(new Symtab(this)); 1466 1467 // Sharable objects and dynamic executables usually have 2 distinct symbol 1468 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller 1469 // version of the symtab that only contains global symbols. The information found 1470 // in the dynsym is therefore also found in the symtab, while the reverse is not 1471 // necessarily true. 1472 Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get(); 1473 if (!symtab) 1474 { 1475 // The symtab section is non-allocable and can be stripped, so if it doesn't exist 1476 // then use the dynsym section which should always be there. 1477 symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get(); 1478 } 1479 if (symtab) 1480 symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab); 1481 1482 // Synthesize trampoline symbols to help navigate the PLT. 1483 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL); 1484 if (symbol) 1485 { 1486 addr_t addr = symbol->d_ptr; 1487 Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get(); 1488 if (reloc_section) 1489 { 1490 user_id_t reloc_id = reloc_section->GetID(); 1491 const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id); 1492 assert(reloc_header); 1493 1494 ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id); 1495 } 1496 } 1497 } 1498 return m_symtab_ap.get(); 1499 } 1500 1501 bool 1502 ObjectFileELF::IsStripped () 1503 { 1504 // TODO: determine this for ELF 1505 return false; 1506 } 1507 1508 //===----------------------------------------------------------------------===// 1509 // Dump 1510 // 1511 // Dump the specifics of the runtime file container (such as any headers 1512 // segments, sections, etc). 1513 //---------------------------------------------------------------------- 1514 void 1515 ObjectFileELF::Dump(Stream *s) 1516 { 1517 DumpELFHeader(s, m_header); 1518 s->EOL(); 1519 DumpELFProgramHeaders(s); 1520 s->EOL(); 1521 DumpELFSectionHeaders(s); 1522 s->EOL(); 1523 SectionList *section_list = GetSectionList(); 1524 if (section_list) 1525 section_list->Dump(s, NULL, true, UINT32_MAX); 1526 Symtab *symtab = GetSymtab(); 1527 if (symtab) 1528 symtab->Dump(s, NULL, eSortOrderNone); 1529 s->EOL(); 1530 DumpDependentModules(s); 1531 s->EOL(); 1532 } 1533 1534 //---------------------------------------------------------------------- 1535 // DumpELFHeader 1536 // 1537 // Dump the ELF header to the specified output stream 1538 //---------------------------------------------------------------------- 1539 void 1540 ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) 1541 { 1542 s->PutCString("ELF Header\n"); 1543 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]); 1544 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", 1545 header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]); 1546 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", 1547 header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]); 1548 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", 1549 header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]); 1550 1551 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]); 1552 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]); 1553 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]); 1554 s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]); 1555 s->Printf ("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]); 1556 1557 s->Printf("e_type = 0x%4.4x ", header.e_type); 1558 DumpELFHeader_e_type(s, header.e_type); 1559 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine); 1560 s->Printf("e_version = 0x%8.8x\n", header.e_version); 1561 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry); 1562 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff); 1563 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff); 1564 s->Printf("e_flags = 0x%8.8x\n", header.e_flags); 1565 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize); 1566 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize); 1567 s->Printf("e_phnum = 0x%4.4x\n", header.e_phnum); 1568 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize); 1569 s->Printf("e_shnum = 0x%4.4x\n", header.e_shnum); 1570 s->Printf("e_shstrndx = 0x%4.4x\n", header.e_shstrndx); 1571 } 1572 1573 //---------------------------------------------------------------------- 1574 // DumpELFHeader_e_type 1575 // 1576 // Dump an token value for the ELF header member e_type 1577 //---------------------------------------------------------------------- 1578 void 1579 ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) 1580 { 1581 switch (e_type) 1582 { 1583 case ET_NONE: *s << "ET_NONE"; break; 1584 case ET_REL: *s << "ET_REL"; break; 1585 case ET_EXEC: *s << "ET_EXEC"; break; 1586 case ET_DYN: *s << "ET_DYN"; break; 1587 case ET_CORE: *s << "ET_CORE"; break; 1588 default: 1589 break; 1590 } 1591 } 1592 1593 //---------------------------------------------------------------------- 1594 // DumpELFHeader_e_ident_EI_DATA 1595 // 1596 // Dump an token value for the ELF header member e_ident[EI_DATA] 1597 //---------------------------------------------------------------------- 1598 void 1599 ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data) 1600 { 1601 switch (ei_data) 1602 { 1603 case ELFDATANONE: *s << "ELFDATANONE"; break; 1604 case ELFDATA2LSB: *s << "ELFDATA2LSB - Little Endian"; break; 1605 case ELFDATA2MSB: *s << "ELFDATA2MSB - Big Endian"; break; 1606 default: 1607 break; 1608 } 1609 } 1610 1611 1612 //---------------------------------------------------------------------- 1613 // DumpELFProgramHeader 1614 // 1615 // Dump a single ELF program header to the specified output stream 1616 //---------------------------------------------------------------------- 1617 void 1618 ObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph) 1619 { 1620 DumpELFProgramHeader_p_type(s, ph.p_type); 1621 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr); 1622 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags); 1623 1624 DumpELFProgramHeader_p_flags(s, ph.p_flags); 1625 s->Printf(") %8.8" PRIx64, ph.p_align); 1626 } 1627 1628 //---------------------------------------------------------------------- 1629 // DumpELFProgramHeader_p_type 1630 // 1631 // Dump an token value for the ELF program header member p_type which 1632 // describes the type of the program header 1633 // ---------------------------------------------------------------------- 1634 void 1635 ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) 1636 { 1637 const int kStrWidth = 15; 1638 switch (p_type) 1639 { 1640 CASE_AND_STREAM(s, PT_NULL , kStrWidth); 1641 CASE_AND_STREAM(s, PT_LOAD , kStrWidth); 1642 CASE_AND_STREAM(s, PT_DYNAMIC , kStrWidth); 1643 CASE_AND_STREAM(s, PT_INTERP , kStrWidth); 1644 CASE_AND_STREAM(s, PT_NOTE , kStrWidth); 1645 CASE_AND_STREAM(s, PT_SHLIB , kStrWidth); 1646 CASE_AND_STREAM(s, PT_PHDR , kStrWidth); 1647 CASE_AND_STREAM(s, PT_TLS , kStrWidth); 1648 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth); 1649 default: 1650 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, ""); 1651 break; 1652 } 1653 } 1654 1655 1656 //---------------------------------------------------------------------- 1657 // DumpELFProgramHeader_p_flags 1658 // 1659 // Dump an token value for the ELF program header member p_flags 1660 //---------------------------------------------------------------------- 1661 void 1662 ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) 1663 { 1664 *s << ((p_flags & PF_X) ? "PF_X" : " ") 1665 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ') 1666 << ((p_flags & PF_W) ? "PF_W" : " ") 1667 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ') 1668 << ((p_flags & PF_R) ? "PF_R" : " "); 1669 } 1670 1671 //---------------------------------------------------------------------- 1672 // DumpELFProgramHeaders 1673 // 1674 // Dump all of the ELF program header to the specified output stream 1675 //---------------------------------------------------------------------- 1676 void 1677 ObjectFileELF::DumpELFProgramHeaders(Stream *s) 1678 { 1679 if (ParseProgramHeaders()) 1680 { 1681 s->PutCString("Program Headers\n"); 1682 s->PutCString("IDX p_type p_offset p_vaddr p_paddr " 1683 "p_filesz p_memsz p_flags p_align\n"); 1684 s->PutCString("==== --------------- -------- -------- -------- " 1685 "-------- -------- ------------------------- --------\n"); 1686 1687 uint32_t idx = 0; 1688 for (ProgramHeaderCollConstIter I = m_program_headers.begin(); 1689 I != m_program_headers.end(); ++I, ++idx) 1690 { 1691 s->Printf("[%2u] ", idx); 1692 ObjectFileELF::DumpELFProgramHeader(s, *I); 1693 s->EOL(); 1694 } 1695 } 1696 } 1697 1698 //---------------------------------------------------------------------- 1699 // DumpELFSectionHeader 1700 // 1701 // Dump a single ELF section header to the specified output stream 1702 //---------------------------------------------------------------------- 1703 void 1704 ObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh) 1705 { 1706 s->Printf("%8.8x ", sh.sh_name); 1707 DumpELFSectionHeader_sh_type(s, sh.sh_type); 1708 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags); 1709 DumpELFSectionHeader_sh_flags(s, sh.sh_flags); 1710 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size); 1711 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info); 1712 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize); 1713 } 1714 1715 //---------------------------------------------------------------------- 1716 // DumpELFSectionHeader_sh_type 1717 // 1718 // Dump an token value for the ELF section header member sh_type which 1719 // describes the type of the section 1720 //---------------------------------------------------------------------- 1721 void 1722 ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) 1723 { 1724 const int kStrWidth = 12; 1725 switch (sh_type) 1726 { 1727 CASE_AND_STREAM(s, SHT_NULL , kStrWidth); 1728 CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth); 1729 CASE_AND_STREAM(s, SHT_SYMTAB , kStrWidth); 1730 CASE_AND_STREAM(s, SHT_STRTAB , kStrWidth); 1731 CASE_AND_STREAM(s, SHT_RELA , kStrWidth); 1732 CASE_AND_STREAM(s, SHT_HASH , kStrWidth); 1733 CASE_AND_STREAM(s, SHT_DYNAMIC , kStrWidth); 1734 CASE_AND_STREAM(s, SHT_NOTE , kStrWidth); 1735 CASE_AND_STREAM(s, SHT_NOBITS , kStrWidth); 1736 CASE_AND_STREAM(s, SHT_REL , kStrWidth); 1737 CASE_AND_STREAM(s, SHT_SHLIB , kStrWidth); 1738 CASE_AND_STREAM(s, SHT_DYNSYM , kStrWidth); 1739 CASE_AND_STREAM(s, SHT_LOPROC , kStrWidth); 1740 CASE_AND_STREAM(s, SHT_HIPROC , kStrWidth); 1741 CASE_AND_STREAM(s, SHT_LOUSER , kStrWidth); 1742 CASE_AND_STREAM(s, SHT_HIUSER , kStrWidth); 1743 default: 1744 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, ""); 1745 break; 1746 } 1747 } 1748 1749 //---------------------------------------------------------------------- 1750 // DumpELFSectionHeader_sh_flags 1751 // 1752 // Dump an token value for the ELF section header member sh_flags 1753 //---------------------------------------------------------------------- 1754 void 1755 ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags) 1756 { 1757 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ") 1758 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ') 1759 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ") 1760 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ') 1761 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " "); 1762 } 1763 1764 //---------------------------------------------------------------------- 1765 // DumpELFSectionHeaders 1766 // 1767 // Dump all of the ELF section header to the specified output stream 1768 //---------------------------------------------------------------------- 1769 void 1770 ObjectFileELF::DumpELFSectionHeaders(Stream *s) 1771 { 1772 if (!ParseSectionHeaders()) 1773 return; 1774 1775 s->PutCString("Section Headers\n"); 1776 s->PutCString("IDX name type flags " 1777 "addr offset size link info addralgn " 1778 "entsize Name\n"); 1779 s->PutCString("==== -------- ------------ -------------------------------- " 1780 "-------- -------- -------- -------- -------- -------- " 1781 "-------- ====================\n"); 1782 1783 uint32_t idx = 0; 1784 for (SectionHeaderCollConstIter I = m_section_headers.begin(); 1785 I != m_section_headers.end(); ++I, ++idx) 1786 { 1787 s->Printf("[%2u] ", idx); 1788 ObjectFileELF::DumpELFSectionHeader(s, *I); 1789 const char* section_name = I->section_name.AsCString(""); 1790 if (section_name) 1791 *s << ' ' << section_name << "\n"; 1792 } 1793 } 1794 1795 void 1796 ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) 1797 { 1798 size_t num_modules = ParseDependentModules(); 1799 1800 if (num_modules > 0) 1801 { 1802 s->PutCString("Dependent Modules:\n"); 1803 for (unsigned i = 0; i < num_modules; ++i) 1804 { 1805 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i); 1806 s->Printf(" %s\n", spec.GetFilename().GetCString()); 1807 } 1808 } 1809 } 1810 1811 bool 1812 ObjectFileELF::GetArchitecture (ArchSpec &arch) 1813 { 1814 if (!ParseHeader()) 1815 return false; 1816 1817 arch.SetArchitecture (eArchTypeELF, m_header.e_machine, LLDB_INVALID_CPUTYPE); 1818 arch.GetTriple().setOSName (Host::GetOSString().GetCString()); 1819 arch.GetTriple().setVendorName(Host::GetVendorString().GetCString()); 1820 return true; 1821 } 1822 1823 ObjectFile::Type 1824 ObjectFileELF::CalculateType() 1825 { 1826 switch (m_header.e_type) 1827 { 1828 case llvm::ELF::ET_NONE: 1829 // 0 - No file type 1830 return eTypeUnknown; 1831 1832 case llvm::ELF::ET_REL: 1833 // 1 - Relocatable file 1834 return eTypeObjectFile; 1835 1836 case llvm::ELF::ET_EXEC: 1837 // 2 - Executable file 1838 return eTypeExecutable; 1839 1840 case llvm::ELF::ET_DYN: 1841 // 3 - Shared object file 1842 return eTypeSharedLibrary; 1843 1844 case ET_CORE: 1845 // 4 - Core file 1846 return eTypeCoreFile; 1847 1848 default: 1849 break; 1850 } 1851 return eTypeUnknown; 1852 } 1853 1854 ObjectFile::Strata 1855 ObjectFileELF::CalculateStrata() 1856 { 1857 switch (m_header.e_type) 1858 { 1859 case llvm::ELF::ET_NONE: 1860 // 0 - No file type 1861 return eStrataUnknown; 1862 1863 case llvm::ELF::ET_REL: 1864 // 1 - Relocatable file 1865 return eStrataUnknown; 1866 1867 case llvm::ELF::ET_EXEC: 1868 // 2 - Executable file 1869 // TODO: is there any way to detect that an executable is a kernel 1870 // related executable by inspecting the program headers, section 1871 // headers, symbols, or any other flag bits??? 1872 return eStrataUser; 1873 1874 case llvm::ELF::ET_DYN: 1875 // 3 - Shared object file 1876 // TODO: is there any way to detect that an shared library is a kernel 1877 // related executable by inspecting the program headers, section 1878 // headers, symbols, or any other flag bits??? 1879 return eStrataUnknown; 1880 1881 case ET_CORE: 1882 // 4 - Core file 1883 // TODO: is there any way to detect that an core file is a kernel 1884 // related executable by inspecting the program headers, section 1885 // headers, symbols, or any other flag bits??? 1886 return eStrataUnknown; 1887 1888 default: 1889 break; 1890 } 1891 return eStrataUnknown; 1892 } 1893 1894