]> Git Repo - binutils.git/commitdiff
gdb/
authorDaniel Jacobowitz <[email protected]>
Tue, 17 Oct 2006 20:17:45 +0000 (20:17 +0000)
committerDaniel Jacobowitz <[email protected]>
Tue, 17 Oct 2006 20:17:45 +0000 (20:17 +0000)
* Makefile.in (symtab.o): Update.
* symtab.h (matching_bfd_section): New prototype.
* symtab.c (matching_bfd_section): New.
(find_pc_sect_psymbol, find_pc_sect_symtab): Use it.
* minsyms.c (lookup_minimal_symbol_by_pc_section): Likewise.
* printcmd.c (sym_info): Ignore separate debug objfiles.
gdb/testsuite/
* gdb.base/sepdebug.exp: Remove debug format test.
* lib/gdb.exp (gdb_gnu_strip_debug): Perform debug format test.
Handle no-symtab.
* gdb.base/sepsymtab.c, gdb.base/sepsymtab.exp: New.

gdb/ChangeLog
gdb/Makefile.in
gdb/minsyms.c
gdb/printcmd.c
gdb/symtab.c
gdb/symtab.h
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/sepdebug.exp
gdb/testsuite/gdb.base/sepsymtab.c [new file with mode: 0644]
gdb/testsuite/gdb.base/sepsymtab.exp [new file with mode: 0644]
gdb/testsuite/lib/gdb.exp

index 0972ca6b4b3e52a8099f137f7f03da0b03af04e0..aac9f6720d36139ee23abc4268833942c61d2afb 100644 (file)
@@ -1,3 +1,12 @@
+2006-10-17  Daniel Jacobowitz  <[email protected]>
+
+       * Makefile.in (symtab.o): Update.
+       * symtab.h (matching_bfd_section): New prototype.
+       * symtab.c (matching_bfd_section): New.
+       (find_pc_sect_psymbol, find_pc_sect_symtab): Use it.
+       * minsyms.c (lookup_minimal_symbol_by_pc_section): Likewise.
+       * printcmd.c (sym_info): Ignore separate debug objfiles.
+
 2006-10-17  Daniel Jacobowitz  <[email protected]>
 
        * remote.c (remote_pid_to_str): Capitalize "Thread".
index 07892b857c4df5f3c971b258665b613b07a5f72a..047980250a785db7093d4200abdc75e80e1e1ec4 100644 (file)
@@ -2754,7 +2754,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h) $(gdbtypes_h) $(gdbcore_h) \
        $(language_h) $(demangle_h) $(inferior_h) $(linespec_h) $(source_h) \
        $(filenames_h) $(objc_lang_h) $(ada_lang_h) $(hashtab_h) \
        $(gdb_obstack_h) $(block_h) $(dictionary_h) $(gdb_string_h) \
