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