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