1 /* Copyright (C) 2007-2010 The Android Open Source Project 2 ** 3 ** This software is licensed under the terms of the GNU General Public 4 ** License version 2, as published by the Free Software Foundation, and 5 ** may be copied, distributed, and modified under those terms. 6 ** 7 ** This program is distributed in the hope that it will be useful, 8 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 9 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 ** GNU General Public License for more details. 11 */ 12 13 /* 14 * Contains implementation of routines that encapsulte an API for parsing 15 * an ELF file containing debugging information in DWARF format. 16 */ 17 18 #include "elff_api.h" 19 #include "elf_file.h" 20 #include "dwarf_defs.h" 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 26 ELFF_HANDLE 27 elff_init(const char* elf_file_path) 28 { 29 ElfFile* elf_file = ElfFile::Create(elf_file_path); 30 return reinterpret_cast<ELFF_HANDLE>(elf_file); 31 } 32 33 void 34 elff_close(ELFF_HANDLE handle) 35 { 36 if (handle != NULL) { 37 delete reinterpret_cast<ElfFile*>(handle); 38 } 39 } 40 41 int 42 elff_is_exec(ELFF_HANDLE handle) 43 { 44 assert(handle != NULL); 45 if (handle == NULL) { 46 _set_errno(EINVAL); 47 return -1; 48 } 49 return reinterpret_cast<ElfFile*>(handle)->is_exec(); 50 } 51 52 int 53 elff_get_pc_address_info(ELFF_HANDLE handle, 54 uint64_t address, 55 Elf_AddressInfo* address_info) 56 { 57 assert(handle != NULL && address_info != NULL); 58 if (handle == NULL || address_info == NULL) { 59 _set_errno(EINVAL); 60 return -1; 61 } 62 63 if (reinterpret_cast<ElfFile*>(handle)->get_pc_address_info(address, 64 address_info)) { 65 return 0; 66 } else { 67 return -1; 68 } 69 } 70 71 void 72 elff_free_pc_address_info(ELFF_HANDLE handle, Elf_AddressInfo* address_info) 73 { 74 assert(handle != NULL && address_info != NULL); 75 if (handle == NULL || address_info == NULL) { 76 return; 77 } 78 reinterpret_cast<ElfFile*>(handle)->free_pc_address_info(address_info); 79 } 80 81 #ifdef __cplusplus 82 } /* end of extern "C" */ 83 #endif 84 85