X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=bfd%2Fsyms.c;h=0ff94164ed5e28dfb78a7049980d30e9c55ca096;hb=0bf60745767d2465c81ee57ae7705a62d6d8fafe;hp=d0ffcc727e3e674cd8c430084c3602a01ec2efa1;hpb=1049f94e8e1a9eae86a694d2dca94a6194f763b1;p=deliverable%2Fbinutils-gdb.git diff --git a/bfd/syms.c b/bfd/syms.c index d0ffcc727e..0ff94164ed 100644 --- a/bfd/syms.c +++ b/bfd/syms.c @@ -1,6 +1,6 @@ /* Generic symbol-table support for the BFD library. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003 + 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. Written by Cygnus Support. @@ -18,7 +18,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ /* SECTION @@ -77,7 +77,7 @@ SUBSECTION | if (storage_needed == 0) | return; | -| symbol_table = (asymbol **) xmalloc (storage_needed); +| symbol_table = xmalloc (storage_needed); | ... | number_of_symbols = | bfd_canonicalize_symtab (abfd, symbol_table); @@ -122,7 +122,7 @@ SUBSECTION | new->value = 0x12345; | | ptrs[0] = new; -| ptrs[1] = (asymbol *)0; +| ptrs[1] = 0; | | bfd_set_symtab (abfd, ptrs, 1); | bfd_close (abfd); @@ -133,9 +133,9 @@ SUBSECTION | nm foo | 00012345 A dummy_symbol - Many formats cannot represent arbitary symbol information; for + Many formats cannot represent arbitrary symbol information; for instance, the <> object format does not allow an - arbitary number of sections. A symbol pointing to a section + arbitrary number of sections. A symbol pointing to a section which is not one of <<.text>>, <<.data>> or <<.bss>> cannot be described. @@ -181,7 +181,7 @@ SUBSECTION CODE_FRAGMENT . -.typedef struct symbol_cache_entry +.typedef struct bfd_symbol .{ . {* A pointer to the BFD which owns the symbol. This information . is necessary so that a back end can work out what additional @@ -222,7 +222,7 @@ CODE_FRAGMENT . <>, <>, <> or . <>. *} . -. {* The symbol is a debugging record. The value has an arbitary +. {* The symbol is a debugging record. The value has an arbitrary . meaning, unless BSF_DEBUGGING_RELOC is also set. *} .#define BSF_DEBUGGING 0x08 . @@ -293,12 +293,12 @@ CODE_FRAGMENT . {* A pointer to the section to which this symbol is . relative. This will always be non NULL, there are special . sections for undefined and absolute symbols. *} -. struct sec *section; +. struct bfd_section *section; . . {* Back end special data. *} . union . { -. PTR p; +. void *p; . bfd_vma i; . } . udata; @@ -314,10 +314,6 @@ CODE_FRAGMENT #include "bfdlink.h" #include "aout/stab_gnu.h" -static char coff_section_type PARAMS ((const char *)); -static char decode_section_type PARAMS ((const struct sec *)); -static int cmpindexentry PARAMS ((const PTR, const PTR)); - /* DOCDD INODE @@ -354,14 +350,12 @@ DESCRIPTION */ bfd_boolean -bfd_is_local_label (abfd, sym) - bfd *abfd; - asymbol *sym; +bfd_is_local_label (bfd *abfd, asymbol *sym) { /* The BSF_SECTION_SYM check is needed for IA-64, where every label that starts with '.' is local. This would accidentally catch section names if we didn't reject them here. */ - if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_SECTION_SYM)) != 0) + if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_FILE | BSF_SECTION_SYM)) != 0) return FALSE; if (sym->name == NULL) return FALSE; @@ -382,7 +376,24 @@ DESCRIPTION local label. .#define bfd_is_local_label_name(abfd, name) \ -. BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name)) +. BFD_SEND (abfd, _bfd_is_local_label_name, (abfd, name)) +. +*/ + +/* +FUNCTION + bfd_is_target_special_symbol + +SYNOPSIS + bfd_boolean bfd_is_target_special_symbol (bfd *abfd, asymbol *sym); + +DESCRIPTION + Return TRUE iff a symbol @var{sym} in the BFD @var{abfd} is something + special to the particular target represented by the BFD. Such symbols + should normally not be mentioned to the user. + +.#define bfd_is_target_special_symbol(abfd, sym) \ +. BFD_SEND (abfd, _bfd_is_target_special_symbol, (abfd, sym)) . */ @@ -398,8 +409,7 @@ DESCRIPTION including the NULL. .#define bfd_canonicalize_symtab(abfd, location) \ -. BFD_SEND (abfd, _bfd_canonicalize_symtab,\ -. (abfd, location)) +. BFD_SEND (abfd, _bfd_canonicalize_symtab, (abfd, location)) . */ @@ -408,7 +418,8 @@ FUNCTION bfd_set_symtab SYNOPSIS - bfd_boolean bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int count); + bfd_boolean bfd_set_symtab + (bfd *abfd, asymbol **location, unsigned int count); DESCRIPTION Arrange that when the output BFD @var{abfd} is closed, @@ -417,12 +428,9 @@ DESCRIPTION */ bfd_boolean -bfd_set_symtab (abfd, location, symcount) - bfd *abfd; - asymbol **location; - unsigned int symcount; +bfd_set_symtab (bfd *abfd, asymbol **location, unsigned int symcount) { - if ((abfd->format != bfd_object) || (bfd_read_p (abfd))) + if (abfd->format != bfd_object || bfd_read_p (abfd)) { bfd_set_error (bfd_error_invalid_operation); return FALSE; @@ -438,25 +446,21 @@ FUNCTION bfd_print_symbol_vandf SYNOPSIS - void bfd_print_symbol_vandf (bfd *abfd, PTR file, asymbol *symbol); + void bfd_print_symbol_vandf (bfd *abfd, void *file, asymbol *symbol); DESCRIPTION Print the value and flags of the @var{symbol} supplied to the stream @var{file}. */ void -bfd_print_symbol_vandf (abfd, arg, symbol) - bfd *abfd; - PTR arg; - asymbol *symbol; +bfd_print_symbol_vandf (bfd *abfd, void *arg, asymbol *symbol) { - FILE *file = (FILE *) arg; + FILE *file = arg; flagword type = symbol->flags; - if (symbol->section != (asection *) NULL) - bfd_fprintf_vma (abfd, file, - symbol->value + symbol->section->vma); + if (symbol->section != NULL) + bfd_fprintf_vma (abfd, file, symbol->value + symbol->section->vma); else bfd_fprintf_vma (abfd, file, symbol->value); @@ -493,7 +497,7 @@ DESCRIPTION information, and will cause problems later on. .#define bfd_make_empty_symbol(abfd) \ -. BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) +. BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) . */ @@ -502,7 +506,7 @@ FUNCTION _bfd_generic_make_empty_symbol SYNOPSIS - asymbol * _bfd_generic_make_empty_symbol (bfd *); + asymbol *_bfd_generic_make_empty_symbol (bfd *); DESCRIPTION Create a new <> structure for the BFD @var{abfd} @@ -512,11 +516,10 @@ DESCRIPTION */ asymbol * -_bfd_generic_make_empty_symbol (abfd) - bfd *abfd; +_bfd_generic_make_empty_symbol (bfd *abfd) { bfd_size_type amt = sizeof (asymbol); - asymbol *new = (asymbol *) bfd_zalloc (abfd, amt); + asymbol *new = bfd_zalloc (abfd, amt); if (new) new->the_bfd = abfd; return new; @@ -532,7 +535,7 @@ DESCRIPTION yet to be worked out. .#define bfd_make_debug_symbol(abfd,ptr,size) \ -. BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) +. BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) . */ @@ -576,8 +579,7 @@ static const struct section_to_type stt[] = 't' as well as .text */ static char -coff_section_type (s) - const char *s; +coff_section_type (const char *s) { const struct section_to_type *t; @@ -596,8 +598,7 @@ coff_section_type (s) we could perhaps obsolete coff_section_type. */ static char -decode_section_type (section) - const struct sec *section; +decode_section_type (const struct bfd_section *section) { if (section->flags & SEC_CODE) return 't'; @@ -619,8 +620,7 @@ decode_section_type (section) } if (section->flags & SEC_DEBUGGING) return 'N'; - if ((section->flags & SEC_HAS_CONTENTS) && - (section->flags & SEC_READONLY)) + if ((section->flags & SEC_HAS_CONTENTS) && (section->flags & SEC_READONLY)) return 'n'; return '?'; @@ -638,8 +638,7 @@ SYNOPSIS int bfd_decode_symclass (asymbol *symbol); */ int -bfd_decode_symclass (symbol) - asymbol *symbol; +bfd_decode_symclass (asymbol *symbol) { char c; @@ -711,8 +710,7 @@ SYNOPSIS */ bfd_boolean -bfd_is_undefined_symclass (symclass) - int symclass; +bfd_is_undefined_symclass (int symclass) { return symclass == 'U' || symclass == 'w' || symclass == 'v'; } @@ -731,9 +729,7 @@ SYNOPSIS */ void -bfd_symbol_info (symbol, ret) - asymbol *symbol; - symbol_info *ret; +bfd_symbol_info (asymbol *symbol, symbol_info *ret) { ret->type = bfd_decode_symclass (symbol); @@ -750,7 +746,8 @@ FUNCTION bfd_copy_private_symbol_data SYNOPSIS - bfd_boolean bfd_copy_private_symbol_data (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym); + bfd_boolean bfd_copy_private_symbol_data + (bfd *ibfd, asymbol *isym, bfd *obfd, asymbol *osym); DESCRIPTION Copy private symbol information from @var{isym} in the BFD @@ -762,8 +759,8 @@ DESCRIPTION Not enough memory exists to create private data for @var{osec}. .#define bfd_copy_private_symbol_data(ibfd, isymbol, obfd, osymbol) \ -. BFD_SEND (obfd, _bfd_copy_private_symbol_data, \ -. (ibfd, isymbol, obfd, osymbol)) +. BFD_SEND (obfd, _bfd_copy_private_symbol_data, \ +. (ibfd, isymbol, obfd, osymbol)) . */ @@ -772,11 +769,10 @@ DESCRIPTION version. It just uses BFD asymbol structures as mini symbols. */ long -_bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep) - bfd *abfd; - bfd_boolean dynamic; - PTR *minisymsp; - unsigned int *sizep; +_bfd_generic_read_minisymbols (bfd *abfd, + bfd_boolean dynamic, + void **minisymsp, + unsigned int *sizep) { long storage; asymbol **syms = NULL; @@ -791,7 +787,7 @@ _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep) if (storage == 0) return 0; - syms = (asymbol **) bfd_malloc ((bfd_size_type) storage); + syms = bfd_malloc (storage); if (syms == NULL) goto error_return; @@ -802,7 +798,7 @@ _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep) if (symcount < 0) goto error_return; - *minisymsp = (PTR) syms; + *minisymsp = syms; *sizep = sizeof (asymbol *); return symcount; @@ -818,11 +814,10 @@ _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep) we just return the asymbol the minisymbol points to. */ asymbol * -_bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym) - bfd *abfd ATTRIBUTE_UNUSED; - bfd_boolean dynamic ATTRIBUTE_UNUSED; - const PTR minisym; - asymbol *sym ATTRIBUTE_UNUSED; +_bfd_generic_minisymbol_to_symbol (bfd *abfd ATTRIBUTE_UNUSED, + bfd_boolean dynamic ATTRIBUTE_UNUSED, + const void *minisym, + asymbol *sym ATTRIBUTE_UNUSED) { return *(asymbol **) minisym; } @@ -857,12 +852,10 @@ struct indexentry /* Compare two indexentry structures. This is called via qsort. */ static int -cmpindexentry (a, b) - const PTR a; - const PTR b; +cmpindexentry (const void *a, const void *b) { - const struct indexentry *contestantA = (const struct indexentry *) a; - const struct indexentry *contestantB = (const struct indexentry *) b; + const struct indexentry *contestantA = a; + const struct indexentry *contestantB = b; if (contestantA->val < contestantB->val) return -1; @@ -903,17 +896,15 @@ struct stab_find_info }; bfd_boolean -_bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, - pfilename, pfnname, pline, pinfo) - bfd *abfd; - asymbol **symbols; - asection *section; - bfd_vma offset; - bfd_boolean *pfound; - const char **pfilename; - const char **pfnname; - unsigned int *pline; - PTR *pinfo; +_bfd_stab_section_find_nearest_line (bfd *abfd, + asymbol **symbols, + asection *section, + bfd_vma offset, + bfd_boolean *pfound, + const char **pfilename, + const char **pfnname, + unsigned int *pline, + void **pinfo) { struct stab_find_info *info; bfd_size_type stabsize, strsize; @@ -951,7 +942,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, #define VALOFF (8) #define STABSIZE (12) - info = (struct stab_find_info *) *pinfo; + info = *pinfo; if (info != NULL) { if (info->stabsec == NULL || info->strsec == NULL) @@ -960,8 +951,12 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, return TRUE; } - stabsize = info->stabsec->_raw_size; - strsize = info->strsec->_raw_size; + stabsize = (info->stabsec->rawsize + ? info->stabsec->rawsize + : info->stabsec->size); + strsize = (info->strsec->rawsize + ? info->strsec->rawsize + : info->strsec->size); } else { @@ -972,7 +967,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, char *function_name; bfd_size_type amt = sizeof *info; - info = (struct stab_find_info *) bfd_zalloc (abfd, amt); + info = bfd_zalloc (abfd, amt); if (info == NULL) return FALSE; @@ -987,22 +982,26 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, { /* No stabs debugging information. Set *pinfo so that we can return quickly in the info != NULL case above. */ - *pinfo = (PTR) info; + *pinfo = info; return TRUE; } - stabsize = info->stabsec->_raw_size; - strsize = info->strsec->_raw_size; + stabsize = (info->stabsec->rawsize + ? info->stabsec->rawsize + : info->stabsec->size); + strsize = (info->strsec->rawsize + ? info->strsec->rawsize + : info->strsec->size); - info->stabs = (bfd_byte *) bfd_alloc (abfd, stabsize); - info->strs = (bfd_byte *) bfd_alloc (abfd, strsize); + info->stabs = bfd_alloc (abfd, stabsize); + info->strs = bfd_alloc (abfd, strsize); if (info->stabs == NULL || info->strs == NULL) return FALSE; if (! bfd_get_section_contents (abfd, info->stabsec, info->stabs, - (bfd_vma) 0, stabsize) + 0, stabsize) || ! bfd_get_section_contents (abfd, info->strsec, info->strs, - (bfd_vma) 0, strsize)) + 0, strsize)) return FALSE; /* If this is a relocatable object file, we have to relocate @@ -1012,7 +1011,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, reloc_size = bfd_get_reloc_upper_bound (abfd, info->stabsec); if (reloc_size < 0) return FALSE; - reloc_vector = (arelent **) bfd_malloc ((bfd_size_type) reloc_size); + reloc_vector = bfd_malloc (reloc_size); if (reloc_vector == NULL && reloc_size != 0) return FALSE; reloc_count = bfd_canonicalize_reloc (abfd, info->stabsec, reloc_vector, @@ -1034,6 +1033,10 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, asymbol *sym; r = *pr; + /* Ignore R_*_NONE relocs. */ + if (r->howto->dst_mask == 0) + continue; + if (r->howto->rightshift != 0 || r->howto->size != 2 || r->howto->bitsize != 32 @@ -1105,7 +1108,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, amt = info->indextablesize; amt *= sizeof (struct indexentry); - info->indextable = (struct indexentry *) bfd_alloc (abfd, amt); + info->indextable = bfd_alloc (abfd, amt); if (info->indextable == NULL) return FALSE; @@ -1226,7 +1229,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, qsort (info->indextable, (size_t) i, sizeof (struct indexentry), cmpindexentry); - *pinfo = (PTR) info; + *pinfo = info; } /* We are passed a section relative offset. The offsets in the @@ -1248,7 +1251,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, long low, high; long mid = -1; - /* Cache non-existant or invalid. Do binary search on + /* Cache non-existent or invalid. Do binary search on indextable. */ indexentry = NULL; @@ -1360,7 +1363,7 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound, if (info->filename != NULL) free (info->filename); len = strlen (file_name) + 1; - info->filename = (char *) bfd_malloc ((bfd_size_type) dirlen + len); + info->filename = bfd_malloc (dirlen + len); if (info->filename == NULL) return FALSE; memcpy (info->filename, directory_name, dirlen);