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