| /* Copyright (C) 2007-2010 The Android Open Source Project |
| ** |
| ** This software is licensed under the terms of the GNU General Public |
| ** License version 2, as published by the Free Software Foundation, and |
| ** may be copied, distributed, and modified under those terms. |
| ** |
| ** This program is distributed in the hope that it will be useful, |
| ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ** GNU General Public License for more details. |
| */ |
| |
| /* |
| * Contains implementation of routines that encapsulte an API for parsing |
| * an ELF file containing debugging information in DWARF format. |
| */ |
| |
| #include "elff_api.h" |
| #include "elf_file.h" |
| #include "dwarf_defs.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| ELFF_HANDLE |
| elff_init(const char* elf_file_path) |
| { |
| ElfFile* elf_file = ElfFile::Create(elf_file_path); |
| return reinterpret_cast<ELFF_HANDLE>(elf_file); |
| } |
| |
| void |
| elff_close(ELFF_HANDLE handle) |
| { |
| if (handle != NULL) { |
| delete reinterpret_cast<ElfFile*>(handle); |
| } |
| } |
| |
| int |
| elff_is_exec(ELFF_HANDLE handle) |
| { |
| assert(handle != NULL); |
| if (handle == NULL) { |
| _set_errno(EINVAL); |
| return -1; |
| } |
| return reinterpret_cast<ElfFile*>(handle)->is_exec(); |
| } |
| |
| int |
| elff_get_pc_address_info(ELFF_HANDLE handle, |
| uint64_t address, |
| Elf_AddressInfo* address_info) |
| { |
| assert(handle != NULL && address_info != NULL); |
| if (handle == NULL || address_info == NULL) { |
| _set_errno(EINVAL); |
| return -1; |
| } |
| |
| if (reinterpret_cast<ElfFile*>(handle)->get_pc_address_info(address, |
| address_info)) { |
| return 0; |
| } else { |
| return -1; |
| } |
| } |
| |
| void |
| elff_free_pc_address_info(ELFF_HANDLE handle, Elf_AddressInfo* address_info) |
| { |
| assert(handle != NULL && address_info != NULL); |
| if (handle == NULL || address_info == NULL) { |
| return; |
| } |
| reinterpret_cast<ElfFile*>(handle)->free_pc_address_info(address_info); |
| } |
| |
| #ifdef __cplusplus |
| } /* end of extern "C" */ |
| #endif |
| |