| /* 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 | |