From 36192a8d549d934534b43e9be4948d90daa6981c Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Mon, 8 Apr 2013 20:08:21 +0000 Subject: [PATCH] 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. --- bfd/ChangeLog | 5 ++ bfd/som.c | 4 +- bfd/som.h | 3 +- gdb/ChangeLog | 13 +++++ gdb/solib-som.c | 29 ++++++++-- gdb/somread.c | 151 +++++++++++++++++++++++++++++++++++++++++++----- 6 files changed, 181 insertions(+), 24 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e32a80c9af..f1ea9c47c4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2013-04-08 Tom Tromey + + * som.c (bfd_section_from_som_symbol): No longer static. + * som.h (bfd_section_from_som_symbol): Declare. + 2013-04-06 Alan Modra * elf32-ppc.c (ppc_elf_check_relocs): Use SYMBOLIC_BIND. diff --git a/bfd/som.c b/bfd/som.c index 87aa88f971..0ddbb6f0c9 100644 --- a/bfd/som.c +++ b/bfd/som.c @@ -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) { diff --git a/bfd/som.h b/bfd/som.h index cf8dcbfd54..7a54249314 100644 --- a/bfd/som.h +++ b/bfd/som.h @@ -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 */ diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bfb7c6b047..edc4d0a5a9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2013-04-08 Tom Tromey + + 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 * coffread.c (cs_to_section): Use gdb_bfd_section_index. diff --git a/gdb/solib-som.c b/gdb/solib-som.c index ff7fbaa1ff..650e3dfead 100644 --- a/gdb/solib-som.c +++ b/gdb/solib-som.c @@ -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; diff --git a/gdb/somread.c b/gdb/somread.c index 0aa3dce686..44b0c85c8d 100644 --- a/gdb/somread.c +++ b/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. */ -- 2.34.1