symcount = bfd_canonicalize_symtab (abfd, syms);
if (symcount < 0)
bfd_fatal (bfd_get_filename (abfd));
+
+ /* If there are no symbols left after canonicalization and
+ we have not tried the dynamic symbols then give them a go. */
+ if (symcount == 0
+ && ! dynamic
+ && (storage = bfd_get_dynamic_symtab_upper_bound (abfd)) > 0)
+ {
+ free (syms);
+ syms = xmalloc (storage);
+ symcount = bfd_canonicalize_dynamic_symtab (abfd, syms);
+ }
}
\f
/* These global variables are used to pass information between
static const char *filename;
static const char *functionname;
static unsigned int line;
+static unsigned int discriminator;
static bfd_boolean found;
/* Look for an address in a section. This is called via
if (pc >= vma + size)
return;
- found = bfd_find_nearest_line (abfd, section, syms, pc - vma,
- &filename, &functionname, &line);
+ found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc - vma,
+ &filename, &functionname,
+ &line, &discriminator);
}
/* Look for an offset in a section. This is directly called. */
if (pc >= size)
return;
- found = bfd_find_nearest_line (abfd, section, syms, pc,
- &filename, &functionname, &line);
+ found = bfd_find_nearest_line_discriminator (abfd, section, syms, pc,
+ &filename, &functionname,
+ &line, &discriminator);
}
/* Read hexadecimal addresses from stdin, translate into
if (! found)
{
if (with_functions)
- printf ("??\n");
+ {
+ if (pretty_print)
+ printf ("?? ");
+ else
+ printf ("??\n");
+ }
printf ("??:0\n");
}
else
printf ("%s:", filename ? filename : "??");
if (line != 0)
- printf ("%u\n", line);
+ {
+ if (discriminator != 0)
+ printf ("%u (discriminator %u)\n", line, discriminator);
+ else
+ printf ("%u\n", line);
+ }
else
printf ("?\n");
if (!unwind_inlines)