diff options
-rw-r--r-- | bfd/ChangeLog | 9 | ||||
-rw-r--r-- | bfd/dwarf2.c | 23 | ||||
-rw-r--r-- | ld/ChangeLog | 9 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf.exp | 6 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf2.err | 4 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf2a.c | 8 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf2b.c | 10 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf3.c | 13 | ||||
-rw-r--r-- | ld/testsuite/ld-elf/dwarf3.err | 4 |
9 files changed, 84 insertions, 2 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0c45c44..01314bd 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,12 @@ +2017-02-16 Andrew Burgess <andrew.burgess@embecosm.com> + + * dwarf2.c (struct dwarf2_debug): Add orig_bfd member. + (_bfd_dwarf2_slurp_debug_info): If stashed debug information does + not match current bfd, then reload debug information. Record bfd + we're loading debug info for in the stash. If we have debug + informatin in the cache then perform section placement before + returning. + 2017-02-16 Alan Modra <amodra@gmail.com> PR 21000 diff --git a/bfd/dwarf2.c b/bfd/dwarf2.c index 6b111d3..03447a9 100644 --- a/bfd/dwarf2.c +++ b/bfd/dwarf2.c @@ -100,6 +100,12 @@ struct dwarf2_debug /* Pointer to the end of the .debug_info section memory buffer. */ bfd_byte *info_ptr_end; + /* Pointer to the original bfd for which debug was loaded. This is what + we use to compare and so check that the cached debug data is still + valid - it saves having to possibly dereference the gnu_debuglink each + time. */ + bfd *orig_bfd; + /* Pointer to the bfd, section and address of the beginning of the section. The bfd might be different than expected because of gnu_debuglink sections. */ @@ -3897,8 +3903,20 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd, if (stash != NULL) { - if (section_vma_same (abfd, stash)) - return TRUE; + if (stash->orig_bfd == abfd + && section_vma_same (abfd, stash)) + { + /* Check that we did previously find some debug information + before attempting to make use of it. */ + if (stash->bfd_ptr != NULL) + { + if (do_place && !place_sections (abfd, stash)) + return FALSE; + return TRUE; + } + + return FALSE; + } _bfd_dwarf2_cleanup_debug_info (abfd, pinfo); memset (stash, 0, amt); } @@ -3908,6 +3926,7 @@ _bfd_dwarf2_slurp_debug_info (bfd *abfd, bfd *debug_bfd, if (! stash) return FALSE; } + stash->orig_bfd = abfd; stash->debug_sections = debug_sections; stash->syms = symbols; if (!save_section_vma (abfd, stash)) diff --git a/ld/ChangeLog b/ld/ChangeLog index 8d49373..696e08af 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,14 @@ 2017-02-16 Andrew Burgess <andrew.burgess@embecosm.com> + * testsuite/ld-elf/dwarf.exp (build_tests): Add new tests. + * testsuite/ld-elf/dwarf2.err: New file. + * testsuite/ld-elf/dwarf2a.c: New file. + * testsuite/ld-elf/dwarf2b.c: New file. + * testsuite/ld-elf/dwarf3.c: New file. + * testsuite/ld-elf/dwarf3.err: New file. + +2017-02-16 Andrew Burgess <andrew.burgess@embecosm.com> + * testsuite/lib/ld-lib.exp (run_cc_link_tests): Add warning, error, warning_output, and error_output actions. Remove separate warnings parameter. diff --git a/ld/testsuite/ld-elf/dwarf.exp b/ld/testsuite/ld-elf/dwarf.exp index 529ebcc..25b0c9d 100644 --- a/ld/testsuite/ld-elf/dwarf.exp +++ b/ld/testsuite/ld-elf/dwarf.exp @@ -49,6 +49,12 @@ set build_tests { {"Build libdwarf1.so" "-s -shared" "-fPIC -g -feliminate-dwarf2-dups" {dwarf1.c} {} "libdwarf1.so"} + {"DWARF parse during linker error" + "" "-fno-toplevel-reorder" + {dwarf2a.c dwarf2b.c} {{error_output "dwarf2.err"}} "dwarf2.x"} + {"Handle no DWARF information" + "" "-g0" + {dwarf3.c} {{error_output "dwarf3.err"}} "dwarf3.x"} } set run_tests { diff --git a/ld/testsuite/ld-elf/dwarf2.err b/ld/testsuite/ld-elf/dwarf2.err new file mode 100644 index 0000000..872d282 --- /dev/null +++ b/ld/testsuite/ld-elf/dwarf2.err @@ -0,0 +1,4 @@ +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 diff --git a/ld/testsuite/ld-elf/dwarf2a.c b/ld/testsuite/ld-elf/dwarf2a.c new file mode 100644 index 0000000..1de5794 --- /dev/null +++ b/ld/testsuite/ld-elf/dwarf2a.c @@ -0,0 +1,8 @@ +int global_var = 3; +int other_var = 4; + +int +function (void) +{ + return 0; +} diff --git a/ld/testsuite/ld-elf/dwarf2b.c b/ld/testsuite/ld-elf/dwarf2b.c new file mode 100644 index 0000000..c557978 --- /dev/null +++ b/ld/testsuite/ld-elf/dwarf2b.c @@ -0,0 +1,10 @@ +int global_var = 4; +int other_var = 2; + +extern int function (void); + +int +main () +{ + return function (); +} diff --git a/ld/testsuite/ld-elf/dwarf3.c b/ld/testsuite/ld-elf/dwarf3.c new file mode 100644 index 0000000..054eb9b --- /dev/null +++ b/ld/testsuite/ld-elf/dwarf3.c @@ -0,0 +1,13 @@ +/* This test is actually used to test for a segfault that came from the bfd + dwarf parsing code in the case when there is _no_ dwarf info. */ + +extern void bar (int a); + +int +main () +{ + bar (1); + bar (2); + + return 0; +} diff --git a/ld/testsuite/ld-elf/dwarf3.err b/ld/testsuite/ld-elf/dwarf3.err new file mode 100644 index 0000000..6027431 --- /dev/null +++ b/ld/testsuite/ld-elf/dwarf3.err @@ -0,0 +1,4 @@ +.*/dwarf3\.o: In function `main': +.*dwarf3.c:\(\.text.*\+0x[0-9a-f]+\): undefined reference to `bar' +.*dwarf3.c:\(\.text.*\+0x[0-9a-f]+\): undefined reference to `bar' +#...
\ No newline at end of file |