diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 01314bda146..40edca71ff4 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2017-02-16 Andrew Burgess + + * dwarf2.c (_bfd_dwarf2_find_nearest_line): Perform symbol lookup + before trying to fine matching file and line information. + 2017-02-16 Andrew Burgess * dwarf2.c (struct dwarf2_debug): Add orig_bfd member. diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 03447a908a5..9bb81264872 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -4155,6 +4155,38 @@ _bfd_dwarf2_find_nearest_line (bfd *abfd, { BFD_ASSERT (section != NULL && functionname_ptr != NULL); addr = offset; + + /* If we have no SYMBOL but the section we're looking at is not a + code section, then take a look through the list of symbols to see + if we have a symbol at the address we're looking for. If we do + then use this to look up line information. This will allow us to + give file and line results for data symbols. We exclude code + symbols here, if we look up a function symbol and then look up the + line information we'll actually return the line number for the + opening '{' rather than the function definition line. This is + because looking up by symbol uses the line table, in which the + first line for a function is usually the opening '{', while + looking up the function by section + offset uses the + DW_AT_decl_line from the function DW_TAG_subprogram for the line, + which will be the line of the function name. */ + if ((section->flags & SEC_CODE) == 0) + { + asymbol **tmp; + + for (tmp = symbols; (*tmp) != NULL; ++tmp) + if ((*tmp)->the_bfd == abfd + && (*tmp)->section == section + && (*tmp)->value == offset + && ((*tmp)->flags & BSF_SECTION_SYM) == 0) + { + symbol = *tmp; + do_line = TRUE; + /* For local symbols, keep going in the hope we find a + global. */ + if ((symbol->flags & BSF_GLOBAL) != 0) + break; + } + } } if (section->output_section) diff --git a/ld/ChangeLog b/ld/ChangeLog index 696e08afffb..7d4739756a3 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,8 @@ +2017-02-16 Andrew Burgess + + * testsuite/ld-elf/shared.exp: Update expected results. + * testsuite/ld-elf/dwarf2.err: Likewise + 2017-02-16 Andrew Burgess * testsuite/ld-elf/dwarf.exp (build_tests): Add new tests. diff --git a/ld/testsuite/ld-elf/dwarf2.err b/ld/testsuite/ld-elf/dwarf2.err index 872d2823635..b4ea67fc195 100644 --- a/ld/testsuite/ld-elf/dwarf2.err +++ b/ld/testsuite/ld-elf/dwarf2.err @@ -1,4 +1,5 @@ -tmpdir/dwarf2b\.o:\(\.data\+0x0\): multiple definition of `global_var' -tmpdir/dwarf2a\.o:\(\.data\+0x0\): first defined here -tmpdir/dwarf2b\.o:\(\.data\+0x4\): multiple definition of `other_var' -tmpdir/dwarf2a\.o:\(\.data\+0x4\): first defined here +tmpdir/dwarf2b\.o:.*dwarf2b\.c:1: multiple definition of `global_var' +tmpdir/dwarf2a\.o:.*dwarf2a\.c:1: first defined here +tmpdir/dwarf2b\.o:.*dwarf2b\.c:2: multiple definition of `other_var' +tmpdir/dwarf2a\.o:.*dwarf2a\.c:2: first defined here +#... \ No newline at end of file diff --git a/ld/testsuite/ld-elf/shared.exp b/ld/testsuite/ld-elf/shared.exp index 9d5a9d9fe90..3b8ab181d1f 100644 --- a/ld/testsuite/ld-elf/shared.exp +++ b/ld/testsuite/ld-elf/shared.exp @@ -105,7 +105,7 @@ set build_tests { "-shared" "-fPIC" {beginwarn.c end.c} {{readelf {-S --wide} libbarw.rd} - {warning "^.*\\): warning: function foo is deprecated$"}} + {warning "^.*beginwarn.c:7: warning: function foo is deprecated$"}} "libbarw.so" "c"} {"Build hidden libbar.so" "-shared" "-fPIC" @@ -350,7 +350,7 @@ set run_tests [list \ [list "Run warn with versioned libfoo.so" \ "-Wl,--no-as-needed tmpdir/beginwarn.o tmpdir/libfoov.so" "" \ {main.c} "warn" "warn.out" \ - "" "c" {^.*\): warning: function foo is deprecated$} ] \ + "" "c" {^.*beginwarn.c:7: warning: function foo is deprecated$} ] \ [list "Run protected with versioned libfoo.so" \ "-Wl,--no-as-needed tmpdir/begin.o tmpdir/libfoov.so tmpdir/endprotected.o" "" \ {main.c} "protected" "normal.out" ] \