pro_reloc.c revision 49d3bc91e27cd871b950d56c01398fa2f2e12ab4
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Copyright (C) 2000 Silicon Graphics, Inc. All Rights Reserved.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is free software; you can redistribute it and/or modify it
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe under the terms of version 2.1 of the GNU Lesser General Public License
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe as published by the Free Software Foundation.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This program is distributed in the hope that it would be useful, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe WITHOUT ANY WARRANTY; without even the implied warranty of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Further, this software is distributed without any warranty that it is
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe free of the rightful claim of any third person regarding infringement
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or the like. Any license provided herein, whether implied or
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe otherwise, applies only to this software file. Patent licenses, if
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe any, provided herein do not apply to combinations of this program with
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe other software, or any other product whatsoever.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe You should have received a copy of the GNU Lesser General Public
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe License along with this program; if not, write the Free Software
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Foundation, Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe USA.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pky,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Mountain View, CA 94043, or:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://www.sgi.com
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe For further information regarding this notice, see:
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe http://oss.sgi.com/projects/GenInfo/NoticeExplan
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "config.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "libdwarfdefs.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdio.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <string.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*#include <elfaccess.h> */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*Do initial alloc of newslots slots.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Fails only if malloc fails.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Supposed to be called before any relocs allocated.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Ignored if after any allocated.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Part of an optimization, so that for a known 'newslots'
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe relocations count we can preallocate the right size block.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Called from just 2 places.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe returns DW_DLV_OK or DW_DLV_ERROR
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_pre_alloc_n_reloc_slots(Dwarf_P_Debug dbg,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int rel_sec_index,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned newslots)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long len;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Relocation_Block_s *data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[rel_sec_index];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long slots_in_blk = (unsigned long) newslots;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long rel_rec_size = dbg->de_relocation_record_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (prel->pr_first_block)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK; /* do nothing */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe len = sizeof(struct Dwarf_P_Relocation_Block_s) +
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slots_in_blk * rel_rec_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data = (struct Dwarf_P_Relocation_Block_s *)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_p_get_alloc(dbg, len);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (!data) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_ERROR;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_slots_in_block = slots_in_blk; /* could use default
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe here, as fallback in
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe case our origininal
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe estimate wrong.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe When we call this we
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe presumably know what
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe we are doing, so
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe keep this count for
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe now */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_next_slot_to_use = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_where_to_add_next =
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ((char *) data) + sizeof(struct Dwarf_P_Relocation_Block_s);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_data = data->rb_where_to_add_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_first_block = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_last_block = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_block_count = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*Do alloc of slots.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Fails only if malloc fails.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Only allocator used.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe returns DW_DLV_OK or DW_DLV_ERROR
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_alloc_reloc_slots(Dwarf_P_Debug dbg, int rel_sec_index)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long len;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Relocation_Block_s *data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[rel_sec_index];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long slots_in_blk = prel->pr_slots_per_block_to_alloc;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long rel_rec_size = dbg->de_relocation_record_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe len = sizeof(struct Dwarf_P_Relocation_Block_s) +
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slots_in_blk * rel_rec_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data = (struct Dwarf_P_Relocation_Block_s *)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_p_get_alloc(dbg, len);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (!data) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_ERROR;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (prel->pr_first_block) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_last_block->rb_next = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_last_block = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_block_count += 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_first_block = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_last_block = data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_block_count = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_slots_in_block = slots_in_blk;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_next_slot_to_use = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_where_to_add_next =
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ((char *) data) + sizeof(struct Dwarf_P_Relocation_Block_s);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_data = data->rb_where_to_add_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Reserve a slot. return DW_DLV_OK if succeeds.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return DW_DLV_ERROR if fails (malloc error).
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Use the relrec_to_fill to pass back a pointer to
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe a slot space to use.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_reloc_get_a_slot(Dwarf_P_Debug dbg,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int base_sec_index, void **relrec_to_fill)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Relocation_Block_s *data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[base_sec_index];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long rel_rec_size = dbg->de_relocation_record_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe char *ret_addr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data = prel->pr_last_block;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if ((data == 0) ||
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe (data->rb_next_slot_to_use >= data->rb_slots_in_block)) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_alloc_reloc_slots(dbg, base_sec_index);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data = prel->pr_last_block;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* now we have an empty slot */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ret_addr = data->rb_where_to_add_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_where_to_add_next += rel_rec_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data->rb_next_slot_to_use += 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe prel->pr_reloc_total_count += 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *relrec_to_fill = (void *) ret_addr;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe On success returns count of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe .rel.* sections that are symbolic
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe thru count_of_relocation_sections.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe On success, returns DW_DLV_OK.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe If this is not a 'symbolic' run, returns
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe DW_DLV_NO_ENTRY.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe No errors are possible.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*ARGSUSED*/ int
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_get_relocation_info_count(Dwarf_P_Debug dbg,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned *
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe count_of_relocation_sections,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int *drd_buffer_version,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_flags & DW_DLC_SYMBOLIC_RELOCATIONS) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int i;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned int count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (i = 0; i < NUM_DEBUG_SECTIONS; ++i) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_reloc_sect[i].pr_reloc_total_count > 0) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ++count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *count_of_relocation_sections = (Dwarf_Unsigned) count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *drd_buffer_version = DWARF_DRD_BUFFER_VERSION;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_NO_ENTRY;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_get_relocation_info(Dwarf_P_Debug dbg,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Signed * elf_section_index,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Signed * elf_section_index_link,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned * relocation_buffer_count,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Relocation_Data * reldata_buffer,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int next = dbg->de_reloc_next_to_return;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_flags & DW_DLC_SYMBOLIC_RELOCATIONS) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int i;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (i = next; i < NUM_DEBUG_SECTIONS; ++i) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Per_Reloc_Sect prel = &dbg->de_reloc_sect[i];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (prel->pr_reloc_total_count > 0) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_reloc_next_to_return = i + 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ASSERT: prel->.pr_block_count == 1 */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *elf_section_index = prel->pr_sect_num_of_reloc_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *elf_section_index_link = dbg->de_elf_sects[i];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *relocation_buffer_count = prel->pr_reloc_total_count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *reldata_buffer = (Dwarf_Relocation_Data)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe (prel->pr_first_block->rb_data);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe DWARF_P_DBG_ERROR(dbg, DW_DLE_REL_ALLOC, DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_NO_ENTRY;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}