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 #ifndef ART_RUNTIME_ELF_FILE_H_ 18 #define ART_RUNTIME_ELF_FILE_H_ 19 20 #include <memory> 21 #include <string> 22 23 #include "base/macros.h" 24 // Explicitly include our own elf.h to avoid Linux and other dependencies. 25 #include "./elf.h" 26 #include "os.h" 27 28 namespace art { 29 template <typename ElfTypes> 30 class ElfFileImpl; 31 32 // Explicitly instantiated in elf_file.cc 33 typedef ElfFileImpl<ElfTypes32> ElfFileImpl32; 34 typedef ElfFileImpl<ElfTypes64> ElfFileImpl64; 35 36 // Used for compile time and runtime for ElfFile access. Because of 37 // the need for use at runtime, cannot directly use LLVM classes such as 38 // ELFObjectFile. 39 class ElfFile { 40 public: 41 static ElfFile* Open(File* file, bool writable, bool program_header_only, std::string* error_msg, 42 uint8_t* requested_base = nullptr); // TODO: move arg to before error_msg. 43 // Open with specific mmap flags, Always maps in the whole file, not just the 44 // program header sections. 45 static ElfFile* Open(File* file, int mmap_prot, int mmap_flags, std::string* error_msg); 46 ~ElfFile(); 47 48 // Load segments into memory based on PT_LOAD program headers 49 bool Load(bool executable, std::string* error_msg); 50 51 const uint8_t* FindDynamicSymbolAddress(const std::string& symbol_name) const; 52 53 size_t Size() const; 54 55 // The start of the memory map address range for this ELF file. 56 uint8_t* Begin() const; 57 58 // The end of the memory map address range for this ELF file. 59 uint8_t* End() const; 60 61 const File& GetFile() const; 62 63 bool GetSectionOffsetAndSize(const char* section_name, uint64_t* offset, uint64_t* size); 64 65 uint64_t FindSymbolAddress(unsigned section_type, 66 const std::string& symbol_name, 67 bool build_map); 68 69 bool GetLoadedSize(size_t* size, std::string* error_msg) const; 70 71 // Strip an ELF file of unneeded debugging information. 72 // Returns true on success, false on failure. 73 static bool Strip(File* file, std::string* error_msg); 74 75 // Fixup an ELF file so that that oat header will be loaded at oat_begin. 76 // Returns true on success, false on failure. 77 static bool Fixup(File* file, uint64_t oat_data_begin); 78 79 bool Fixup(uint64_t base_address); 80 Is64Bit()81 bool Is64Bit() const { 82 return elf64_.get() != nullptr; 83 } 84 GetImpl32()85 ElfFileImpl32* GetImpl32() const { 86 return elf32_.get(); 87 } 88 GetImpl64()89 ElfFileImpl64* GetImpl64() const { 90 return elf64_.get(); 91 } 92 93 private: 94 explicit ElfFile(ElfFileImpl32* elf32); 95 explicit ElfFile(ElfFileImpl64* elf64); 96 97 const std::unique_ptr<ElfFileImpl32> elf32_; 98 const std::unique_ptr<ElfFileImpl64> elf64_; 99 100 DISALLOW_COPY_AND_ASSIGN(ElfFile); 101 }; 102 103 } // namespace art 104 105 #endif // ART_RUNTIME_ELF_FILE_H_ 106