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 <algorithm> 13 #include <cassert> 14 #include <unordered_map> 15 16 #include "lldb/Core/FileSpecList.h" 17 #include "lldb/Core/Module.h" 18 #include "lldb/Core/ModuleSpec.h" 19 #include "lldb/Core/PluginManager.h" 20 #include "lldb/Core/Section.h" 21 #include "lldb/Symbol/DWARFCallFrameInfo.h" 22 #include "lldb/Symbol/SymbolContext.h" 23 #include "lldb/Target/SectionLoadList.h" 24 #include "lldb/Target/Target.h" 25 #include "lldb/Utility/ArchSpec.h" 26 #include "lldb/Utility/DataBufferHeap.h" 27 #include "lldb/Utility/Log.h" 28 #include "lldb/Utility/Status.h" 29 #include "lldb/Utility/Stream.h" 30 #include "lldb/Utility/Timer.h" 31 32 #include "llvm/ADT/PointerUnion.h" 33 #include "llvm/ADT/StringRef.h" 34 #include "llvm/Object/Decompressor.h" 35 #include "llvm/Support/ARMBuildAttributes.h" 36 #include "llvm/Support/MathExtras.h" 37 #include "llvm/Support/MemoryBuffer.h" 38 #include "llvm/Support/MipsABIFlags.h" 39 40 #define CASE_AND_STREAM(s, def, width) \ 41 case def: \ 42 s->Printf("%-*s", width, #def); \ 43 break; 44 45 using namespace lldb; 46 using namespace lldb_private; 47 using namespace elf; 48 using namespace llvm::ELF; 49 50 namespace { 51 52 // ELF note owner definitions 53 const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD"; 54 const char *const LLDB_NT_OWNER_GNU = "GNU"; 55 const char *const LLDB_NT_OWNER_NETBSD = "NetBSD"; 56 const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD"; 57 const char *const LLDB_NT_OWNER_CSR = "csr"; 58 const char *const LLDB_NT_OWNER_ANDROID = "Android"; 59 const char *const LLDB_NT_OWNER_CORE = "CORE"; 60 const char *const LLDB_NT_OWNER_LINUX = "LINUX"; 61 62 // ELF note type definitions 63 const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01; 64 const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4; 65 66 const elf_word LLDB_NT_GNU_ABI_TAG = 0x01; 67 const elf_word LLDB_NT_GNU_ABI_SIZE = 16; 68 69 const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03; 70 71 const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01; 72 const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4; 73 74 // GNU ABI note OS constants 75 const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00; 76 const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01; 77 const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02; 78 79 // LLDB_NT_OWNER_CORE and LLDB_NT_OWNER_LINUX note contants 80 #define NT_PRSTATUS 1 81 #define NT_PRFPREG 2 82 #define NT_PRPSINFO 3 83 #define NT_TASKSTRUCT 4 84 #define NT_AUXV 6 85 #define NT_SIGINFO 0x53494749 86 #define NT_FILE 0x46494c45 87 #define NT_PRXFPREG 0x46e62b7f 88 #define NT_PPC_VMX 0x100 89 #define NT_PPC_SPE 0x101 90 #define NT_PPC_VSX 0x102 91 #define NT_386_TLS 0x200 92 #define NT_386_IOPERM 0x201 93 #define NT_X86_XSTATE 0x202 94 #define NT_S390_HIGH_GPRS 0x300 95 #define NT_S390_TIMER 0x301 96 #define NT_S390_TODCMP 0x302 97 #define NT_S390_TODPREG 0x303 98 #define NT_S390_CTRS 0x304 99 #define NT_S390_PREFIX 0x305 100 #define NT_S390_LAST_BREAK 0x306 101 #define NT_S390_SYSTEM_CALL 0x307 102 #define NT_S390_TDB 0x308 103 #define NT_S390_VXRS_LOW 0x309 104 #define NT_S390_VXRS_HIGH 0x30a 105 #define NT_ARM_VFP 0x400 106 #define NT_ARM_TLS 0x401 107 #define NT_ARM_HW_BREAK 0x402 108 #define NT_ARM_HW_WATCH 0x403 109 #define NT_ARM_SYSTEM_CALL 0x404 110 #define NT_METAG_CBUF 0x500 111 #define NT_METAG_RPIPE 0x501 112 #define NT_METAG_TLS 0x502 113 114 //===----------------------------------------------------------------------===// 115 /// @class ELFRelocation 116 /// Generic wrapper for ELFRel and ELFRela. 117 /// 118 /// This helper class allows us to parse both ELFRel and ELFRela relocation 119 /// entries in a generic manner. 120 class ELFRelocation { 121 public: 122 /// Constructs an ELFRelocation entry with a personality as given by @p 123 /// type. 124 /// 125 /// @param type Either DT_REL or DT_RELA. Any other value is invalid. 126 ELFRelocation(unsigned type); 127 128 ~ELFRelocation(); 129 130 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 131 132 static unsigned RelocType32(const ELFRelocation &rel); 133 134 static unsigned RelocType64(const ELFRelocation &rel); 135 136 static unsigned RelocSymbol32(const ELFRelocation &rel); 137 138 static unsigned RelocSymbol64(const ELFRelocation &rel); 139 140 static unsigned RelocOffset32(const ELFRelocation &rel); 141 142 static unsigned RelocOffset64(const ELFRelocation &rel); 143 144 static unsigned RelocAddend32(const ELFRelocation &rel); 145 146 static unsigned RelocAddend64(const ELFRelocation &rel); 147 148 private: 149 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion; 150 151 RelocUnion reloc; 152 }; 153 154 ELFRelocation::ELFRelocation(unsigned type) { 155 if (type == DT_REL || type == SHT_REL) 156 reloc = new ELFRel(); 157 else if (type == DT_RELA || type == SHT_RELA) 158 reloc = new ELFRela(); 159 else { 160 assert(false && "unexpected relocation type"); 161 reloc = static_cast<ELFRel *>(NULL); 162 } 163 } 164 165 ELFRelocation::~ELFRelocation() { 166 if (reloc.is<ELFRel *>()) 167 delete reloc.get<ELFRel *>(); 168 else 169 delete reloc.get<ELFRela *>(); 170 } 171 172 bool ELFRelocation::Parse(const lldb_private::DataExtractor &data, 173 lldb::offset_t *offset) { 174 if (reloc.is<ELFRel *>()) 175 return reloc.get<ELFRel *>()->Parse(data, offset); 176 else 177 return reloc.get<ELFRela *>()->Parse(data, offset); 178 } 179 180 unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) { 181 if (rel.reloc.is<ELFRel *>()) 182 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>()); 183 else 184 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>()); 185 } 186 187 unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) { 188 if (rel.reloc.is<ELFRel *>()) 189 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>()); 190 else 191 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>()); 192 } 193 194 unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) { 195 if (rel.reloc.is<ELFRel *>()) 196 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>()); 197 else 198 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>()); 199 } 200 201 unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) { 202 if (rel.reloc.is<ELFRel *>()) 203 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>()); 204 else 205 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>()); 206 } 207 208 unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) { 209 if (rel.reloc.is<ELFRel *>()) 210 return rel.reloc.get<ELFRel *>()->r_offset; 211 else 212 return rel.reloc.get<ELFRela *>()->r_offset; 213 } 214 215 unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) { 216 if (rel.reloc.is<ELFRel *>()) 217 return rel.reloc.get<ELFRel *>()->r_offset; 218 else 219 return rel.reloc.get<ELFRela *>()->r_offset; 220 } 221 222 unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) { 223 if (rel.reloc.is<ELFRel *>()) 224 return 0; 225 else 226 return rel.reloc.get<ELFRela *>()->r_addend; 227 } 228 229 unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) { 230 if (rel.reloc.is<ELFRel *>()) 231 return 0; 232 else 233 return rel.reloc.get<ELFRela *>()->r_addend; 234 } 235 236 } // end anonymous namespace 237 238 bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) { 239 // Read all fields. 240 if (data.GetU32(offset, &n_namesz, 3) == NULL) 241 return false; 242 243 // The name field is required to be nul-terminated, and n_namesz includes the 244 // terminating nul in observed implementations (contrary to the ELF-64 spec). 245 // A special case is needed for cores generated by some older Linux versions, 246 // which write a note named "CORE" without a nul terminator and n_namesz = 4. 247 if (n_namesz == 4) { 248 char buf[4]; 249 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4) 250 return false; 251 if (strncmp(buf, "CORE", 4) == 0) { 252 n_name = "CORE"; 253 *offset += 4; 254 return true; 255 } 256 } 257 258 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4)); 259 if (cstr == NULL) { 260 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS)); 261 if (log) 262 log->Printf("Failed to parse note name lacking nul terminator"); 263 264 return false; 265 } 266 n_name = cstr; 267 return true; 268 } 269 270 static uint32_t kalimbaVariantFromElfFlags(const elf::elf_word e_flags) { 271 const uint32_t dsp_rev = e_flags & 0xFF; 272 uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE; 273 switch (dsp_rev) { 274 // TODO(mg11) Support more variants 275 case 10: 276 kal_arch_variant = llvm::Triple::KalimbaSubArch_v3; 277 break; 278 case 14: 279 kal_arch_variant = llvm::Triple::KalimbaSubArch_v4; 280 break; 281 case 17: 282 case 20: 283 kal_arch_variant = llvm::Triple::KalimbaSubArch_v5; 284 break; 285 default: 286 break; 287 } 288 return kal_arch_variant; 289 } 290 291 static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) { 292 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH; 293 uint32_t endian = header.e_ident[EI_DATA]; 294 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown; 295 uint32_t fileclass = header.e_ident[EI_CLASS]; 296 297 // If there aren't any elf flags available (e.g core elf file) then return 298 // default 299 // 32 or 64 bit arch (without any architecture revision) based on object file's class. 300 if (header.e_type == ET_CORE) { 301 switch (fileclass) { 302 case llvm::ELF::ELFCLASS32: 303 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el 304 : ArchSpec::eMIPSSubType_mips32; 305 case llvm::ELF::ELFCLASS64: 306 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el 307 : ArchSpec::eMIPSSubType_mips64; 308 default: 309 return arch_variant; 310 } 311 } 312 313 switch (mips_arch) { 314 case llvm::ELF::EF_MIPS_ARCH_1: 315 case llvm::ELF::EF_MIPS_ARCH_2: 316 case llvm::ELF::EF_MIPS_ARCH_32: 317 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el 318 : ArchSpec::eMIPSSubType_mips32; 319 case llvm::ELF::EF_MIPS_ARCH_32R2: 320 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el 321 : ArchSpec::eMIPSSubType_mips32r2; 322 case llvm::ELF::EF_MIPS_ARCH_32R6: 323 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el 324 : ArchSpec::eMIPSSubType_mips32r6; 325 case llvm::ELF::EF_MIPS_ARCH_3: 326 case llvm::ELF::EF_MIPS_ARCH_4: 327 case llvm::ELF::EF_MIPS_ARCH_5: 328 case llvm::ELF::EF_MIPS_ARCH_64: 329 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el 330 : ArchSpec::eMIPSSubType_mips64; 331 case llvm::ELF::EF_MIPS_ARCH_64R2: 332 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el 333 : ArchSpec::eMIPSSubType_mips64r2; 334 case llvm::ELF::EF_MIPS_ARCH_64R6: 335 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el 336 : ArchSpec::eMIPSSubType_mips64r6; 337 default: 338 break; 339 } 340 341 return arch_variant; 342 } 343 344 static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) { 345 if (header.e_machine == llvm::ELF::EM_MIPS) 346 return mipsVariantFromElfFlags(header); 347 348 return llvm::ELF::EM_CSR_KALIMBA == header.e_machine 349 ? kalimbaVariantFromElfFlags(header.e_flags) 350 : LLDB_INVALID_CPUTYPE; 351 } 352 353 //! The kalimba toolchain identifies a code section as being 354 //! one with the SHT_PROGBITS set in the section sh_type and the top 355 //! bit in the 32-bit address field set. 356 static lldb::SectionType 357 kalimbaSectionType(const elf::ELFHeader &header, 358 const elf::ELFSectionHeader §_hdr) { 359 if (llvm::ELF::EM_CSR_KALIMBA != header.e_machine) { 360 return eSectionTypeOther; 361 } 362 363 if (llvm::ELF::SHT_NOBITS == sect_hdr.sh_type) { 364 return eSectionTypeZeroFill; 365 } 366 367 if (llvm::ELF::SHT_PROGBITS == sect_hdr.sh_type) { 368 const lldb::addr_t KAL_CODE_BIT = 1 << 31; 369 return KAL_CODE_BIT & sect_hdr.sh_addr ? eSectionTypeCode 370 : eSectionTypeData; 371 } 372 373 return eSectionTypeOther; 374 } 375 376 // Arbitrary constant used as UUID prefix for core files. 377 const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C); 378 379 //------------------------------------------------------------------ 380 // Static methods. 381 //------------------------------------------------------------------ 382 void ObjectFileELF::Initialize() { 383 PluginManager::RegisterPlugin(GetPluginNameStatic(), 384 GetPluginDescriptionStatic(), CreateInstance, 385 CreateMemoryInstance, GetModuleSpecifications); 386 } 387 388 void ObjectFileELF::Terminate() { 389 PluginManager::UnregisterPlugin(CreateInstance); 390 } 391 392 lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() { 393 static ConstString g_name("elf"); 394 return g_name; 395 } 396 397 const char *ObjectFileELF::GetPluginDescriptionStatic() { 398 return "ELF object file reader."; 399 } 400 401 ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp, 402 DataBufferSP &data_sp, 403 lldb::offset_t data_offset, 404 const lldb_private::FileSpec *file, 405 lldb::offset_t file_offset, 406 lldb::offset_t length) { 407 if (!data_sp) { 408 data_sp = MapFileData(*file, length, file_offset); 409 if (!data_sp) 410 return nullptr; 411 data_offset = 0; 412 } 413 414 assert(data_sp); 415 416 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset)) 417 return nullptr; 418 419 const uint8_t *magic = data_sp->GetBytes() + data_offset; 420 if (!ELFHeader::MagicBytesMatch(magic)) 421 return nullptr; 422 423 // Update the data to contain the entire file if it doesn't already 424 if (data_sp->GetByteSize() < length) { 425 data_sp = MapFileData(*file, length, file_offset); 426 if (!data_sp) 427 return nullptr; 428 data_offset = 0; 429 magic = data_sp->GetBytes(); 430 } 431 432 unsigned address_size = ELFHeader::AddressSizeInBytes(magic); 433 if (address_size == 4 || address_size == 8) { 434 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF( 435 module_sp, data_sp, data_offset, file, file_offset, length)); 436 ArchSpec spec; 437 if (objfile_ap->GetArchitecture(spec) && 438 objfile_ap->SetModulesArchitecture(spec)) 439 return objfile_ap.release(); 440 } 441 442 return NULL; 443 } 444 445 ObjectFile *ObjectFileELF::CreateMemoryInstance( 446 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp, 447 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) { 448 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT)) { 449 const uint8_t *magic = data_sp->GetBytes(); 450 if (ELFHeader::MagicBytesMatch(magic)) { 451 unsigned address_size = ELFHeader::AddressSizeInBytes(magic); 452 if (address_size == 4 || address_size == 8) { 453 std::unique_ptr<ObjectFileELF> objfile_ap( 454 new ObjectFileELF(module_sp, data_sp, process_sp, header_addr)); 455 ArchSpec spec; 456 if (objfile_ap->GetArchitecture(spec) && 457 objfile_ap->SetModulesArchitecture(spec)) 458 return objfile_ap.release(); 459 } 460 } 461 } 462 return NULL; 463 } 464 465 bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp, 466 lldb::addr_t data_offset, 467 lldb::addr_t data_length) { 468 if (data_sp && 469 data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) { 470 const uint8_t *magic = data_sp->GetBytes() + data_offset; 471 return ELFHeader::MagicBytesMatch(magic); 472 } 473 return false; 474 } 475 476 /* 477 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c 478 * 479 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or 480 * code or tables extracted from it, as desired without restriction. 481 */ 482 static uint32_t calc_crc32(uint32_t crc, const void *buf, size_t size) { 483 static const uint32_t g_crc32_tab[] = { 484 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 485 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 486 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 487 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 488 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 489 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 490 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 491 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 492 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 493 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 494 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 495 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 496 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 497 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 498 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 499 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 500 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 501 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 502 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 503 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 504 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 505 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 506 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 507 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 508 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 509 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 510 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 511 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 512 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 513 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 514 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 515 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 516 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 517 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 518 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 519 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 520 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 521 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 522 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 523 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 524 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 525 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 526 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d}; 527 const uint8_t *p = (const uint8_t *)buf; 528 529 crc = crc ^ ~0U; 530 while (size--) 531 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); 532 return crc ^ ~0U; 533 } 534 535 static uint32_t calc_gnu_debuglink_crc32(const void *buf, size_t size) { 536 return calc_crc32(0U, buf, size); 537 } 538 539 uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32( 540 const ProgramHeaderColl &program_headers, DataExtractor &object_data) { 541 typedef ProgramHeaderCollConstIter Iter; 542 543 uint32_t core_notes_crc = 0; 544 545 for (Iter I = program_headers.begin(); I != program_headers.end(); ++I) { 546 if (I->p_type == llvm::ELF::PT_NOTE) { 547 const elf_off ph_offset = I->p_offset; 548 const size_t ph_size = I->p_filesz; 549 550 DataExtractor segment_data; 551 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) { 552 // The ELF program header contained incorrect data, probably corefile 553 // is incomplete or corrupted. 554 break; 555 } 556 557 core_notes_crc = calc_crc32(core_notes_crc, segment_data.GetDataStart(), 558 segment_data.GetByteSize()); 559 } 560 } 561 562 return core_notes_crc; 563 } 564 565 static const char *OSABIAsCString(unsigned char osabi_byte) { 566 #define _MAKE_OSABI_CASE(x) \ 567 case x: \ 568 return #x 569 switch (osabi_byte) { 570 _MAKE_OSABI_CASE(ELFOSABI_NONE); 571 _MAKE_OSABI_CASE(ELFOSABI_HPUX); 572 _MAKE_OSABI_CASE(ELFOSABI_NETBSD); 573 _MAKE_OSABI_CASE(ELFOSABI_GNU); 574 _MAKE_OSABI_CASE(ELFOSABI_HURD); 575 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS); 576 _MAKE_OSABI_CASE(ELFOSABI_AIX); 577 _MAKE_OSABI_CASE(ELFOSABI_IRIX); 578 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD); 579 _MAKE_OSABI_CASE(ELFOSABI_TRU64); 580 _MAKE_OSABI_CASE(ELFOSABI_MODESTO); 581 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD); 582 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS); 583 _MAKE_OSABI_CASE(ELFOSABI_NSK); 584 _MAKE_OSABI_CASE(ELFOSABI_AROS); 585 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS); 586 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI); 587 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX); 588 _MAKE_OSABI_CASE(ELFOSABI_ARM); 589 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE); 590 default: 591 return "<unknown-osabi>"; 592 } 593 #undef _MAKE_OSABI_CASE 594 } 595 596 // 597 // WARNING : This function is being deprecated 598 // It's functionality has moved to ArchSpec::SetArchitecture This function is 599 // only being kept to validate the move. 600 // 601 // TODO : Remove this function 602 static bool GetOsFromOSABI(unsigned char osabi_byte, 603 llvm::Triple::OSType &ostype) { 604 switch (osabi_byte) { 605 case ELFOSABI_AIX: 606 ostype = llvm::Triple::OSType::AIX; 607 break; 608 case ELFOSABI_FREEBSD: 609 ostype = llvm::Triple::OSType::FreeBSD; 610 break; 611 case ELFOSABI_GNU: 612 ostype = llvm::Triple::OSType::Linux; 613 break; 614 case ELFOSABI_NETBSD: 615 ostype = llvm::Triple::OSType::NetBSD; 616 break; 617 case ELFOSABI_OPENBSD: 618 ostype = llvm::Triple::OSType::OpenBSD; 619 break; 620 case ELFOSABI_SOLARIS: 621 ostype = llvm::Triple::OSType::Solaris; 622 break; 623 default: 624 ostype = llvm::Triple::OSType::UnknownOS; 625 } 626 return ostype != llvm::Triple::OSType::UnknownOS; 627 } 628 629 size_t ObjectFileELF::GetModuleSpecifications( 630 const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp, 631 lldb::offset_t data_offset, lldb::offset_t file_offset, 632 lldb::offset_t length, lldb_private::ModuleSpecList &specs) { 633 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES)); 634 635 const size_t initial_count = specs.GetSize(); 636 637 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) { 638 DataExtractor data; 639 data.SetData(data_sp); 640 elf::ELFHeader header; 641 lldb::offset_t header_offset = data_offset; 642 if (header.Parse(data, &header_offset)) { 643 if (data_sp) { 644 ModuleSpec spec(file); 645 646 const uint32_t sub_type = subTypeFromElfHeader(header); 647 spec.GetArchitecture().SetArchitecture( 648 eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]); 649 650 if (spec.GetArchitecture().IsValid()) { 651 llvm::Triple::OSType ostype; 652 llvm::Triple::VendorType vendor; 653 llvm::Triple::OSType spec_ostype = 654 spec.GetArchitecture().GetTriple().getOS(); 655 656 if (log) 657 log->Printf("ObjectFileELF::%s file '%s' module OSABI: %s", 658 __FUNCTION__, file.GetPath().c_str(), 659 OSABIAsCString(header.e_ident[EI_OSABI])); 660 661 // SetArchitecture should have set the vendor to unknown 662 vendor = spec.GetArchitecture().GetTriple().getVendor(); 663 assert(vendor == llvm::Triple::UnknownVendor); 664 UNUSED_IF_ASSERT_DISABLED(vendor); 665 666 // 667 // Validate it is ok to remove GetOsFromOSABI 668 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype); 669 assert(spec_ostype == ostype); 670 if (spec_ostype != llvm::Triple::OSType::UnknownOS) { 671 if (log) 672 log->Printf("ObjectFileELF::%s file '%s' set ELF module OS type " 673 "from ELF header OSABI.", 674 __FUNCTION__, file.GetPath().c_str()); 675 } 676 677 data_sp = MapFileData(file, -1, file_offset); 678 if (data_sp) 679 data.SetData(data_sp); 680 // In case there is header extension in the section #0, the header we 681 // parsed above could have sentinel values for e_phnum, e_shnum, and 682 // e_shstrndx. In this case we need to reparse the header with a 683 // bigger data source to get the actual values. 684 if (header.HasHeaderExtension()) { 685 lldb::offset_t header_offset = data_offset; 686 header.Parse(data, &header_offset); 687 } 688 689 uint32_t gnu_debuglink_crc = 0; 690 std::string gnu_debuglink_file; 691 SectionHeaderColl section_headers; 692 lldb_private::UUID &uuid = spec.GetUUID(); 693 694 GetSectionHeaderInfo(section_headers, data, header, uuid, 695 gnu_debuglink_file, gnu_debuglink_crc, 696 spec.GetArchitecture()); 697 698 llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple(); 699 700 if (log) 701 log->Printf("ObjectFileELF::%s file '%s' module set to triple: %s " 702 "(architecture %s)", 703 __FUNCTION__, file.GetPath().c_str(), 704 spec_triple.getTriple().c_str(), 705 spec.GetArchitecture().GetArchitectureName()); 706 707 if (!uuid.IsValid()) { 708 uint32_t core_notes_crc = 0; 709 710 if (!gnu_debuglink_crc) { 711 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); 712 lldb_private::Timer scoped_timer( 713 func_cat, 714 "Calculating module crc32 %s with size %" PRIu64 " KiB", 715 file.GetLastPathComponent().AsCString(), 716 (file.GetByteSize() - file_offset) / 1024); 717 718 // For core files - which usually don't happen to have a 719 // gnu_debuglink, and are pretty bulky - calculating whole 720 // contents crc32 would be too much of luxury. Thus we will need 721 // to fallback to something simpler. 722 if (header.e_type == llvm::ELF::ET_CORE) { 723 ProgramHeaderColl program_headers; 724 GetProgramHeaderInfo(program_headers, data, header); 725 726 core_notes_crc = 727 CalculateELFNotesSegmentsCRC32(program_headers, data); 728 } else { 729 gnu_debuglink_crc = calc_gnu_debuglink_crc32( 730 data.GetDataStart(), data.GetByteSize()); 731 } 732 } 733 if (gnu_debuglink_crc) { 734 // Use 4 bytes of crc from the .gnu_debuglink section. 735 uint32_t uuidt[4] = {gnu_debuglink_crc, 0, 0, 0}; 736 uuid.SetBytes(uuidt, sizeof(uuidt)); 737 } else if (core_notes_crc) { 738 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make 739 // it look different form .gnu_debuglink crc followed by 4 bytes 740 // of note segments crc. 741 uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0}; 742 uuid.SetBytes(uuidt, sizeof(uuidt)); 743 } 744 } 745 746 specs.Append(spec); 747 } 748 } 749 } 750 } 751 752 return specs.GetSize() - initial_count; 753 } 754 755 //------------------------------------------------------------------ 756 // PluginInterface protocol 757 //------------------------------------------------------------------ 758 lldb_private::ConstString ObjectFileELF::GetPluginName() { 759 return GetPluginNameStatic(); 760 } 761 762 uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; } 763 //------------------------------------------------------------------ 764 // ObjectFile protocol 765 //------------------------------------------------------------------ 766 767 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp, 768 DataBufferSP &data_sp, lldb::offset_t data_offset, 769 const FileSpec *file, lldb::offset_t file_offset, 770 lldb::offset_t length) 771 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset), 772 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0), 773 m_program_headers(), m_section_headers(), m_dynamic_symbols(), 774 m_filespec_ap(), m_entry_point_address(), m_arch_spec() { 775 if (file) 776 m_file = *file; 777 ::memset(&m_header, 0, sizeof(m_header)); 778 } 779 780 ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp, 781 DataBufferSP &header_data_sp, 782 const lldb::ProcessSP &process_sp, 783 addr_t header_addr) 784 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp), 785 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0), 786 m_program_headers(), m_section_headers(), m_dynamic_symbols(), 787 m_filespec_ap(), m_entry_point_address(), m_arch_spec() { 788 ::memset(&m_header, 0, sizeof(m_header)); 789 } 790 791 ObjectFileELF::~ObjectFileELF() {} 792 793 bool ObjectFileELF::IsExecutable() const { 794 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0); 795 } 796 797 bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value, 798 bool value_is_offset) { 799 ModuleSP module_sp = GetModule(); 800 if (module_sp) { 801 size_t num_loaded_sections = 0; 802 SectionList *section_list = GetSectionList(); 803 if (section_list) { 804 if (!value_is_offset) { 805 bool found_offset = false; 806 for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) { 807 const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i); 808 if (header == nullptr) 809 continue; 810 811 if (header->p_type != PT_LOAD || header->p_offset != 0) 812 continue; 813 814 value = value - header->p_vaddr; 815 found_offset = true; 816 break; 817 } 818 if (!found_offset) 819 return false; 820 } 821 822 const size_t num_sections = section_list->GetSize(); 823 size_t sect_idx = 0; 824 825 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) { 826 // Iterate through the object file sections to find all of the sections 827 // that have SHF_ALLOC in their flag bits. 828 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx)); 829 if (section_sp && section_sp->Test(SHF_ALLOC)) { 830 lldb::addr_t load_addr = section_sp->GetFileAddress(); 831 // We don't want to update the load address of a section with type 832 // eSectionTypeAbsoluteAddress as they already have the absolute load 833 // address already specified 834 if (section_sp->GetType() != eSectionTypeAbsoluteAddress) 835 load_addr += value; 836 837 // On 32-bit systems the load address have to fit into 4 bytes. The 838 // rest of the bytes are the overflow from the addition. 839 if (GetAddressByteSize() == 4) 840 load_addr &= 0xFFFFFFFF; 841 842 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp, 843 load_addr)) 844 ++num_loaded_sections; 845 } 846 } 847 return num_loaded_sections > 0; 848 } 849 } 850 return false; 851 } 852 853 ByteOrder ObjectFileELF::GetByteOrder() const { 854 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB) 855 return eByteOrderBig; 856 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB) 857 return eByteOrderLittle; 858 return eByteOrderInvalid; 859 } 860 861 uint32_t ObjectFileELF::GetAddressByteSize() const { 862 return m_data.GetAddressByteSize(); 863 } 864 865 AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) { 866 Symtab *symtab = GetSymtab(); 867 if (!symtab) 868 return eAddressClassUnknown; 869 870 // The address class is determined based on the symtab. Ask it from the 871 // object file what contains the symtab information. 872 ObjectFile *symtab_objfile = symtab->GetObjectFile(); 873 if (symtab_objfile != nullptr && symtab_objfile != this) 874 return symtab_objfile->GetAddressClass(file_addr); 875 876 auto res = ObjectFile::GetAddressClass(file_addr); 877 if (res != eAddressClassCode) 878 return res; 879 880 auto ub = m_address_class_map.upper_bound(file_addr); 881 if (ub == m_address_class_map.begin()) { 882 // No entry in the address class map before the address. Return default 883 // address class for an address in a code section. 884 return eAddressClassCode; 885 } 886 887 // Move iterator to the address class entry preceding address 888 --ub; 889 890 return ub->second; 891 } 892 893 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) { 894 return std::distance(m_section_headers.begin(), I) + 1u; 895 } 896 897 size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const { 898 return std::distance(m_section_headers.begin(), I) + 1u; 899 } 900 901 bool ObjectFileELF::ParseHeader() { 902 lldb::offset_t offset = 0; 903 return m_header.Parse(m_data, &offset); 904 } 905 906 bool ObjectFileELF::GetUUID(lldb_private::UUID *uuid) { 907 // Need to parse the section list to get the UUIDs, so make sure that's been 908 // done. 909 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile) 910 return false; 911 912 if (m_uuid.IsValid()) { 913 // We have the full build id uuid. 914 *uuid = m_uuid; 915 return true; 916 } else if (GetType() == ObjectFile::eTypeCoreFile) { 917 uint32_t core_notes_crc = 0; 918 919 if (!ParseProgramHeaders()) 920 return false; 921 922 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data); 923 924 if (core_notes_crc) { 925 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look 926 // different form .gnu_debuglink crc - followed by 4 bytes of note 927 // segments crc. 928 uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0}; 929 m_uuid.SetBytes(uuidt, sizeof(uuidt)); 930 } 931 } else { 932 if (!m_gnu_debuglink_crc) 933 m_gnu_debuglink_crc = 934 calc_gnu_debuglink_crc32(m_data.GetDataStart(), m_data.GetByteSize()); 935 if (m_gnu_debuglink_crc) { 936 // Use 4 bytes of crc from the .gnu_debuglink section. 937 uint32_t uuidt[4] = {m_gnu_debuglink_crc, 0, 0, 0}; 938 m_uuid.SetBytes(uuidt, sizeof(uuidt)); 939 } 940 } 941 942 if (m_uuid.IsValid()) { 943 *uuid = m_uuid; 944 return true; 945 } 946 947 return false; 948 } 949 950 lldb_private::FileSpecList ObjectFileELF::GetDebugSymbolFilePaths() { 951 FileSpecList file_spec_list; 952 953 if (!m_gnu_debuglink_file.empty()) { 954 FileSpec file_spec(m_gnu_debuglink_file, false); 955 file_spec_list.Append(file_spec); 956 } 957 return file_spec_list; 958 } 959 960 uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) { 961 size_t num_modules = ParseDependentModules(); 962 uint32_t num_specs = 0; 963 964 for (unsigned i = 0; i < num_modules; ++i) { 965 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i))) 966 num_specs++; 967 } 968 969 return num_specs; 970 } 971 972 Address ObjectFileELF::GetImageInfoAddress(Target *target) { 973 if (!ParseDynamicSymbols()) 974 return Address(); 975 976 SectionList *section_list = GetSectionList(); 977 if (!section_list) 978 return Address(); 979 980 // Find the SHT_DYNAMIC (.dynamic) section. 981 SectionSP dynsym_section_sp( 982 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)); 983 if (!dynsym_section_sp) 984 return Address(); 985 assert(dynsym_section_sp->GetObjectFile() == this); 986 987 user_id_t dynsym_id = dynsym_section_sp->GetID(); 988 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id); 989 if (!dynsym_hdr) 990 return Address(); 991 992 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) { 993 ELFDynamic &symbol = m_dynamic_symbols[i]; 994 995 if (symbol.d_tag == DT_DEBUG) { 996 // Compute the offset as the number of previous entries plus the size of 997 // d_tag. 998 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize(); 999 return Address(dynsym_section_sp, offset); 1000 } 1001 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP 1002 // exists in non-PIE. 1003 else if ((symbol.d_tag == DT_MIPS_RLD_MAP || 1004 symbol.d_tag == DT_MIPS_RLD_MAP_REL) && 1005 target) { 1006 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize(); 1007 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target); 1008 if (dyn_base == LLDB_INVALID_ADDRESS) 1009 return Address(); 1010 1011 Status error; 1012 if (symbol.d_tag == DT_MIPS_RLD_MAP) { 1013 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer. 1014 Address addr; 1015 if (target->ReadPointerFromMemory(dyn_base + offset, false, error, 1016 addr)) 1017 return addr; 1018 } 1019 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) { 1020 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer, 1021 // relative to the address of the tag. 1022 uint64_t rel_offset; 1023 rel_offset = target->ReadUnsignedIntegerFromMemory( 1024 dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error); 1025 if (error.Success() && rel_offset != UINT64_MAX) { 1026 Address addr; 1027 addr_t debug_ptr_address = 1028 dyn_base + (offset - GetAddressByteSize()) + rel_offset; 1029 addr.SetOffset(debug_ptr_address); 1030 return addr; 1031 } 1032 } 1033 } 1034 } 1035 1036 return Address(); 1037 } 1038 1039 lldb_private::Address ObjectFileELF::GetEntryPointAddress() { 1040 if (m_entry_point_address.IsValid()) 1041 return m_entry_point_address; 1042 1043 if (!ParseHeader() || !IsExecutable()) 1044 return m_entry_point_address; 1045 1046 SectionList *section_list = GetSectionList(); 1047 addr_t offset = m_header.e_entry; 1048 1049 if (!section_list) 1050 m_entry_point_address.SetOffset(offset); 1051 else 1052 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list); 1053 return m_entry_point_address; 1054 } 1055 1056 //---------------------------------------------------------------------- 1057 // ParseDependentModules 1058 //---------------------------------------------------------------------- 1059 size_t ObjectFileELF::ParseDependentModules() { 1060 if (m_filespec_ap.get()) 1061 return m_filespec_ap->GetSize(); 1062 1063 m_filespec_ap.reset(new FileSpecList()); 1064 1065 if (!ParseSectionHeaders()) 1066 return 0; 1067 1068 SectionList *section_list = GetSectionList(); 1069 if (!section_list) 1070 return 0; 1071 1072 // Find the SHT_DYNAMIC section. 1073 Section *dynsym = 1074 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true) 1075 .get(); 1076 if (!dynsym) 1077 return 0; 1078 assert(dynsym->GetObjectFile() == this); 1079 1080 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex(dynsym->GetID()); 1081 if (!header) 1082 return 0; 1083 // sh_link: section header index of string table used by entries in the 1084 // section. 1085 Section *dynstr = section_list->FindSectionByID(header->sh_link + 1).get(); 1086 if (!dynstr) 1087 return 0; 1088 1089 DataExtractor dynsym_data; 1090 DataExtractor dynstr_data; 1091 if (ReadSectionData(dynsym, dynsym_data) && 1092 ReadSectionData(dynstr, dynstr_data)) { 1093 ELFDynamic symbol; 1094 const lldb::offset_t section_size = dynsym_data.GetByteSize(); 1095 lldb::offset_t offset = 0; 1096 1097 // The only type of entries we are concerned with are tagged DT_NEEDED, 1098 // yielding the name of a required library. 1099 while (offset < section_size) { 1100 if (!symbol.Parse(dynsym_data, &offset)) 1101 break; 1102 1103 if (symbol.d_tag != DT_NEEDED) 1104 continue; 1105 1106 uint32_t str_index = static_cast<uint32_t>(symbol.d_val); 1107 const char *lib_name = dynstr_data.PeekCStr(str_index); 1108 m_filespec_ap->Append(FileSpec(lib_name, true)); 1109 } 1110 } 1111 1112 return m_filespec_ap->GetSize(); 1113 } 1114 1115 //---------------------------------------------------------------------- 1116 // GetProgramHeaderInfo 1117 //---------------------------------------------------------------------- 1118 size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers, 1119 DataExtractor &object_data, 1120 const ELFHeader &header) { 1121 // We have already parsed the program headers 1122 if (!program_headers.empty()) 1123 return program_headers.size(); 1124 1125 // If there are no program headers to read we are done. 1126 if (header.e_phnum == 0) 1127 return 0; 1128 1129 program_headers.resize(header.e_phnum); 1130 if (program_headers.size() != header.e_phnum) 1131 return 0; 1132 1133 const size_t ph_size = header.e_phnum * header.e_phentsize; 1134 const elf_off ph_offset = header.e_phoff; 1135 DataExtractor data; 1136 if (data.SetData(object_data, ph_offset, ph_size) != ph_size) 1137 return 0; 1138 1139 uint32_t idx; 1140 lldb::offset_t offset; 1141 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) { 1142 if (program_headers[idx].Parse(data, &offset) == false) 1143 break; 1144 } 1145 1146 if (idx < program_headers.size()) 1147 program_headers.resize(idx); 1148 1149 return program_headers.size(); 1150 } 1151 1152 //---------------------------------------------------------------------- 1153 // ParseProgramHeaders 1154 //---------------------------------------------------------------------- 1155 size_t ObjectFileELF::ParseProgramHeaders() { 1156 return GetProgramHeaderInfo(m_program_headers, m_data, m_header); 1157 } 1158 1159 lldb_private::Status 1160 ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data, 1161 lldb_private::ArchSpec &arch_spec, 1162 lldb_private::UUID &uuid) { 1163 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES)); 1164 Status error; 1165 1166 lldb::offset_t offset = 0; 1167 1168 while (true) { 1169 // Parse the note header. If this fails, bail out. 1170 const lldb::offset_t note_offset = offset; 1171 ELFNote note = ELFNote(); 1172 if (!note.Parse(data, &offset)) { 1173 // We're done. 1174 return error; 1175 } 1176 1177 if (log) 1178 log->Printf("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32, 1179 __FUNCTION__, note.n_name.c_str(), note.n_type); 1180 1181 // Process FreeBSD ELF notes. 1182 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) && 1183 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) && 1184 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) { 1185 // Pull out the min version info. 1186 uint32_t version_info; 1187 if (data.GetU32(&offset, &version_info, 1) == nullptr) { 1188 error.SetErrorString("failed to read FreeBSD ABI note payload"); 1189 return error; 1190 } 1191 1192 // Convert the version info into a major/minor number. 1193 const uint32_t version_major = version_info / 100000; 1194 const uint32_t version_minor = (version_info / 1000) % 100; 1195 1196 char os_name[32]; 1197 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32, 1198 version_major, version_minor); 1199 1200 // Set the elf OS version to FreeBSD. Also clear the vendor. 1201 arch_spec.GetTriple().setOSName(os_name); 1202 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1203 1204 if (log) 1205 log->Printf("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32 1206 ".%" PRIu32, 1207 __FUNCTION__, version_major, version_minor, 1208 static_cast<uint32_t>(version_info % 1000)); 1209 } 1210 // Process GNU ELF notes. 1211 else if (note.n_name == LLDB_NT_OWNER_GNU) { 1212 switch (note.n_type) { 1213 case LLDB_NT_GNU_ABI_TAG: 1214 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) { 1215 // Pull out the min OS version supporting the ABI. 1216 uint32_t version_info[4]; 1217 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) == 1218 nullptr) { 1219 error.SetErrorString("failed to read GNU ABI note payload"); 1220 return error; 1221 } 1222 1223 // Set the OS per the OS field. 1224 switch (version_info[0]) { 1225 case LLDB_NT_GNU_ABI_OS_LINUX: 1226 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1227 arch_spec.GetTriple().setVendor( 1228 llvm::Triple::VendorType::UnknownVendor); 1229 if (log) 1230 log->Printf( 1231 "ObjectFileELF::%s detected Linux, min version %" PRIu32 1232 ".%" PRIu32 ".%" PRIu32, 1233 __FUNCTION__, version_info[1], version_info[2], 1234 version_info[3]); 1235 // FIXME we have the minimal version number, we could be propagating 1236 // that. version_info[1] = OS Major, version_info[2] = OS Minor, 1237 // version_info[3] = Revision. 1238 break; 1239 case LLDB_NT_GNU_ABI_OS_HURD: 1240 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS); 1241 arch_spec.GetTriple().setVendor( 1242 llvm::Triple::VendorType::UnknownVendor); 1243 if (log) 1244 log->Printf("ObjectFileELF::%s detected Hurd (unsupported), min " 1245 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32, 1246 __FUNCTION__, version_info[1], version_info[2], 1247 version_info[3]); 1248 break; 1249 case LLDB_NT_GNU_ABI_OS_SOLARIS: 1250 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris); 1251 arch_spec.GetTriple().setVendor( 1252 llvm::Triple::VendorType::UnknownVendor); 1253 if (log) 1254 log->Printf( 1255 "ObjectFileELF::%s detected Solaris, min version %" PRIu32 1256 ".%" PRIu32 ".%" PRIu32, 1257 __FUNCTION__, version_info[1], version_info[2], 1258 version_info[3]); 1259 break; 1260 default: 1261 if (log) 1262 log->Printf( 1263 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32 1264 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32, 1265 __FUNCTION__, version_info[0], version_info[1], 1266 version_info[2], version_info[3]); 1267 break; 1268 } 1269 } 1270 break; 1271 1272 case LLDB_NT_GNU_BUILD_ID_TAG: 1273 // Only bother processing this if we don't already have the uuid set. 1274 if (!uuid.IsValid()) { 1275 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a 1276 // build-id of a different 1277 // length. Accept it as long as it's at least 4 bytes as it will be 1278 // better than our own crc32. 1279 if (note.n_descsz >= 4 && note.n_descsz <= 20) { 1280 uint8_t uuidbuf[20]; 1281 if (data.GetU8(&offset, &uuidbuf, note.n_descsz) == nullptr) { 1282 error.SetErrorString("failed to read GNU_BUILD_ID note payload"); 1283 return error; 1284 } 1285 1286 // Save the build id as the UUID for the module. 1287 uuid.SetBytes(uuidbuf, note.n_descsz); 1288 } 1289 } 1290 break; 1291 } 1292 if (arch_spec.IsMIPS() && 1293 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) 1294 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform 1295 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1296 } 1297 // Process NetBSD ELF notes. 1298 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) && 1299 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) && 1300 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE)) { 1301 // Pull out the min version info. 1302 uint32_t version_info; 1303 if (data.GetU32(&offset, &version_info, 1) == nullptr) { 1304 error.SetErrorString("failed to read NetBSD ABI note payload"); 1305 return error; 1306 } 1307 1308 // Set the elf OS version to NetBSD. Also clear the vendor. 1309 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD); 1310 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1311 1312 if (log) 1313 log->Printf( 1314 "ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32, 1315 __FUNCTION__, version_info); 1316 } 1317 // Process OpenBSD ELF notes. 1318 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) { 1319 // Set the elf OS version to OpenBSD. Also clear the vendor. 1320 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD); 1321 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor); 1322 } 1323 // Process CSR kalimba notes 1324 else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) && 1325 (note.n_name == LLDB_NT_OWNER_CSR)) { 1326 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS); 1327 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR); 1328 1329 // TODO At some point the description string could be processed. 1330 // It could provide a steer towards the kalimba variant which this ELF 1331 // targets. 1332 if (note.n_descsz) { 1333 const char *cstr = 1334 data.GetCStr(&offset, llvm::alignTo(note.n_descsz, 4)); 1335 (void)cstr; 1336 } 1337 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) { 1338 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1339 arch_spec.GetTriple().setEnvironment( 1340 llvm::Triple::EnvironmentType::Android); 1341 } else if (note.n_name == LLDB_NT_OWNER_LINUX) { 1342 // This is sometimes found in core files and usually contains extended 1343 // register info 1344 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1345 } else if (note.n_name == LLDB_NT_OWNER_CORE) { 1346 // Parse the NT_FILE to look for stuff in paths to shared libraries As 1347 // the contents look like this in a 64 bit ELF core file: count = 1348 // 0x000000000000000a (10) page_size = 0x0000000000001000 (4096) Index 1349 // start end file_ofs path ===== 1350 // ------------------ ------------------ ------------------ 1351 // ------------------------------------- [ 0] 0x0000000000400000 1352 // 0x0000000000401000 0x0000000000000000 /tmp/a.out [ 1] 1353 // 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out [ 1354 // 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out 1355 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000 1356 // /lib/x86_64-linux-gnu/libc-2.19.so [ 4] 0x00007fa79cba8000 1357 // 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux- 1358 // gnu/libc-2.19.so [ 5] 0x00007fa79cda7000 0x00007fa79cdab000 1359 // 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so [ 6] 1360 // 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64 1361 // -linux-gnu/libc-2.19.so [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000 1362 // 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so [ 8] 1363 // 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64 1364 // -linux-gnu/ld-2.19.so [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000 1365 // 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so In the 32 bit ELFs 1366 // the count, page_size, start, end, file_ofs are uint32_t For reference: 1367 // see readelf source code (in binutils). 1368 if (note.n_type == NT_FILE) { 1369 uint64_t count = data.GetAddress(&offset); 1370 const char *cstr; 1371 data.GetAddress(&offset); // Skip page size 1372 offset += count * 3 * 1373 data.GetAddressByteSize(); // Skip all start/end/file_ofs 1374 for (size_t i = 0; i < count; ++i) { 1375 cstr = data.GetCStr(&offset); 1376 if (cstr == nullptr) { 1377 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read " 1378 "at an offset after the end " 1379 "(GetCStr returned nullptr)", 1380 __FUNCTION__); 1381 return error; 1382 } 1383 llvm::StringRef path(cstr); 1384 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) { 1385 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1386 break; 1387 } 1388 } 1389 if (arch_spec.IsMIPS() && 1390 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) 1391 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some 1392 // cases (e.g. compile with -nostdlib) Hence set OS to Linux 1393 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux); 1394 } 1395 } 1396 1397 // Calculate the offset of the next note just in case "offset" has been 1398 // used to poke at the contents of the note data 1399 offset = note_offset + note.GetByteSize(); 1400 } 1401 1402 return error; 1403 } 1404 1405 void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length, 1406 ArchSpec &arch_spec) { 1407 lldb::offset_t Offset = 0; 1408 1409 uint8_t FormatVersion = data.GetU8(&Offset); 1410 if (FormatVersion != llvm::ARMBuildAttrs::Format_Version) 1411 return; 1412 1413 Offset = Offset + sizeof(uint32_t); // Section Length 1414 llvm::StringRef VendorName = data.GetCStr(&Offset); 1415 1416 if (VendorName != "aeabi") 1417 return; 1418 1419 if (arch_spec.GetTriple().getEnvironment() == 1420 llvm::Triple::UnknownEnvironment) 1421 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI); 1422 1423 while (Offset < length) { 1424 uint8_t Tag = data.GetU8(&Offset); 1425 uint32_t Size = data.GetU32(&Offset); 1426 1427 if (Tag != llvm::ARMBuildAttrs::File || Size == 0) 1428 continue; 1429 1430 while (Offset < length) { 1431 uint64_t Tag = data.GetULEB128(&Offset); 1432 switch (Tag) { 1433 default: 1434 if (Tag < 32) 1435 data.GetULEB128(&Offset); 1436 else if (Tag % 2 == 0) 1437 data.GetULEB128(&Offset); 1438 else 1439 data.GetCStr(&Offset); 1440 1441 break; 1442 1443 case llvm::ARMBuildAttrs::CPU_raw_name: 1444 case llvm::ARMBuildAttrs::CPU_name: 1445 data.GetCStr(&Offset); 1446 1447 break; 1448 1449 case llvm::ARMBuildAttrs::ABI_VFP_args: { 1450 uint64_t VFPArgs = data.GetULEB128(&Offset); 1451 1452 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) { 1453 if (arch_spec.GetTriple().getEnvironment() == 1454 llvm::Triple::UnknownEnvironment || 1455 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF) 1456 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI); 1457 1458 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float); 1459 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) { 1460 if (arch_spec.GetTriple().getEnvironment() == 1461 llvm::Triple::UnknownEnvironment || 1462 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI) 1463 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF); 1464 1465 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float); 1466 } 1467 1468 break; 1469 } 1470 } 1471 } 1472 } 1473 } 1474 1475 //---------------------------------------------------------------------- 1476 // GetSectionHeaderInfo 1477 //---------------------------------------------------------------------- 1478 size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 1479 DataExtractor &object_data, 1480 const elf::ELFHeader &header, 1481 lldb_private::UUID &uuid, 1482 std::string &gnu_debuglink_file, 1483 uint32_t &gnu_debuglink_crc, 1484 ArchSpec &arch_spec) { 1485 // Don't reparse the section headers if we already did that. 1486 if (!section_headers.empty()) 1487 return section_headers.size(); 1488 1489 // Only initialize the arch_spec to okay defaults if they're not already set. 1490 // We'll refine this with note data as we parse the notes. 1491 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) { 1492 llvm::Triple::OSType ostype; 1493 llvm::Triple::OSType spec_ostype; 1494 const uint32_t sub_type = subTypeFromElfHeader(header); 1495 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type, 1496 header.e_ident[EI_OSABI]); 1497 1498 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is 1499 // determined based on EI_OSABI flag and the info extracted from ELF notes 1500 // (see RefineModuleDetailsFromNote). However in some cases that still 1501 // might be not enough: for example a shared library might not have any 1502 // notes at all and have EI_OSABI flag set to System V, as result the OS 1503 // will be set to UnknownOS. 1504 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype); 1505 spec_ostype = arch_spec.GetTriple().getOS(); 1506 assert(spec_ostype == ostype); 1507 UNUSED_IF_ASSERT_DISABLED(spec_ostype); 1508 } 1509 1510 if (arch_spec.GetMachine() == llvm::Triple::mips || 1511 arch_spec.GetMachine() == llvm::Triple::mipsel || 1512 arch_spec.GetMachine() == llvm::Triple::mips64 || 1513 arch_spec.GetMachine() == llvm::Triple::mips64el) { 1514 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) { 1515 case llvm::ELF::EF_MIPS_MICROMIPS: 1516 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips); 1517 break; 1518 case llvm::ELF::EF_MIPS_ARCH_ASE_M16: 1519 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16); 1520 break; 1521 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX: 1522 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx); 1523 break; 1524 default: 1525 break; 1526 } 1527 } 1528 1529 if (arch_spec.GetMachine() == llvm::Triple::arm || 1530 arch_spec.GetMachine() == llvm::Triple::thumb) { 1531 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT) 1532 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float); 1533 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT) 1534 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float); 1535 } 1536 1537 // If there are no section headers we are done. 1538 if (header.e_shnum == 0) 1539 return 0; 1540 1541 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES)); 1542 1543 section_headers.resize(header.e_shnum); 1544 if (section_headers.size() != header.e_shnum) 1545 return 0; 1546 1547 const size_t sh_size = header.e_shnum * header.e_shentsize; 1548 const elf_off sh_offset = header.e_shoff; 1549 DataExtractor sh_data; 1550 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size) 1551 return 0; 1552 1553 uint32_t idx; 1554 lldb::offset_t offset; 1555 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) { 1556 if (section_headers[idx].Parse(sh_data, &offset) == false) 1557 break; 1558 } 1559 if (idx < section_headers.size()) 1560 section_headers.resize(idx); 1561 1562 const unsigned strtab_idx = header.e_shstrndx; 1563 if (strtab_idx && strtab_idx < section_headers.size()) { 1564 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx]; 1565 const size_t byte_size = sheader.sh_size; 1566 const Elf64_Off offset = sheader.sh_offset; 1567 lldb_private::DataExtractor shstr_data; 1568 1569 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) { 1570 for (SectionHeaderCollIter I = section_headers.begin(); 1571 I != section_headers.end(); ++I) { 1572 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink"); 1573 const ELFSectionHeaderInfo &sheader = *I; 1574 const uint64_t section_size = 1575 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size; 1576 ConstString name(shstr_data.PeekCStr(I->sh_name)); 1577 1578 I->section_name = name; 1579 1580 if (arch_spec.IsMIPS()) { 1581 uint32_t arch_flags = arch_spec.GetFlags(); 1582 DataExtractor data; 1583 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) { 1584 1585 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1586 section_size) == section_size)) { 1587 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section 1588 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0 1589 arch_flags |= data.GetU32(&offset); 1590 1591 // The floating point ABI is at offset 7 1592 offset = 7; 1593 switch (data.GetU8(&offset)) { 1594 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY: 1595 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY; 1596 break; 1597 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE: 1598 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE; 1599 break; 1600 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE: 1601 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE; 1602 break; 1603 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT: 1604 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT; 1605 break; 1606 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64: 1607 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64; 1608 break; 1609 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX: 1610 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX; 1611 break; 1612 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64: 1613 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64; 1614 break; 1615 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A: 1616 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A; 1617 break; 1618 } 1619 } 1620 } 1621 // Settings appropriate ArchSpec ABI Flags 1622 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) { 1623 case llvm::ELF::EF_MIPS_ABI_O32: 1624 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32; 1625 break; 1626 case EF_MIPS_ABI_O64: 1627 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64; 1628 break; 1629 case EF_MIPS_ABI_EABI32: 1630 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32; 1631 break; 1632 case EF_MIPS_ABI_EABI64: 1633 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64; 1634 break; 1635 default: 1636 // ABI Mask doesn't cover N32 and N64 ABI. 1637 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64) 1638 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64; 1639 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2) 1640 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32; 1641 break; 1642 } 1643 arch_spec.SetFlags(arch_flags); 1644 } 1645 1646 if (arch_spec.GetMachine() == llvm::Triple::arm || 1647 arch_spec.GetMachine() == llvm::Triple::thumb) { 1648 DataExtractor data; 1649 1650 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 && 1651 data.SetData(object_data, sheader.sh_offset, section_size) == section_size) 1652 ParseARMAttributes(data, section_size, arch_spec); 1653 } 1654 1655 if (name == g_sect_name_gnu_debuglink) { 1656 DataExtractor data; 1657 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1658 section_size) == section_size)) { 1659 lldb::offset_t gnu_debuglink_offset = 0; 1660 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset); 1661 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4); 1662 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1); 1663 } 1664 } 1665 1666 // Process ELF note section entries. 1667 bool is_note_header = (sheader.sh_type == SHT_NOTE); 1668 1669 // The section header ".note.android.ident" is stored as a 1670 // PROGBITS type header but it is actually a note header. 1671 static ConstString g_sect_name_android_ident(".note.android.ident"); 1672 if (!is_note_header && name == g_sect_name_android_ident) 1673 is_note_header = true; 1674 1675 if (is_note_header) { 1676 // Allow notes to refine module info. 1677 DataExtractor data; 1678 if (section_size && (data.SetData(object_data, sheader.sh_offset, 1679 section_size) == section_size)) { 1680 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid); 1681 if (error.Fail()) { 1682 if (log) 1683 log->Printf("ObjectFileELF::%s ELF note processing failed: %s", 1684 __FUNCTION__, error.AsCString()); 1685 } 1686 } 1687 } 1688 } 1689 1690 // Make any unknown triple components to be unspecified unknowns. 1691 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor) 1692 arch_spec.GetTriple().setVendorName(llvm::StringRef()); 1693 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS) 1694 arch_spec.GetTriple().setOSName(llvm::StringRef()); 1695 1696 return section_headers.size(); 1697 } 1698 } 1699 1700 section_headers.clear(); 1701 return 0; 1702 } 1703 1704 size_t ObjectFileELF::GetProgramHeaderCount() { return ParseProgramHeaders(); } 1705 1706 const elf::ELFProgramHeader * 1707 ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id) { 1708 if (!id || !ParseProgramHeaders()) 1709 return NULL; 1710 1711 if (--id < m_program_headers.size()) 1712 return &m_program_headers[id]; 1713 1714 return NULL; 1715 } 1716 1717 DataExtractor ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id) { 1718 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id); 1719 if (segment_header == NULL) 1720 return DataExtractor(); 1721 return DataExtractor(m_data, segment_header->p_offset, 1722 segment_header->p_filesz); 1723 } 1724 1725 llvm::StringRef 1726 ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const { 1727 size_t pos = symbol_name.find('@'); 1728 return symbol_name.substr(0, pos); 1729 } 1730 1731 //---------------------------------------------------------------------- 1732 // ParseSectionHeaders 1733 //---------------------------------------------------------------------- 1734 size_t ObjectFileELF::ParseSectionHeaders() { 1735 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, 1736 m_gnu_debuglink_file, m_gnu_debuglink_crc, 1737 m_arch_spec); 1738 } 1739 1740 const ObjectFileELF::ELFSectionHeaderInfo * 1741 ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) { 1742 if (!id || !ParseSectionHeaders()) 1743 return NULL; 1744 1745 if (--id < m_section_headers.size()) 1746 return &m_section_headers[id]; 1747 1748 return NULL; 1749 } 1750 1751 lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) { 1752 if (!name || !name[0] || !ParseSectionHeaders()) 1753 return 0; 1754 for (size_t i = 1; i < m_section_headers.size(); ++i) 1755 if (m_section_headers[i].section_name == ConstString(name)) 1756 return i; 1757 return 0; 1758 } 1759 1760 static SectionType getSectionType(llvm::StringRef section_name) { 1761 if (!section_name.startswith(".")) { 1762 return eSectionTypeOther; 1763 } 1764 1765 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, 1766 // http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html 1767 // MISSING? .debug-index - 1768 // http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644 1769 return llvm::StringSwitch<SectionType>(section_name.drop_front(1)) 1770 .Case("text", eSectionTypeCode) 1771 .Case("data", eSectionTypeData) 1772 .Case("bss", eSectionTypeZeroFill) 1773 .Case("tdata", eSectionTypeData) 1774 .Case("tbss", eSectionTypeZeroFill) 1775 // Abbreviations used in the .debug_info section 1776 .Case("debug_abbrev", eSectionTypeDWARFDebugAbbrev) 1777 .Case("debug_abbrev.dwo", eSectionTypeDWARFDebugAbbrev) 1778 .Case("debug_addr", eSectionTypeDWARFDebugAddr) 1779 // Lookup table for mapping addresses to compilation units 1780 .Case("debug_aranges", eSectionTypeDWARFDebugAranges) 1781 .Case("debug_cu_index", eSectionTypeDWARFDebugCuIndex) 1782 // Call frame information 1783 .Case("debug_frame", eSectionTypeDWARFDebugFrame) 1784 // The core DWARF information section 1785 .Case("debug_info", eSectionTypeDWARFDebugInfo) 1786 .Case("debug_info.dwo", eSectionTypeDWARFDebugInfo) 1787 // Line number information 1788 .Case("debug_line", eSectionTypeDWARFDebugLine) 1789 .Case("debug_line.dwo", eSectionTypeDWARFDebugLine) 1790 // Location lists used in DW_AT_location attributes 1791 .Case("debug_loc", eSectionTypeDWARFDebugLoc) 1792 .Case("debug_loc.dwo", eSectionTypeDWARFDebugLoc) 1793 // Macro information 1794 .Case("debug_macinfo", eSectionTypeDWARFDebugMacInfo) 1795 .Case("debug_macro", eSectionTypeDWARFDebugMacro) 1796 .Case("debug_macro.dwo", eSectionTypeDWARFDebugMacro) 1797 // Lookup table for mapping object and function names to compilation units 1798 .Case("debug_pubnames", eSectionTypeDWARFDebugPubNames) 1799 // Lookup table for mapping type names to compilation units 1800 .Case("debug_pubtypes", eSectionTypeDWARFDebugPubTypes) 1801 // Address ranges used in DW_AT_ranges attributes 1802 .Case("debug_ranges", eSectionTypeDWARFDebugRanges) 1803 // String table used in .debug_info 1804 .Case("debug_str", eSectionTypeDWARFDebugStr) 1805 .Case("debug_str.dwo", eSectionTypeDWARFDebugStr) 1806 .Case("debug_str_offsets", eSectionTypeDWARFDebugStrOffsets) 1807 .Case("debug_str_offsets.dwo", eSectionTypeDWARFDebugStrOffsets) 1808 .Case("debug_types", eSectionTypeDWARFDebugTypes) 1809 .Case("gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink) 1810 .Case("eh_frame", eSectionTypeEHFrame) 1811 .Case("ARM.exidx", eSectionTypeARMexidx) 1812 .Case("ARM.extab", eSectionTypeARMextab) 1813 .Case("gosymtab", eSectionTypeGoSymtab) 1814 .Default(eSectionTypeOther); 1815 } 1816 1817 void ObjectFileELF::CreateSections(SectionList &unified_section_list) { 1818 if (!m_sections_ap.get() && ParseSectionHeaders()) { 1819 m_sections_ap.reset(new SectionList()); 1820 1821 // Object files frequently have 0 for every section address, meaning we 1822 // need to compute synthetic addresses in order for "file addresses" from 1823 // different sections to not overlap 1824 bool synthaddrs = (CalculateType() == ObjectFile::Type::eTypeObjectFile); 1825 uint64_t nextaddr = 0; 1826 1827 for (SectionHeaderCollIter I = m_section_headers.begin(); 1828 I != m_section_headers.end(); ++I) { 1829 const ELFSectionHeaderInfo &header = *I; 1830 1831 llvm::StringRef section_name = I->section_name.GetStringRef(); 1832 const uint64_t file_size = 1833 header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 1834 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0; 1835 1836 SectionType sect_type = getSectionType(section_name); 1837 bool is_thread_specific = 1838 section_name.equals(".tdata") || section_name.equals(".tbss"); 1839 1840 const uint32_t permissions = 1841 ((header.sh_flags & SHF_ALLOC) ? ePermissionsReadable : 0u) | 1842 ((header.sh_flags & SHF_WRITE) ? ePermissionsWritable : 0u) | 1843 ((header.sh_flags & SHF_EXECINSTR) ? ePermissionsExecutable : 0u); 1844 switch (header.sh_type) { 1845 case SHT_SYMTAB: 1846 assert(sect_type == eSectionTypeOther); 1847 sect_type = eSectionTypeELFSymbolTable; 1848 break; 1849 case SHT_DYNSYM: 1850 assert(sect_type == eSectionTypeOther); 1851 sect_type = eSectionTypeELFDynamicSymbols; 1852 break; 1853 case SHT_RELA: 1854 case SHT_REL: 1855 assert(sect_type == eSectionTypeOther); 1856 sect_type = eSectionTypeELFRelocationEntries; 1857 break; 1858 case SHT_DYNAMIC: 1859 assert(sect_type == eSectionTypeOther); 1860 sect_type = eSectionTypeELFDynamicLinkInfo; 1861 break; 1862 } 1863 1864 if (eSectionTypeOther == sect_type) { 1865 // the kalimba toolchain assumes that ELF section names are free-form. 1866 // It does support linkscripts which (can) give rise to various 1867 // arbitrarily named sections being "Code" or "Data". 1868 sect_type = kalimbaSectionType(m_header, header); 1869 } 1870 1871 // In common case ELF code section can have arbitrary name (for example, 1872 // we can specify it using section attribute for particular function) so 1873 // assume that section is a code section if it has SHF_EXECINSTR flag set 1874 // and has SHT_PROGBITS type. 1875 if (eSectionTypeOther == sect_type && 1876 llvm::ELF::SHT_PROGBITS == header.sh_type && 1877 (header.sh_flags & SHF_EXECINSTR)) { 1878 sect_type = eSectionTypeCode; 1879 } 1880 1881 const uint32_t target_bytes_size = 1882 (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type) 1883 ? m_arch_spec.GetDataByteSize() 1884 : eSectionTypeCode == sect_type ? m_arch_spec.GetCodeByteSize() 1885 : 1; 1886 elf::elf_xword log2align = 1887 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign); 1888 1889 uint64_t addr = header.sh_addr; 1890 1891 if ((header.sh_flags & SHF_ALLOC) && synthaddrs) { 1892 nextaddr = 1893 (nextaddr + header.sh_addralign - 1) & ~(header.sh_addralign - 1); 1894 addr = nextaddr; 1895 nextaddr += vm_size; 1896 } 1897 1898 SectionSP section_sp(new Section( 1899 GetModule(), // Module to which this section belongs. 1900 this, // ObjectFile to which this section belongs and should read 1901 // section data from. 1902 SectionIndex(I), // Section ID. 1903 I->section_name, // Section name. 1904 sect_type, // Section type. 1905 addr, // VM address. 1906 vm_size, // VM size in bytes of this section. 1907 header.sh_offset, // Offset of this section in the file. 1908 file_size, // Size of the section as found in the file. 1909 log2align, // Alignment of the section 1910 header.sh_flags, // Flags for this section. 1911 target_bytes_size)); // Number of host bytes per target byte 1912 1913 section_sp->SetPermissions(permissions); 1914 if (is_thread_specific) 1915 section_sp->SetIsThreadSpecific(is_thread_specific); 1916 m_sections_ap->AddSection(section_sp); 1917 } 1918 } 1919 1920 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the 1921 // unified section list. 1922 if (GetType() != eTypeDebugInfo) 1923 unified_section_list = *m_sections_ap; 1924 } 1925 1926 // Find the arm/aarch64 mapping symbol character in the given symbol name. 1927 // Mapping symbols have the form of "$<char>[.<any>]*". Additionally we 1928 // recognize cases when the mapping symbol prefixed by an arbitrary string 1929 // because if a symbol prefix added to each symbol in the object file with 1930 // objcopy then the mapping symbols are also prefixed. 1931 static char FindArmAarch64MappingSymbol(const char *symbol_name) { 1932 if (!symbol_name) 1933 return '\0'; 1934 1935 const char *dollar_pos = ::strchr(symbol_name, '$'); 1936 if (!dollar_pos || dollar_pos[1] == '\0') 1937 return '\0'; 1938 1939 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.') 1940 return dollar_pos[1]; 1941 return '\0'; 1942 } 1943 1944 #define STO_MIPS_ISA (3 << 6) 1945 #define STO_MICROMIPS (2 << 6) 1946 #define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS) 1947 1948 // private 1949 unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id, 1950 SectionList *section_list, 1951 const size_t num_symbols, 1952 const DataExtractor &symtab_data, 1953 const DataExtractor &strtab_data) { 1954 ELFSymbol symbol; 1955 lldb::offset_t offset = 0; 1956 1957 static ConstString text_section_name(".text"); 1958 static ConstString init_section_name(".init"); 1959 static ConstString fini_section_name(".fini"); 1960 static ConstString ctors_section_name(".ctors"); 1961 static ConstString dtors_section_name(".dtors"); 1962 1963 static ConstString data_section_name(".data"); 1964 static ConstString rodata_section_name(".rodata"); 1965 static ConstString rodata1_section_name(".rodata1"); 1966 static ConstString data2_section_name(".data1"); 1967 static ConstString bss_section_name(".bss"); 1968 static ConstString opd_section_name(".opd"); // For ppc64 1969 1970 // On Android the oatdata and the oatexec symbols in the oat and odex files 1971 // covers the full .text section what causes issues with displaying unusable 1972 // symbol name to the user and very slow unwinding speed because the 1973 // instruction emulation based unwind plans try to emulate all instructions 1974 // in these symbols. Don't add these symbols to the symbol list as they have 1975 // no use for the debugger and they are causing a lot of trouble. Filtering 1976 // can't be restricted to Android because this special object file don't 1977 // contain the note section specifying the environment to Android but the 1978 // custom extension and file name makes it highly unlikely that this will 1979 // collide with anything else. 1980 ConstString file_extension = m_file.GetFileNameExtension(); 1981 bool skip_oatdata_oatexec = file_extension == ConstString("oat") || 1982 file_extension == ConstString("odex"); 1983 1984 ArchSpec arch; 1985 GetArchitecture(arch); 1986 ModuleSP module_sp(GetModule()); 1987 SectionList *module_section_list = 1988 module_sp ? module_sp->GetSectionList() : nullptr; 1989 1990 // Local cache to avoid doing a FindSectionByName for each symbol. The "const 1991 // char*" key must came from a ConstString object so they can be compared by 1992 // pointer 1993 std::unordered_map<const char *, lldb::SectionSP> section_name_to_section; 1994 1995 unsigned i; 1996 for (i = 0; i < num_symbols; ++i) { 1997 if (symbol.Parse(symtab_data, &offset) == false) 1998 break; 1999 2000 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 2001 if (!symbol_name) 2002 symbol_name = ""; 2003 2004 // No need to add non-section symbols that have no names 2005 if (symbol.getType() != STT_SECTION && 2006 (symbol_name == nullptr || symbol_name[0] == '\0')) 2007 continue; 2008 2009 // Skipping oatdata and oatexec sections if it is requested. See details 2010 // above the definition of skip_oatdata_oatexec for the reasons. 2011 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 || 2012 ::strcmp(symbol_name, "oatexec") == 0)) 2013 continue; 2014 2015 SectionSP symbol_section_sp; 2016 SymbolType symbol_type = eSymbolTypeInvalid; 2017 Elf64_Half section_idx = symbol.st_shndx; 2018 2019 switch (section_idx) { 2020 case SHN_ABS: 2021 symbol_type = eSymbolTypeAbsolute; 2022 break; 2023 case SHN_UNDEF: 2024 symbol_type = eSymbolTypeUndefined; 2025 break; 2026 default: 2027 symbol_section_sp = section_list->GetSectionAtIndex(section_idx); 2028 break; 2029 } 2030 2031 // If a symbol is undefined do not process it further even if it has a STT 2032 // type 2033 if (symbol_type != eSymbolTypeUndefined) { 2034 switch (symbol.getType()) { 2035 default: 2036 case STT_NOTYPE: 2037 // The symbol's type is not specified. 2038 break; 2039 2040 case STT_OBJECT: 2041 // The symbol is associated with a data object, such as a variable, an 2042 // array, etc. 2043 symbol_type = eSymbolTypeData; 2044 break; 2045 2046 case STT_FUNC: 2047 // The symbol is associated with a function or other executable code. 2048 symbol_type = eSymbolTypeCode; 2049 break; 2050 2051 case STT_SECTION: 2052 // The symbol is associated with a section. Symbol table entries of 2053 // this type exist primarily for relocation and normally have STB_LOCAL 2054 // binding. 2055 break; 2056 2057 case STT_FILE: 2058 // Conventionally, the symbol's name gives the name of the source file 2059 // associated with the object file. A file symbol has STB_LOCAL 2060 // binding, its section index is SHN_ABS, and it precedes the other 2061 // STB_LOCAL symbols for the file, if it is present. 2062 symbol_type = eSymbolTypeSourceFile; 2063 break; 2064 2065 case STT_GNU_IFUNC: 2066 // The symbol is associated with an indirect function. The actual 2067 // function will be resolved if it is referenced. 2068 symbol_type = eSymbolTypeResolver; 2069 break; 2070 } 2071 } 2072 2073 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) { 2074 if (symbol_section_sp) { 2075 const ConstString §_name = symbol_section_sp->GetName(); 2076 if (sect_name == text_section_name || sect_name == init_section_name || 2077 sect_name == fini_section_name || sect_name == ctors_section_name || 2078 sect_name == dtors_section_name) { 2079 symbol_type = eSymbolTypeCode; 2080 } else if (sect_name == data_section_name || 2081 sect_name == data2_section_name || 2082 sect_name == rodata_section_name || 2083 sect_name == rodata1_section_name || 2084 sect_name == bss_section_name) { 2085 symbol_type = eSymbolTypeData; 2086 } 2087 } 2088 } 2089 2090 int64_t symbol_value_offset = 0; 2091 uint32_t additional_flags = 0; 2092 2093 if (arch.IsValid()) { 2094 if (arch.GetMachine() == llvm::Triple::arm) { 2095 if (symbol.getBinding() == STB_LOCAL) { 2096 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); 2097 if (symbol_type == eSymbolTypeCode) { 2098 switch (mapping_symbol) { 2099 case 'a': 2100 // $a[.<any>]* - marks an ARM instruction sequence 2101 m_address_class_map[symbol.st_value] = eAddressClassCode; 2102 break; 2103 case 'b': 2104 case 't': 2105 // $b[.<any>]* - marks a THUMB BL instruction sequence 2106 // $t[.<any>]* - marks a THUMB instruction sequence 2107 m_address_class_map[symbol.st_value] = 2108 eAddressClassCodeAlternateISA; 2109 break; 2110 case 'd': 2111 // $d[.<any>]* - marks a data item sequence (e.g. lit pool) 2112 m_address_class_map[symbol.st_value] = eAddressClassData; 2113 break; 2114 } 2115 } 2116 if (mapping_symbol) 2117 continue; 2118 } 2119 } else if (arch.GetMachine() == llvm::Triple::aarch64) { 2120 if (symbol.getBinding() == STB_LOCAL) { 2121 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name); 2122 if (symbol_type == eSymbolTypeCode) { 2123 switch (mapping_symbol) { 2124 case 'x': 2125 // $x[.<any>]* - marks an A64 instruction sequence 2126 m_address_class_map[symbol.st_value] = eAddressClassCode; 2127 break; 2128 case 'd': 2129 // $d[.<any>]* - marks a data item sequence (e.g. lit pool) 2130 m_address_class_map[symbol.st_value] = eAddressClassData; 2131 break; 2132 } 2133 } 2134 if (mapping_symbol) 2135 continue; 2136 } 2137 } 2138 2139 if (arch.GetMachine() == llvm::Triple::arm) { 2140 if (symbol_type == eSymbolTypeCode) { 2141 if (symbol.st_value & 1) { 2142 // Subtracting 1 from the address effectively unsets the low order 2143 // bit, which results in the address actually pointing to the 2144 // beginning of the symbol. This delta will be used below in 2145 // conjunction with symbol.st_value to produce the final 2146 // symbol_value that we store in the symtab. 2147 symbol_value_offset = -1; 2148 m_address_class_map[symbol.st_value ^ 1] = 2149 eAddressClassCodeAlternateISA; 2150 } else { 2151 // This address is ARM 2152 m_address_class_map[symbol.st_value] = eAddressClassCode; 2153 } 2154 } 2155 } 2156 2157 /* 2158 * MIPS: 2159 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for 2160 * MIPS). 2161 * This allows processor to switch between microMIPS and MIPS without any 2162 * need 2163 * for special mode-control register. However, apart from .debug_line, 2164 * none of 2165 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use 2166 * st_other 2167 * flag to check whether the symbol is microMIPS and then set the address 2168 * class 2169 * accordingly. 2170 */ 2171 const llvm::Triple::ArchType llvm_arch = arch.GetMachine(); 2172 if (llvm_arch == llvm::Triple::mips || 2173 llvm_arch == llvm::Triple::mipsel || 2174 llvm_arch == llvm::Triple::mips64 || 2175 llvm_arch == llvm::Triple::mips64el) { 2176 if (IS_MICROMIPS(symbol.st_other)) 2177 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA; 2178 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) { 2179 symbol.st_value = symbol.st_value & (~1ull); 2180 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA; 2181 } else { 2182 if (symbol_type == eSymbolTypeCode) 2183 m_address_class_map[symbol.st_value] = eAddressClassCode; 2184 else if (symbol_type == eSymbolTypeData) 2185 m_address_class_map[symbol.st_value] = eAddressClassData; 2186 else 2187 m_address_class_map[symbol.st_value] = eAddressClassUnknown; 2188 } 2189 } 2190 } 2191 2192 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB 2193 // symbols. See above for more details. 2194 uint64_t symbol_value = symbol.st_value + symbol_value_offset; 2195 2196 if (symbol_section_sp == nullptr && section_idx == SHN_ABS && 2197 symbol.st_size != 0) { 2198 // We don't have a section for a symbol with non-zero size. Create a new 2199 // section for it so the address range covered by the symbol is also 2200 // covered by the module (represented through the section list). It is 2201 // needed so module lookup for the addresses covered by this symbol will 2202 // be successfull. This case happens for absolute symbols. 2203 ConstString fake_section_name(std::string(".absolute.") + symbol_name); 2204 symbol_section_sp = 2205 std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name, 2206 eSectionTypeAbsoluteAddress, symbol_value, 2207 symbol.st_size, 0, 0, 0, SHF_ALLOC); 2208 2209 module_section_list->AddSection(symbol_section_sp); 2210 section_list->AddSection(symbol_section_sp); 2211 } 2212 2213 if (symbol_section_sp && 2214 CalculateType() != ObjectFile::Type::eTypeObjectFile) 2215 symbol_value -= symbol_section_sp->GetFileAddress(); 2216 2217 if (symbol_section_sp && module_section_list && 2218 module_section_list != section_list) { 2219 const ConstString §_name = symbol_section_sp->GetName(); 2220 auto section_it = section_name_to_section.find(sect_name.GetCString()); 2221 if (section_it == section_name_to_section.end()) 2222 section_it = 2223 section_name_to_section 2224 .emplace(sect_name.GetCString(), 2225 module_section_list->FindSectionByName(sect_name)) 2226 .first; 2227 if (section_it->second) 2228 symbol_section_sp = section_it->second; 2229 } 2230 2231 bool is_global = symbol.getBinding() == STB_GLOBAL; 2232 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags; 2233 bool is_mangled = (symbol_name[0] == '_' && symbol_name[1] == 'Z'); 2234 2235 llvm::StringRef symbol_ref(symbol_name); 2236 2237 // Symbol names may contain @VERSION suffixes. Find those and strip them 2238 // temporarily. 2239 size_t version_pos = symbol_ref.find('@'); 2240 bool has_suffix = version_pos != llvm::StringRef::npos; 2241 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos); 2242 Mangled mangled(ConstString(symbol_bare), is_mangled); 2243 2244 // Now append the suffix back to mangled and unmangled names. Only do it if 2245 // the demangling was successful (string is not empty). 2246 if (has_suffix) { 2247 llvm::StringRef suffix = symbol_ref.substr(version_pos); 2248 2249 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef(); 2250 if (!mangled_name.empty()) 2251 mangled.SetMangledName(ConstString((mangled_name + suffix).str())); 2252 2253 ConstString demangled = 2254 mangled.GetDemangledName(lldb::eLanguageTypeUnknown); 2255 llvm::StringRef demangled_name = demangled.GetStringRef(); 2256 if (!demangled_name.empty()) 2257 mangled.SetDemangledName(ConstString((demangled_name + suffix).str())); 2258 } 2259 2260 // In ELF all symbol should have a valid size but it is not true for some 2261 // function symbols coming from hand written assembly. As none of the 2262 // function symbol should have 0 size we try to calculate the size for 2263 // these symbols in the symtab with saying that their original size is not 2264 // valid. 2265 bool symbol_size_valid = 2266 symbol.st_size != 0 || symbol.getType() != STT_FUNC; 2267 2268 Symbol dc_symbol( 2269 i + start_id, // ID is the original symbol table index. 2270 mangled, 2271 symbol_type, // Type of this symbol 2272 is_global, // Is this globally visible? 2273 false, // Is this symbol debug info? 2274 false, // Is this symbol a trampoline? 2275 false, // Is this symbol artificial? 2276 AddressRange(symbol_section_sp, // Section in which this symbol is 2277 // defined or null. 2278 symbol_value, // Offset in section or symbol value. 2279 symbol.st_size), // Size in bytes of this symbol. 2280 symbol_size_valid, // Symbol size is valid 2281 has_suffix, // Contains linker annotations? 2282 flags); // Symbol flags. 2283 symtab->AddSymbol(dc_symbol); 2284 } 2285 return i; 2286 } 2287 2288 unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table, 2289 user_id_t start_id, 2290 lldb_private::Section *symtab) { 2291 if (symtab->GetObjectFile() != this) { 2292 // If the symbol table section is owned by a different object file, have it 2293 // do the parsing. 2294 ObjectFileELF *obj_file_elf = 2295 static_cast<ObjectFileELF *>(symtab->GetObjectFile()); 2296 return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab); 2297 } 2298 2299 // Get section list for this object file. 2300 SectionList *section_list = m_sections_ap.get(); 2301 if (!section_list) 2302 return 0; 2303 2304 user_id_t symtab_id = symtab->GetID(); 2305 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 2306 assert(symtab_hdr->sh_type == SHT_SYMTAB || 2307 symtab_hdr->sh_type == SHT_DYNSYM); 2308 2309 // sh_link: section header index of associated string table. Section ID's are 2310 // ones based. 2311 user_id_t strtab_id = symtab_hdr->sh_link + 1; 2312 Section *strtab = section_list->FindSectionByID(strtab_id).get(); 2313 2314 if (symtab && strtab) { 2315 assert(symtab->GetObjectFile() == this); 2316 assert(strtab->GetObjectFile() == this); 2317 2318 DataExtractor symtab_data; 2319 DataExtractor strtab_data; 2320 if (ReadSectionData(symtab, symtab_data) && 2321 ReadSectionData(strtab, strtab_data)) { 2322 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize; 2323 2324 return ParseSymbols(symbol_table, start_id, section_list, num_symbols, 2325 symtab_data, strtab_data); 2326 } 2327 } 2328 2329 return 0; 2330 } 2331 2332 size_t ObjectFileELF::ParseDynamicSymbols() { 2333 if (m_dynamic_symbols.size()) 2334 return m_dynamic_symbols.size(); 2335 2336 SectionList *section_list = GetSectionList(); 2337 if (!section_list) 2338 return 0; 2339 2340 // Find the SHT_DYNAMIC section. 2341 Section *dynsym = 2342 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true) 2343 .get(); 2344 if (!dynsym) 2345 return 0; 2346 assert(dynsym->GetObjectFile() == this); 2347 2348 ELFDynamic symbol; 2349 DataExtractor dynsym_data; 2350 if (ReadSectionData(dynsym, dynsym_data)) { 2351 const lldb::offset_t section_size = dynsym_data.GetByteSize(); 2352 lldb::offset_t cursor = 0; 2353 2354 while (cursor < section_size) { 2355 if (!symbol.Parse(dynsym_data, &cursor)) 2356 break; 2357 2358 m_dynamic_symbols.push_back(symbol); 2359 } 2360 } 2361 2362 return m_dynamic_symbols.size(); 2363 } 2364 2365 const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) { 2366 if (!ParseDynamicSymbols()) 2367 return NULL; 2368 2369 DynamicSymbolCollIter I = m_dynamic_symbols.begin(); 2370 DynamicSymbolCollIter E = m_dynamic_symbols.end(); 2371 for (; I != E; ++I) { 2372 ELFDynamic *symbol = &*I; 2373 2374 if (symbol->d_tag == tag) 2375 return symbol; 2376 } 2377 2378 return NULL; 2379 } 2380 2381 unsigned ObjectFileELF::PLTRelocationType() { 2382 // DT_PLTREL 2383 // This member specifies the type of relocation entry to which the 2384 // procedure linkage table refers. The d_val member holds DT_REL or 2385 // DT_RELA, as appropriate. All relocations in a procedure linkage table 2386 // must use the same relocation. 2387 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL); 2388 2389 if (symbol) 2390 return symbol->d_val; 2391 2392 return 0; 2393 } 2394 2395 // Returns the size of the normal plt entries and the offset of the first 2396 // normal plt entry. The 0th entry in the plt table is usually a resolution 2397 // entry which have different size in some architectures then the rest of the 2398 // plt entries. 2399 static std::pair<uint64_t, uint64_t> 2400 GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr, 2401 const ELFSectionHeader *plt_hdr) { 2402 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2403 2404 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 2405 // 16 bytes. So round the entsize up by the alignment if addralign is set. 2406 elf_xword plt_entsize = 2407 plt_hdr->sh_addralign 2408 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign) 2409 : plt_hdr->sh_entsize; 2410 2411 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly. 2412 // PLT entries relocation code in general requires multiple instruction and 2413 // should be greater than 4 bytes in most cases. Try to guess correct size 2414 // just in case. 2415 if (plt_entsize <= 4) { 2416 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the 2417 // size of the plt entries based on the number of entries and the size of 2418 // the plt section with the assumption that the size of the 0th entry is at 2419 // least as big as the size of the normal entries and it isn't much bigger 2420 // then that. 2421 if (plt_hdr->sh_addralign) 2422 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign / 2423 (num_relocations + 1) * plt_hdr->sh_addralign; 2424 else 2425 plt_entsize = plt_hdr->sh_size / (num_relocations + 1); 2426 } 2427 2428 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize; 2429 2430 return std::make_pair(plt_entsize, plt_offset); 2431 } 2432 2433 static unsigned ParsePLTRelocations( 2434 Symtab *symbol_table, user_id_t start_id, unsigned rel_type, 2435 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr, 2436 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr, 2437 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data, 2438 DataExtractor &symtab_data, DataExtractor &strtab_data) { 2439 ELFRelocation rel(rel_type); 2440 ELFSymbol symbol; 2441 lldb::offset_t offset = 0; 2442 2443 uint64_t plt_offset, plt_entsize; 2444 std::tie(plt_entsize, plt_offset) = 2445 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr); 2446 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2447 2448 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 2449 reloc_info_fn reloc_type; 2450 reloc_info_fn reloc_symbol; 2451 2452 if (hdr->Is32Bit()) { 2453 reloc_type = ELFRelocation::RelocType32; 2454 reloc_symbol = ELFRelocation::RelocSymbol32; 2455 } else { 2456 reloc_type = ELFRelocation::RelocType64; 2457 reloc_symbol = ELFRelocation::RelocSymbol64; 2458 } 2459 2460 unsigned slot_type = hdr->GetRelocationJumpSlotType(); 2461 unsigned i; 2462 for (i = 0; i < num_relocations; ++i) { 2463 if (rel.Parse(rel_data, &offset) == false) 2464 break; 2465 2466 if (reloc_type(rel) != slot_type) 2467 continue; 2468 2469 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; 2470 if (!symbol.Parse(symtab_data, &symbol_offset)) 2471 break; 2472 2473 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 2474 bool is_mangled = 2475 symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false; 2476 uint64_t plt_index = plt_offset + i * plt_entsize; 2477 2478 Symbol jump_symbol( 2479 i + start_id, // Symbol table index 2480 symbol_name, // symbol name. 2481 is_mangled, // is the symbol name mangled? 2482 eSymbolTypeTrampoline, // Type of this symbol 2483 false, // Is this globally visible? 2484 false, // Is this symbol debug info? 2485 true, // Is this symbol a trampoline? 2486 true, // Is this symbol artificial? 2487 plt_section_sp, // Section in which this symbol is defined or null. 2488 plt_index, // Offset in section or symbol value. 2489 plt_entsize, // Size in bytes of this symbol. 2490 true, // Size is valid 2491 false, // Contains linker annotations? 2492 0); // Symbol flags. 2493 2494 symbol_table->AddSymbol(jump_symbol); 2495 } 2496 2497 return i; 2498 } 2499 2500 unsigned 2501 ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id, 2502 const ELFSectionHeaderInfo *rel_hdr, 2503 user_id_t rel_id) { 2504 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 2505 2506 // The link field points to the associated symbol table. 2507 user_id_t symtab_id = rel_hdr->sh_link; 2508 2509 // If the link field doesn't point to the appropriate symbol name table then 2510 // try to find it by name as some compiler don't fill in the link fields. 2511 if (!symtab_id) 2512 symtab_id = GetSectionIndexByName(".dynsym"); 2513 2514 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers 2515 // point that to the .got.plt or .got section instead of .plt. 2516 user_id_t plt_id = GetSectionIndexByName(".plt"); 2517 2518 if (!symtab_id || !plt_id) 2519 return 0; 2520 2521 // Section ID's are ones based; 2522 symtab_id++; 2523 plt_id++; 2524 2525 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id); 2526 if (!plt_hdr) 2527 return 0; 2528 2529 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id); 2530 if (!sym_hdr) 2531 return 0; 2532 2533 SectionList *section_list = m_sections_ap.get(); 2534 if (!section_list) 2535 return 0; 2536 2537 Section *rel_section = section_list->FindSectionByID(rel_id).get(); 2538 if (!rel_section) 2539 return 0; 2540 2541 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id)); 2542 if (!plt_section_sp) 2543 return 0; 2544 2545 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 2546 if (!symtab) 2547 return 0; 2548 2549 // sh_link points to associated string table. 2550 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get(); 2551 if (!strtab) 2552 return 0; 2553 2554 DataExtractor rel_data; 2555 if (!ReadSectionData(rel_section, rel_data)) 2556 return 0; 2557 2558 DataExtractor symtab_data; 2559 if (!ReadSectionData(symtab, symtab_data)) 2560 return 0; 2561 2562 DataExtractor strtab_data; 2563 if (!ReadSectionData(strtab, strtab_data)) 2564 return 0; 2565 2566 unsigned rel_type = PLTRelocationType(); 2567 if (!rel_type) 2568 return 0; 2569 2570 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header, 2571 rel_hdr, plt_hdr, sym_hdr, plt_section_sp, 2572 rel_data, symtab_data, strtab_data); 2573 } 2574 2575 unsigned ObjectFileELF::ApplyRelocations( 2576 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr, 2577 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr, 2578 DataExtractor &rel_data, DataExtractor &symtab_data, 2579 DataExtractor &debug_data, Section *rel_section) { 2580 ELFRelocation rel(rel_hdr->sh_type); 2581 lldb::addr_t offset = 0; 2582 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 2583 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 2584 reloc_info_fn reloc_type; 2585 reloc_info_fn reloc_symbol; 2586 2587 if (hdr->Is32Bit()) { 2588 reloc_type = ELFRelocation::RelocType32; 2589 reloc_symbol = ELFRelocation::RelocSymbol32; 2590 } else { 2591 reloc_type = ELFRelocation::RelocType64; 2592 reloc_symbol = ELFRelocation::RelocSymbol64; 2593 } 2594 2595 for (unsigned i = 0; i < num_relocations; ++i) { 2596 if (rel.Parse(rel_data, &offset) == false) 2597 break; 2598 2599 Symbol *symbol = NULL; 2600 2601 if (hdr->Is32Bit()) { 2602 switch (reloc_type(rel)) { 2603 case R_386_32: 2604 case R_386_PC32: 2605 default: 2606 // FIXME: This asserts with this input: 2607 // 2608 // foo.cpp 2609 // int main(int argc, char **argv) { return 0; } 2610 // 2611 // clang++.exe --target=i686-unknown-linux-gnu -g -c foo.cpp -o foo.o 2612 // 2613 // and running this on the foo.o module. 2614 assert(false && "unexpected relocation type"); 2615 } 2616 } else { 2617 switch (reloc_type(rel)) { 2618 case R_X86_64_64: { 2619 symbol = symtab->FindSymbolByID(reloc_symbol(rel)); 2620 if (symbol) { 2621 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2622 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2623 uint64_t *dst = reinterpret_cast<uint64_t *>( 2624 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + 2625 ELFRelocation::RelocOffset64(rel)); 2626 *dst = value + ELFRelocation::RelocAddend64(rel); 2627 } 2628 break; 2629 } 2630 case R_X86_64_32: 2631 case R_X86_64_32S: { 2632 symbol = symtab->FindSymbolByID(reloc_symbol(rel)); 2633 if (symbol) { 2634 addr_t value = symbol->GetAddressRef().GetFileAddress(); 2635 value += ELFRelocation::RelocAddend32(rel); 2636 assert( 2637 (reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) || 2638 (reloc_type(rel) == R_X86_64_32S && 2639 ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN))); 2640 uint32_t truncated_addr = (value & 0xFFFFFFFF); 2641 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer(); 2642 uint32_t *dst = reinterpret_cast<uint32_t *>( 2643 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() + 2644 ELFRelocation::RelocOffset32(rel)); 2645 *dst = truncated_addr; 2646 } 2647 break; 2648 } 2649 case R_X86_64_PC32: 2650 default: 2651 assert(false && "unexpected relocation type"); 2652 } 2653 } 2654 } 2655 2656 return 0; 2657 } 2658 2659 unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr, 2660 user_id_t rel_id, 2661 lldb_private::Symtab *thetab) { 2662 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 2663 2664 // Parse in the section list if needed. 2665 SectionList *section_list = GetSectionList(); 2666 if (!section_list) 2667 return 0; 2668 2669 // Section ID's are ones based. 2670 user_id_t symtab_id = rel_hdr->sh_link + 1; 2671 user_id_t debug_id = rel_hdr->sh_info + 1; 2672 2673 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 2674 if (!symtab_hdr) 2675 return 0; 2676 2677 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id); 2678 if (!debug_hdr) 2679 return 0; 2680 2681 Section *rel = section_list->FindSectionByID(rel_id).get(); 2682 if (!rel) 2683 return 0; 2684 2685 Section *symtab = section_list->FindSectionByID(symtab_id).get(); 2686 if (!symtab) 2687 return 0; 2688 2689 Section *debug = section_list->FindSectionByID(debug_id).get(); 2690 if (!debug) 2691 return 0; 2692 2693 DataExtractor rel_data; 2694 DataExtractor symtab_data; 2695 DataExtractor debug_data; 2696 2697 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) && 2698 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) && 2699 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) { 2700 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr, 2701 rel_data, symtab_data, debug_data, debug); 2702 } 2703 2704 return 0; 2705 } 2706 2707 Symtab *ObjectFileELF::GetSymtab() { 2708 ModuleSP module_sp(GetModule()); 2709 if (!module_sp) 2710 return NULL; 2711 2712 // We always want to use the main object file so we (hopefully) only have one 2713 // cached copy of our symtab, dynamic sections, etc. 2714 ObjectFile *module_obj_file = module_sp->GetObjectFile(); 2715 if (module_obj_file && module_obj_file != this) 2716 return module_obj_file->GetSymtab(); 2717 2718 if (m_symtab_ap.get() == NULL) { 2719 SectionList *section_list = module_sp->GetSectionList(); 2720 if (!section_list) 2721 return NULL; 2722 2723 uint64_t symbol_id = 0; 2724 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex()); 2725 2726 // Sharable objects and dynamic executables usually have 2 distinct symbol 2727 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a 2728 // smaller version of the symtab that only contains global symbols. The 2729 // information found in the dynsym is therefore also found in the symtab, 2730 // while the reverse is not necessarily true. 2731 Section *symtab = 2732 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get(); 2733 if (!symtab) { 2734 // The symtab section is non-allocable and can be stripped, so if it 2735 // doesn't exist then use the dynsym section which should always be 2736 // there. 2737 symtab = 2738 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true) 2739 .get(); 2740 } 2741 if (symtab) { 2742 m_symtab_ap.reset(new Symtab(symtab->GetObjectFile())); 2743 symbol_id += ParseSymbolTable(m_symtab_ap.get(), symbol_id, symtab); 2744 } 2745 2746 // DT_JMPREL 2747 // If present, this entry's d_ptr member holds the address of 2748 // relocation 2749 // entries associated solely with the procedure linkage table. 2750 // Separating 2751 // these relocation entries lets the dynamic linker ignore them during 2752 // process initialization, if lazy binding is enabled. If this entry is 2753 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must 2754 // also be present. 2755 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL); 2756 if (symbol) { 2757 // Synthesize trampoline symbols to help navigate the PLT. 2758 addr_t addr = symbol->d_ptr; 2759 Section *reloc_section = 2760 section_list->FindSectionContainingFileAddress(addr).get(); 2761 if (reloc_section) { 2762 user_id_t reloc_id = reloc_section->GetID(); 2763 const ELFSectionHeaderInfo *reloc_header = 2764 GetSectionHeaderByIndex(reloc_id); 2765 assert(reloc_header); 2766 2767 if (m_symtab_ap == nullptr) 2768 m_symtab_ap.reset(new Symtab(reloc_section->GetObjectFile())); 2769 2770 ParseTrampolineSymbols(m_symtab_ap.get(), symbol_id, reloc_header, 2771 reloc_id); 2772 } 2773 } 2774 2775 DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo(); 2776 if (eh_frame) { 2777 if (m_symtab_ap == nullptr) 2778 m_symtab_ap.reset(new Symtab(this)); 2779 ParseUnwindSymbols(m_symtab_ap.get(), eh_frame); 2780 } 2781 2782 // If we still don't have any symtab then create an empty instance to avoid 2783 // do the section lookup next time. 2784 if (m_symtab_ap == nullptr) 2785 m_symtab_ap.reset(new Symtab(this)); 2786 2787 m_symtab_ap->CalculateSymbolSizes(); 2788 } 2789 2790 return m_symtab_ap.get(); 2791 } 2792 2793 void ObjectFileELF::RelocateSection(lldb_private::Section *section) 2794 { 2795 static const llvm::StringRef debug_prefix(".debug"); 2796 2797 // Set relocated bit so we stop getting called, regardless of whether we 2798 // actually relocate. 2799 section->SetIsRelocated(true); 2800 2801 // We only relocate in ELF relocatable files 2802 if (CalculateType() != eTypeObjectFile) 2803 return; 2804 2805 llvm::StringRef section_name = section->GetName().GetStringRef(); 2806 // Can't relocate that which can't be named 2807 if (section_name.empty()) 2808 return; 2809 2810 // We don't relocate non-debug sections at the moment 2811 if (section_name.startswith(debug_prefix)) 2812 return; 2813 2814 // Relocation section names to look for 2815 std::string needle = std::string(".rel") + section_name.str(); 2816 std::string needlea = std::string(".rela") + section_name.str(); 2817 2818 for (SectionHeaderCollIter I = m_section_headers.begin(); 2819 I != m_section_headers.end(); ++I) { 2820 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) { 2821 const char *hay_name = I->section_name.GetCString(); 2822 if (hay_name == nullptr) 2823 continue; 2824 if (needle == hay_name || needlea == hay_name) { 2825 const ELFSectionHeader &reloc_header = *I; 2826 user_id_t reloc_id = SectionIndex(I); 2827 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab()); 2828 break; 2829 } 2830 } 2831 } 2832 } 2833 2834 void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table, 2835 DWARFCallFrameInfo *eh_frame) { 2836 SectionList *section_list = GetSectionList(); 2837 if (!section_list) 2838 return; 2839 2840 // First we save the new symbols into a separate list and add them to the 2841 // symbol table after we colleced all symbols we want to add. This is 2842 // necessary because adding a new symbol invalidates the internal index of 2843 // the symtab what causing the next lookup to be slow because it have to 2844 // recalculate the index first. 2845 std::vector<Symbol> new_symbols; 2846 2847 eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols]( 2848 lldb::addr_t file_addr, uint32_t size, dw_offset_t) { 2849 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr); 2850 if (symbol) { 2851 if (!symbol->GetByteSizeIsValid()) { 2852 symbol->SetByteSize(size); 2853 symbol->SetSizeIsSynthesized(true); 2854 } 2855 } else { 2856 SectionSP section_sp = 2857 section_list->FindSectionContainingFileAddress(file_addr); 2858 if (section_sp) { 2859 addr_t offset = file_addr - section_sp->GetFileAddress(); 2860 const char *symbol_name = GetNextSyntheticSymbolName().GetCString(); 2861 uint64_t symbol_id = symbol_table->GetNumSymbols(); 2862 Symbol eh_symbol( 2863 symbol_id, // Symbol table index. 2864 symbol_name, // Symbol name. 2865 false, // Is the symbol name mangled? 2866 eSymbolTypeCode, // Type of this symbol. 2867 true, // Is this globally visible? 2868 false, // Is this symbol debug info? 2869 false, // Is this symbol a trampoline? 2870 true, // Is this symbol artificial? 2871 section_sp, // Section in which this symbol is defined or null. 2872 offset, // Offset in section or symbol value. 2873 0, // Size: Don't specify the size as an FDE can 2874 false, // Size is valid: cover multiple symbols. 2875 false, // Contains linker annotations? 2876 0); // Symbol flags. 2877 new_symbols.push_back(eh_symbol); 2878 } 2879 } 2880 return true; 2881 }); 2882 2883 for (const Symbol &s : new_symbols) 2884 symbol_table->AddSymbol(s); 2885 } 2886 2887 bool ObjectFileELF::IsStripped() { 2888 // TODO: determine this for ELF 2889 return false; 2890 } 2891 2892 //===----------------------------------------------------------------------===// 2893 // Dump 2894 // 2895 // Dump the specifics of the runtime file container (such as any headers 2896 // segments, sections, etc). 2897 //---------------------------------------------------------------------- 2898 void ObjectFileELF::Dump(Stream *s) { 2899 ModuleSP module_sp(GetModule()); 2900 if (!module_sp) { 2901 return; 2902 } 2903 2904 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex()); 2905 s->Printf("%p: ", static_cast<void *>(this)); 2906 s->Indent(); 2907 s->PutCString("ObjectFileELF"); 2908 2909 ArchSpec header_arch; 2910 GetArchitecture(header_arch); 2911 2912 *s << ", file = '" << m_file 2913 << "', arch = " << header_arch.GetArchitectureName() << "\n"; 2914 2915 DumpELFHeader(s, m_header); 2916 s->EOL(); 2917 DumpELFProgramHeaders(s); 2918 s->EOL(); 2919 DumpELFSectionHeaders(s); 2920 s->EOL(); 2921 SectionList *section_list = GetSectionList(); 2922 if (section_list) 2923 section_list->Dump(s, NULL, true, UINT32_MAX); 2924 Symtab *symtab = GetSymtab(); 2925 if (symtab) 2926 symtab->Dump(s, NULL, eSortOrderNone); 2927 s->EOL(); 2928 DumpDependentModules(s); 2929 s->EOL(); 2930 } 2931 2932 //---------------------------------------------------------------------- 2933 // DumpELFHeader 2934 // 2935 // Dump the ELF header to the specified output stream 2936 //---------------------------------------------------------------------- 2937 void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) { 2938 s->PutCString("ELF Header\n"); 2939 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]); 2940 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1], 2941 header.e_ident[EI_MAG1]); 2942 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2], 2943 header.e_ident[EI_MAG2]); 2944 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3], 2945 header.e_ident[EI_MAG3]); 2946 2947 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]); 2948 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]); 2949 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]); 2950 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]); 2951 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]); 2952 2953 s->Printf("e_type = 0x%4.4x ", header.e_type); 2954 DumpELFHeader_e_type(s, header.e_type); 2955 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine); 2956 s->Printf("e_version = 0x%8.8x\n", header.e_version); 2957 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry); 2958 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff); 2959 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff); 2960 s->Printf("e_flags = 0x%8.8x\n", header.e_flags); 2961 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize); 2962 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize); 2963 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum); 2964 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize); 2965 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum); 2966 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx); 2967 } 2968 2969 //---------------------------------------------------------------------- 2970 // DumpELFHeader_e_type 2971 // 2972 // Dump an token value for the ELF header member e_type 2973 //---------------------------------------------------------------------- 2974 void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) { 2975 switch (e_type) { 2976 case ET_NONE: 2977 *s << "ET_NONE"; 2978 break; 2979 case ET_REL: 2980 *s << "ET_REL"; 2981 break; 2982 case ET_EXEC: 2983 *s << "ET_EXEC"; 2984 break; 2985 case ET_DYN: 2986 *s << "ET_DYN"; 2987 break; 2988 case ET_CORE: 2989 *s << "ET_CORE"; 2990 break; 2991 default: 2992 break; 2993 } 2994 } 2995 2996 //---------------------------------------------------------------------- 2997 // DumpELFHeader_e_ident_EI_DATA 2998 // 2999 // Dump an token value for the ELF header member e_ident[EI_DATA] 3000 //---------------------------------------------------------------------- 3001 void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, 3002 unsigned char ei_data) { 3003 switch (ei_data) { 3004 case ELFDATANONE: 3005 *s << "ELFDATANONE"; 3006 break; 3007 case ELFDATA2LSB: 3008 *s << "ELFDATA2LSB - Little Endian"; 3009 break; 3010 case ELFDATA2MSB: 3011 *s << "ELFDATA2MSB - Big Endian"; 3012 break; 3013 default: 3014 break; 3015 } 3016 } 3017 3018 //---------------------------------------------------------------------- 3019 // DumpELFProgramHeader 3020 // 3021 // Dump a single ELF program header to the specified output stream 3022 //---------------------------------------------------------------------- 3023 void ObjectFileELF::DumpELFProgramHeader(Stream *s, 3024 const ELFProgramHeader &ph) { 3025 DumpELFProgramHeader_p_type(s, ph.p_type); 3026 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, 3027 ph.p_vaddr, ph.p_paddr); 3028 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, 3029 ph.p_flags); 3030 3031 DumpELFProgramHeader_p_flags(s, ph.p_flags); 3032 s->Printf(") %8.8" PRIx64, ph.p_align); 3033 } 3034 3035 //---------------------------------------------------------------------- 3036 // DumpELFProgramHeader_p_type 3037 // 3038 // Dump an token value for the ELF program header member p_type which describes 3039 // the type of the program header 3040 // ---------------------------------------------------------------------- 3041 void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) { 3042 const int kStrWidth = 15; 3043 switch (p_type) { 3044 CASE_AND_STREAM(s, PT_NULL, kStrWidth); 3045 CASE_AND_STREAM(s, PT_LOAD, kStrWidth); 3046 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth); 3047 CASE_AND_STREAM(s, PT_INTERP, kStrWidth); 3048 CASE_AND_STREAM(s, PT_NOTE, kStrWidth); 3049 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth); 3050 CASE_AND_STREAM(s, PT_PHDR, kStrWidth); 3051 CASE_AND_STREAM(s, PT_TLS, kStrWidth); 3052 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth); 3053 default: 3054 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, ""); 3055 break; 3056 } 3057 } 3058 3059 //---------------------------------------------------------------------- 3060 // DumpELFProgramHeader_p_flags 3061 // 3062 // Dump an token value for the ELF program header member p_flags 3063 //---------------------------------------------------------------------- 3064 void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) { 3065 *s << ((p_flags & PF_X) ? "PF_X" : " ") 3066 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ') 3067 << ((p_flags & PF_W) ? "PF_W" : " ") 3068 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ') 3069 << ((p_flags & PF_R) ? "PF_R" : " "); 3070 } 3071 3072 //---------------------------------------------------------------------- 3073 // DumpELFProgramHeaders 3074 // 3075 // Dump all of the ELF program header to the specified output stream 3076 //---------------------------------------------------------------------- 3077 void ObjectFileELF::DumpELFProgramHeaders(Stream *s) { 3078 if (!ParseProgramHeaders()) 3079 return; 3080 3081 s->PutCString("Program Headers\n"); 3082 s->PutCString("IDX p_type p_offset p_vaddr p_paddr " 3083 "p_filesz p_memsz p_flags p_align\n"); 3084 s->PutCString("==== --------------- -------- -------- -------- " 3085 "-------- -------- ------------------------- --------\n"); 3086 3087 uint32_t idx = 0; 3088 for (ProgramHeaderCollConstIter I = m_program_headers.begin(); 3089 I != m_program_headers.end(); ++I, ++idx) { 3090 s->Printf("[%2u] ", idx); 3091 ObjectFileELF::DumpELFProgramHeader(s, *I); 3092 s->EOL(); 3093 } 3094 } 3095 3096 //---------------------------------------------------------------------- 3097 // DumpELFSectionHeader 3098 // 3099 // Dump a single ELF section header to the specified output stream 3100 //---------------------------------------------------------------------- 3101 void ObjectFileELF::DumpELFSectionHeader(Stream *s, 3102 const ELFSectionHeaderInfo &sh) { 3103 s->Printf("%8.8x ", sh.sh_name); 3104 DumpELFSectionHeader_sh_type(s, sh.sh_type); 3105 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags); 3106 DumpELFSectionHeader_sh_flags(s, sh.sh_flags); 3107 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, 3108 sh.sh_offset, sh.sh_size); 3109 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info); 3110 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize); 3111 } 3112 3113 //---------------------------------------------------------------------- 3114 // DumpELFSectionHeader_sh_type 3115 // 3116 // Dump an token value for the ELF section header member sh_type which 3117 // describes the type of the section 3118 //---------------------------------------------------------------------- 3119 void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) { 3120 const int kStrWidth = 12; 3121 switch (sh_type) { 3122 CASE_AND_STREAM(s, SHT_NULL, kStrWidth); 3123 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth); 3124 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth); 3125 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth); 3126 CASE_AND_STREAM(s, SHT_RELA, kStrWidth); 3127 CASE_AND_STREAM(s, SHT_HASH, kStrWidth); 3128 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth); 3129 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth); 3130 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth); 3131 CASE_AND_STREAM(s, SHT_REL, kStrWidth); 3132 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth); 3133 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth); 3134 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth); 3135 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth); 3136 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth); 3137 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth); 3138 default: 3139 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, ""); 3140 break; 3141 } 3142 } 3143 3144 //---------------------------------------------------------------------- 3145 // DumpELFSectionHeader_sh_flags 3146 // 3147 // Dump an token value for the ELF section header member sh_flags 3148 //---------------------------------------------------------------------- 3149 void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, 3150 elf_xword sh_flags) { 3151 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ") 3152 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ') 3153 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ") 3154 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ') 3155 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " "); 3156 } 3157 3158 //---------------------------------------------------------------------- 3159 // DumpELFSectionHeaders 3160 // 3161 // Dump all of the ELF section header to the specified output stream 3162 //---------------------------------------------------------------------- 3163 void ObjectFileELF::DumpELFSectionHeaders(Stream *s) { 3164 if (!ParseSectionHeaders()) 3165 return; 3166 3167 s->PutCString("Section Headers\n"); 3168 s->PutCString("IDX name type flags " 3169 "addr offset size link info addralgn " 3170 "entsize Name\n"); 3171 s->PutCString("==== -------- ------------ -------------------------------- " 3172 "-------- -------- -------- -------- -------- -------- " 3173 "-------- ====================\n"); 3174 3175 uint32_t idx = 0; 3176 for (SectionHeaderCollConstIter I = m_section_headers.begin(); 3177 I != m_section_headers.end(); ++I, ++idx) { 3178 s->Printf("[%2u] ", idx); 3179 ObjectFileELF::DumpELFSectionHeader(s, *I); 3180 const char *section_name = I->section_name.AsCString(""); 3181 if (section_name) 3182 *s << ' ' << section_name << "\n"; 3183 } 3184 } 3185 3186 void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) { 3187 size_t num_modules = ParseDependentModules(); 3188 3189 if (num_modules > 0) { 3190 s->PutCString("Dependent Modules:\n"); 3191 for (unsigned i = 0; i < num_modules; ++i) { 3192 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i); 3193 s->Printf(" %s\n", spec.GetFilename().GetCString()); 3194 } 3195 } 3196 } 3197 3198 bool ObjectFileELF::GetArchitecture(ArchSpec &arch) { 3199 if (!ParseHeader()) 3200 return false; 3201 3202 if (m_section_headers.empty()) { 3203 // Allow elf notes to be parsed which may affect the detected architecture. 3204 ParseSectionHeaders(); 3205 } 3206 3207 if (CalculateType() == eTypeCoreFile && 3208 m_arch_spec.TripleOSIsUnspecifiedUnknown()) { 3209 // Core files don't have section headers yet they have PT_NOTE program 3210 // headers that might shed more light on the architecture 3211 if (ParseProgramHeaders()) { 3212 for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) { 3213 const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i); 3214 if (header && header->p_type == PT_NOTE && header->p_offset != 0 && 3215 header->p_filesz > 0) { 3216 DataExtractor data; 3217 if (data.SetData(m_data, header->p_offset, header->p_filesz) == 3218 header->p_filesz) { 3219 lldb_private::UUID uuid; 3220 RefineModuleDetailsFromNote(data, m_arch_spec, uuid); 3221 } 3222 } 3223 } 3224 } 3225 } 3226 arch = m_arch_spec; 3227 return true; 3228 } 3229 3230 ObjectFile::Type ObjectFileELF::CalculateType() { 3231 switch (m_header.e_type) { 3232 case llvm::ELF::ET_NONE: 3233 // 0 - No file type 3234 return eTypeUnknown; 3235 3236 case llvm::ELF::ET_REL: 3237 // 1 - Relocatable file 3238 return eTypeObjectFile; 3239 3240 case llvm::ELF::ET_EXEC: 3241 // 2 - Executable file 3242 return eTypeExecutable; 3243 3244 case llvm::ELF::ET_DYN: 3245 // 3 - Shared object file 3246 return eTypeSharedLibrary; 3247 3248 case ET_CORE: 3249 // 4 - Core file 3250 return eTypeCoreFile; 3251 3252 default: 3253 break; 3254 } 3255 return eTypeUnknown; 3256 } 3257 3258 ObjectFile::Strata ObjectFileELF::CalculateStrata() { 3259 switch (m_header.e_type) { 3260 case llvm::ELF::ET_NONE: 3261 // 0 - No file type 3262 return eStrataUnknown; 3263 3264 case llvm::ELF::ET_REL: 3265 // 1 - Relocatable file 3266 return eStrataUnknown; 3267 3268 case llvm::ELF::ET_EXEC: 3269 // 2 - Executable file 3270 // TODO: is there any way to detect that an executable is a kernel 3271 // related executable by inspecting the program headers, section headers, 3272 // symbols, or any other flag bits??? 3273 return eStrataUser; 3274 3275 case llvm::ELF::ET_DYN: 3276 // 3 - Shared object file 3277 // TODO: is there any way to detect that an shared library is a kernel 3278 // related executable by inspecting the program headers, section headers, 3279 // symbols, or any other flag bits??? 3280 return eStrataUnknown; 3281 3282 case ET_CORE: 3283 // 4 - Core file 3284 // TODO: is there any way to detect that an core file is a kernel 3285 // related executable by inspecting the program headers, section headers, 3286 // symbols, or any other flag bits??? 3287 return eStrataUnknown; 3288 3289 default: 3290 break; 3291 } 3292 return eStrataUnknown; 3293 } 3294 3295 size_t ObjectFileELF::ReadSectionData(Section *section, 3296 lldb::offset_t section_offset, void *dst, 3297 size_t dst_len) { 3298 // If some other objectfile owns this data, pass this to them. 3299 if (section->GetObjectFile() != this) 3300 return section->GetObjectFile()->ReadSectionData(section, section_offset, 3301 dst, dst_len); 3302 3303 if (!section->Test(SHF_COMPRESSED)) 3304 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len); 3305 3306 // For compressed sections we need to read to full data to be able to 3307 // decompress. 3308 DataExtractor data; 3309 ReadSectionData(section, data); 3310 return data.CopyData(section_offset, dst_len, dst); 3311 } 3312 3313 size_t ObjectFileELF::ReadSectionData(Section *section, 3314 DataExtractor §ion_data) { 3315 // If some other objectfile owns this data, pass this to them. 3316 if (section->GetObjectFile() != this) 3317 return section->GetObjectFile()->ReadSectionData(section, section_data); 3318 3319 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES); 3320 3321 size_t result = ObjectFile::ReadSectionData(section, section_data); 3322 if (result == 0 || !section->Test(SHF_COMPRESSED)) 3323 return result; 3324 3325 auto Decompressor = llvm::object::Decompressor::create( 3326 section->GetName().GetStringRef(), 3327 {reinterpret_cast<const char *>(section_data.GetDataStart()), 3328 size_t(section_data.GetByteSize())}, 3329 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8); 3330 if (!Decompressor) { 3331 LLDB_LOG_ERROR(log, Decompressor.takeError(), 3332 "Unable to initialize decompressor for section {0}", 3333 section->GetName()); 3334 return result; 3335 } 3336 auto buffer_sp = 3337 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0); 3338 if (auto Error = Decompressor->decompress( 3339 {reinterpret_cast<char *>(buffer_sp->GetBytes()), 3340 size_t(buffer_sp->GetByteSize())})) { 3341 LLDB_LOG_ERROR(log, std::move(Error), "Decompression of section {0} failed", 3342 section->GetName()); 3343 return result; 3344 } 3345 section_data.SetData(buffer_sp); 3346 return buffer_sp->GetByteSize(); 3347 } 3348 3349 bool ObjectFileELF::AnySegmentHasPhysicalAddress() { 3350 size_t header_count = ParseProgramHeaders(); 3351 for (size_t i = 1; i <= header_count; ++i) { 3352 auto header = GetProgramHeaderByIndex(i); 3353 if (header->p_paddr != 0) 3354 return true; 3355 } 3356 return false; 3357 } 3358 3359 std::vector<ObjectFile::LoadableData> 3360 ObjectFileELF::GetLoadableData(Target &target) { 3361 // Create a list of loadable data from loadable segments, using physical 3362 // addresses if they aren't all null 3363 std::vector<LoadableData> loadables; 3364 size_t header_count = ParseProgramHeaders(); 3365 bool should_use_paddr = AnySegmentHasPhysicalAddress(); 3366 for (size_t i = 1; i <= header_count; ++i) { 3367 LoadableData loadable; 3368 auto header = GetProgramHeaderByIndex(i); 3369 if (header->p_type != llvm::ELF::PT_LOAD) 3370 continue; 3371 loadable.Dest = should_use_paddr ? header->p_paddr : header->p_vaddr; 3372 if (loadable.Dest == LLDB_INVALID_ADDRESS) 3373 continue; 3374 if (header->p_filesz == 0) 3375 continue; 3376 auto segment_data = GetSegmentDataByIndex(i); 3377 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(), 3378 segment_data.GetByteSize()); 3379 loadables.push_back(loadable); 3380 } 3381 return loadables; 3382 } 3383