-       $(gdb_stat_h) $(cp_abi_h) $(observer_h)
+       $(gdb_stat_h) $(cp_abi_h) $(observer_h) $(gdb_assert_h)
 target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \
        $(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \
        $(gdb_wait_h) $(dcache_h) $(regcache_h) $(gdb_assert_h) $(gdbcore_h) \
index ae4c23a113264245d04b452cde51579ccac8321f..b257c852e35ebdece19052147b75aee7ddbe7a4f 100644 (file)
@@ -360,7 +360,6 @@ lookup_minimal_symbol_solib_trampoline (const char *name,
   return NULL;
 }
 
-
 /* Search through the minimal symbol table for each objfile and find
    the symbol whose address is the largest address that is still less
    than or equal to PC, and matches SECTION (if non-NULL).  Returns a
@@ -491,7 +490,8 @@ lookup_minimal_symbol_by_pc_section (CORE_ADDR pc, asection *section)
                         don't fill the bfd_section member, so don't
                         throw away symbols on those platforms.  */
                      && SYMBOL_BFD_SECTION (&msymbol[hi]) != NULL
-                     && SYMBOL_BFD_SECTION (&msymbol[hi]) != section)
+                     && (!matching_bfd_sections
+                         (SYMBOL_BFD_SECTION (&msymbol[hi]), section)))
                    {
                      hi--;
                      continue;
index ade7802817e1ed76b363a5d1ab44b7a2d952009f..210a1c0fe5fd6d7efc60db8fa22230917047e208 100644 (file)
@@ -983,6 +983,11 @@ sym_info (char *arg, int from_tty)
   addr = parse_and_eval_address (arg);
   ALL_OBJSECTIONS (objfile, osect)
   {
+    /* Only process each object file once, even if there's a separate
+       debug file.  */
+    if (objfile->separate_debug_objfile_backlink)
+      continue;
+
     sect = osect->the_bfd_section;
     sect_addr = overlay_mapped_address (addr, sect);
 
index 2832dd15fdb0ea4e73f87d5e524225eeb0e7e0cd..10c723a141cba464bc6758c0dc6199e1e0bcd85d 100644 (file)
@@ -56,6 +56,7 @@
 #include <ctype.h>
 #include "cp-abi.h"
 #include "observer.h"
+#include "gdb_assert.h"
 
 /* Prototypes for local functions */
 
@@ -706,6 +707,64 @@ init_sal (struct symtab_and_line *sal)
 }
 \f
 
+/* Return 1 if the two sections are the same, or if they could
+   plausibly be copies of each other, one in an original object
+   file and another in a separated debug file.  */
+
+int
+matching_bfd_sections (asection *first, asection *second)
+{
+  struct objfile *obj;
+
+  /* If they're the same section, then they match.  */
+  if (first == second)
+    return 1;
+
+  /* If either is NULL, give up.  */
+  if (first == NULL || second == NULL)
+    return 0;
+
+  /* This doesn't apply to absolute symbols.  */
+  if (first->owner == NULL || second->owner == NULL)
+    return 0;
+
+  /* If they're in the same object file, they must be different sections.  */
+  if (first->owner == second->owner)
+    return 0;
+
+  /* Check whether the two sections are potentially corresponding.  They must
+     have the same size, address, and name.  We can't compare section indexes,
+     which would be more reliable, because some sections may have been
+     stripped.  */
+  if (bfd_get_section_size (first) != bfd_get_section_size (second))
+    return 0;
+
+  if (bfd_get_section_vma (first->owner, first)
+      != bfd_get_section_vma (second->owner, second))
+    return 0;
+
+  if (bfd_get_section_name (first->owner, first) == NULL
+      || bfd_get_section_name (second->owner, second) == NULL
+      || strcmp (bfd_get_section_name (first->owner, first),
+                bfd_get_section_name (second->owner, second)) != 0)
+    return 0;
+
+  /* Otherwise check that they are in corresponding objfiles.  */
+
+  ALL_OBJFILES (obj)
+    if (obj->obfd == first->owner)
+      break;
+  gdb_assert (obj != NULL);
+
+  if (obj->separate_debug_objfile != NULL
+      && obj->separate_debug_objfile->obfd == second->owner)
+    return 1;
+  if (obj->separate_debug_objfile_backlink != NULL
+      && obj->separate_debug_objfile_backlink->obfd == second->owner)
+    return 1;
+
+  return 0;
+}
 
 /* Find which partial symtab contains PC and SECTION.  Return 0 if
    none.  We return the psymtab that contains a symbol whose address
@@ -845,7 +904,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
          if (section)          /* match on a specific section */
            {
              fixup_psymbol_section (p, psymtab->objfile);
-             if (SYMBOL_BFD_SECTION (p) != section)
+             if (!matching_bfd_sections (SYMBOL_BFD_SECTION (p), section))
                continue;
            }
          best_pc = SYMBOL_VALUE_ADDRESS (p);
@@ -869,7 +928,7 @@ find_pc_sect_psymbol (struct partial_symtab *psymtab, CORE_ADDR pc,
          if (section)          /* match on a specific section */
            {
              fixup_psymbol_section (p, psymtab->objfile);
-             if (SYMBOL_BFD_SECTION (p) != section)
+             if (!matching_bfd_sections (SYMBOL_BFD_SECTION (p), section))
                continue;
            }
          best_pc = SYMBOL_VALUE_ADDRESS (p);
@@ -1902,7 +1961,7 @@ find_pc_sect_symtab (CORE_ADDR pc, asection *section)
            ALL_BLOCK_SYMBOLS (b, iter, sym)
              {
                fixup_symbol_section (sym, objfile);
-               if (section == SYMBOL_BFD_SECTION (sym))
+               if (matching_bfd_sections (SYMBOL_BFD_SECTION (sym), section))
                  break;
              }
            if (sym == NULL)
index bef9aaaf1a9f3a5a4f64e93bc721f57b6d70f96b..4a980c13df7f6f81bb6add584dc15601faa5e582 100644 (file)
@@ -1316,6 +1316,8 @@ extern char **make_source_files_completion_list (char *, char *);
 
 /* symtab.c */
 
+int matching_bfd_sections (asection *, asection *);
+
 extern struct partial_symtab *find_main_psymtab (void);
 
 extern struct symtab *find_line_symtab (struct symtab *, int, int *, int *);
index 440fde90fb99726d3efe41a59d310ade98847b46..7396d50fd00e9ee4ce08dc7d0efbb4d66e8c8a28 100644 (file)
@@ -1,3 +1,10 @@
+2006-10-17  Daniel Jacobowitz  <[email protected]>
+
+       * gdb.base/sepdebug.exp: Remove debug format test.
+       * lib/gdb.exp (gdb_gnu_strip_debug): Perform debug format test.
+       Handle no-symtab.
+       * gdb.base/sepsymtab.c, gdb.base/sepsymtab.exp: New.
+
 2006-10-17  Daniel Jacobowitz  <[email protected]>
 
        * gdb.threads/manythreads.c (thread_function, main): Don't cast
index 5bc00c5453560d2cf85d41bb6d0115345ef6cee0..4593549aaa031ac47465df85ea803f153cbc6b64 100644 (file)
@@ -47,39 +47,6 @@ if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb
     return -1
 }
 
-# FIXME: this is nasty. We need to check for the stabs debug format.
-# To do this we must run gdb on the unstripped executable, list 'main'
-# (as to have a default source file), use get_debug_format (which does
-# 'info source') and then see if the debug info is stabs. If so, we
-# bail out.  We cannot do this any other way because get_debug_format
-# finds out the debug format using gdb itself, and in case of stabs we
-# get an error loading the program if it is already stripped.  An
-# alternative would be to find out the debug info from the flags
-# passed to dejagnu when the test is run.
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}
-gdb_test "list main" "" ""
-get_debug_format
-if { [test_debug_format "stabs"] } then {
-    # the separate debug info feature doesn't work well in binutils with stabs.
-    # It produces a corrupted debug info only file, and gdb chokes on it.
-    # It is almost impossible to capture the failing message out of gdb,
-    # because it happens inside gdb_load. At that point any error message
-    # is intercepted by dejagnu itself, and, because of the error threshold,
-    # any faulty test result is changed into an UNRESOLVED. 
-    # (see dejagnu/lib/framework.exp)
-    unsupported "no separate debug info handling with stabs"
-    return -1
-} elseif { [test_debug_format "unknown"] } then {
-    # gdb doesn't know what the debug format is. We are out of luck here. 
-    unsupported "unknown debugging format"
-    return -1
-}
-gdb_exit
-
 # Note: the procedure gdb_gnu_strip_debug will produce an executable called
 # ${binfile}, which is just like the executable ($binfile) but without
 # the debuginfo. Instead $binfile has a .gnudebuglink section which contains
