49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Copyright (C) 2000,2002,2003,2004,2005 Silicon Graphics, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright (C) 2008-2010 Arxan Technologies, Inc. All Rights Reserved.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Portions Copyright (C) 2009-2010 David Anderson. 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
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe USA.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Contact information: Silicon Graphics, Inc., 1500 Crittenden Lane,
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#include "config.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "dwarf_incl.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdio.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <sys/stat.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <sys/types.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <string.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include <stdlib.h>
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#include "dwarf_incl.h"
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#include "malloc_check.h"
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#define DWARF_DBG_ERROR(dbg,errval,retval) \
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_error(dbg, error, errval); return(retval);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define FALSE 0
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#define TRUE 1
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/* This static is copied to the dbg on dbg init
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe so that the static need not be referenced at
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe run time, preserving better locality of
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe reference.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Value is 0 means do the string check.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Value non-zero means do not do the check.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic Dwarf_Small _dwarf_assume_string_bad;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic Dwarf_Small _dwarf_apply_relocs = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* Call this after calling dwarf_init but before doing anything else.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * It applies to all objects, not just the current object.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_set_reloc_application(int apply)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int oldval = _dwarf_apply_relocs;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe _dwarf_apply_relocs = apply;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return oldval;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowedwarf_set_stringcheck(int newval)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int oldval = _dwarf_assume_string_bad;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_assume_string_bad = newval;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return oldval;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* Unifies the basic duplicate/empty testing and section
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe * data setting to one place. */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweget_basic_section_data(Dwarf_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Section_s *secdata,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Obj_Access_Section_s *doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half section_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error* error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int duperr, int emptyerr )
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (secdata->dss_index != 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, duperr, DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (doas->size == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (emptyerr == 0 ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Allow empty section. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Know no reason to allow section */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, emptyerr, DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_index = section_index;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_size = doas->size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_addr = doas->addr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_link = doas->link;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowestatic void
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweadd_rela_data( struct Dwarf_Section_s *secdata,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Obj_Access_Section_s *doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half section_index)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_reloc_index = section_index;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_reloc_size = doas->size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_reloc_addr = doas->addr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_reloc_symtab = doas->link;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe secdata->dss_reloc_link = doas->link;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Given an Elf ptr, set up dbg with pointers
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe to all the Dwarf data sections.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe Return NULL on error.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe This function is also responsible for determining
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe whether the given object contains Dwarf information
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe or not. The test currently used is that it contains
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe either a .debug_info or a .debug_frame section. If
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe not, it returns DW_DLV_NO_ENTRY causing dwarf_init() also to
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_NO_ENTRY. Earlier, we had thought of using only
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe the presence/absence of .debug_info to test, but we
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe added .debug_frame since there could be stripped objects
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe that have only a .debug_frame section for exception
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe processing.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe DW_DLV_NO_ENTRY or DW_DLV_OK or DW_DLV_ERROR
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowestatic int
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe_dwarf_setup(Dwarf_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe const char *scn_name = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int foundDwarf = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Obj_Access_Interface_s * obj = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Endianness endianness;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned section_size = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned section_count = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Half section_index = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Addr section_addr = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe foundDwarf = FALSE;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_assume_string_in_bounds = _dwarf_assume_string_bad;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_same_endian = 1;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_copy_word = memcpy;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe obj = dbg->de_obj_file;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe endianness = obj->methods->get_byte_order(obj->object);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#ifdef WORDS_BIGENDIAN
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_big_endian_object = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (endianness == DW_OBJECT_LSB ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_same_endian = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_big_endian_object = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#else /* little endian */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_big_endian_object = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (endianness == DW_OBJECT_MSB ) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_same_endian = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_big_endian_object = 1;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_copy_word = _dwarf_memcpy_swap_bytes;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif /* !WORDS_BIGENDIAN */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The following de_length_size is Not Too Significant. Only used
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe one calculation, and an approximate one at that. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_length_size = obj->methods->get_length_size(obj->object);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_pointer_size = obj->methods->get_pointer_size(obj->object);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_count = obj->methods->get_section_count(obj->object);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* We can skip index 0 when considering ELF files, but not other
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe object types. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe for (section_index = 0; section_index < section_count;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe ++section_index) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Obj_Access_Section_s doas;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = DW_DLV_ERROR;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int err;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = obj->methods->get_section_info(obj->object,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &doas, &err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res == DW_DLV_ERROR){
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_addr = doas.addr;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_size = doas.size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe scn_name = doas.name;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (strncmp(scn_name, ".debug_", 7)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe && strcmp(scn_name, ".eh_frame")
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe && strcmp(scn_name, ".symtab")
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe && strcmp(scn_name, ".strtab")
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe && strncmp(scn_name, ".rela.",6)) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe continue;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_info") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_info, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_INFO_DUPLICATE,DW_DLE_DEBUG_INFO_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe foundDwarf = TRUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_abbrev") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_abbrev, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_ABBREV_DUPLICATE,DW_DLE_DEBUG_ABBREV_NULL);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_aranges") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_aranges, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_ARANGES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_line") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_line, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_LINE_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_frame") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_frame, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_FRAME_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe foundDwarf = TRUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(scn_name, ".eh_frame") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* gnu egcs-1.1.2 data */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_frame_eh_gnu, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_FRAME_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe foundDwarf = TRUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_loc") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_loc, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_LOC_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_pubnames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_pubnames, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_PUBNAMES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_str") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_str, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_STR_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_funcnames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* SGI IRIX-only. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_funcnames, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_FUNCNAMES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_typenames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* SGI IRIX-only, created years before DWARF3. Content
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe essentially identical to .debug_pubtypes. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_typenames, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_TYPENAMES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(scn_name, ".debug_pubtypes") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* Section new in DWARF3. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_pubtypes, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_PUBTYPES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_varnames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* SGI IRIX-only. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_varnames, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_VARNAMES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_weaknames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* SGI IRIX-only. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_weaknames, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_WEAKNAMES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(scn_name, ".debug_macinfo") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_macinfo, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_MACINFO_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".debug_ranges") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_debug_ranges, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_RANGES_DUPLICATE,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe foundDwarf = TRUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".symtab") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_elf_symtab, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_SYMTAB_ERR,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strcmp(scn_name, ".strtab") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = get_basic_section_data(dbg,&dbg->de_elf_strtab, &doas,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe section_index,error,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_DLE_DEBUG_STRTAB_ERR,0);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe else if (strncmp(scn_name, ".rela.debug_",12) == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe const char *rcn_name = scn_name + 5;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (strcmp(rcn_name, ".debug_info") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_info,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_abbrev") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_abbrev,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_aranges") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_aranges,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_line") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_line,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_frame") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_frame,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".eh_frame") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_frame_eh_gnu,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_loc") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_loc,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_pubnames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_pubnames,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_str") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_str,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_funcnames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_funcnames,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_typenames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_typenames,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_pubtypes") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_pubtypes,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_varnames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_varnames,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_weaknames") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_weaknames,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe } else if (strcmp(rcn_name, ".debug_macinfo") == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe add_rela_data(&dbg->de_debug_macinfo,&doas,section_index);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (foundDwarf) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_NO_ENTRY;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Use a Dwarf_Obj_Access_Interface to kick things off. All other
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe init routines eventually use this one.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe The returned Dwarf_Debug contains a copy of *obj
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe the callers copy of *obj may be freed whenever the caller
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe wishes.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_object_init(Dwarf_Obj_Access_Interface* obj, Dwarf_Handler errhand,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Ptr errarg, Dwarf_Debug* ret_dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error* error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Debug dbg = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int setup_result = DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg = _dwarf_get_debug();
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (dbg == NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_errhand = errhand;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe dbg->de_errarg = errarg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_rule_initial_value = DW_FRAME_REG_INITIAL_VALUE;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_reg_rules_entry_count = DW_FRAME_LAST_REG_NUM;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe#ifdef HAVE_OLD_FRAME_CFA_COL
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* DW_FRAME_CFA_COL is really only suitable for old libdwarf frame
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe interfaces and its value of 0 there is only usable where
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (as in MIPS) register 0 has no value other than 0 so
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe we can use the frame table column 0 for the CFA value
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (and rely on client software to know when 'register 0'
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe is the cfa and when to just use a value 0 for register 0).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#else
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_cfa_col_number = DW_FRAME_CFA_COL3;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe#endif
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_same_value_number = DW_FRAME_SAME_VAL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_frame_undefined_value_number = DW_FRAME_UNDEFINED_VAL;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg->de_obj_file = obj;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe setup_result = _dwarf_setup(dbg, error);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (setup_result != DW_DLV_OK) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* The status we want to return here is of _dwarf_setup,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe not of the _dwarf_free_all_of_one_debug(dbg) call.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe So use a local status variable for the free. */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int freeresult = _dwarf_free_all_of_one_debug(dbg);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (freeresult == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_malloc_check_complete("After Final free");
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return setup_result;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_harmless_init(&dbg->de_harmless_errors,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DW_HARMLESS_ERROR_CIRCULAR_LIST_DEFAULT_SIZE);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /* This call cannot fail: allocates nothing, releases nothing */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe _dwarf_setup_debug(dbg);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe *ret_dbg = dbg;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe A finish routine that is completely unaware of ELF.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Frees all memory that was not previously freed by
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_dealloc.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Aside frmo certain categories.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe */
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_object_finish(Dwarf_Debug dbg, Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe int res = DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe res = _dwarf_free_all_of_one_debug(dbg);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe if (res == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, DW_DLE_DBG_ALLOC, DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dwarf_malloc_check_complete("After Final free");
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe/*
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Load the ELF section with the specified index and set the
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe pointer pointed to by section_data to the memory where it
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe was loaded.
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe */
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Loweint
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe_dwarf_load_section(Dwarf_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Section_s *section,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Error * error)
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int res = DW_DLV_ERROR;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe int err = 0;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe struct Dwarf_Obj_Access_Interface_s *o = 0;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe /* check to see if the section is already loaded */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if (section->dss_data != NULL) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe o = dbg->de_obj_file;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = o->methods->load_section(
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe o->object, section->dss_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe &section->dss_data, &err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res == DW_DLV_ERROR){
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(_dwarf_apply_relocs == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(section->dss_reloc_size == 0) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(!o->methods->relocate_a_section) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe /*apply relocations */
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe res = o->methods->relocate_a_section( o->object, section->dss_index,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe dbg, &err);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe if(res == DW_DLV_ERROR) {
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe DWARF_DBG_ERROR(dbg, err, DW_DLV_ERROR);
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe }
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe return res;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe}
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe/* This is a hack so clients can verify offsets.
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Added April 2005 so that debugger can detect broken offsets
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe (which happened in an IRIX -64 executable larger than 2GB
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe using MIPSpro 7.3.1.3 compilers. A couple .debug_pubnames
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe offsets were wrong.).
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe*/
07dc1947c362e187fb955d283b692f8769dd5defRichard Loweint
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowedwarf_get_section_max_offsets(Dwarf_Debug dbg,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_info_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_abbrev_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_line_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_loc_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_aranges_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_macinfo_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_pubnames_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_str_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_frame_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_ranges_size,
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe Dwarf_Unsigned * debug_typenames_size)
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe{
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_info_size = dbg->de_debug_info.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_abbrev_size = dbg->de_debug_abbrev.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_line_size = dbg->de_debug_line.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_loc_size = dbg->de_debug_loc.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_aranges_size = dbg->de_debug_aranges.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_macinfo_size = dbg->de_debug_macinfo.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_pubnames_size = dbg->de_debug_pubnames.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_str_size = dbg->de_debug_str.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_frame_size = dbg->de_debug_frame.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_ranges_size = dbg->de_debug_ranges.dss_size;
07dc1947c362e187fb955d283b692f8769dd5defRichard Lowe *debug_typenames_size = dbg->de_debug_typenames.dss_size;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe return DW_DLV_OK;
49d3bc91e27cd871b950d56c01398fa2f2e12ab4Richard Lowe}