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