diff --git a/gdb/testsuite/gdb.base/sepsymtab.c b/gdb/testsuite/gdb.base/sepsymtab.c
new file mode 100644 (file)
index 0000000..1c53958
--- /dev/null
@@ -0,0 +1,23 @@
+/* Copyright 2006
+   Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+   02111-1307, USA.  */
+
+int
+main (int argc, char **argv, char **envp)
+{
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.base/sepsymtab.exp b/gdb/testsuite/gdb.base/sepsymtab.exp
new file mode 100644 (file)
index 0000000..b386f3c
--- /dev/null
@@ -0,0 +1,53 @@
+# Copyright 2006
+# Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  
+
+if $tracelevel then {
+    strace $tracelevel
+}
+
+#
+# test running programs
+#
+
+set testfile "sepsymtab"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" \
+         executable {debug}] != "" } {
+    untested sepsymtab.exp
+    return -1
+}
+
+if [gdb_gnu_strip_debug $binfile no-main] {
+    # check that you have a recent version of strip and objcopy installed
+    unsupported "cannot produce separate debug info files"
+    return -1
+}
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+gdb_load ${binfile}
+
+set command "info sym main"
+set command_regex [string_to_regexp $command]
+gdb_test_multiple "$command" "$command" {
+    -re "^${command_regex}\[\r\n\]+main in section \[^\r\n\]+\[\r\n\]+$gdb_prompt \$" {
+       pass "$command"
+    }
+}
index 0d8a430192e064996282f4f7c980f56f24f16b41..86c7e1de0621527aeda7c8b7732315988d3f6555 100644 (file)
@@ -2276,7 +2276,7 @@ proc gdb_skip_bogus_test { msg } {
 # Note: the procedure gdb_gnu_strip_debug will produce an executable called
 # ${binfile}.dbglnk, which is just like the executable ($binfile) but without
 # the debuginfo. Instead $binfile has a .gnu_debuglink section which contains
-# the name of a idebuginfo only file. This file will be stored in the 
+# the name of a debuginfo only file. This file will be stored in the 
 # gdb.base/.debug subdirectory.
 
 # Functions for separate debug info testing
@@ -2307,8 +2307,45 @@ proc separate_debug_filename { exec } {
     return $debug_file
 }
 
+# Create stripped files for DEST, replacing it.  If ARGS is passed, it is a
+# list of optional flags.  The only currently supported flag is no-main,
+# which removes the symbol entry for main from the separate debug file.
 
-proc gdb_gnu_strip_debug { dest } {
+proc gdb_gnu_strip_debug { dest args } {
+
+    # First, make sure that we can do this.  This is nasty. We need to
+    # check for the stabs debug format.  To do this we must run gdb on
+    # the unstripped executable, list 'main' (as to have a default
+    # source file), use get_debug_format (which does 'info source')
+    # and then see if the debug info is stabs. If so, we bail out.  We
+    # cannot do this any other way because get_debug_format finds out
+    # the debug format using gdb itself, and in case of stabs we get
+    # an error loading the program if it is already stripped.  An
+    # alternative would be to find out the debug info from the flags
+    # passed to dejagnu when the test is run.
+
+    gdb_exit
+    gdb_start
+    gdb_load ${dest}
+    gdb_test "list main" "" ""
+    get_debug_format
+    if { [test_debug_format "stabs"] } then {
+       # The separate debug info feature doesn't work well in
+       # binutils with stabs.  It produces a corrupted debug info
+       # only file, and gdb chokes on it.  It is almost impossible to
+       # capture the failing message out of gdb, because it happens
+       # inside gdb_load. At that point any error message is
+       # intercepted by dejagnu itself, and, because of the error
+       # threshold, any faulty test result is changed into an
+       # UNRESOLVED.  (see dejagnu/lib/framework.exp)
+       unsupported "no separate debug info handling with stabs"
+       return -1
+    } elseif { [test_debug_format "unknown"] } then {
+       # gdb doesn't know what the debug format is. We are out of luck here. 
+       unsupported "unknown debugging format"
+       return -1
+    }
+    gdb_exit
 
     set debug_file [separate_debug_filename $dest]
     set strip_to_file_program strip
@@ -2342,6 +2379,22 @@ proc gdb_gnu_strip_debug { dest } {
       return 1
     }
 
+    # If no-main is passed, strip the symbol for main from the separate
+    # file.  This is to simulate the behavior of elfutils's eu-strip, which
+    # leaves the symtab in the original file only.  There's no way to get
+    # objcopy or strip to remove the symbol table without also removing the
+    # debugging sections, so this is as close as we can get.
+    if { [llength $args] == 1 && [lindex $args 0] == "no-main" } {
+       set result [catch "exec $objcopy_program -N main ${debug_file} ${debug_file}-tmp" output]
+       verbose "result is $result"
+       verbose "output is $output"
+       if {$result == 1} {
+           return 1
+       }
+       file delete "${debug_file}"
+       file rename "${debug_file}-tmp" "${debug_file}"
+    }
+
     # Link the two previous output files together, adding the .gnu_debuglink
     # section to the stripped_file, containing a pointer to the debug_file,
     # save the new file in dest.
This page took 0.072093 seconds and 4 git commands to generate.