PR symtab/8423:
* solib-som.c (som_solib_section_offsets): Use BFD section indices. Set offsets for all sections. * somread.c (som_symtab_read): Compute BFD section for symbol. Use prim_record_minimal_symbol_and_info. (som_symfile_read): Fix comment. (struct find_section_offset_arg): New. (find_section_offset, set_section_index): New functions. (som_symfile_offsets): Use set_section_index to compute section indices. bfd/ * som.c (bfd_section_from_som_symbol): No longer static. * som.h (bfd_section_from_som_symbol): Declare.
This commit is contained in:
parent
65cf356359
commit
36192a8d54
@ -1,3 +1,8 @@
|
||||
2013-04-08 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* som.c (bfd_section_from_som_symbol): No longer static.
|
||||
* som.h (bfd_section_from_som_symbol): Declare.
|
||||
|
||||
2013-04-06 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* elf32-ppc.c (ppc_elf_check_relocs): Use SYMBOLIC_BIND.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/* bfd back-end for HP PA-RISC SOM objects.
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011,
|
||||
2012 Free Software Foundation, Inc.
|
||||
2012, 2013 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by the Center for Software Science at the
|
||||
University of Utah.
|
||||
@ -4572,7 +4572,7 @@ som_get_symtab_upper_bound (bfd *abfd)
|
||||
|
||||
/* Convert from a SOM subspace index to a BFD section. */
|
||||
|
||||
static asection *
|
||||
asection *
|
||||
bfd_section_from_som_symbol
|
||||
(bfd *abfd, struct som_external_symbol_dictionary_record *symbol)
|
||||
{
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* HP PA-RISC SOM object file format: definitions internal to BFD.
|
||||
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2007, 2008, 2012 Free Software Foundation, Inc.
|
||||
2002, 2003, 2004, 2005, 2007, 2008, 2012, 2013 Free Software Foundation, Inc.
|
||||
|
||||
Contributed by the Center for Software Science at the
|
||||
University of Utah (pa-gdb-bugs@cs.utah.edu).
|
||||
@ -234,5 +234,6 @@ void bfd_som_set_symbol_type (asymbol *, unsigned int);
|
||||
bfd_boolean bfd_som_attach_aux_hdr (bfd *, int, char *);
|
||||
int ** hppa_som_gen_reloc_type (bfd *, int, int, enum hppa_reloc_field_selector_type_alt, int, asymbol *);
|
||||
bfd_boolean bfd_som_attach_compilation_unit (bfd *, const char *, const char *, const char *, const char *);
|
||||
asection * bfd_section_from_som_symbol (bfd *abfd, struct som_external_symbol_dictionary_record *symbol);
|
||||
|
||||
#endif /* _SOM_H */
|
||||
|
@ -1,3 +1,16 @@
|
||||
2013-04-08 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
PR symtab/8423:
|
||||
* solib-som.c (som_solib_section_offsets): Use BFD section
|
||||
indices. Set offsets for all sections.
|
||||
* somread.c (som_symtab_read): Compute BFD section for
|
||||
symbol. Use prim_record_minimal_symbol_and_info.
|
||||
(som_symfile_read): Fix comment.
|
||||
(struct find_section_offset_arg): New.
|
||||
(find_section_offset, set_section_index): New functions.
|
||||
(som_symfile_offsets): Use set_section_index to compute
|
||||
section indices.
|
||||
|
||||
2013-04-08 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* coffread.c (cs_to_section): Use gdb_bfd_section_index.
|
||||
|
@ -840,13 +840,12 @@ som_solib_section_offsets (struct objfile *objfile,
|
||||
if (strstr (objfile->name, so_list->so_name))
|
||||
{
|
||||
asection *private_section;
|
||||
struct obj_section *sect;
|
||||
|
||||
/* The text offset is easy. */
|
||||
offsets->offsets[SECT_OFF_TEXT (objfile)]
|
||||
= (so_list->lm_info->text_addr
|
||||
- so_list->lm_info->text_link_addr);
|
||||
offsets->offsets[SECT_OFF_RODATA (objfile)]
|
||||
= ANOFFSET (offsets, SECT_OFF_TEXT (objfile));
|
||||
|
||||
/* We should look at presumed_dp in the SOM header, but
|
||||
that's not easily available. This should be OK though. */
|
||||
@ -859,10 +858,28 @@ som_solib_section_offsets (struct objfile *objfile,
|
||||
offsets->offsets[SECT_OFF_BSS (objfile)] = 0;
|
||||
return 1;
|
||||
}
|
||||
offsets->offsets[SECT_OFF_DATA (objfile)]
|
||||
= (so_list->lm_info->data_start - private_section->vma);
|
||||
offsets->offsets[SECT_OFF_BSS (objfile)]
|
||||
= ANOFFSET (offsets, SECT_OFF_DATA (objfile));
|
||||
if (objfile->sect_index_data != -1)
|
||||
{
|
||||
offsets->offsets[SECT_OFF_DATA (objfile)]
|
||||
= (so_list->lm_info->data_start - private_section->vma);
|
||||
if (objfile->sect_index_bss != -1)
|
||||
offsets->offsets[SECT_OFF_BSS (objfile)]
|
||||
= ANOFFSET (offsets, SECT_OFF_DATA (objfile));
|
||||
}
|
||||
|
||||
ALL_OBJFILE_OSECTIONS (objfile, sect)
|
||||
{
|
||||
flagword flags = bfd_get_section_flags (objfile->obfd,
|
||||
sect->the_bfd_section);
|
||||
|
||||
if ((flags & SEC_CODE) != 0)
|
||||
offsets->offsets[sect->the_bfd_section->index]
|
||||
= offsets->offsets[SECT_OFF_TEXT (objfile)];
|
||||
else
|
||||
offsets->offsets[sect->the_bfd_section->index]
|
||||
= offsets->offsets[SECT_OFF_DATA (objfile)];
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
so_list = so_list->next;
|
||||
|
151
gdb/somread.c
151
gdb/somread.c
@ -54,11 +54,10 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
|
||||
struct som_external_symbol_dictionary_record *buf, *bufp, *endbufp;
|
||||
char *symname;
|
||||
CONST int symsize = sizeof (struct som_external_symbol_dictionary_record);
|
||||
CORE_ADDR text_offset, data_offset;
|
||||
|
||||
|
||||
text_offset = ANOFFSET (section_offsets, 0);
|
||||
data_offset = ANOFFSET (section_offsets, 1);
|
||||
#define text_offset ANOFFSET (section_offsets, SECT_OFF_TEXT (objfile))
|
||||
#define data_offset ANOFFSET (section_offsets, SECT_OFF_DATA (objfile))
|
||||
|
||||
number_of_symbols = bfd_get_symcount (abfd);
|
||||
|
||||
@ -106,9 +105,36 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
|
||||
unsigned int symbol_scope
|
||||
= (flags >> SOM_SYMBOL_SCOPE_SH) & SOM_SYMBOL_SCOPE_MASK;
|
||||
CORE_ADDR symbol_value = bfd_getb32 (bufp->symbol_value);
|
||||
asection *section = NULL;
|
||||
|
||||
QUIT;
|
||||
|
||||
/* Compute the section. */
|
||||
switch (symbol_scope)
|
||||
{
|
||||
case SS_EXTERNAL:
|
||||
if (symbol_type != ST_STORAGE)
|
||||
section = bfd_und_section_ptr;
|
||||
else
|
||||
section = bfd_com_section_ptr;
|
||||
break;
|
||||
|
||||
case SS_UNSAT:
|
||||
if (symbol_type != ST_STORAGE)
|
||||
section = bfd_und_section_ptr;
|
||||
else
|
||||
section = bfd_com_section_ptr;
|
||||
break;
|
||||
|
||||
case SS_UNIVERSAL:
|
||||
section = bfd_section_from_som_symbol (abfd, bufp);
|
||||
break;
|
||||
|
||||
case SS_LOCAL:
|
||||
section = bfd_section_from_som_symbol (abfd, bufp);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (symbol_scope)
|
||||
{
|
||||
case SS_UNIVERSAL:
|
||||
@ -267,7 +293,29 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
|
||||
error (_("Invalid symbol data; bad HP string table offset: %s"),
|
||||
plongest (bfd_getb32 (bufp->name)));
|
||||
|
||||
prim_record_minimal_symbol (symname, symbol_value, ms_type, objfile);
|
||||
if (bfd_is_const_section (section))
|
||||
{
|
||||
struct obj_section *iter;
|
||||
|
||||
ALL_OBJFILE_OSECTIONS (objfile, iter)
|
||||
{
|
||||
if (bfd_is_const_section (iter->the_bfd_section))
|
||||
continue;
|
||||
|
||||
if (obj_section_addr (iter) <= symbol_value
|
||||
&& symbol_value < obj_section_endaddr (iter))
|
||||
{
|
||||
section = iter->the_bfd_section;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
prim_record_minimal_symbol_and_info (symname, symbol_value, ms_type,
|
||||
gdb_bfd_section_index (objfile->obfd,
|
||||
section),
|
||||
section,
|
||||
objfile);
|
||||
}
|
||||
}
|
||||
|
||||
@ -287,7 +335,7 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
|
||||
for real.
|
||||
|
||||
We look for sections with specific names, to tell us what debug
|
||||
format to look for: FIXME!!!
|
||||
format to look for.
|
||||
|
||||
somstab_build_psymtabs() handles STABS symbols.
|
||||
|
||||
@ -361,6 +409,80 @@ som_symfile_init (struct objfile *objfile)
|
||||
objfile->flags |= OBJF_REORDERED;
|
||||
}
|
||||
|
||||
/* An object of this type is passed to find_section_offset. */
|
||||
|
||||
struct find_section_offset_arg
|
||||
{
|
||||
/* The objfile. */
|
||||
|
||||
struct objfile *objfile;
|
||||
|
||||
/* Flags to invert. */
|
||||
|
||||
flagword invert;
|
||||
|
||||
/* Flags to look for. */
|
||||
|
||||
flagword flags;
|
||||
|
||||
/* A text section with non-zero size, if any. */
|
||||
|
||||
asection *best_section;
|
||||
|
||||
/* An empty text section, if any. */
|
||||
|
||||
asection *empty_section;
|
||||
};
|
||||
|
||||
/* A callback for bfd_map_over_sections that tries to find a section
|
||||
with particular flags in an objfile. */
|
||||
|
||||
static void
|
||||
find_section_offset (bfd *abfd, asection *sect, void *arg)
|
||||
{
|
||||
struct find_section_offset_arg *info = arg;
|
||||
flagword aflag;
|
||||
|
||||
aflag = bfd_get_section_flags (abfd, sect);
|
||||
|
||||
aflag ^= info->invert;
|
||||
|
||||
if ((aflag & info->flags) == info->flags)
|
||||
{
|
||||
if (bfd_section_size (abfd, sect) > 0)
|
||||
{
|
||||
if (info->best_section == NULL)
|
||||
info->best_section = sect;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (info->empty_section == NULL)
|
||||
info->empty_section = sect;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Set a section index from a BFD. */
|
||||
|
||||
static void
|
||||
set_section_index (struct objfile *objfile, flagword invert, flagword flags,
|
||||
int *index_ptr)
|
||||
{
|
||||
struct find_section_offset_arg info;
|
||||
|
||||
info.objfile = objfile;
|
||||
info.best_section = NULL;
|
||||
info.empty_section = NULL;
|
||||
info.invert = invert;
|
||||
info.flags = flags;
|
||||
bfd_map_over_sections (objfile->obfd, find_section_offset, &info);
|
||||
|
||||
if (info.best_section)
|
||||
*index_ptr = info.best_section->index;
|
||||
else if (info.empty_section)
|
||||
*index_ptr = info.empty_section->index;
|
||||
}
|
||||
|
||||
/* SOM specific parsing routine for section offsets.
|
||||
|
||||
Plain and simple for now. */
|
||||
@ -370,22 +492,21 @@ som_symfile_offsets (struct objfile *objfile, struct section_addr_info *addrs)
|
||||
{
|
||||
int i;
|
||||
CORE_ADDR text_addr;
|
||||
asection *sect;
|
||||
|
||||
objfile->num_sections = bfd_count_sections (objfile->obfd);
|
||||
objfile->section_offsets = (struct section_offsets *)
|
||||
obstack_alloc (&objfile->objfile_obstack,
|
||||
SIZEOF_N_SECTION_OFFSETS (objfile->num_sections));
|
||||
|
||||
/* FIXME: ezannoni 2000-04-20 The section names in SOM are not
|
||||
.text, .data, etc, but $TEXT$, $DATA$,... We should initialize
|
||||
SET_OFF_* from bfd. (See default_symfile_offsets()). But I don't
|
||||
know the correspondence between SOM sections and GDB's idea of
|
||||
section names. So for now we default to what is was before these
|
||||
changes. */
|
||||
objfile->sect_index_text = 0;
|
||||
objfile->sect_index_data = 1;
|
||||
objfile->sect_index_bss = 2;
|
||||
objfile->sect_index_rodata = 3;
|
||||
set_section_index (objfile, 0, SEC_ALLOC | SEC_CODE,
|
||||
&objfile->sect_index_text);
|
||||
set_section_index (objfile, 0, SEC_ALLOC | SEC_DATA,
|
||||
&objfile->sect_index_data);
|
||||
set_section_index (objfile, SEC_LOAD, SEC_ALLOC | SEC_LOAD,
|
||||
&objfile->sect_index_bss);
|
||||
set_section_index (objfile, 0, SEC_ALLOC | SEC_READONLY,
|
||||
&objfile->sect_index_rodata);
|
||||
|
||||
/* First see if we're a shared library. If so, get the section
|
||||
offsets from the library, else get them from addrs. */
|
||||
|
Loading…
Reference in New Issue
Block a user