(_bfd_stab_section_find_nearest_line): For line number stabs outside of
functions, treat values as absolute addresses.
This commit is contained in:
parent
3193e2343c
commit
21efdc8d7c
@ -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.
|
||||||
|
91
bfd/syms.c
91
bfd/syms.c
@ -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';
|
||||||
|
Loading…
Reference in New Issue
Block a user