1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "elf_file.h" 18 19 #include <sys/types.h> 20 #include <unistd.h> 21 22 #include "base/logging.h" 23 #include "base/stringprintf.h" 24 #include "base/stl_util.h" 25 #include "dwarf.h" 26 #include "leb128.h" 27 #include "utils.h" 28 #include "instruction_set.h" 29 30 namespace art { 31 32 // ------------------------------------------------------------------- 33 // Binary GDB JIT Interface as described in 34 // http://sourceware.org/gdb/onlinedocs/gdb/Declarations.html 35 extern "C" { 36 typedef enum { 37 JIT_NOACTION = 0, 38 JIT_REGISTER_FN, 39 JIT_UNREGISTER_FN 40 } JITAction; 41 42 struct JITCodeEntry { 43 JITCodeEntry* next_; 44 JITCodeEntry* prev_; 45 const byte *symfile_addr_; 46 uint64_t symfile_size_; 47 }; 48 49 struct JITDescriptor { 50 uint32_t version_; 51 uint32_t action_flag_; 52 JITCodeEntry* relevant_entry_; 53 JITCodeEntry* first_entry_; 54 }; 55 56 // GDB will place breakpoint into this function. 57 // To prevent GCC from inlining or removing it we place noinline attribute 58 // and inline assembler statement inside. 59 void __attribute__((noinline)) __jit_debug_register_code() { 60 __asm__(""); 61 } 62 63 // GDB will inspect contents of this descriptor. 64 // Static initialization is necessary to prevent GDB from seeing 65 // uninitialized descriptor. 66 JITDescriptor __jit_debug_descriptor = { 1, JIT_NOACTION, nullptr, nullptr }; 67 } 68 69 70 static JITCodeEntry* CreateCodeEntry(const byte *symfile_addr, 71 uintptr_t symfile_size) { 72 JITCodeEntry* entry = new JITCodeEntry; 73 entry->symfile_addr_ = symfile_addr; 74 entry->symfile_size_ = symfile_size; 75 entry->prev_ = nullptr; 76 77 // TODO: Do we need a lock here? 78 entry->next_ = __jit_debug_descriptor.first_entry_; 79 if (entry->next_ != nullptr) { 80 entry->next_->prev_ = entry; 81 } 82 __jit_debug_descriptor.first_entry_ = entry; 83 __jit_debug_descriptor.relevant_entry_ = entry; 84 85 __jit_debug_descriptor.action_flag_ = JIT_REGISTER_FN; 86 __jit_debug_register_code(); 87 return entry; 88 } 89 90 91 static void UnregisterCodeEntry(JITCodeEntry* entry) { 92 // TODO: Do we need a lock here? 93 if (entry->prev_ != nullptr) { 94 entry->prev_->next_ = entry->next_; 95 } else { 96 __jit_debug_descriptor.first_entry_ = entry->next_; 97 } 98 99 if (entry->next_ != nullptr) { 100 entry->next_->prev_ = entry->prev_; 101 } 102 103 __jit_debug_descriptor.relevant_entry_ = entry; 104 __jit_debug_descriptor.action_flag_ = JIT_UNREGISTER_FN; 105 __jit_debug_register_code(); 106 delete entry; 107 } 108 109 ElfFile::ElfFile(File* file, bool writable, bool program_header_only) 110 : file_(file), 111 writable_(writable), 112 program_header_only_(program_header_only), 113 header_(nullptr), 114 base_address_(nullptr), 115 program_headers_start_(nullptr), 116 section_headers_start_(nullptr), 117 dynamic_program_header_(nullptr), 118 dynamic_section_start_(nullptr), 119 symtab_section_start_(nullptr), 120 dynsym_section_start_(nullptr), 121 strtab_section_start_(nullptr), 122 dynstr_section_start_(nullptr), 123 hash_section_start_(nullptr), 124 symtab_symbol_table_(nullptr), 125 dynsym_symbol_table_(nullptr), 126 jit_elf_image_(nullptr), 127 jit_gdb_entry_(nullptr) { 128 CHECK(file != nullptr); 129 } 130 131 ElfFile* ElfFile::Open(File* file, bool writable, bool program_header_only, 132 std::string* error_msg) { 133 std::unique_ptr<ElfFile> elf_file(new ElfFile(file, writable, program_header_only)); 134 int prot; 135 int flags; 136 if (writable) { 137 prot = PROT_READ | PROT_WRITE; 138 flags = MAP_SHARED; 139 } else { 140 prot = PROT_READ; 141 flags = MAP_PRIVATE; 142 } 143 if (!elf_file->Setup(prot, flags, error_msg)) { 144 return nullptr; 145 } 146 return elf_file.release(); 147 } 148 149 ElfFile* ElfFile::Open(File* file, int prot, int flags, std::string* error_msg) { 150 std::unique_ptr<ElfFile> elf_file(new ElfFile(file, (prot & PROT_WRITE) == PROT_WRITE, false)); 151 if (!elf_file->Setup(prot, flags, error_msg)) { 152 return nullptr; 153 } 154 return elf_file.release(); 155 } 156 157 bool ElfFile::Setup(int prot, int flags, std::string* error_msg) { 158 int64_t temp_file_length = file_->GetLength(); 159 if (temp_file_length < 0) { 160 errno = -temp_file_length; 161 *error_msg = StringPrintf("Failed to get length of file: '%s' fd=%d: %s", 162 file_->GetPath().c_str(), file_->Fd(), strerror(errno)); 163 return false; 164 } 165 size_t file_length = static_cast<size_t>(temp_file_length); 166 if (file_length < sizeof(Elf32_Ehdr)) { 167 *error_msg = StringPrintf("File size of %zd bytes not large enough to contain ELF header of " 168 "%zd bytes: '%s'", file_length, sizeof(Elf32_Ehdr), 169 file_->GetPath().c_str()); 170 return false; 171 } 172 173 if (program_header_only_) { 174 // first just map ELF header to get program header size information 175 size_t elf_header_size = sizeof(Elf32_Ehdr); 176 if (!SetMap(MemMap::MapFile(elf_header_size, prot, flags, file_->Fd(), 0, 177 file_->GetPath().c_str(), error_msg), 178 error_msg)) { 179 return false; 180 } 181 // then remap to cover program header 182 size_t program_header_size = header_->e_phoff + (header_->e_phentsize * header_->e_phnum); 183 if (file_length < program_header_size) { 184 *error_msg = StringPrintf("File size of %zd bytes not large enough to contain ELF program " 185 "header of %zd bytes: '%s'", file_length, 186 sizeof(Elf32_Ehdr), file_->GetPath().c_str()); 187 return false; 188 } 189 if (!SetMap(MemMap::MapFile(program_header_size, prot, flags, file_->Fd(), 0, 190 file_->GetPath().c_str(), error_msg), 191 error_msg)) { 192 *error_msg = StringPrintf("Failed to map ELF program headers: %s", error_msg->c_str()); 193 return false; 194 } 195 } else { 196 // otherwise map entire file 197 if (!SetMap(MemMap::MapFile(file_->GetLength(), prot, flags, file_->Fd(), 0, 198 file_->GetPath().c_str(), error_msg), 199 error_msg)) { 200 *error_msg = StringPrintf("Failed to map ELF file: %s", error_msg->c_str()); 201 return false; 202 } 203 } 204 205 if (program_header_only_) { 206 program_headers_start_ = Begin() + GetHeader().e_phoff; 207 } else { 208 if (!CheckAndSet(GetHeader().e_phoff, "program headers", &program_headers_start_, error_msg)) { 209 return false; 210 } 211 212 // Setup section headers. 213 if (!CheckAndSet(GetHeader().e_shoff, "section headers", §ion_headers_start_, error_msg)) { 214 return false; 215 } 216 217 // Find shstrtab. 218 Elf32_Shdr* shstrtab_section_header = GetSectionNameStringSection(); 219 if (shstrtab_section_header == nullptr) { 220 *error_msg = StringPrintf("Failed to find shstrtab section header in ELF file: '%s'", 221 file_->GetPath().c_str()); 222 return false; 223 } 224 225 // Find .dynamic section info from program header 226 dynamic_program_header_ = FindProgamHeaderByType(PT_DYNAMIC); 227 if (dynamic_program_header_ == nullptr) { 228 *error_msg = StringPrintf("Failed to find PT_DYNAMIC program header in ELF file: '%s'", 229 file_->GetPath().c_str()); 230 return false; 231 } 232 233 if (!CheckAndSet(GetDynamicProgramHeader().p_offset, "dynamic section", 234 reinterpret_cast<byte**>(&dynamic_section_start_), error_msg)) { 235 return false; 236 } 237 238 // Find other sections from section headers 239 for (Elf32_Word i = 0; i < GetSectionHeaderNum(); i++) { 240 Elf32_Shdr* section_header = GetSectionHeader(i); 241 if (section_header == nullptr) { 242 *error_msg = StringPrintf("Failed to find section header for section %d in ELF file: '%s'", 243 i, file_->GetPath().c_str()); 244 return false; 245 } 246 switch (section_header->sh_type) { 247 case SHT_SYMTAB: { 248 if (!CheckAndSet(section_header->sh_offset, "symtab", 249 reinterpret_cast<byte**>(&symtab_section_start_), error_msg)) { 250 return false; 251 } 252 break; 253 } 254 case SHT_DYNSYM: { 255 if (!CheckAndSet(section_header->sh_offset, "dynsym", 256 reinterpret_cast<byte**>(&dynsym_section_start_), error_msg)) { 257 return false; 258 } 259 break; 260 } 261 case SHT_STRTAB: { 262 // TODO: base these off of sh_link from .symtab and .dynsym above 263 if ((section_header->sh_flags & SHF_ALLOC) != 0) { 264 // Check that this is named ".dynstr" and ignore otherwise. 265 const char* header_name = GetString(*shstrtab_section_header, section_header->sh_name); 266 if (strncmp(".dynstr", header_name, 8) == 0) { 267 if (!CheckAndSet(section_header->sh_offset, "dynstr", 268 reinterpret_cast<byte**>(&dynstr_section_start_), error_msg)) { 269 return false; 270 } 271 } 272 } else { 273 // Check that this is named ".strtab" and ignore otherwise. 274 const char* header_name = GetString(*shstrtab_section_header, section_header->sh_name); 275 if (strncmp(".strtab", header_name, 8) == 0) { 276 if (!CheckAndSet(section_header->sh_offset, "strtab", 277 reinterpret_cast<byte**>(&strtab_section_start_), error_msg)) { 278 return false; 279 } 280 } 281 } 282 break; 283 } 284 case SHT_DYNAMIC: { 285 if (reinterpret_cast<byte*>(dynamic_section_start_) != 286 Begin() + section_header->sh_offset) { 287 LOG(WARNING) << "Failed to find matching SHT_DYNAMIC for PT_DYNAMIC in " 288 << file_->GetPath() << ": " << std::hex 289 << reinterpret_cast<void*>(dynamic_section_start_) 290 << " != " << reinterpret_cast<void*>(Begin() + section_header->sh_offset); 291 return false; 292 } 293 break; 294 } 295 case SHT_HASH: { 296 if (!CheckAndSet(section_header->sh_offset, "hash section", 297 reinterpret_cast<byte**>(&hash_section_start_), error_msg)) { 298 return false; 299 } 300 break; 301 } 302 } 303 } 304 305 // Check for the existence of some sections. 306 if (!CheckSectionsExist(error_msg)) { 307 return false; 308 } 309 } 310 311 return true; 312 } 313 314 ElfFile::~ElfFile() { 315 STLDeleteElements(&segments_); 316 delete symtab_symbol_table_; 317 delete dynsym_symbol_table_; 318 delete jit_elf_image_; 319 if (jit_gdb_entry_) { 320 UnregisterCodeEntry(jit_gdb_entry_); 321 } 322 } 323 324 bool ElfFile::CheckAndSet(Elf32_Off offset, const char* label, 325 byte** target, std::string* error_msg) { 326 if (Begin() + offset >= End()) { 327 *error_msg = StringPrintf("Offset %d is out of range for %s in ELF file: '%s'", offset, label, 328 file_->GetPath().c_str()); 329 return false; 330 } 331 *target = Begin() + offset; 332 return true; 333 } 334 335 bool ElfFile::CheckSectionsLinked(const byte* source, const byte* target) const { 336 // Only works in whole-program mode, as we need to iterate over the sections. 337 // Note that we normally can't search by type, as duplicates are allowed for most section types. 338 if (program_header_only_) { 339 return true; 340 } 341 342 Elf32_Shdr* source_section = nullptr; 343 Elf32_Word target_index = 0; 344 bool target_found = false; 345 for (Elf32_Word i = 0; i < GetSectionHeaderNum(); i++) { 346 Elf32_Shdr* section_header = GetSectionHeader(i); 347 348 if (Begin() + section_header->sh_offset == source) { 349 // Found the source. 350 source_section = section_header; 351 if (target_index) { 352 break; 353 } 354 } else if (Begin() + section_header->sh_offset == target) { 355 target_index = i; 356 target_found = true; 357 if (source_section != nullptr) { 358 break; 359 } 360 } 361 } 362 363 return target_found && source_section != nullptr && source_section->sh_link == target_index; 364 } 365 366 bool ElfFile::CheckSectionsExist(std::string* error_msg) const { 367 if (!program_header_only_) { 368 // If in full mode, need section headers. 369 if (section_headers_start_ == nullptr) { 370 *error_msg = StringPrintf("No section headers in ELF file: '%s'", file_->GetPath().c_str()); 371 return false; 372 } 373 } 374 375 // This is redundant, but defensive. 376 if (dynamic_program_header_ == nullptr) { 377 *error_msg = StringPrintf("Failed to find PT_DYNAMIC program header in ELF file: '%s'", 378 file_->GetPath().c_str()); 379 return false; 380 } 381 382 // Need a dynamic section. This is redundant, but defensive. 383 if (dynamic_section_start_ == nullptr) { 384 *error_msg = StringPrintf("Failed to find dynamic section in ELF file: '%s'", 385 file_->GetPath().c_str()); 386 return false; 387 } 388 389 // Symtab validation. These is not really a hard failure, as we are currently not using the 390 // symtab internally, but it's nice to be defensive. 391 if (symtab_section_start_ != nullptr) { 392 // When there's a symtab, there should be a strtab. 393 if (strtab_section_start_ == nullptr) { 394 *error_msg = StringPrintf("No strtab for symtab in ELF file: '%s'", file_->GetPath().c_str()); 395 return false; 396 } 397 398 // The symtab should link to the strtab. 399 if (!CheckSectionsLinked(reinterpret_cast<const byte*>(symtab_section_start_), 400 reinterpret_cast<const byte*>(strtab_section_start_))) { 401 *error_msg = StringPrintf("Symtab is not linked to the strtab in ELF file: '%s'", 402 file_->GetPath().c_str()); 403 return false; 404 } 405 } 406 407 // We always need a dynstr & dynsym. 408 if (dynstr_section_start_ == nullptr) { 409 *error_msg = StringPrintf("No dynstr in ELF file: '%s'", file_->GetPath().c_str()); 410 return false; 411 } 412 if (dynsym_section_start_ == nullptr) { 413 *error_msg = StringPrintf("No dynsym in ELF file: '%s'", file_->GetPath().c_str()); 414 return false; 415 } 416 417 // Need a hash section for dynamic symbol lookup. 418 if (hash_section_start_ == nullptr) { 419 *error_msg = StringPrintf("Failed to find hash section in ELF file: '%s'", 420 file_->GetPath().c_str()); 421 return false; 422 } 423 424 // And the hash section should be linking to the dynsym. 425 if (!CheckSectionsLinked(reinterpret_cast<const byte*>(hash_section_start_), 426 reinterpret_cast<const byte*>(dynsym_section_start_))) { 427 *error_msg = StringPrintf("Hash section is not linked to the dynstr in ELF file: '%s'", 428 file_->GetPath().c_str()); 429 return false; 430 } 431 432 return true; 433 } 434 435 bool ElfFile::SetMap(MemMap* map, std::string* error_msg) { 436 if (map == nullptr) { 437 // MemMap::Open should have already set an error. 438 DCHECK(!error_msg->empty()); 439 return false; 440 } 441 map_.reset(map); 442 CHECK(map_.get() != nullptr) << file_->GetPath(); 443 CHECK(map_->Begin() != nullptr) << file_->GetPath(); 444 445 header_ = reinterpret_cast<Elf32_Ehdr*>(map_->Begin()); 446 if ((ELFMAG0 != header_->e_ident[EI_MAG0]) 447 || (ELFMAG1 != header_->e_ident[EI_MAG1]) 448 || (ELFMAG2 != header_->e_ident[EI_MAG2]) 449 || (ELFMAG3 != header_->e_ident[EI_MAG3])) { 450 *error_msg = StringPrintf("Failed to find ELF magic value %d %d %d %d in %s, found %d %d %d %d", 451 ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, 452 file_->GetPath().c_str(), 453 header_->e_ident[EI_MAG0], 454 header_->e_ident[EI_MAG1], 455 header_->e_ident[EI_MAG2], 456 header_->e_ident[EI_MAG3]); 457 return false; 458 } 459 if (ELFCLASS32 != header_->e_ident[EI_CLASS]) { 460 *error_msg = StringPrintf("Failed to find expected EI_CLASS value %d in %s, found %d", 461 ELFCLASS32, 462 file_->GetPath().c_str(), 463 header_->e_ident[EI_CLASS]); 464 return false; 465 } 466 if (ELFDATA2LSB != header_->e_ident[EI_DATA]) { 467 *error_msg = StringPrintf("Failed to find expected EI_DATA value %d in %s, found %d", 468 ELFDATA2LSB, 469 file_->GetPath().c_str(), 470 header_->e_ident[EI_CLASS]); 471 return false; 472 } 473 if (EV_CURRENT != header_->e_ident[EI_VERSION]) { 474 *error_msg = StringPrintf("Failed to find expected EI_VERSION value %d in %s, found %d", 475 EV_CURRENT, 476 file_->GetPath().c_str(), 477 header_->e_ident[EI_CLASS]); 478 return false; 479 } 480 if (ET_DYN != header_->e_type) { 481 *error_msg = StringPrintf("Failed to find expected e_type value %d in %s, found %d", 482 ET_DYN, 483 file_->GetPath().c_str(), 484 header_->e_type); 485 return false; 486 } 487 if (EV_CURRENT != header_->e_version) { 488 *error_msg = StringPrintf("Failed to find expected e_version value %d in %s, found %d", 489 EV_CURRENT, 490 file_->GetPath().c_str(), 491 header_->e_version); 492 return false; 493 } 494 if (0 != header_->e_entry) { 495 *error_msg = StringPrintf("Failed to find expected e_entry value %d in %s, found %d", 496 0, 497 file_->GetPath().c_str(), 498 header_->e_entry); 499 return false; 500 } 501 if (0 == header_->e_phoff) { 502 *error_msg = StringPrintf("Failed to find non-zero e_phoff value in %s", 503 file_->GetPath().c_str()); 504 return false; 505 } 506 if (0 == header_->e_shoff) { 507 *error_msg = StringPrintf("Failed to find non-zero e_shoff value in %s", 508 file_->GetPath().c_str()); 509 return false; 510 } 511 if (0 == header_->e_ehsize) { 512 *error_msg = StringPrintf("Failed to find non-zero e_ehsize value in %s", 513 file_->GetPath().c_str()); 514 return false; 515 } 516 if (0 == header_->e_phentsize) { 517 *error_msg = StringPrintf("Failed to find non-zero e_phentsize value in %s", 518 file_->GetPath().c_str()); 519 return false; 520 } 521 if (0 == header_->e_phnum) { 522 *error_msg = StringPrintf("Failed to find non-zero e_phnum value in %s", 523 file_->GetPath().c_str()); 524 return false; 525 } 526 if (0 == header_->e_shentsize) { 527 *error_msg = StringPrintf("Failed to find non-zero e_shentsize value in %s", 528 file_->GetPath().c_str()); 529 return false; 530 } 531 if (0 == header_->e_shnum) { 532 *error_msg = StringPrintf("Failed to find non-zero e_shnum value in %s", 533 file_->GetPath().c_str()); 534 return false; 535 } 536 if (0 == header_->e_shstrndx) { 537 *error_msg = StringPrintf("Failed to find non-zero e_shstrndx value in %s", 538 file_->GetPath().c_str()); 539 return false; 540 } 541 if (header_->e_shstrndx >= header_->e_shnum) { 542 *error_msg = StringPrintf("Failed to find e_shnum value %d less than %d in %s", 543 header_->e_shstrndx, 544 header_->e_shnum, 545 file_->GetPath().c_str()); 546 return false; 547 } 548 549 if (!program_header_only_) { 550 if (header_->e_phoff >= Size()) { 551 *error_msg = StringPrintf("Failed to find e_phoff value %d less than %zd in %s", 552 header_->e_phoff, 553 Size(), 554 file_->GetPath().c_str()); 555 return false; 556 } 557 if (header_->e_shoff >= Size()) { 558 *error_msg = StringPrintf("Failed to find e_shoff value %d less than %zd in %s", 559 header_->e_shoff, 560 Size(), 561 file_->GetPath().c_str()); 562 return false; 563 } 564 } 565 return true; 566 } 567 568 569 Elf32_Ehdr& ElfFile::GetHeader() const { 570 CHECK(header_ != nullptr); // Header has been checked in SetMap. This is a sanity check. 571 return *header_; 572 } 573 574 byte* ElfFile::GetProgramHeadersStart() const { 575 CHECK(program_headers_start_ != nullptr); // Header has been set in Setup. This is a sanity 576 // check. 577 return program_headers_start_; 578 } 579 580 byte* ElfFile::GetSectionHeadersStart() const { 581 CHECK(!program_header_only_); // Only used in "full" mode. 582 CHECK(section_headers_start_ != nullptr); // Is checked in CheckSectionsExist. Sanity check. 583 return section_headers_start_; 584 } 585 586 Elf32_Phdr& ElfFile::GetDynamicProgramHeader() const { 587 CHECK(dynamic_program_header_ != nullptr); // Is checked in CheckSectionsExist. Sanity check. 588 return *dynamic_program_header_; 589 } 590 591 Elf32_Dyn* ElfFile::GetDynamicSectionStart() const { 592 CHECK(dynamic_section_start_ != nullptr); // Is checked in CheckSectionsExist. Sanity check. 593 return dynamic_section_start_; 594 } 595 596 static bool IsSymbolSectionType(Elf32_Word section_type) { 597 return ((section_type == SHT_SYMTAB) || (section_type == SHT_DYNSYM)); 598 } 599 600 Elf32_Sym* ElfFile::GetSymbolSectionStart(Elf32_Word section_type) const { 601 CHECK(IsSymbolSectionType(section_type)) << file_->GetPath() << " " << section_type; 602 switch (section_type) { 603 case SHT_SYMTAB: { 604 return symtab_section_start_; 605 break; 606 } 607 case SHT_DYNSYM: { 608 return dynsym_section_start_; 609 break; 610 } 611 default: { 612 LOG(FATAL) << section_type; 613 return nullptr; 614 } 615 } 616 } 617 618 const char* ElfFile::GetStringSectionStart(Elf32_Word section_type) const { 619 CHECK(IsSymbolSectionType(section_type)) << file_->GetPath() << " " << section_type; 620 switch (section_type) { 621 case SHT_SYMTAB: { 622 return strtab_section_start_; 623 } 624 case SHT_DYNSYM: { 625 return dynstr_section_start_; 626 } 627 default: { 628 LOG(FATAL) << section_type; 629 return nullptr; 630 } 631 } 632 } 633 634 const char* ElfFile::GetString(Elf32_Word section_type, Elf32_Word i) const { 635 CHECK(IsSymbolSectionType(section_type)) << file_->GetPath() << " " << section_type; 636 if (i == 0) { 637 return nullptr; 638 } 639 const char* string_section_start = GetStringSectionStart(section_type); 640 if (string_section_start == nullptr) { 641 return nullptr; 642 } 643 return string_section_start + i; 644 } 645 646 // WARNING: The following methods do not check for an error condition (non-existent hash section). 647 // It is the caller's job to do this. 648 649 Elf32_Word* ElfFile::GetHashSectionStart() const { 650 return hash_section_start_; 651 } 652 653 Elf32_Word ElfFile::GetHashBucketNum() const { 654 return GetHashSectionStart()[0]; 655 } 656 657 Elf32_Word ElfFile::GetHashChainNum() const { 658 return GetHashSectionStart()[1]; 659 } 660 661 Elf32_Word ElfFile::GetHashBucket(size_t i, bool* ok) const { 662 if (i >= GetHashBucketNum()) { 663 *ok = false; 664 return 0; 665 } 666 *ok = true; 667 // 0 is nbucket, 1 is nchain 668 return GetHashSectionStart()[2 + i]; 669 } 670 671 Elf32_Word ElfFile::GetHashChain(size_t i, bool* ok) const { 672 if (i >= GetHashBucketNum()) { 673 *ok = false; 674 return 0; 675 } 676 *ok = true; 677 // 0 is nbucket, 1 is nchain, & chains are after buckets 678 return GetHashSectionStart()[2 + GetHashBucketNum() + i]; 679 } 680 681 Elf32_Word ElfFile::GetProgramHeaderNum() const { 682 return GetHeader().e_phnum; 683 } 684 685 Elf32_Phdr* ElfFile::GetProgramHeader(Elf32_Word i) const { 686 CHECK_LT(i, GetProgramHeaderNum()) << file_->GetPath(); // Sanity check for caller. 687 byte* program_header = GetProgramHeadersStart() + (i * GetHeader().e_phentsize); 688 if (program_header >= End()) { 689 return nullptr; // Failure condition. 690 } 691 return reinterpret_cast<Elf32_Phdr*>(program_header); 692 } 693 694 Elf32_Phdr* ElfFile::FindProgamHeaderByType(Elf32_Word type) const { 695 for (Elf32_Word i = 0; i < GetProgramHeaderNum(); i++) { 696 Elf32_Phdr* program_header = GetProgramHeader(i); 697 if (program_header->p_type == type) { 698 return program_header; 699 } 700 } 701 return nullptr; 702 } 703 704 Elf32_Word ElfFile::GetSectionHeaderNum() const { 705 return GetHeader().e_shnum; 706 } 707 708 Elf32_Shdr* ElfFile::GetSectionHeader(Elf32_Word i) const { 709 // Can only access arbitrary sections when we have the whole file, not just program header. 710 // Even if we Load(), it doesn't bring in all the sections. 711 CHECK(!program_header_only_) << file_->GetPath(); 712 if (i >= GetSectionHeaderNum()) { 713 return nullptr; // Failure condition. 714 } 715 byte* section_header = GetSectionHeadersStart() + (i * GetHeader().e_shentsize); 716 if (section_header >= End()) { 717 return nullptr; // Failure condition. 718 } 719 return reinterpret_cast<Elf32_Shdr*>(section_header); 720 } 721 722 Elf32_Shdr* ElfFile::FindSectionByType(Elf32_Word type) const { 723 // Can only access arbitrary sections when we have the whole file, not just program header. 724 // We could change this to switch on known types if they were detected during loading. 725 CHECK(!program_header_only_) << file_->GetPath(); 726 for (Elf32_Word i = 0; i < GetSectionHeaderNum(); i++) { 727 Elf32_Shdr* section_header = GetSectionHeader(i); 728 if (section_header->sh_type == type) { 729 return section_header; 730 } 731 } 732 return nullptr; 733 } 734 735 // from bionic 736 static unsigned elfhash(const char *_name) { 737 const unsigned char *name = (const unsigned char *) _name; 738 unsigned h = 0, g; 739 740 while (*name) { 741 h = (h << 4) + *name++; 742 g = h & 0xf0000000; 743 h ^= g; 744 h ^= g >> 24; 745 } 746 return h; 747 } 748 749 Elf32_Shdr* ElfFile::GetSectionNameStringSection() const { 750 return GetSectionHeader(GetHeader().e_shstrndx); 751 } 752 753 const byte* ElfFile::FindDynamicSymbolAddress(const std::string& symbol_name) const { 754 // Check that we have a hash section. 755 if (GetHashSectionStart() == nullptr) { 756 return nullptr; // Failure condition. 757 } 758 const Elf32_Sym* sym = FindDynamicSymbol(symbol_name); 759 if (sym != nullptr) { 760 return base_address_ + sym->st_value; 761 } else { 762 return nullptr; 763 } 764 } 765 766 // WARNING: Only called from FindDynamicSymbolAddress. Elides check for hash section. 767 const Elf32_Sym* ElfFile::FindDynamicSymbol(const std::string& symbol_name) const { 768 if (GetHashBucketNum() == 0) { 769 // No dynamic symbols at all. 770 return nullptr; 771 } 772 Elf32_Word hash = elfhash(symbol_name.c_str()); 773 Elf32_Word bucket_index = hash % GetHashBucketNum(); 774 bool ok; 775 Elf32_Word symbol_and_chain_index = GetHashBucket(bucket_index, &ok); 776 if (!ok) { 777 return nullptr; 778 } 779 while (symbol_and_chain_index != 0 /* STN_UNDEF */) { 780 Elf32_Sym* symbol = GetSymbol(SHT_DYNSYM, symbol_and_chain_index); 781 if (symbol == nullptr) { 782 return nullptr; // Failure condition. 783 } 784 const char* name = GetString(SHT_DYNSYM, symbol->st_name); 785 if (symbol_name == name) { 786 return symbol; 787 } 788 symbol_and_chain_index = GetHashChain(symbol_and_chain_index, &ok); 789 if (!ok) { 790 return nullptr; 791 } 792 } 793 return nullptr; 794 } 795 796 Elf32_Word ElfFile::GetSymbolNum(Elf32_Shdr& section_header) const { 797 CHECK(IsSymbolSectionType(section_header.sh_type)) 798 << file_->GetPath() << " " << section_header.sh_type; 799 CHECK_NE(0U, section_header.sh_entsize) << file_->GetPath(); 800 return section_header.sh_size / section_header.sh_entsize; 801 } 802 803 Elf32_Sym* ElfFile::GetSymbol(Elf32_Word section_type, 804 Elf32_Word i) const { 805 Elf32_Sym* sym_start = GetSymbolSectionStart(section_type); 806 if (sym_start == nullptr) { 807 return nullptr; 808 } 809 return sym_start + i; 810 } 811 812 ElfFile::SymbolTable** ElfFile::GetSymbolTable(Elf32_Word section_type) { 813 CHECK(IsSymbolSectionType(section_type)) << file_->GetPath() << " " << section_type; 814 switch (section_type) { 815 case SHT_SYMTAB: { 816 return &symtab_symbol_table_; 817 } 818 case SHT_DYNSYM: { 819 return &dynsym_symbol_table_; 820 } 821 default: { 822 LOG(FATAL) << section_type; 823 return nullptr; 824 } 825 } 826 } 827 828 Elf32_Sym* ElfFile::FindSymbolByName(Elf32_Word section_type, 829 const std::string& symbol_name, 830 bool build_map) { 831 CHECK(!program_header_only_) << file_->GetPath(); 832 CHECK(IsSymbolSectionType(section_type)) << file_->GetPath() << " " << section_type; 833 834 SymbolTable** symbol_table = GetSymbolTable(section_type); 835 if (*symbol_table != nullptr || build_map) { 836 if (*symbol_table == nullptr) { 837 DCHECK(build_map); 838 *symbol_table = new SymbolTable; 839 Elf32_Shdr* symbol_section = FindSectionByType(section_type); 840 if (symbol_section == nullptr) { 841 return nullptr; // Failure condition. 842 } 843 Elf32_Shdr* string_section = GetSectionHeader(symbol_section->sh_link); 844 if (string_section == nullptr) { 845 return nullptr; // Failure condition. 846 } 847 for (uint32_t i = 0; i < GetSymbolNum(*symbol_section); i++) { 848 Elf32_Sym* symbol = GetSymbol(section_type, i); 849 if (symbol == nullptr) { 850 return nullptr; // Failure condition. 851 } 852 unsigned char type = ELF32_ST_TYPE(symbol->st_info); 853 if (type == STT_NOTYPE) { 854 continue; 855 } 856 const char* name = GetString(*string_section, symbol->st_name); 857 if (name == nullptr) { 858 continue; 859 } 860 std::pair<SymbolTable::iterator, bool> result = 861 (*symbol_table)->insert(std::make_pair(name, symbol)); 862 if (!result.second) { 863 // If a duplicate, make sure it has the same logical value. Seen on x86. 864 if ((symbol->st_value != result.first->second->st_value) || 865 (symbol->st_size != result.first->second->st_size) || 866 (symbol->st_info != result.first->second->st_info) || 867 (symbol->st_other != result.first->second->st_other) || 868 (symbol->st_shndx != result.first->second->st_shndx)) { 869 return nullptr; // Failure condition. 870 } 871 } 872 } 873 } 874 CHECK(*symbol_table != nullptr); 875 SymbolTable::const_iterator it = (*symbol_table)->find(symbol_name); 876 if (it == (*symbol_table)->end()) { 877 return nullptr; 878 } 879 return it->second; 880 } 881 882 // Fall back to linear search 883 Elf32_Shdr* symbol_section = FindSectionByType(section_type); 884 if (symbol_section == nullptr) { 885 return nullptr; 886 } 887 Elf32_Shdr* string_section = GetSectionHeader(symbol_section->sh_link); 888 if (string_section == nullptr) { 889 return nullptr; 890 } 891 for (uint32_t i = 0; i < GetSymbolNum(*symbol_section); i++) { 892 Elf32_Sym* symbol = GetSymbol(section_type, i); 893 if (symbol == nullptr) { 894 return nullptr; // Failure condition. 895 } 896 const char* name = GetString(*string_section, symbol->st_name); 897 if (name == nullptr) { 898 continue; 899 } 900 if (symbol_name == name) { 901 return symbol; 902 } 903 } 904 return nullptr; 905 } 906 907 Elf32_Addr ElfFile::FindSymbolAddress(Elf32_Word section_type, 908 const std::string& symbol_name, 909 bool build_map) { 910 Elf32_Sym* symbol = FindSymbolByName(section_type, symbol_name, build_map); 911 if (symbol == nullptr) { 912 return 0; 913 } 914 return symbol->st_value; 915 } 916 917 const char* ElfFile::GetString(Elf32_Shdr& string_section, Elf32_Word i) const { 918 CHECK(!program_header_only_) << file_->GetPath(); 919 // TODO: remove this static_cast from enum when using -std=gnu++0x 920 if (static_cast<Elf32_Word>(SHT_STRTAB) != string_section.sh_type) { 921 return nullptr; // Failure condition. 922 } 923 if (i >= string_section.sh_size) { 924 return nullptr; 925 } 926 if (i == 0) { 927 return nullptr; 928 } 929 byte* strings = Begin() + string_section.sh_offset; 930 byte* string = strings + i; 931 if (string >= End()) { 932 return nullptr; 933 } 934 return reinterpret_cast<const char*>(string); 935 } 936 937 Elf32_Word ElfFile::GetDynamicNum() const { 938 return GetDynamicProgramHeader().p_filesz / sizeof(Elf32_Dyn); 939 } 940 941 Elf32_Dyn& ElfFile::GetDynamic(Elf32_Word i) const { 942 CHECK_LT(i, GetDynamicNum()) << file_->GetPath(); 943 return *(GetDynamicSectionStart() + i); 944 } 945 946 Elf32_Dyn* ElfFile::FindDynamicByType(Elf32_Sword type) const { 947 for (Elf32_Word i = 0; i < GetDynamicNum(); i++) { 948 Elf32_Dyn* dyn = &GetDynamic(i); 949 if (dyn->d_tag == type) { 950 return dyn; 951 } 952 } 953 return NULL; 954 } 955 956 Elf32_Word ElfFile::FindDynamicValueByType(Elf32_Sword type) const { 957 Elf32_Dyn* dyn = FindDynamicByType(type); 958 if (dyn == NULL) { 959 return 0; 960 } else { 961 return dyn->d_un.d_val; 962 } 963 } 964 965 Elf32_Rel* ElfFile::GetRelSectionStart(Elf32_Shdr& section_header) const { 966 CHECK(SHT_REL == section_header.sh_type) << file_->GetPath() << " " << section_header.sh_type; 967 return reinterpret_cast<Elf32_Rel*>(Begin() + section_header.sh_offset); 968 } 969 970 Elf32_Word ElfFile::GetRelNum(Elf32_Shdr& section_header) const { 971 CHECK(SHT_REL == section_header.sh_type) << file_->GetPath() << " " << section_header.sh_type; 972 CHECK_NE(0U, section_header.sh_entsize) << file_->GetPath(); 973 return section_header.sh_size / section_header.sh_entsize; 974 } 975 976 Elf32_Rel& ElfFile::GetRel(Elf32_Shdr& section_header, Elf32_Word i) const { 977 CHECK(SHT_REL == section_header.sh_type) << file_->GetPath() << " " << section_header.sh_type; 978 CHECK_LT(i, GetRelNum(section_header)) << file_->GetPath(); 979 return *(GetRelSectionStart(section_header) + i); 980 } 981 982 Elf32_Rela* ElfFile::GetRelaSectionStart(Elf32_Shdr& section_header) const { 983 CHECK(SHT_RELA == section_header.sh_type) << file_->GetPath() << " " << section_header.sh_type; 984 return reinterpret_cast<Elf32_Rela*>(Begin() + section_header.sh_offset); 985 } 986 987 Elf32_Word ElfFile::GetRelaNum(Elf32_Shdr& section_header) const { 988 CHECK(SHT_RELA == section_header.sh_type) << file_->GetPath() << " " << section_header.sh_type; 989 return section_header.sh_size / section_header.sh_entsize; 990 } 991 992 Elf32_Rela& ElfFile::GetRela(Elf32_Shdr& section_header, Elf32_Word i) const { 993 CHECK(SHT_RELA == section_header.sh_type) << file_->GetPath() << " " << section_header.sh_type; 994 CHECK_LT(i, GetRelaNum(section_header)) << file_->GetPath(); 995 return *(GetRelaSectionStart(section_header) + i); 996 } 997 998 // Base on bionic phdr_table_get_load_size 999 size_t ElfFile::GetLoadedSize() const { 1000 Elf32_Addr min_vaddr = 0xFFFFFFFFu; 1001 Elf32_Addr max_vaddr = 0x00000000u; 1002 for (Elf32_Word i = 0; i < GetProgramHeaderNum(); i++) { 1003 Elf32_Phdr* program_header = GetProgramHeader(i); 1004 if (program_header->p_type != PT_LOAD) { 1005 continue; 1006 } 1007 Elf32_Addr begin_vaddr = program_header->p_vaddr; 1008 if (begin_vaddr < min_vaddr) { 1009 min_vaddr = begin_vaddr; 1010 } 1011 Elf32_Addr end_vaddr = program_header->p_vaddr + program_header->p_memsz; 1012 if (end_vaddr > max_vaddr) { 1013 max_vaddr = end_vaddr; 1014 } 1015 } 1016 min_vaddr = RoundDown(min_vaddr, kPageSize); 1017 max_vaddr = RoundUp(max_vaddr, kPageSize); 1018 CHECK_LT(min_vaddr, max_vaddr) << file_->GetPath(); 1019 size_t loaded_size = max_vaddr - min_vaddr; 1020 return loaded_size; 1021 } 1022 1023 bool ElfFile::Load(bool executable, std::string* error_msg) { 1024 CHECK(program_header_only_) << file_->GetPath(); 1025 1026 if (executable) { 1027 InstructionSet elf_ISA = kNone; 1028 switch (GetHeader().e_machine) { 1029 case EM_ARM: { 1030 elf_ISA = kArm; 1031 break; 1032 } 1033 case EM_AARCH64: { 1034 elf_ISA = kArm64; 1035 break; 1036 } 1037 case EM_386: { 1038 elf_ISA = kX86; 1039 break; 1040 } 1041 case EM_X86_64: { 1042 elf_ISA = kX86_64; 1043 break; 1044 } 1045 case EM_MIPS: { 1046 elf_ISA = kMips; 1047 break; 1048 } 1049 } 1050 1051 if (elf_ISA != kRuntimeISA) { 1052 std::ostringstream oss; 1053 oss << "Expected ISA " << kRuntimeISA << " but found " << elf_ISA; 1054 *error_msg = oss.str(); 1055 return false; 1056 } 1057 } 1058 1059 bool reserved = false; 1060 for (Elf32_Word i = 0; i < GetProgramHeaderNum(); i++) { 1061 Elf32_Phdr* program_header = GetProgramHeader(i); 1062 if (program_header == nullptr) { 1063 *error_msg = StringPrintf("No program header for entry %d in ELF file %s.", 1064 i, file_->GetPath().c_str()); 1065 return false; 1066 } 1067 1068 // Record .dynamic header information for later use 1069 if (program_header->p_type == PT_DYNAMIC) { 1070 dynamic_program_header_ = program_header; 1071 continue; 1072 } 1073 1074 // Not something to load, move on. 1075 if (program_header->p_type != PT_LOAD) { 1076 continue; 1077 } 1078 1079 // Found something to load. 1080 1081 // Before load the actual segments, reserve a contiguous chunk 1082 // of required size and address for all segments, but with no 1083 // permissions. We'll then carve that up with the proper 1084 // permissions as we load the actual segments. If p_vaddr is 1085 // non-zero, the segments require the specific address specified, 1086 // which either was specified in the file because we already set 1087 // base_address_ after the first zero segment). 1088 int64_t temp_file_length = file_->GetLength(); 1089 if (temp_file_length < 0) { 1090 errno = -temp_file_length; 1091 *error_msg = StringPrintf("Failed to get length of file: '%s' fd=%d: %s", 1092 file_->GetPath().c_str(), file_->Fd(), strerror(errno)); 1093 return false; 1094 } 1095 size_t file_length = static_cast<size_t>(temp_file_length); 1096 if (!reserved) { 1097 byte* reserve_base = ((program_header->p_vaddr != 0) ? 1098 reinterpret_cast<byte*>(program_header->p_vaddr) : nullptr); 1099 std::string reservation_name("ElfFile reservation for "); 1100 reservation_name += file_->GetPath(); 1101 std::unique_ptr<MemMap> reserve(MemMap::MapAnonymous(reservation_name.c_str(), 1102 reserve_base, 1103 GetLoadedSize(), PROT_NONE, false, 1104 error_msg)); 1105 if (reserve.get() == nullptr) { 1106 *error_msg = StringPrintf("Failed to allocate %s: %s", 1107 reservation_name.c_str(), error_msg->c_str()); 1108 return false; 1109 } 1110 reserved = true; 1111 if (reserve_base == nullptr) { 1112 base_address_ = reserve->Begin(); 1113 } 1114 segments_.push_back(reserve.release()); 1115 } 1116 // empty segment, nothing to map 1117 if (program_header->p_memsz == 0) { 1118 continue; 1119 } 1120 byte* p_vaddr = base_address_ + program_header->p_vaddr; 1121 int prot = 0; 1122 if (executable && ((program_header->p_flags & PF_X) != 0)) { 1123 prot |= PROT_EXEC; 1124 } 1125 if ((program_header->p_flags & PF_W) != 0) { 1126 prot |= PROT_WRITE; 1127 } 1128 if ((program_header->p_flags & PF_R) != 0) { 1129 prot |= PROT_READ; 1130 } 1131 int flags = 0; 1132 if (writable_) { 1133 prot |= PROT_WRITE; 1134 flags |= MAP_SHARED; 1135 } else { 1136 flags |= MAP_PRIVATE; 1137 } 1138 if (file_length < (program_header->p_offset + program_header->p_memsz)) { 1139 *error_msg = StringPrintf("File size of %zd bytes not large enough to contain ELF segment " 1140 "%d of %d bytes: '%s'", file_length, i, 1141 program_header->p_offset + program_header->p_memsz, 1142 file_->GetPath().c_str()); 1143 return false; 1144 } 1145 std::unique_ptr<MemMap> segment(MemMap::MapFileAtAddress(p_vaddr, 1146 program_header->p_memsz, 1147 prot, flags, file_->Fd(), 1148 program_header->p_offset, 1149 true, // implies MAP_FIXED 1150 file_->GetPath().c_str(), 1151 error_msg)); 1152 if (segment.get() == nullptr) { 1153 *error_msg = StringPrintf("Failed to map ELF file segment %d from %s: %s", 1154 i, file_->GetPath().c_str(), error_msg->c_str()); 1155 return false; 1156 } 1157 if (segment->Begin() != p_vaddr) { 1158 *error_msg = StringPrintf("Failed to map ELF file segment %d from %s at expected address %p, " 1159 "instead mapped to %p", 1160 i, file_->GetPath().c_str(), p_vaddr, segment->Begin()); 1161 return false; 1162 } 1163 segments_.push_back(segment.release()); 1164 } 1165 1166 // Now that we are done loading, .dynamic should be in memory to find .dynstr, .dynsym, .hash 1167 byte* dsptr = base_address_ + GetDynamicProgramHeader().p_vaddr; 1168 if ((dsptr < Begin() || dsptr >= End()) && !ValidPointer(dsptr)) { 1169 *error_msg = StringPrintf("dynamic section address invalid in ELF file %s", 1170 file_->GetPath().c_str()); 1171 return false; 1172 } 1173 dynamic_section_start_ = reinterpret_cast<Elf32_Dyn*>(dsptr); 1174 1175 for (Elf32_Word i = 0; i < GetDynamicNum(); i++) { 1176 Elf32_Dyn& elf_dyn = GetDynamic(i); 1177 byte* d_ptr = base_address_ + elf_dyn.d_un.d_ptr; 1178 switch (elf_dyn.d_tag) { 1179 case DT_HASH: { 1180 if (!ValidPointer(d_ptr)) { 1181 *error_msg = StringPrintf("DT_HASH value %p does not refer to a loaded ELF segment of %s", 1182 d_ptr, file_->GetPath().c_str()); 1183 return false; 1184 } 1185 hash_section_start_ = reinterpret_cast<Elf32_Word*>(d_ptr); 1186 break; 1187 } 1188 case DT_STRTAB: { 1189 if (!ValidPointer(d_ptr)) { 1190 *error_msg = StringPrintf("DT_HASH value %p does not refer to a loaded ELF segment of %s", 1191 d_ptr, file_->GetPath().c_str()); 1192 return false; 1193 } 1194 dynstr_section_start_ = reinterpret_cast<char*>(d_ptr); 1195 break; 1196 } 1197 case DT_SYMTAB: { 1198 if (!ValidPointer(d_ptr)) { 1199 *error_msg = StringPrintf("DT_HASH value %p does not refer to a loaded ELF segment of %s", 1200 d_ptr, file_->GetPath().c_str()); 1201 return false; 1202 } 1203 dynsym_section_start_ = reinterpret_cast<Elf32_Sym*>(d_ptr); 1204 break; 1205 } 1206 case DT_NULL: { 1207 if (GetDynamicNum() != i+1) { 1208 *error_msg = StringPrintf("DT_NULL found after %d .dynamic entries, " 1209 "expected %d as implied by size of PT_DYNAMIC segment in %s", 1210 i + 1, GetDynamicNum(), file_->GetPath().c_str()); 1211 return false; 1212 } 1213 break; 1214 } 1215 } 1216 } 1217 1218 // Check for the existence of some sections. 1219 if (!CheckSectionsExist(error_msg)) { 1220 return false; 1221 } 1222 1223 // Use GDB JIT support to do stack backtrace, etc. 1224 if (executable) { 1225 GdbJITSupport(); 1226 } 1227 1228 return true; 1229 } 1230 1231 bool ElfFile::ValidPointer(const byte* start) const { 1232 for (size_t i = 0; i < segments_.size(); ++i) { 1233 const MemMap* segment = segments_[i]; 1234 if (segment->Begin() <= start && start < segment->End()) { 1235 return true; 1236 } 1237 } 1238 return false; 1239 } 1240 1241 1242 Elf32_Shdr* ElfFile::FindSectionByName(const std::string& name) const { 1243 CHECK(!program_header_only_); 1244 Elf32_Shdr* shstrtab_sec = GetSectionNameStringSection(); 1245 if (shstrtab_sec == nullptr) { 1246 return nullptr; 1247 } 1248 for (uint32_t i = 0; i < GetSectionHeaderNum(); i++) { 1249 Elf32_Shdr* shdr = GetSectionHeader(i); 1250 if (shdr == nullptr) { 1251 return nullptr; 1252 } 1253 const char* sec_name = GetString(*shstrtab_sec, shdr->sh_name); 1254 if (sec_name == nullptr) { 1255 continue; 1256 } 1257 if (name == sec_name) { 1258 return shdr; 1259 } 1260 } 1261 return nullptr; 1262 } 1263 1264 struct PACKED(1) FDE { 1265 uint32_t raw_length_; 1266 uint32_t GetLength() { 1267 return raw_length_ + sizeof(raw_length_); 1268 } 1269 uint32_t CIE_pointer; 1270 uint32_t initial_location; 1271 uint32_t address_range; 1272 uint8_t instructions[0]; 1273 }; 1274 1275 static FDE* NextFDE(FDE* frame) { 1276 byte* fde_bytes = reinterpret_cast<byte*>(frame); 1277 fde_bytes += frame->GetLength(); 1278 return reinterpret_cast<FDE*>(fde_bytes); 1279 } 1280 1281 static bool IsFDE(FDE* frame) { 1282 return frame->CIE_pointer != 0; 1283 } 1284 1285 // TODO This only works for 32-bit Elf Files. 1286 static bool FixupEHFrame(uintptr_t text_start, byte* eh_frame, size_t eh_frame_size) { 1287 FDE* last_frame = reinterpret_cast<FDE*>(eh_frame + eh_frame_size); 1288 FDE* frame = NextFDE(reinterpret_cast<FDE*>(eh_frame)); 1289 for (; frame < last_frame; frame = NextFDE(frame)) { 1290 if (!IsFDE(frame)) { 1291 return false; 1292 } 1293 frame->initial_location += text_start; 1294 } 1295 return true; 1296 } 1297 1298 struct PACKED(1) DebugInfoHeader { 1299 uint32_t unit_length; // TODO 32-bit specific size 1300 uint16_t version; 1301 uint32_t debug_abbrev_offset; // TODO 32-bit specific size 1302 uint8_t address_size; 1303 }; 1304 1305 // Returns -1 if it is variable length, which we will just disallow for now. 1306 static int32_t FormLength(uint32_t att) { 1307 switch (att) { 1308 case DW_FORM_data1: 1309 case DW_FORM_flag: 1310 case DW_FORM_flag_present: 1311 case DW_FORM_ref1: 1312 return 1; 1313 1314 case DW_FORM_data2: 1315 case DW_FORM_ref2: 1316 return 2; 1317 1318 case DW_FORM_addr: // TODO 32-bit only 1319 case DW_FORM_ref_addr: // TODO 32-bit only 1320 case DW_FORM_sec_offset: // TODO 32-bit only 1321 case DW_FORM_strp: // TODO 32-bit only 1322 case DW_FORM_data4: 1323 case DW_FORM_ref4: 1324 return 4; 1325 1326 case DW_FORM_data8: 1327 case DW_FORM_ref8: 1328 case DW_FORM_ref_sig8: 1329 return 8; 1330 1331 case DW_FORM_block: 1332 case DW_FORM_block1: 1333 case DW_FORM_block2: 1334 case DW_FORM_block4: 1335 case DW_FORM_exprloc: 1336 case DW_FORM_indirect: 1337 case DW_FORM_ref_udata: 1338 case DW_FORM_sdata: 1339 case DW_FORM_string: 1340 case DW_FORM_udata: 1341 default: 1342 return -1; 1343 } 1344 } 1345 1346 class DebugTag { 1347 public: 1348 const uint32_t index_; 1349 ~DebugTag() {} 1350 // Creates a new tag and moves data pointer up to the start of the next one. 1351 // nullptr means error. 1352 static DebugTag* Create(const byte** data_pointer) { 1353 const byte* data = *data_pointer; 1354 uint32_t index = DecodeUnsignedLeb128(&data); 1355 std::unique_ptr<DebugTag> tag(new DebugTag(index)); 1356 tag->size_ = static_cast<uint32_t>( 1357 reinterpret_cast<uintptr_t>(data) - reinterpret_cast<uintptr_t>(*data_pointer)); 1358 // skip the abbrev 1359 tag->tag_ = DecodeUnsignedLeb128(&data); 1360 tag->has_child_ = (*data == 0); 1361 data++; 1362 while (true) { 1363 uint32_t attr = DecodeUnsignedLeb128(&data); 1364 uint32_t form = DecodeUnsignedLeb128(&data); 1365 if (attr == 0 && form == 0) { 1366 break; 1367 } else if (attr == 0 || form == 0) { 1368 // Bad abbrev. 1369 return nullptr; 1370 } 1371 int32_t size = FormLength(form); 1372 if (size == -1) { 1373 return nullptr; 1374 } 1375 tag->AddAttribute(attr, static_cast<uint32_t>(size)); 1376 } 1377 *data_pointer = data; 1378 return tag.release(); 1379 } 1380 1381 uint32_t GetSize() const { 1382 return size_; 1383 } 1384 1385 bool HasChild() { 1386 return has_child_; 1387 } 1388 1389 uint32_t GetTagNumber() { 1390 return tag_; 1391 } 1392 1393 // Gets the offset of a particular attribute in this tag structure. 1394 // Interpretation of the data is left to the consumer. 0 is returned if the 1395 // tag does not contain the attribute. 1396 uint32_t GetOffsetOf(uint32_t dwarf_attribute) const { 1397 auto it = off_map_.find(dwarf_attribute); 1398 if (it == off_map_.end()) { 1399 return 0; 1400 } else { 1401 return it->second; 1402 } 1403 } 1404 1405 // Gets the size of attribute 1406 uint32_t GetAttrSize(uint32_t dwarf_attribute) const { 1407 auto it = size_map_.find(dwarf_attribute); 1408 if (it == size_map_.end()) { 1409 return 0; 1410 } else { 1411 return it->second; 1412 } 1413 } 1414 1415 private: 1416 explicit DebugTag(uint32_t index) : index_(index), size_(0), tag_(0), has_child_(false) {} 1417 void AddAttribute(uint32_t type, uint32_t attr_size) { 1418 off_map_.insert(std::pair<uint32_t, uint32_t>(type, size_)); 1419 size_map_.insert(std::pair<uint32_t, uint32_t>(type, attr_size)); 1420 size_ += attr_size; 1421 } 1422 std::map<uint32_t, uint32_t> off_map_; 1423 std::map<uint32_t, uint32_t> size_map_; 1424 uint32_t size_; 1425 uint32_t tag_; 1426 bool has_child_; 1427 }; 1428 1429 class DebugAbbrev { 1430 public: 1431 ~DebugAbbrev() {} 1432 static DebugAbbrev* Create(const byte* dbg_abbrev, size_t dbg_abbrev_size) { 1433 std::unique_ptr<DebugAbbrev> abbrev(new DebugAbbrev); 1434 const byte* last = dbg_abbrev + dbg_abbrev_size; 1435 while (dbg_abbrev < last) { 1436 std::unique_ptr<DebugTag> tag(DebugTag::Create(&dbg_abbrev)); 1437 if (tag.get() == nullptr) { 1438 return nullptr; 1439 } else { 1440 abbrev->tags_.insert(std::pair<uint32_t, uint32_t>(tag->index_, abbrev->tag_list_.size())); 1441 abbrev->tag_list_.push_back(std::move(tag)); 1442 } 1443 } 1444 return abbrev.release(); 1445 } 1446 1447 DebugTag* ReadTag(const byte* entry) { 1448 uint32_t tag_num = DecodeUnsignedLeb128(&entry); 1449 auto it = tags_.find(tag_num); 1450 if (it == tags_.end()) { 1451 return nullptr; 1452 } else { 1453 CHECK_GT(tag_list_.size(), it->second); 1454 return tag_list_.at(it->second).get(); 1455 } 1456 } 1457 1458 private: 1459 DebugAbbrev() {} 1460 std::map<uint32_t, uint32_t> tags_; 1461 std::vector<std::unique_ptr<DebugTag>> tag_list_; 1462 }; 1463 1464 class DebugInfoIterator { 1465 public: 1466 static DebugInfoIterator* Create(DebugInfoHeader* header, size_t frame_size, 1467 DebugAbbrev* abbrev) { 1468 std::unique_ptr<DebugInfoIterator> iter(new DebugInfoIterator(header, frame_size, abbrev)); 1469 if (iter->GetCurrentTag() == nullptr) { 1470 return nullptr; 1471 } else { 1472 return iter.release(); 1473 } 1474 } 1475 ~DebugInfoIterator() {} 1476 1477 // Moves to the next DIE. Returns false if at last entry. 1478 // TODO Handle variable length attributes. 1479 bool next() { 1480 if (current_entry_ == nullptr || current_tag_ == nullptr) { 1481 return false; 1482 } 1483 current_entry_ += current_tag_->GetSize(); 1484 if (current_entry_ >= last_entry_) { 1485 current_entry_ = nullptr; 1486 return false; 1487 } 1488 current_tag_ = abbrev_->ReadTag(current_entry_); 1489 if (current_tag_ == nullptr) { 1490 current_entry_ = nullptr; 1491 return false; 1492 } else { 1493 return true; 1494 } 1495 } 1496 1497 const DebugTag* GetCurrentTag() { 1498 return const_cast<DebugTag*>(current_tag_); 1499 } 1500 byte* GetPointerToField(uint8_t dwarf_field) { 1501 if (current_tag_ == nullptr || current_entry_ == nullptr || current_entry_ >= last_entry_) { 1502 return nullptr; 1503 } 1504 uint32_t off = current_tag_->GetOffsetOf(dwarf_field); 1505 if (off == 0) { 1506 // tag does not have that field. 1507 return nullptr; 1508 } else { 1509 DCHECK_LT(off, current_tag_->GetSize()); 1510 return current_entry_ + off; 1511 } 1512 } 1513 1514 private: 1515 DebugInfoIterator(DebugInfoHeader* header, size_t frame_size, DebugAbbrev* abbrev) 1516 : abbrev_(abbrev), 1517 last_entry_(reinterpret_cast<byte*>(header) + frame_size), 1518 current_entry_(reinterpret_cast<byte*>(header) + sizeof(DebugInfoHeader)), 1519 current_tag_(abbrev_->ReadTag(current_entry_)) {} 1520 DebugAbbrev* abbrev_; 1521 byte* last_entry_; 1522 byte* current_entry_; 1523 DebugTag* current_tag_; 1524 }; 1525 1526 static bool FixupDebugInfo(uint32_t text_start, DebugInfoIterator* iter) { 1527 do { 1528 if (iter->GetCurrentTag()->GetAttrSize(DW_AT_low_pc) != sizeof(int32_t) || 1529 iter->GetCurrentTag()->GetAttrSize(DW_AT_high_pc) != sizeof(int32_t)) { 1530 return false; 1531 } 1532 uint32_t* PC_low = reinterpret_cast<uint32_t*>(iter->GetPointerToField(DW_AT_low_pc)); 1533 uint32_t* PC_high = reinterpret_cast<uint32_t*>(iter->GetPointerToField(DW_AT_high_pc)); 1534 if (PC_low != nullptr && PC_high != nullptr) { 1535 *PC_low += text_start; 1536 *PC_high += text_start; 1537 } 1538 } while (iter->next()); 1539 return true; 1540 } 1541 1542 static bool FixupDebugSections(const byte* dbg_abbrev, size_t dbg_abbrev_size, 1543 uintptr_t text_start, 1544 byte* dbg_info, size_t dbg_info_size, 1545 byte* eh_frame, size_t eh_frame_size) { 1546 std::unique_ptr<DebugAbbrev> abbrev(DebugAbbrev::Create(dbg_abbrev, dbg_abbrev_size)); 1547 if (abbrev.get() == nullptr) { 1548 return false; 1549 } 1550 std::unique_ptr<DebugInfoIterator> iter( 1551 DebugInfoIterator::Create(reinterpret_cast<DebugInfoHeader*>(dbg_info), 1552 dbg_info_size, abbrev.get())); 1553 if (iter.get() == nullptr) { 1554 return false; 1555 } 1556 return FixupDebugInfo(text_start, iter.get()) 1557 && FixupEHFrame(text_start, eh_frame, eh_frame_size); 1558 } 1559 1560 void ElfFile::GdbJITSupport() { 1561 // We only get here if we only are mapping the program header. 1562 DCHECK(program_header_only_); 1563 1564 // Well, we need the whole file to do this. 1565 std::string error_msg; 1566 // Make it MAP_PRIVATE so we can just give it to gdb if all the necessary 1567 // sections are there. 1568 std::unique_ptr<ElfFile> all_ptr(Open(const_cast<File*>(file_), PROT_READ | PROT_WRITE, 1569 MAP_PRIVATE, &error_msg)); 1570 if (all_ptr.get() == nullptr) { 1571 return; 1572 } 1573 ElfFile& all = *all_ptr; 1574 1575 // Do we have interesting sections? 1576 const Elf32_Shdr* debug_info = all.FindSectionByName(".debug_info"); 1577 const Elf32_Shdr* debug_abbrev = all.FindSectionByName(".debug_abbrev"); 1578 const Elf32_Shdr* eh_frame = all.FindSectionByName(".eh_frame"); 1579 const Elf32_Shdr* debug_str = all.FindSectionByName(".debug_str"); 1580 const Elf32_Shdr* strtab_sec = all.FindSectionByName(".strtab"); 1581 const Elf32_Shdr* symtab_sec = all.FindSectionByName(".symtab"); 1582 Elf32_Shdr* text_sec = all.FindSectionByName(".text"); 1583 if (debug_info == nullptr || debug_abbrev == nullptr || eh_frame == nullptr || 1584 debug_str == nullptr || text_sec == nullptr || strtab_sec == nullptr || 1585 symtab_sec == nullptr) { 1586 return; 1587 } 1588 // We need to add in a strtab and symtab to the image. 1589 // all is MAP_PRIVATE so it can be written to freely. 1590 // We also already have strtab and symtab so we are fine there. 1591 Elf32_Ehdr& elf_hdr = all.GetHeader(); 1592 elf_hdr.e_entry = 0; 1593 elf_hdr.e_phoff = 0; 1594 elf_hdr.e_phnum = 0; 1595 elf_hdr.e_phentsize = 0; 1596 elf_hdr.e_type = ET_EXEC; 1597 1598 text_sec->sh_type = SHT_NOBITS; 1599 text_sec->sh_offset = 0; 1600 1601 if (!FixupDebugSections( 1602 all.Begin() + debug_abbrev->sh_offset, debug_abbrev->sh_size, text_sec->sh_addr, 1603 all.Begin() + debug_info->sh_offset, debug_info->sh_size, 1604 all.Begin() + eh_frame->sh_offset, eh_frame->sh_size)) { 1605 LOG(ERROR) << "Failed to load GDB data"; 1606 return; 1607 } 1608 1609 jit_gdb_entry_ = CreateCodeEntry(all.Begin(), all.Size()); 1610 gdb_file_mapping_.reset(all_ptr.release()); 1611 } 1612 1613 } // namespace art 1614