pro_reloc_symbolic.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#include "pro_section.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_reloc.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "pro_reloc_symbolic.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return DW_DLV_ERROR on malloc error.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return DW_DLV_OK otherwise
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_reloc_name_symbolic(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe reloc
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned symidx,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe enum Dwarf_Rel_Type type,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int reltarget_length)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* get a slot, fill in the slot entry */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe void *relrec_to_fill;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_Relocation_Data_s *slotp;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe &relrec_to_fill);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp = (struct Dwarf_Relocation_Data_s *) relrec_to_fill;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp->drd_type = type;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp->drd_length = reltarget_length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp->drd_offset = offset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp->drd_symbol_index = symidx;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return DW_DLV_ERROR on malloc error.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return DW_DLV_OK otherwise
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_pro_reloc_length_symbolic(Dwarf_P_Debug dbg, int base_sec_index, Dwarf_Unsigned offset, /* r_offset
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe reloc
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned start_symidx,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned end_symidx,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe enum Dwarf_Rel_Type type,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int reltarget_length)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* get a slot, fill in the slot entry */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe void *relrec_to_fill;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_Relocation_Data_s *slotp1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_Relocation_Data_s *slotp2;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe &relrec_to_fill);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp1 = (struct Dwarf_Relocation_Data_s *) relrec_to_fill;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_reloc_get_a_slot(dbg, base_sec_index,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe &relrec_to_fill);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp2 = (struct Dwarf_Relocation_Data_s *) relrec_to_fill;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ASSERT: type == dwarf_drt_first_of_length_type_pair */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp1->drd_type = type;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp1->drd_length = reltarget_length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp1->drd_offset = offset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp1->drd_symbol_index = start_symidx;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp2->drd_type = dwarf_drt_second_of_length_pair;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp2->drd_length = reltarget_length;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp2->drd_offset = offset;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe slotp2->drd_symbol_index = end_symidx;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Reset whatever fields of Dwarf_P_Per_Reloc_Sect_s
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe we must to allow adding a fresh new single
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe block easily (block consolidation use only).
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic void
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_reset_reloc_sect_info(struct Dwarf_P_Per_Reloc_Sect_s *pblk,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long ct)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* do not zero pr_sect_num_of_reloc_sect */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe pblk->pr_reloc_total_count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe pblk->pr_first_block = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe pblk->pr_last_block = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe pblk->pr_block_count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe pblk->pr_slots_per_block_to_alloc = ct;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Ensure each stream is a single buffer and
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe add that single buffer to the set of stream buffers.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe By creating a new buffer and copying if necessary.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe (If > 1 block, reduce to 1 block)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Free the input set of buffers if we consolidate.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe We pass back *new_sec_count as zero because we
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe are not creating normal sections for a .o, but
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe symbolic relocations, separately counted.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return -1 on error (malloc failure)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return DW_DLV_OK on success. Any other return indicates
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe malloc failed.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_symbolic_relocs_to_disk(Dwarf_P_Debug dbg,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Signed * new_sec_count)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* unsigned long total_size =0; */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Small *data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int sec_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long i;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Error error;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Signed sec_count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_P_Per_Reloc_Sect p_reloc = &dbg->de_reloc_sect[0];
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe for (i = 0; i < NUM_DEBUG_SECTIONS; ++i, ++p_reloc) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long ct = p_reloc->pr_reloc_total_count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Relocation_Block_s *p_blk;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Relocation_Block_s *p_blk_last;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* int len */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int err;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (ct == 0) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe continue;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* len = dbg->de_relocation_record_size; */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe ++sec_count;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* total_size = ct *len; */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe sec_index = p_reloc->pr_sect_num_of_reloc_sect;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (sec_index == 0) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* call de_func or de_func_b, getting section number of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe reloc sec */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int rel_section_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int int_name;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Dwarf_Unsigned name_idx;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This is a bit of a fake, as we do not really have true
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe elf sections at all. Just the data such might contain.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe But this lets the caller eventually link things
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe together: without this call we would not know what rel
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data goes with what section when we are asked for the
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe real arrays. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg->de_func_b) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe rel_section_index =
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_func_b(_dwarf_rel_section_names[i],
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_relocation_record_size,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* type */ SHT_REL,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* flags */ 0,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* link to symtab, which we cannot
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe know */ SHN_UNDEF,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* sec rels apply to */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_elf_sects[i],
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe &name_idx, &err);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } else {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe rel_section_index =
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_func(_dwarf_rel_section_names[i],
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_relocation_record_size,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* type */ SHT_REL,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* flags */ 0,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* link to symtab, which we cannot
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe know */ SHN_UNDEF,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* sec rels apply to, in elf, sh_info */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_elf_sects[i], &int_name, &err);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe name_idx = int_name;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (rel_section_index == -1) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_p_error(dbg, &error, DW_DLE_ELF_SECT_ERR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return (DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe p_reloc->pr_sect_num_of_reloc_sect = rel_section_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe sec_index = rel_section_index;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe p_blk = p_reloc->pr_first_block;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (p_reloc->pr_block_count > 1) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe struct Dwarf_P_Relocation_Block_s *new_blk;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* HACK , not normal interfaces, trashing p_reloc
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe current contents! */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_reset_reloc_sect_info(p_reloc, ct);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* Creating new single block for all 'ct' entries */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_pro_pre_alloc_n_reloc_slots(dbg, (int) i, ct);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res != DW_DLV_OK) {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe new_blk = p_reloc->pr_first_block;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data = (Dwarf_Small *) new_blk->rb_data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* The following loop does the consolidation to a
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe single block and frees the input block(s). */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe do {
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe unsigned long len =
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe p_blk->rb_where_to_add_next - p_blk->rb_data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe memcpy(data, p_blk->rb_data, len);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe data += len;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe p_blk_last = p_blk;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe p_blk = p_blk->rb_next;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_p_dealloc(dbg, (Dwarf_Small *) p_blk_last);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe } while (p_blk) ;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* ASSERT: sum of len copied == total_size */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe new_blk->rb_next_slot_to_use = ct;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe new_blk->rb_where_to_add_next = (char *) data;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe p_reloc->pr_reloc_total_count = ct;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* have now created a single block, but no change in slots
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe used (pr_reloc_total_count) */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *new_sec_count = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}