(_bfd_stab_section_find_nearest_line): For line number stabs outside of

functions, treat values as absolute addresses.
This commit is contained in:
Nick Clifton 2003-02-14 09:31:57 +00:00
parent 3193e2343c
commit 21efdc8d7c
2 changed files with 47 additions and 47 deletions

View File

@ -3,6 +3,9 @@
* elfcore.h (elf_core_file_p): Compare alternate machine codes for ELF * elfcore.h (elf_core_file_p): Compare alternate machine codes for ELF
backends when checking if the generic ELF target should be used. backends when checking if the generic ELF target should be used.
* syms.c (_bfd_stab_section_find_nearest_line): For line number stabs
outside of functions, treat values as absolute addresses.
2003-02-14 Alan Modra <amodra@bigpond.net.au> 2003-02-14 Alan Modra <amodra@bigpond.net.au>
* elf64-ppc.c (ppc64_elf_link_hash_table_create): Init tls_get_addr. * elf64-ppc.c (ppc64_elf_link_hash_table_create): Init tls_get_addr.

View File

@ -1,24 +1,24 @@
/* Generic symbol-table support for the BFD library. /* Generic symbol-table support for the BFD library.
Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002 2000, 2001, 2002, 2003
Free Software Foundation, Inc. Free Software Foundation, Inc.
Written by Cygnus Support. Written by Cygnus Support.
This file is part of BFD, the Binary File Descriptor library. This file is part of BFD, the Binary File Descriptor library.
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or the Free Software Foundation; either version 2 of the License, or
(at your option) any later version. (at your option) any later version.
This program is distributed in the hope that it will be useful, This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/* /*
SECTION SECTION
@ -74,9 +74,9 @@ SUBSECTION
| if (storage_needed < 0) | if (storage_needed < 0)
| FAIL | FAIL
| |
| if (storage_needed == 0) { | if (storage_needed == 0)
| return ; | return;
| } |
| symbol_table = (asymbol **) xmalloc (storage_needed); | symbol_table = (asymbol **) xmalloc (storage_needed);
| ... | ...
| number_of_symbols = | number_of_symbols =
@ -85,9 +85,8 @@ SUBSECTION
| if (number_of_symbols < 0) | if (number_of_symbols < 0)
| FAIL | FAIL
| |
| for (i = 0; i < number_of_symbols; i++) { | for (i = 0; i < number_of_symbols; i++)
| process_symbol (symbol_table[i]); | process_symbol (symbol_table[i]);
| }
All storage for the symbols themselves is in an objalloc All storage for the symbols themselves is in an objalloc
connected to the BFD; it is freed when the BFD is closed. connected to the BFD; it is freed when the BFD is closed.
@ -108,25 +107,26 @@ SUBSECTION
example showing the creation of a symbol table with only one element: example showing the creation of a symbol table with only one element:
| #include "bfd.h" | #include "bfd.h"
| main() | int main (void)
| { | {
| bfd *abfd; | bfd *abfd;
| asymbol *ptrs[2]; | asymbol *ptrs[2];
| asymbol *new; | asymbol *new;
| |
| abfd = bfd_openw("foo","a.out-sunos-big"); | abfd = bfd_openw ("foo","a.out-sunos-big");
| bfd_set_format(abfd, bfd_object); | bfd_set_format (abfd, bfd_object);
| new = bfd_make_empty_symbol(abfd); | new = bfd_make_empty_symbol (abfd);
| new->name = "dummy_symbol"; | new->name = "dummy_symbol";
| new->section = bfd_make_section_old_way(abfd, ".text"); | new->section = bfd_make_section_old_way (abfd, ".text");
| new->flags = BSF_GLOBAL; | new->flags = BSF_GLOBAL;
| new->value = 0x12345; | new->value = 0x12345;
| |
| ptrs[0] = new; | ptrs[0] = new;
| ptrs[1] = (asymbol *)0; | ptrs[1] = (asymbol *)0;
| |
| bfd_set_symtab(abfd, ptrs, 1); | bfd_set_symtab (abfd, ptrs, 1);
| bfd_close(abfd); | bfd_close (abfd);
| return 0;
| } | }
| |
| ./makesym | ./makesym
@ -346,7 +346,7 @@ FUNCTION
bfd_is_local_label bfd_is_local_label
SYNOPSIS SYNOPSIS
bfd_boolean bfd_is_local_label(bfd *abfd, asymbol *sym); bfd_boolean bfd_is_local_label (bfd *abfd, asymbol *sym);
DESCRIPTION DESCRIPTION
Return TRUE if the given symbol @var{sym} in the BFD @var{abfd} is Return TRUE if the given symbol @var{sym} in the BFD @var{abfd} is
@ -438,7 +438,7 @@ FUNCTION
bfd_print_symbol_vandf bfd_print_symbol_vandf
SYNOPSIS SYNOPSIS
void bfd_print_symbol_vandf(bfd *abfd, PTR file, asymbol *symbol); void bfd_print_symbol_vandf (bfd *abfd, PTR file, asymbol *symbol);
DESCRIPTION DESCRIPTION
Print the value and flags of the @var{symbol} supplied to the Print the value and flags of the @var{symbol} supplied to the
@ -451,16 +451,14 @@ bfd_print_symbol_vandf (abfd, arg, symbol)
asymbol *symbol; asymbol *symbol;
{ {
FILE *file = (FILE *) arg; FILE *file = (FILE *) arg;
flagword type = symbol->flags; flagword type = symbol->flags;
if (symbol->section != (asection *) NULL) if (symbol->section != (asection *) NULL)
{ bfd_fprintf_vma (abfd, file,
bfd_fprintf_vma (abfd, file, symbol->value + symbol->section->vma);
symbol->value + symbol->section->vma);
}
else else
{ bfd_fprintf_vma (abfd, file, symbol->value);
bfd_fprintf_vma (abfd, file, symbol->value);
}
/* This presumes that a symbol can not be both BSF_DEBUGGING and /* This presumes that a symbol can not be both BSF_DEBUGGING and
BSF_DYNAMIC, nor more than one of BSF_FUNCTION, BSF_FILE, and BSF_DYNAMIC, nor more than one of BSF_FUNCTION, BSF_FILE, and
@ -504,7 +502,7 @@ FUNCTION
_bfd_generic_make_empty_symbol _bfd_generic_make_empty_symbol
SYNOPSIS SYNOPSIS
asymbol *_bfd_generic_make_empty_symbol (bfd *); asymbol * _bfd_generic_make_empty_symbol (bfd *);
DESCRIPTION DESCRIPTION
Create a new <<asymbol>> structure for the BFD @var{abfd} Create a new <<asymbol>> structure for the BFD @var{abfd}
@ -634,7 +632,7 @@ DESCRIPTION
class of @var{symbol}, or '?' for an unknown class. class of @var{symbol}, or '?' for an unknown class.
SYNOPSIS SYNOPSIS
int bfd_decode_symclass(asymbol *symbol); int bfd_decode_symclass (asymbol *symbol);
*/ */
int int
bfd_decode_symclass (symbol) bfd_decode_symclass (symbol)
@ -726,7 +724,7 @@ DESCRIPTION
calling this function. calling this function.
SYNOPSIS SYNOPSIS
void bfd_symbol_info(asymbol *symbol, symbol_info *ret); void bfd_symbol_info (asymbol *symbol, symbol_info *ret);
*/ */
void void
@ -749,7 +747,7 @@ FUNCTION
bfd_copy_private_symbol_data bfd_copy_private_symbol_data
SYNOPSIS 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 DESCRIPTION
Copy private symbol information from @var{isym} in the BFD Copy private symbol information from @var{isym} in the BFD
@ -816,7 +814,6 @@ _bfd_generic_read_minisymbols (abfd, dynamic, minisymsp, sizep)
an asymbol. We don't worry about the sym argument we are passed; an asymbol. We don't worry about the sym argument we are passed;
we just return the asymbol the minisymbol points to. */ we just return the asymbol the minisymbol points to. */
/*ARGSUSED*/
asymbol * asymbol *
_bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym) _bfd_generic_minisymbol_to_symbol (abfd, dynamic, minisym, sym)
bfd *abfd ATTRIBUTE_UNUSED; bfd *abfd ATTRIBUTE_UNUSED;
@ -1245,12 +1242,11 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound,
else else
#endif #endif
{ {
/* Cache non-existant or invalid. Do binary search on
indextable. */
long low, high; long low, high;
long mid = -1; long mid = -1;
/* Cache non-existant or invalid. Do binary search on
indextable. */
indexentry = NULL; indexentry = NULL;
low = 0; low = 0;
@ -1305,9 +1301,11 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound,
case N_SLINE: case N_SLINE:
case N_DSLINE: case N_DSLINE:
case N_BSLINE: case N_BSLINE:
/* A line number. The value is relative to the start of the /* A line number. If the function was specified, then the value
current function. */ is relative to the start of the function. Otherwise, the
val = indexentry->val + bfd_get_32 (abfd, stab + VALOFF); value is an absolute address. */
val = ((indexentry->function_name ? indexentry->val : 0)
+ bfd_get_32 (abfd, stab + VALOFF));
/* If this line starts before our desired offset, or if it's /* If this line starts before our desired offset, or if it's
the first line we've been able to find, use it. The the first line we've been able to find, use it. The
!saw_line check works around a bug in GCC 2.95.3, which emits !saw_line check works around a bug in GCC 2.95.3, which emits
@ -1376,7 +1374,6 @@ _bfd_stab_section_find_nearest_line (abfd, symbols, section, offset, pfound,
/* This will typically be something like main:F(0,1), so we want /* This will typically be something like main:F(0,1), so we want
to clobber the colon. It's OK to change the name, since the to clobber the colon. It's OK to change the name, since the
string is in our own local storage anyhow. */ string is in our own local storage anyhow. */
s = strchr (indexentry->function_name, ':'); s = strchr (indexentry->function_name, ':');
if (s != NULL) if (s != NULL)
*s = '\0'; *s = '\0';