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