PR23652, Use symbols from debug bfd for _bfd_elf_find_function properly

There were a number of problems with the previous patch.  Firstly,
_bfd_dwarf2_stash_syms didn't do anything when the original file had
dynamic symbols, and secondly, info found by the symbol search didn't
make it out of _bfd_elf_find_nearest_line except in the case of DWARF
functions without external linkage.

	PR 23652
	* dwarf2.c (_bfd_dwarf2_stash_syms): Break out of loop on finding
	matching section.
	(_bfd_dwarf2_find_nearest_line): Return an int, with value 2 when
	returning info from the symbol table.  Do the _bfd_elf_find_function
	search also when !found.  Call _bfd_dwarf2_stash_syms regardless of
	symbols.
	* elf64-alpha.c (elf64_alpha_find_nearest_line): Accept dwarf2
	result of 1 only.
	* elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Likewise.
	* libbfd-in.h (_bfd_dwarf2_find_nearest_line): Update prototype.
	* libbfd.h: Regenerate.
This commit is contained in:
Alan Modra 2019-11-27 18:00:59 +10:30
parent e76790600a
commit 7f3bf38453
6 changed files with 34 additions and 10 deletions

View File

@ -1,3 +1,18 @@
2019-11-27 Alan Modra <amodra@gmail.com>
PR 23652
* dwarf2.c (_bfd_dwarf2_stash_syms): Break out of loop on finding
matching section.
(_bfd_dwarf2_find_nearest_line): Return an int, with value 2 when
returning info from the symbol table. Do the _bfd_elf_find_function
search also when !found. Call _bfd_dwarf2_stash_syms regardless of
symbols.
* elf64-alpha.c (elf64_alpha_find_nearest_line): Accept dwarf2
result of 1 only.
* elfxx-mips.c (_bfd_mips_elf_find_nearest_line): Likewise.
* libbfd-in.h (_bfd_dwarf2_find_nearest_line): Update prototype.
* libbfd.h: Regenerate.
2019-11-27 Alan Modra <amodra@gmail.com>
PR 23652

View File

@ -3923,6 +3923,7 @@ _bfd_dwarf2_stash_syms (struct dwarf2_debug *stash, bfd *abfd,
{
*sec = d;
*syms = stash->syms;
break;
}
}
}
@ -4692,15 +4693,19 @@ _bfd_dwarf2_find_symbol_bias (asymbol ** symbols, void ** pinfo)
/* Find the source code location of SYMBOL. If SYMBOL is NULL
then find the nearest source code location corresponding to
the address SECTION + OFFSET.
Returns TRUE if the line is found without error and fills in
Returns 1 if the line is found without error and fills in
FILENAME_PTR and LINENUMBER_PTR. In the case where SYMBOL was
NULL the FUNCTIONNAME_PTR is also filled in.
Returns 2 if partial information from _bfd_elf_find_function is
returned (function and maybe file) by looking at symbols. DWARF2
info is present but not regarding the requested code location.
Returns 0 otherwise.
SYMBOLS contains the symbol table for ABFD.
DEBUG_SECTIONS contains the name of the dwarf debug sections.
field and in the abbreviation offset, or zero to indicate that the
default value should be used. */
bfd_boolean
int
_bfd_dwarf2_find_nearest_line (bfd *abfd,
asymbol **symbols,
asymbol *symbol,
@ -4726,7 +4731,7 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
bfd_vma addr;
struct comp_unit* each;
struct funcinfo *function = NULL;
bfd_boolean found = FALSE;
int found = FALSE;
bfd_boolean do_line;
*filename_ptr = NULL;
@ -4925,19 +4930,21 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd,
if (functionname_ptr && function && function->is_linkage)
*functionname_ptr = function->name;
else if (functionname_ptr
&& ((found && !*functionname_ptr)
&& (!*functionname_ptr
|| (function && !function->is_linkage)))
{
asymbol *fun;
asymbol **syms = symbols;
asection *sec = section;
if (symbols == NULL || *symbols == NULL)
_bfd_dwarf2_stash_syms (stash, abfd, &sec, &syms);
_bfd_dwarf2_stash_syms (stash, abfd, &sec, &syms);
fun = _bfd_elf_find_function (abfd, syms, sec, offset,
*filename_ptr ? NULL : filename_ptr,
functionname_ptr);
if (!found && fun != NULL)
found = 2;
if (function && !function->is_linkage)
{
bfd_vma sec_vma;

View File

@ -1468,7 +1468,8 @@ elf64_alpha_find_nearest_line (bfd *abfd, asymbol **symbols,
filename_ptr, functionname_ptr,
line_ptr, discriminator_ptr,
dwarf_debug_sections,
&elf_tdata (abfd)->dwarf2_find_line_info))
&elf_tdata (abfd)->dwarf2_find_line_info)
== 1)
return TRUE;
msec = bfd_get_section_by_name (abfd, ".mdebug");

View File

@ -13078,7 +13078,8 @@ _bfd_mips_elf_find_nearest_line (bfd *abfd, asymbol **symbols,
filename_ptr, functionname_ptr,
line_ptr, discriminator_ptr,
dwarf_debug_sections,
&elf_tdata (abfd)->dwarf2_find_line_info))
&elf_tdata (abfd)->dwarf2_find_line_info)
== 1)
return TRUE;
if (_bfd_dwarf1_find_nearest_line (abfd, symbols, section, offset,

View File

@ -596,7 +596,7 @@ struct dwarf_debug_section
extern const struct dwarf_debug_section dwarf_debug_sections[] ATTRIBUTE_HIDDEN;
/* Find the nearest line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_nearest_line
extern int _bfd_dwarf2_find_nearest_line
(bfd *, asymbol **, asymbol *, asection *, bfd_vma,
const char **, const char **, unsigned int *, unsigned int *,
const struct dwarf_debug_section *, void **) ATTRIBUTE_HIDDEN;

View File

@ -601,7 +601,7 @@ struct dwarf_debug_section
extern const struct dwarf_debug_section dwarf_debug_sections[] ATTRIBUTE_HIDDEN;
/* Find the nearest line using DWARF 2 debugging information. */
extern bfd_boolean _bfd_dwarf2_find_nearest_line
extern int _bfd_dwarf2_find_nearest_line
(bfd *, asymbol **, asymbol *, asection *, bfd_vma,
const char **, const char **, unsigned int *, unsigned int *,
const struct dwarf_debug_section *, void **) ATTRIBUTE_HIDDEN;