|
Packit |
cdaae3 |
/*
|
|
Packit |
cdaae3 |
Copyright 2014-2014 David Anderson. All rights reserved.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This program is free software; you can redistribute it and/or modify it
|
|
Packit |
cdaae3 |
under the terms of version 2 of the GNU General Public License as
|
|
Packit |
cdaae3 |
published by the Free Software Foundation.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This program is distributed in the hope that it would be useful, but
|
|
Packit |
cdaae3 |
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
cdaae3 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
Further, this software is distributed without any warranty that it is
|
|
Packit |
cdaae3 |
free of the rightful claim of any third person regarding infringement
|
|
Packit |
cdaae3 |
or the like. Any license provided herein, whether implied or
|
|
Packit |
cdaae3 |
otherwise, applies only to this software file. Patent licenses, if
|
|
Packit |
cdaae3 |
any, provided herein do not apply to combinations of this program with
|
|
Packit |
cdaae3 |
other software, or any other product whatsoever.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
You should have received a copy of the GNU General Public License along
|
|
Packit |
cdaae3 |
with this program; if not, write the Free Software Foundation, Inc., 51
|
|
Packit |
cdaae3 |
Franklin Street - Fifth Floor, Boston MA 02110-1301, USA.
|
|
Packit |
cdaae3 |
*/
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#include "globals.h"
|
|
Packit |
cdaae3 |
#include "naming.h"
|
|
Packit |
cdaae3 |
#include "esb.h"
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#include "print_sections.h"
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int
|
|
Packit |
cdaae3 |
print_culist_array(Dwarf_Debug dbg,
|
|
Packit |
cdaae3 |
Dwarf_Gdbindex gdbindex,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned *cu_list_len,
|
|
Packit |
cdaae3 |
Dwarf_Error * culist_err)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
Dwarf_Unsigned list_len = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned i;
|
|
Packit |
cdaae3 |
int res = dwarf_gdbindex_culist_array(gdbindex,
|
|
Packit |
cdaae3 |
&list_len,culist_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_culist_array failed",res,*culist_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf(" CU list. array length: %" DW_PR_DUu
|
|
Packit |
cdaae3 |
" format: [entry#] cuoffset culength\n",
|
|
Packit |
cdaae3 |
list_len);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
for( i = 0; i < list_len; i++) {
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cuoffset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned culength = 0;
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_culist_entry(gdbindex,i,
|
|
Packit |
cdaae3 |
&cuoffset,&culength,culist_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_culist_entry failed",res,*culist_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "] 0x%"
|
|
Packit |
cdaae3 |
DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" 0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
i,
|
|
Packit |
cdaae3 |
cuoffset,
|
|
Packit |
cdaae3 |
culength);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("\n");
|
|
Packit |
cdaae3 |
*cu_list_len = list_len;
|
|
Packit |
cdaae3 |
return DW_DLV_OK;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int
|
|
Packit |
cdaae3 |
print_types_culist_array(Dwarf_Debug dbg,
|
|
Packit |
cdaae3 |
Dwarf_Gdbindex gdbindex,
|
|
Packit |
cdaae3 |
Dwarf_Error * cular_err)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
Dwarf_Unsigned list_len = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned i;
|
|
Packit |
cdaae3 |
int res = dwarf_gdbindex_types_culist_array(gdbindex,
|
|
Packit |
cdaae3 |
&list_len,cular_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_types_culist_array failed",res,*cular_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf(" TU list. array length: %" DW_PR_DUu
|
|
Packit |
cdaae3 |
" format: [entry#] cuoffset culength signature\n",
|
|
Packit |
cdaae3 |
list_len);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
for( i = 0; i < list_len; i++) {
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cuoffset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned culength = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned signature = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_types_culist_entry(gdbindex,i,
|
|
Packit |
cdaae3 |
&cuoffset,&culength,
|
|
Packit |
cdaae3 |
&signature,
|
|
Packit |
cdaae3 |
cular_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_culist_entry failed",res,*cular_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "] 0x%"
|
|
Packit |
cdaae3 |
DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" 0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
i,
|
|
Packit |
cdaae3 |
cuoffset,
|
|
Packit |
cdaae3 |
culength,
|
|
Packit |
cdaae3 |
signature);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("\n");
|
|
Packit |
cdaae3 |
return DW_DLV_OK;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int
|
|
Packit |
cdaae3 |
print_addressarea(Dwarf_Debug dbg,
|
|
Packit |
cdaae3 |
Dwarf_Gdbindex gdbindex,
|
|
Packit |
cdaae3 |
Dwarf_Error * addra_err)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
Dwarf_Unsigned list_len = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned i;
|
|
Packit |
cdaae3 |
int res = dwarf_gdbindex_addressarea(gdbindex,
|
|
Packit |
cdaae3 |
&list_len,addra_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_addressarea failed",res,*addra_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf(" Address table array length: %" DW_PR_DUu
|
|
Packit |
cdaae3 |
" format: [entry#] lowpc highpc cu-index\n",
|
|
Packit |
cdaae3 |
list_len);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
for( i = 0; i < list_len; i++) {
|
|
Packit |
cdaae3 |
Dwarf_Unsigned lowpc = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned highpc = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cu_index = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_addressarea_entry(gdbindex,i,
|
|
Packit |
cdaae3 |
&lowpc,&highpc,
|
|
Packit |
cdaae3 |
&cu_index,
|
|
Packit |
cdaae3 |
addra_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_addressarea_entry failed",res,*addra_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "] 0x%"
|
|
Packit |
cdaae3 |
DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" %4" DW_PR_DUu "\n",
|
|
Packit |
cdaae3 |
i,
|
|
Packit |
cdaae3 |
lowpc,
|
|
Packit |
cdaae3 |
highpc,
|
|
Packit |
cdaae3 |
cu_index);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("\n");
|
|
Packit |
cdaae3 |
return DW_DLV_OK;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
const char *kind_list[] = {
|
|
Packit |
cdaae3 |
"unknown(0) ",
|
|
Packit |
cdaae3 |
"type(1) ",
|
|
Packit |
cdaae3 |
"var-enum(2) ",
|
|
Packit |
cdaae3 |
"function(3) ",
|
|
Packit |
cdaae3 |
"other-sym(4)",
|
|
Packit |
cdaae3 |
"reserved(5) ",
|
|
Packit |
cdaae3 |
"function(6) ",
|
|
Packit |
cdaae3 |
"reserved(7) ",
|
|
Packit |
cdaae3 |
};
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static const char *
|
|
Packit |
cdaae3 |
get_kind(unsigned k)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
if (k <= 7) {
|
|
Packit |
cdaae3 |
return kind_list[k];
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return "kind-erroneous";
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
/* NOTE: Returns pointer to static local string.
|
|
Packit |
cdaae3 |
Use the returned pointer immediately or
|
|
Packit |
cdaae3 |
things will not work properly. */
|
|
Packit |
cdaae3 |
static char *
|
|
Packit |
cdaae3 |
cu_index_string(Dwarf_Unsigned index,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned culist_len)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
static char temp_space[40];
|
|
Packit |
cdaae3 |
Dwarf_Unsigned type_index = 0;
|
|
Packit |
cdaae3 |
if (index < culist_len) {
|
|
Packit |
cdaae3 |
snprintf(temp_space,sizeof(temp_space), "%4" DW_PR_DUu,index);
|
|
Packit |
cdaae3 |
return temp_space;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
type_index = index-culist_len;
|
|
Packit |
cdaae3 |
snprintf(temp_space,sizeof(temp_space),
|
|
Packit |
cdaae3 |
"%4" DW_PR_DUu "(T%4" DW_PR_DUu ")",
|
|
Packit |
cdaae3 |
index,type_index);
|
|
Packit |
cdaae3 |
return temp_space;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int
|
|
Packit |
cdaae3 |
print_symtab_entry(Dwarf_Debug dbg,
|
|
Packit |
cdaae3 |
Dwarf_Gdbindex gdbindex,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned index,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned symnameoffset,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cuvecoffset,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned culist_len,
|
|
Packit |
cdaae3 |
Dwarf_Error *sym_err)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
int res = 0;
|
|
Packit |
cdaae3 |
const char *name = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cuvec_len = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned ii = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (symnameoffset == 0 && cuvecoffset == 0) {
|
|
Packit |
cdaae3 |
if (verbose > 1) {
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "] \"empty-hash-entry\"\n", index);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return DW_DLV_OK;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_string_by_offset(gdbindex,
|
|
Packit |
cdaae3 |
symnameoffset,&name,sym_err);
|
|
Packit |
cdaae3 |
if(res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_string_by_offset failed",res,*sym_err);
|
|
Packit |
cdaae3 |
*sym_err = 0;
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_cuvector_length(gdbindex,
|
|
Packit |
cdaae3 |
cuvecoffset,&cuvec_len,sym_err);
|
|
Packit |
cdaae3 |
if( res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_cuvector_length failed",res,*sym_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if (verbose > 1) {
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "]"
|
|
Packit |
cdaae3 |
"stroff 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" cuvecoff 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" cuveclen 0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
index,symnameoffset,cuvecoffset,cuvec_len);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
for(ii = 0; ii < cuvec_len; ++ii ) {
|
|
Packit |
cdaae3 |
Dwarf_Unsigned attributes = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cu_index = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned reserved1 = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned symbol_kind = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned is_static = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_cuvector_inner_attributes(
|
|
Packit |
cdaae3 |
gdbindex,cuvecoffset,ii,
|
|
Packit |
cdaae3 |
&attributes,sym_err);
|
|
Packit |
cdaae3 |
if( res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_cuvector_inner_attributes failed",res,*sym_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_cuvector_instance_expand_value(gdbindex,
|
|
Packit |
cdaae3 |
attributes, &cu_index,&reserved1,&symbol_kind, &is_static,
|
|
Packit |
cdaae3 |
sym_err);
|
|
Packit |
cdaae3 |
if( res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_cuvector_instance_expand_value failed",res,*sym_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
/* if cu_index is > the cu-count, then it refers
|
|
Packit |
cdaae3 |
to a tu_index of 'cu_index - cu-count' */
|
|
Packit |
cdaae3 |
if (cuvec_len == 1) {
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "]"
|
|
Packit |
cdaae3 |
"%s"
|
|
Packit |
cdaae3 |
" [%s %s] \"%s\"\n",
|
|
Packit |
cdaae3 |
index,
|
|
Packit |
cdaae3 |
cu_index_string(cu_index,culist_len),
|
|
Packit |
cdaae3 |
is_static?
|
|
Packit |
cdaae3 |
"static ":
|
|
Packit |
cdaae3 |
"global ",
|
|
Packit |
cdaae3 |
get_kind(symbol_kind),
|
|
Packit |
cdaae3 |
name);
|
|
Packit |
cdaae3 |
} else if (ii == 0) {
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "] \"%s\"\n" ,
|
|
Packit |
cdaae3 |
index,
|
|
Packit |
cdaae3 |
name);
|
|
Packit |
cdaae3 |
printf(" %s [%s %s]\n",
|
|
Packit |
cdaae3 |
cu_index_string(cu_index,culist_len),
|
|
Packit |
cdaae3 |
is_static?
|
|
Packit |
cdaae3 |
"static ":
|
|
Packit |
cdaae3 |
"global ",
|
|
Packit |
cdaae3 |
get_kind(symbol_kind));
|
|
Packit |
cdaae3 |
}else{
|
|
Packit |
cdaae3 |
printf(" %s [%s %s]\n",
|
|
Packit |
cdaae3 |
cu_index_string(cu_index,culist_len),
|
|
Packit |
cdaae3 |
is_static?
|
|
Packit |
cdaae3 |
"static ":
|
|
Packit |
cdaae3 |
"global ",
|
|
Packit |
cdaae3 |
get_kind(symbol_kind));
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if (verbose > 1) {
|
|
Packit |
cdaae3 |
printf(" [%4" DW_PR_DUu "]"
|
|
Packit |
cdaae3 |
"attr 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" cuindx 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" kind 0x%" DW_PR_XZEROS DW_PR_DUx
|
|
Packit |
cdaae3 |
" static 0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
ii,attributes,cu_index,symbol_kind,is_static);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return DW_DLV_OK;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int
|
|
Packit |
cdaae3 |
print_symboltable(Dwarf_Debug dbg,
|
|
Packit |
cdaae3 |
Dwarf_Gdbindex gdbindex,
|
|
Packit |
cdaae3 |
Dwarf_Unsigned culist_len,
|
|
Packit |
cdaae3 |
Dwarf_Error * symt_err)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
Dwarf_Unsigned list_len = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned i;
|
|
Packit |
cdaae3 |
int res = dwarf_gdbindex_symboltable_array(gdbindex,
|
|
Packit |
cdaae3 |
&list_len,symt_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_symboltable failed",res,*symt_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("\n Symbol table: length %" DW_PR_DUu
|
|
Packit |
cdaae3 |
" format: [entry#] symindex cuindex [type] \"name\" or \n",
|
|
Packit |
cdaae3 |
list_len);
|
|
Packit |
cdaae3 |
printf(" "
|
|
Packit |
cdaae3 |
" format: [entry#] \"name\" , list of cuindex [type]\n");
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
for( i = 0; i < list_len; i++) {
|
|
Packit |
cdaae3 |
Dwarf_Unsigned symnameoffset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cuvecoffset = 0;
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_symboltable_entry(gdbindex,i,
|
|
Packit |
cdaae3 |
&symnameoffset,&cuvecoffset,
|
|
Packit |
cdaae3 |
symt_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
print_error_and_continue(dbg,
|
|
Packit |
cdaae3 |
"dwarf_gdbindex_symboltable_entry failed",res,*symt_err);
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = print_symtab_entry(dbg,gdbindex,i,symnameoffset,cuvecoffset,
|
|
Packit |
cdaae3 |
culist_len,symt_err);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
return res;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("\n");
|
|
Packit |
cdaae3 |
return DW_DLV_OK;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
extern void
|
|
Packit |
cdaae3 |
print_gdb_index(Dwarf_Debug dbg)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
Dwarf_Gdbindex gdbindex = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned version = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned cu_list_offset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned types_cu_list_offset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned address_area_offset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned symbol_table_offset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned constant_pool_offset = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned section_size = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned unused = 0;
|
|
Packit |
cdaae3 |
Dwarf_Error error = 0;
|
|
Packit |
cdaae3 |
const char *section_name = 0;
|
|
Packit |
cdaae3 |
Dwarf_Unsigned culist_len = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
int res = 0;
|
|
Packit |
cdaae3 |
current_section_id = DEBUG_GDB_INDEX;
|
|
Packit |
cdaae3 |
res = dwarf_gdbindex_header(dbg, &gdbindex,
|
|
Packit |
cdaae3 |
&version,
|
|
Packit |
cdaae3 |
&cu_list_offset,
|
|
Packit |
cdaae3 |
&types_cu_list_offset,
|
|
Packit |
cdaae3 |
&address_area_offset,
|
|
Packit |
cdaae3 |
&symbol_table_offset,
|
|
Packit |
cdaae3 |
&constant_pool_offset,
|
|
Packit |
cdaae3 |
§ion_size,
|
|
Packit |
cdaae3 |
&unused,
|
|
Packit |
cdaae3 |
§ion_name,
|
|
Packit |
cdaae3 |
&error);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (!glflags.gf_do_print_dwarf) {
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if(res == DW_DLV_NO_ENTRY) {
|
|
Packit |
cdaae3 |
/* Silently! The section is rare so lets
|
|
Packit |
cdaae3 |
say nothing. */
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if (!section_name || !*section_name) {
|
|
Packit |
cdaae3 |
section_name = ".gdb_index";
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("\n%s\n",section_name);
|
|
Packit |
cdaae3 |
if( res == DW_DLV_ERROR) {
|
|
Packit |
cdaae3 |
print_error(dbg,"dwarf_gdbindex_header",res,error);
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
printf(" Version : "
|
|
Packit |
cdaae3 |
"0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
version);
|
|
Packit |
cdaae3 |
printf(" CU list offset : "
|
|
Packit |
cdaae3 |
"0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
cu_list_offset);
|
|
Packit |
cdaae3 |
printf(" Address area offset : "
|
|
Packit |
cdaae3 |
"0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
types_cu_list_offset);
|
|
Packit |
cdaae3 |
printf(" Symbol table offset : "
|
|
Packit |
cdaae3 |
"0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
address_area_offset);
|
|
Packit |
cdaae3 |
printf(" Constant pool offset: "
|
|
Packit |
cdaae3 |
"0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
constant_pool_offset);
|
|
Packit |
cdaae3 |
printf(" section size : "
|
|
Packit |
cdaae3 |
"0x%" DW_PR_XZEROS DW_PR_DUx "\n",
|
|
Packit |
cdaae3 |
section_size);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
res = print_culist_array(dbg,gdbindex,&culist_len,&error);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
if (res == DW_DLV_ERROR) {
|
|
Packit |
cdaae3 |
dwarf_dealloc(dbg,error, DW_DLA_ERROR);
|
|
Packit |
cdaae3 |
error = 0;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = print_types_culist_array(dbg,gdbindex,&error);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
if (res == DW_DLV_ERROR) {
|
|
Packit |
cdaae3 |
dwarf_dealloc(dbg,error, DW_DLA_ERROR);
|
|
Packit |
cdaae3 |
error = 0;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = print_addressarea(dbg,gdbindex,&error);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
if (res == DW_DLV_ERROR) {
|
|
Packit |
cdaae3 |
dwarf_dealloc(dbg,error, DW_DLA_ERROR);
|
|
Packit |
cdaae3 |
error = 0;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
res = print_symboltable(dbg,gdbindex,culist_len,&error);
|
|
Packit |
cdaae3 |
if (res != DW_DLV_OK) {
|
|
Packit |
cdaae3 |
if (res == DW_DLV_ERROR) {
|
|
Packit |
cdaae3 |
dwarf_dealloc(dbg,error, DW_DLA_ERROR);
|
|
Packit |
cdaae3 |
error = 0;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
return;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|