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 875e65a..324268f 100644 (file)
@@ -1,5 +1,14 @@
 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.
        * exec.c (print_section_info <abfd == exec_bfd>): Relocate Entry point.
        * solib-svr4.c (svr4_relocate_main_executable <exec_bfd>): New block.
index a2feabd..0957c44 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 7f5dabd..426326d 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 3756109..9a571ad 100644 (file)
@@ -1,5 +1,10 @@
 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.
        * gdb.base/break-interp.exp: Exit on skip_shlib_tests.  Change $srcfile.
        New variables $binfile_lib and $srcfile_lib.  Call get_compiler_info
index ce86cab..553bbc6 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 {