/* addr2line.c -- convert addresses to line number and function name
- Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
- 2007, 2009 Free Software Foundation, Inc.
+ Copyright (C) 1997-2016 Free Software Foundation, Inc.
Contributed by Ulrich Lauther <Ulrich.Lauther@mchp.siemens.de>
This file is part of GNU Binutils.
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);
+ }
+
+ /* PR 17512: file: 2a1d3b5b.
+ Do not pretend that we have some symbols when we don't. */
+ if (symcount <= 0)
+ {
+ free (syms);
+ syms = NULL;
+ }
}
\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)
program_name = *argv;
xmalloc_set_program_name (program_name);
+ bfd_set_error_program_name (program_name);
expandargv (&argc, &argv);