1*2de3b87aSKai Wang /*- 2*2de3b87aSKai Wang * Copyright (c) 2010 Kai Wang 3*2de3b87aSKai Wang * All rights reserved. 4*2de3b87aSKai Wang * 5*2de3b87aSKai Wang * Redistribution and use in source and binary forms, with or without 6*2de3b87aSKai Wang * modification, are permitted provided that the following conditions 7*2de3b87aSKai Wang * are met: 8*2de3b87aSKai Wang * 1. Redistributions of source code must retain the above copyright 9*2de3b87aSKai Wang * notice, this list of conditions and the following disclaimer. 10*2de3b87aSKai Wang * 2. Redistributions in binary form must reproduce the above copyright 11*2de3b87aSKai Wang * notice, this list of conditions and the following disclaimer in the 12*2de3b87aSKai Wang * documentation and/or other materials provided with the distribution. 13*2de3b87aSKai Wang * 14*2de3b87aSKai Wang * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15*2de3b87aSKai Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16*2de3b87aSKai Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17*2de3b87aSKai Wang * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18*2de3b87aSKai Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19*2de3b87aSKai Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20*2de3b87aSKai Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21*2de3b87aSKai Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22*2de3b87aSKai Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23*2de3b87aSKai Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24*2de3b87aSKai Wang * SUCH DAMAGE. 25*2de3b87aSKai Wang */ 26*2de3b87aSKai Wang 27*2de3b87aSKai Wang #include "_libdwarf.h" 28*2de3b87aSKai Wang 29*2de3b87aSKai Wang ELFTC_VCSID("$Id: dwarf_pro_reloc.c 2074 2011-10-27 03:34:33Z jkoshy $"); 30*2de3b87aSKai Wang 31*2de3b87aSKai Wang int 32*2de3b87aSKai Wang dwarf_get_relocation_info_count(Dwarf_P_Debug dbg, Dwarf_Unsigned *reloc_cnt, 33*2de3b87aSKai Wang int *drd_buffer_version, Dwarf_Error *error) 34*2de3b87aSKai Wang { 35*2de3b87aSKai Wang 36*2de3b87aSKai Wang if (dbg == NULL || reloc_cnt == NULL || drd_buffer_version == NULL) { 37*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 38*2de3b87aSKai Wang return (DW_DLV_ERROR); 39*2de3b87aSKai Wang } 40*2de3b87aSKai Wang 41*2de3b87aSKai Wang if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) { 42*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); 43*2de3b87aSKai Wang return (DW_DLV_NO_ENTRY); 44*2de3b87aSKai Wang } 45*2de3b87aSKai Wang 46*2de3b87aSKai Wang *reloc_cnt = dbg->dbgp_drscnt; 47*2de3b87aSKai Wang *drd_buffer_version = DWARF_DRD_BUFFER_VERSION; 48*2de3b87aSKai Wang 49*2de3b87aSKai Wang return (DW_DLV_OK); 50*2de3b87aSKai Wang } 51*2de3b87aSKai Wang 52*2de3b87aSKai Wang int 53*2de3b87aSKai Wang dwarf_get_relocation_info(Dwarf_P_Debug dbg, Dwarf_Signed *elf_section_index, 54*2de3b87aSKai Wang Dwarf_Signed *elf_section_link, Dwarf_Unsigned *reloc_entry_count, 55*2de3b87aSKai Wang Dwarf_Relocation_Data *reloc_buffer, Dwarf_Error *error) 56*2de3b87aSKai Wang { 57*2de3b87aSKai Wang Dwarf_Rel_Section drs; 58*2de3b87aSKai Wang Dwarf_Rel_Entry dre; 59*2de3b87aSKai Wang int i; 60*2de3b87aSKai Wang 61*2de3b87aSKai Wang if (dbg == NULL || elf_section_index == NULL || 62*2de3b87aSKai Wang elf_section_link == NULL || reloc_entry_count == NULL || 63*2de3b87aSKai Wang reloc_buffer == NULL) { 64*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_ARGUMENT); 65*2de3b87aSKai Wang return (DW_DLV_ERROR); 66*2de3b87aSKai Wang } 67*2de3b87aSKai Wang 68*2de3b87aSKai Wang if ((dbg->dbgp_flags & DW_DLC_SYMBOLIC_RELOCATIONS) == 0) { 69*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); 70*2de3b87aSKai Wang return (DW_DLV_NO_ENTRY); 71*2de3b87aSKai Wang } 72*2de3b87aSKai Wang 73*2de3b87aSKai Wang if (dbg->dbgp_drscnt == 0) { 74*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); 75*2de3b87aSKai Wang return (DW_DLV_NO_ENTRY); 76*2de3b87aSKai Wang } 77*2de3b87aSKai Wang 78*2de3b87aSKai Wang if (dbg->dbgp_drspos == NULL) { 79*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_NO_ENTRY); 80*2de3b87aSKai Wang return (DW_DLV_NO_ENTRY); 81*2de3b87aSKai Wang } 82*2de3b87aSKai Wang 83*2de3b87aSKai Wang drs = dbg->dbgp_drspos; 84*2de3b87aSKai Wang assert(drs->drs_ds != NULL && drs->drs_ref != NULL); 85*2de3b87aSKai Wang assert(drs->drs_drecnt > 0); 86*2de3b87aSKai Wang 87*2de3b87aSKai Wang *elf_section_index = drs->drs_ds->ds_ndx; 88*2de3b87aSKai Wang *elf_section_link = drs->drs_ref->ds_ndx; 89*2de3b87aSKai Wang *reloc_entry_count = drs->drs_drecnt; 90*2de3b87aSKai Wang 91*2de3b87aSKai Wang if (drs->drs_drd == NULL) { 92*2de3b87aSKai Wang drs->drs_drd = calloc(*reloc_entry_count, 93*2de3b87aSKai Wang sizeof(struct Dwarf_Relocation_Data_s)); 94*2de3b87aSKai Wang if (drs->drs_drd == NULL) { 95*2de3b87aSKai Wang DWARF_SET_ERROR(dbg, error, DW_DLE_MEMORY); 96*2de3b87aSKai Wang return (DW_DLV_ERROR); 97*2de3b87aSKai Wang } 98*2de3b87aSKai Wang for (i = 0, dre = STAILQ_FIRST(&drs->drs_dre); 99*2de3b87aSKai Wang (Dwarf_Unsigned) i < *reloc_entry_count && dre != NULL; 100*2de3b87aSKai Wang i++, dre = STAILQ_NEXT(dre, dre_next)) { 101*2de3b87aSKai Wang drs->drs_drd[i].drd_type = dre->dre_type; 102*2de3b87aSKai Wang drs->drs_drd[i].drd_length = dre->dre_length; 103*2de3b87aSKai Wang drs->drs_drd[i].drd_offset = dre->dre_offset; 104*2de3b87aSKai Wang drs->drs_drd[i].drd_symbol_index = dre->dre_symndx; 105*2de3b87aSKai Wang } 106*2de3b87aSKai Wang assert((Dwarf_Unsigned) i == *reloc_entry_count && dre == NULL); 107*2de3b87aSKai Wang } 108*2de3b87aSKai Wang 109*2de3b87aSKai Wang *reloc_buffer = drs->drs_drd; 110*2de3b87aSKai Wang 111*2de3b87aSKai Wang dbg->dbgp_drspos = STAILQ_NEXT(dbg->dbgp_drspos, drs_next); 112*2de3b87aSKai Wang 113*2de3b87aSKai Wang return (DW_DLV_OK); 114*2de3b87aSKai Wang } 115