* 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.
2006-10-17 Daniel Jacobowitz <dan@codesourcery.com>
+ * 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 <dan@codesourcery.com>
+
* remote.c (remote_pid_to_str): Capitalize "Thread".
2006-10-15 Daniel Jacobowitz <dan@codesourcery.com>
$(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) \
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
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;
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);
#include <ctype.h>
#include "cp-abi.h"
#include "observer.h"
+#include "gdb_assert.h"
/* Prototypes for local functions */
}
\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
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);
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);
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)
/* 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 *);
2006-10-17 Daniel Jacobowitz <dan@codesourcery.com>
+ * 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 <dan@codesourcery.com>
+
* gdb.threads/manythreads.c (thread_function, main): Don't cast
int to pointer or pointer to int.
* gdb.threads/manythreads.exp: Don't expect the string "LWP".
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
--- /dev/null
+/* 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;
+}
--- /dev/null
+# 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"
+ }
+}
# 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
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
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.