From: Alan Modra Date: Fri, 1 Jun 2012 01:04:29 +0000 (+0000) Subject: * addr2line.c (translate_addresses): Truncate input addresses to X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=670b0bad30115b2324a83f7df343cc83f8d0b901;p=binutils-gdb.git * addr2line.c (translate_addresses): Truncate input addresses to arch_size bits. Avoid undefined shift. Print '?' for zero line. --- diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 2b916a8f9a4..14d720f2842 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,8 @@ +2012-06-01 Alan Modra + + * addr2line.c (translate_addresses): Truncate input addresses to + arch_size bits. Avoid undefined shift. Print '?' for zero line. + 2012-05-30 Nick Clifton * readelf.c (process_section_headers): Correct bug in previous diff --git a/binutils/addr2line.c b/binutils/addr2line.c index d0f45671cb5..663da4570e5 100644 --- a/binutils/addr2line.c +++ b/binutils/addr2line.c @@ -196,8 +196,6 @@ find_offset_in_section (bfd *abfd, asection *section) static void translate_addresses (bfd *abfd, asection *section) { - const struct elf_backend_data * bed; - int read_stdin = (naddr == 0); for (;;) @@ -218,11 +216,15 @@ translate_addresses (bfd *abfd, asection *section) pc = bfd_scan_vma (*addr++, NULL, 16); } - if (bfd_get_flavour (abfd) == bfd_target_elf_flavour - && (bed = get_elf_backend_data (abfd)) != NULL - && bed->sign_extend_vma - && (pc & (bfd_vma) 1 << (bed->s->arch_size - 1))) - pc |= ((bfd_vma) -1) << bed->s->arch_size; + if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) + { + const struct elf_backend_data *bed = get_elf_backend_data (abfd); + bfd_vma sign = (bfd_vma) 1 << (bed->s->arch_size - 1); + + pc &= (sign << 1) - 1; + if (bed->sign_extend_vma) + pc = (pc ^ sign) - sign; + } if (with_addresses) { @@ -290,7 +292,11 @@ translate_addresses (bfd *abfd, asection *section) filename = h + 1; } - printf ("%s:%u\n", filename ? filename : "??", line); + printf ("%s:", filename ? filename : "??"); + if (line != 0) + printf ("%u\n", line); + else + printf ("?\n"); if (!unwind_inlines) found = FALSE; else