2004-12-03 Jan Beulich  <jbeulich@novell.com>

	* elf.c (elf_find_function): Don't use the last file symbol ever,
	seen, but the last one seen prior to the symbol being reported.
	Don't report a filename at all for global symbols when that might
	be ambiguous/wrong.
This commit is contained in:
Jan Beulich 2004-12-03 13:59:36 +00:00
parent 3da796a242
commit 5742623224
2 changed files with 34 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2004-12-03 Jan Beulich <jbeulich@novell.com>
* elf.c (elf_find_function): Don't use the last file symbol ever,
seen, but the last one seen prior to the symbol being reported.
Don't report a filename at all for global symbols when that might
be ambiguous/wrong.
2004-12-01 Paul Brook <paul@codesourcery.com>
* elf32-arm.c (elf32_arm_copy_private_bfd_data): Set EI_OSABI.

View File

@ -6376,13 +6376,24 @@ elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
const char **functionname_ptr)
{
const char *filename;
asymbol *func;
asymbol *func, *file;
bfd_vma low_func;
asymbol **p;
/* ??? Given multiple file symbols, it is impossible to reliably
choose the right file name for global symbols. File symbols are
local symbols, and thus all file symbols must sort before any
global symbols. The ELF spec may be interpreted to say that a
file symbol must sort before other local symbols, but currently
ld -r doesn't do this. So, for ld -r output, it is possible to
make a better choice of file name for local symbols by ignoring
file symbols appearing after a given local symbol. */
enum { nothing_seen, symbol_seen, file_after_symbol_seen } state;
filename = NULL;
func = NULL;
file = NULL;
low_func = 0;
state = nothing_seen;
for (p = symbols; *p != NULL; p++)
{
@ -6395,8 +6406,12 @@ elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
default:
break;
case STT_FILE:
filename = bfd_asymbol_name (&q->symbol);
break;
file = &q->symbol;
if (state == symbol_seen)
state = file_after_symbol_seen;
continue;
case STT_SECTION:
continue;
case STT_NOTYPE:
case STT_FUNC:
if (bfd_get_section (&q->symbol) == section
@ -6405,9 +6420,18 @@ elf_find_function (bfd *abfd ATTRIBUTE_UNUSED,
{
func = (asymbol *) q;
low_func = q->symbol.value;
if (file == NULL)
filename = NULL;
else if (ELF_ST_BIND (q->internal_elf_sym.st_info) != STB_LOCAL
&& state == file_after_symbol_seen)
filename = NULL;
else
filename = bfd_asymbol_name (file);
}
break;
}
if (state == nothing_seen)
state = symbol_seen;
}
if (func == NULL)