diff options
Diffstat (limited to 'runtime/elf_file.cc')
-rw-r--r-- | runtime/elf_file.cc | 133 |
1 files changed, 0 insertions, 133 deletions
diff --git a/runtime/elf_file.cc b/runtime/elf_file.cc index 281967054d..52da28bb50 100644 --- a/runtime/elf_file.cc +++ b/runtime/elf_file.cc @@ -32,84 +32,6 @@ namespace art { -// ------------------------------------------------------------------- -// Binary GDB JIT Interface as described in -// http://sourceware.org/gdb/onlinedocs/gdb/Declarations.html -extern "C" { - typedef enum { - JIT_NOACTION = 0, - JIT_REGISTER_FN, - JIT_UNREGISTER_FN - } JITAction; - - struct JITCodeEntry { - JITCodeEntry* next_; - JITCodeEntry* prev_; - const uint8_t *symfile_addr_; - uint64_t symfile_size_; - }; - - struct JITDescriptor { - uint32_t version_; - uint32_t action_flag_; - JITCodeEntry* relevant_entry_; - JITCodeEntry* first_entry_; - }; - - // GDB will place breakpoint into this function. - // To prevent GCC from inlining or removing it we place noinline attribute - // and inline assembler statement inside. - void __attribute__((noinline)) __jit_debug_register_code(); - void __attribute__((noinline)) __jit_debug_register_code() { - __asm__(""); - } - - // GDB will inspect contents of this descriptor. - // Static initialization is necessary to prevent GDB from seeing - // uninitialized descriptor. - JITDescriptor __jit_debug_descriptor = { 1, JIT_NOACTION, nullptr, nullptr }; -} - - -static JITCodeEntry* CreateCodeEntry(const uint8_t *symfile_addr, - uintptr_t symfile_size) { - JITCodeEntry* entry = new JITCodeEntry; - entry->symfile_addr_ = symfile_addr; - entry->symfile_size_ = symfile_size; - entry->prev_ = nullptr; - - // TODO: Do we need a lock here? - entry->next_ = __jit_debug_descriptor.first_entry_; - if (entry->next_ != nullptr) { - entry->next_->prev_ = entry; - } - __jit_debug_descriptor.first_entry_ = entry; - __jit_debug_descriptor.relevant_entry_ = entry; - - __jit_debug_descriptor.action_flag_ = JIT_REGISTER_FN; - __jit_debug_register_code(); - return entry; -} - - -static void UnregisterCodeEntry(JITCodeEntry* entry) { - // TODO: Do we need a lock here? - if (entry->prev_ != nullptr) { - entry->prev_->next_ = entry->next_; - } else { - __jit_debug_descriptor.first_entry_ = entry->next_; - } - - if (entry->next_ != nullptr) { - entry->next_->prev_ = entry->prev_; - } - - __jit_debug_descriptor.relevant_entry_ = entry; - __jit_debug_descriptor.action_flag_ = JIT_UNREGISTER_FN; - __jit_debug_register_code(); - delete entry; -} - template <typename ElfTypes> ElfFileImpl<ElfTypes>::ElfFileImpl(File* file, bool writable, bool program_header_only, @@ -130,8 +52,6 @@ ElfFileImpl<ElfTypes>::ElfFileImpl(File* file, bool writable, hash_section_start_(nullptr), symtab_symbol_table_(nullptr), dynsym_symbol_table_(nullptr), - jit_elf_image_(nullptr), - jit_gdb_entry_(nullptr), requested_base_(requested_base) { CHECK(file != nullptr); } @@ -350,10 +270,6 @@ ElfFileImpl<ElfTypes>::~ElfFileImpl() { STLDeleteElements(&segments_); delete symtab_symbol_table_; delete dynsym_symbol_table_; - delete jit_elf_image_; - if (jit_gdb_entry_) { - UnregisterCodeEntry(jit_gdb_entry_); - } } template <typename ElfTypes> @@ -1377,11 +1293,6 @@ bool ElfFileImpl<ElfTypes>::Load(bool executable, std::string* error_msg) { return false; } - // Use GDB JIT support to do stack backtrace, etc. - if (executable) { - GdbJITSupport(); - } - return true; } @@ -1472,50 +1383,6 @@ void ElfFileImpl<ElfTypes>::ApplyOatPatches( } template <typename ElfTypes> -void ElfFileImpl<ElfTypes>::GdbJITSupport() { - // We only get here if we only are mapping the program header. - DCHECK(program_header_only_); - - // Well, we need the whole file to do this. - std::string error_msg; - // Make it MAP_PRIVATE so we can just give it to gdb if all the necessary - // sections are there. - std::unique_ptr<ElfFileImpl<ElfTypes>> all_ptr( - Open(const_cast<File*>(file_), PROT_READ | PROT_WRITE, MAP_PRIVATE, &error_msg)); - if (all_ptr.get() == nullptr) { - return; - } - ElfFileImpl<ElfTypes>& all = *all_ptr; - - // We need the eh_frame for gdb but debug info might be present without it. - const Elf_Shdr* eh_frame = all.FindSectionByName(".eh_frame"); - if (eh_frame == nullptr) { - return; - } - - // Do we have interesting sections? - // We need to add in a strtab and symtab to the image. - // all is MAP_PRIVATE so it can be written to freely. - // We also already have strtab and symtab so we are fine there. - Elf_Ehdr& elf_hdr = all.GetHeader(); - elf_hdr.e_entry = 0; - elf_hdr.e_phoff = 0; - elf_hdr.e_phnum = 0; - elf_hdr.e_phentsize = 0; - elf_hdr.e_type = ET_EXEC; - - // Since base_address_ is 0 if we are actually loaded at a known address (i.e. this is boot.oat) - // and the actual address stuff starts at in regular files this is good. - if (!all.FixupDebugSections(reinterpret_cast<intptr_t>(base_address_))) { - LOG(ERROR) << "Failed to load GDB data"; - return; - } - - jit_gdb_entry_ = CreateCodeEntry(all.Begin(), all.Size()); - gdb_file_mapping_.reset(all_ptr.release()); -} - -template <typename ElfTypes> bool ElfFileImpl<ElfTypes>::Strip(std::string* error_msg) { // ELF files produced by MCLinker look roughly like this // |