gdb/
authorJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 14 Jan 2010 21:09:05 +0000 (21:09 +0000)
committerJan Kratochvil <jan.kratochvil@redhat.com>
Thu, 14 Jan 2010 21:09:05 +0000 (21:09 +0000)
* 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
gdb/solib-svr4.c
gdb/symtab.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/break-interp.exp

index 875e65afb7df2e4cd00f9d61ab2f585a65cfa9fd..324268f2480024f7330b8c28034cae170cf56739 100644 (file)
@@ -1,3 +1,12 @@
+2010-01-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * 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  <jan.kratochvil@redhat.com>
 
        Support PIEs with no symfile_objfile.
index a2feabd4c767a7e0acd78218d6b030c663361d2b..0957c446e8b2aa9b15e6c6cf2f1952ea8bd4ca70 100644 (file)
@@ -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
index 7f5dabdef621f1c67f9262f055793a4ea0cecd4a..426326d1066f9e15730d69ada9b285695fbef852 100644 (file)
@@ -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;
 }
index 37561094896bb24380fea105f1941db69535b1d6..9a571ade133c522ed7b0b480b4e3533d9e31369c 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.base/break-interp.exp (test_core): New proc.
+       (test_ld): Call it.
+
 2010-01-14  Jan Kratochvil  <jan.kratochvil@redhat.com>
 
        * gdb.base/break-interp-main.c, gdb.base/break-interp-lib.c: New.
index ce86cabc4e83e2ff291452a0645149a64edfd359..553bbc6266c6784ce989ffb0b5644da25aa2de6e 100644 (file)
@@ -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 {