• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
elff_init(const char * elf_file_path)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
elff_close(ELFF_HANDLE handle)34 elff_close(ELFF_HANDLE handle)
35 {
36   if (handle != NULL) {
37     delete reinterpret_cast<ElfFile*>(handle);
38   }
39 }
40 
41 int
elff_is_exec(ELFF_HANDLE handle)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
elff_get_pc_address_info(ELFF_HANDLE handle,uint64_t address,Elf_AddressInfo * address_info)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
elff_free_pc_address_info(ELFF_HANDLE handle,Elf_AddressInfo * address_info)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