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