From 670b0bad30115b2324a83f7df343cc83f8d0b901 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Fri, 1 Jun 2012 01:04:29 +0000 Subject: * addr2line.c (translate_addresses): Truncate input addresses to arch_size bits. Avoid undefined shift. Print '?' for zero line. --- binutils/ChangeLog | 5 +++++ binutils/addr2line.c | 22 ++++++++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 2b916a8..14d720f 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 d0f4567..663da45 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 -- cgit v1.1