From 61f0d76280d963a9ecf3a3a525dae7ac21050636 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Thu, 14 Jan 2010 21:09:05 +0000 Subject: [PATCH] gdb/ * solib-svr4.c (scan_dyntag): Remove variable dyn_addr. New variable target_section. Find SECT in current_target_sections, gdb_assert it. (elf_lookup_lib_symbol): Pass the binary file if given symfile_objfile. New variable abfd. * symtab.c (lookup_objfile_from_block): Return the binary file instead of separate debug info file. gdb/testsuite/ * gdb.base/break-interp.exp (test_core): New proc. (test_ld): Call it. --- gdb/ChangeLog | 9 ++++++++ gdb/solib-svr4.c | 28 ++++++++++++++++++++----- gdb/symtab.c | 7 ++++++- gdb/testsuite/ChangeLog | 5 +++++ gdb/testsuite/gdb.base/break-interp.exp | 23 ++++++++++++++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 875e65afb7..324268f248 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2010-01-14 Jan Kratochvil + + * solib-svr4.c (scan_dyntag): Remove variable dyn_addr. New variable + target_section. Find SECT in current_target_sections, gdb_assert it. + (elf_lookup_lib_symbol): Pass the binary file if given symfile_objfile. + New variable abfd. + * symtab.c (lookup_objfile_from_block): Return the binary file instead + of separate debug info file. + 2010-01-14 Jan Kratochvil Support PIEs with no symfile_objfile. diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index a2feabd4c7..0957c446e8 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -568,11 +568,12 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr) { int arch_size, step, sect_size; long dyn_tag; - CORE_ADDR dyn_ptr, dyn_addr; + CORE_ADDR dyn_ptr; gdb_byte *bufend, *bufstart, *buf; Elf32_External_Dyn *x_dynp_32; Elf64_External_Dyn *x_dynp_64; struct bfd_section *sect; + struct target_section *target_section; if (abfd == NULL) return 0; @@ -588,7 +589,13 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr) sect = bfd_get_section_by_name (abfd, ".dynamic"); if (sect == NULL) return 0; - dyn_addr = bfd_section_vma (abfd, sect); + + for (target_section = current_target_sections->sections; + target_section < current_target_sections->sections_end; + target_section++) + if (sect == target_section->the_bfd_section) + break; + gdb_assert (target_section < current_target_sections->sections_end); /* Read in .dynamic from the BFD. We will get the actual value from memory later. */ @@ -630,7 +637,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE_ADDR *ptr) CORE_ADDR ptr_addr; ptr_type = builtin_type (target_gdbarch)->builtin_data_ptr; - ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8; + ptr_addr = target_section->addr + (buf - bufstart) + arch_size / 8; if (target_read_memory (ptr_addr, ptr_buf, arch_size / 8) == 0) dyn_ptr = extract_typed_address (ptr_buf, ptr_type); *ptr = dyn_ptr; @@ -1951,8 +1958,19 @@ elf_lookup_lib_symbol (const struct objfile *objfile, const char *linkage_name, const domain_enum domain) { - if (objfile->obfd == NULL - || scan_dyntag (DT_SYMBOLIC, objfile->obfd, NULL) != 1) + bfd *abfd; + + if (objfile == symfile_objfile) + abfd = exec_bfd; + else + { + /* OBJFILE should have been passed as the non-debug one. */ + gdb_assert (objfile->separate_debug_objfile_backlink == NULL); + + abfd = objfile->obfd; + } + + if (abfd == NULL || scan_dyntag (DT_SYMBOLIC, abfd, NULL) != 1) return NULL; return lookup_global_symbol_from_objfile diff --git a/gdb/symtab.c b/gdb/symtab.c index 7f5dabdef6..426326d106 100644 --- a/gdb/symtab.c +++ b/gdb/symtab.c @@ -1470,7 +1470,12 @@ lookup_objfile_from_block (const struct block *block) /* Go through SYMTABS. */ ALL_SYMTABS (obj, s) if (block == BLOCKVECTOR_BLOCK (BLOCKVECTOR (s), GLOBAL_BLOCK)) - return obj; + { + if (obj->separate_debug_objfile_backlink) + obj = obj->separate_debug_objfile_backlink; + + return obj; + } return NULL; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 3756109489..9a571ade13 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-14 Jan Kratochvil + + * gdb.base/break-interp.exp (test_core): New proc. + (test_ld): Call it. + 2010-01-14 Jan Kratochvil * gdb.base/break-interp-main.c, gdb.base/break-interp-lib.c: New. diff --git a/gdb/testsuite/gdb.base/break-interp.exp b/gdb/testsuite/gdb.base/break-interp.exp index ce86cabc4e..553bbc6266 100644 --- a/gdb/testsuite/gdb.base/break-interp.exp +++ b/gdb/testsuite/gdb.base/break-interp.exp @@ -237,6 +237,27 @@ proc reach {func command} { } } +proc test_core {file} { + global srcdir subdir gdb_prompt + + set corefile [core_find $file] + if {$corefile == ""} { + return + } + + gdb_exit + gdb_start + # Clear it to never find any separate debug infos in $debug_root. + gdb_test "set debug-file-directory" "" "set debug-file-directory for core" + gdb_reinitialize_dir $srcdir/$subdir + gdb_load $file + + # Do not check the binary filename as it may be truncated. + gdb_test "core-file $corefile" "Core was generated by .*\r\n#0 .*" "core loaded" + + gdb_test "bt" "#\[0-9\]+ +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#\[0-9\]+ +\[^\r\n\]*\\mmain\\M.*" "core main bt" +} + proc test_ld {file ifmain trynosym} { global srcdir subdir gdb_prompt @@ -259,6 +280,8 @@ proc test_ld {file ifmain trynosym} { reach "libfunc" continue gdb_test "bt" "#0 +\[^\r\n\]*\\mlibfunc\\M\[^\r\n\]*\r\n#1 +\[^\r\n\]*\\mmain\\M.*" "main bt" + + test_core $file } if !$trynosym { -- 2.34.1