1 /* $NetBSD: dwarf_init.c,v 1.3 2016/02/20 02:43:41 christos Exp $ */ 2 3 /*- 4 * Copyright (c) 2007 John Birrell (jb@freebsd.org) 5 * Copyright (c) 2009 Kai Wang 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #include "_libdwarf.h" 31 32 __RCSID("$NetBSD: dwarf_init.c,v 1.3 2016/02/20 02:43:41 christos Exp $"); 33 ELFTC_VCSID("Id: dwarf_init.c 2073 2011-10-27 03:30:47Z jkoshy "); 34 35 int 36 dwarf_elf_init(Elf *elf, int mode, Dwarf_Handler errhand, Dwarf_Ptr errarg, 37 Dwarf_Debug *ret_dbg, Dwarf_Error *error) 38 { 39 Dwarf_Debug dbg; 40 int ret; 41 42 if (elf == NULL || ret_dbg == NULL) { 43 DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 44 return (DW_DLV_ERROR); 45 } 46 47 if (mode != DW_DLC_READ) { 48 DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 49 return (DW_DLV_ERROR); 50 } 51 52 if (_dwarf_alloc(&dbg, mode, error) != DW_DLE_NONE) 53 return (DW_DLV_ERROR); 54 55 if (_dwarf_elf_init(dbg, elf, error) != DW_DLE_NONE) { 56 free(dbg); 57 return (DW_DLV_ERROR); 58 } 59 60 if ((ret = _dwarf_init(dbg, 0, errhand, errarg, error)) != 61 DW_DLE_NONE) { 62 _dwarf_elf_deinit(dbg); 63 free(dbg); 64 if (ret == DW_DLE_DEBUG_INFO_NULL) 65 return (DW_DLV_NO_ENTRY); 66 else 67 return (DW_DLV_ERROR); 68 } 69 70 *ret_dbg = dbg; 71 72 return (DW_DLV_OK); 73 } 74 75 int 76 dwarf_get_elf(Dwarf_Debug dbg, Elf **elf, Dwarf_Error *error) 77 { 78 Dwarf_Elf_Object *e; 79 80 if (dbg == NULL || elf == NULL) { 81 DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 82 return (DW_DLV_ERROR); 83 } 84 85 e = dbg->dbg_iface->object; 86 *elf = e->eo_elf; 87 88 return (DW_DLV_OK); 89 } 90 91 int 92 dwarf_init(int fd, int mode, Dwarf_Handler errhand, Dwarf_Ptr errarg, 93 Dwarf_Debug *ret_dbg, Dwarf_Error *error) 94 { 95 Dwarf_Debug dbg; 96 Elf *elf; 97 int ret; 98 99 if (fd < 0 || ret_dbg == NULL) { 100 DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 101 return (DW_DLV_ERROR); 102 } 103 104 if (mode != DW_DLC_READ) { 105 DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 106 return (DW_DLV_ERROR); 107 } 108 109 if (elf_version(EV_CURRENT) == EV_NONE) { 110 DWARF_SET_ELF_ERROR(NULL, error); 111 return (DW_DLV_ERROR); 112 } 113 114 if ((elf = elf_begin(fd, ELF_C_READ, NULL)) == NULL) { 115 DWARF_SET_ELF_ERROR(NULL, error); 116 return (DW_DLV_ERROR); 117 } 118 119 if (_dwarf_alloc(&dbg, mode, error) != DW_DLE_NONE) 120 return (DW_DLV_ERROR); 121 122 if (_dwarf_elf_init(dbg, elf, error) != DW_DLE_NONE) { 123 free(dbg); 124 return (DW_DLV_ERROR); 125 } 126 127 if ((ret = _dwarf_init(dbg, 0, errhand, errarg, error)) != 128 DW_DLE_NONE) { 129 _dwarf_elf_deinit(dbg); 130 free(dbg); 131 if (ret == DW_DLE_DEBUG_INFO_NULL) 132 return (DW_DLV_NO_ENTRY); 133 else 134 return (DW_DLV_ERROR); 135 } 136 137 *ret_dbg = dbg; 138 139 return (DW_DLV_OK); 140 } 141 142 int 143 dwarf_object_init(Dwarf_Obj_Access_Interface *iface, Dwarf_Handler errhand, 144 Dwarf_Ptr errarg, Dwarf_Debug *ret_dbg, Dwarf_Error *error) 145 { 146 Dwarf_Debug dbg; 147 148 if (iface == NULL || ret_dbg == NULL) { 149 DWARF_SET_ERROR(NULL, error, DW_DLE_ARGUMENT); 150 return (DW_DLV_ERROR); 151 } 152 153 if (_dwarf_alloc(&dbg, DW_DLC_READ, error) != DW_DLE_NONE) 154 return (DW_DLV_ERROR); 155 156 dbg->dbg_iface = iface; 157 158 if (_dwarf_init(dbg, 0, errhand, errarg, error) != DW_DLE_NONE) { 159 free(dbg); 160 return (DW_DLV_ERROR); 161 } 162 163 *ret_dbg = dbg; 164 165 return (DW_DLV_OK); 166 } 167