X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Faddr2line.c;h=11bbcd8f27d826ef48051eb0d7b62d55448badab;hb=aefd8b33d97bded58e51d75271f99e1eaec9fb28;hp=663da4570e5887866456415d40dd8d477936020a;hpb=670b0bad30115b2324a83f7df343cc83f8d0b901;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/addr2line.c b/binutils/addr2line.c index 663da4570e..11bbcd8f27 100644 --- a/binutils/addr2line.c +++ b/binutils/addr2line.c @@ -1,6 +1,5 @@ /* 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-2017 Free Software Foundation, Inc. Contributed by Ulrich Lauther This file is part of GNU Binutils. @@ -130,6 +129,25 @@ slurp_symtab (bfd *abfd) 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; + } } /* These global variables are used to pass information between @@ -139,6 +157,7 @@ static bfd_vma pc; 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 @@ -165,8 +184,9 @@ find_address_in_section (bfd *abfd, asection *section, 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. */ @@ -186,8 +206,9 @@ find_offset_in_section (bfd *abfd, asection *section) 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 @@ -246,7 +267,12 @@ translate_addresses (bfd *abfd, asection *section) if (! found) { if (with_functions) - printf ("??\n"); + { + if (pretty_print) + printf ("?? "); + else + printf ("??\n"); + } printf ("??:0\n"); } else @@ -294,7 +320,12 @@ translate_addresses (bfd *abfd, asection *section) 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) @@ -400,6 +431,7 @@ main (int argc, char **argv) program_name = *argv; xmalloc_set_program_name (program_name); + bfd_set_error_program_name (program_name); expandargv (&argc, &argv);