This commit is contained in:
committed by
Git OBS Bridge
parent
a3bdbacbed
commit
c9ef7ab429
@@ -1,3 +0,0 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
|
||||||
oid sha256:f98cec38420f4f1ce3da2f16e6045f086d24dfcf05996b2d74f8620691442f62
|
|
||||||
size 15080950
|
|
3
gdb-6.7.50.20080110-cvs.tar.bz2
Normal file
3
gdb-6.7.50.20080110-cvs.tar.bz2
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
version https://git-lfs.github.com/spec/v1
|
||||||
|
oid sha256:03d71579cbc8e43da40bf8cb3662f705eef2fa86ac5030b9520ae4a080dbf260
|
||||||
|
size 15093497
|
@@ -1,3 +1,8 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu Jan 10 11:57:13 CET 2008 - schwab@suse.de
|
||||||
|
|
||||||
|
- Update to head of trunk.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Mon Nov 12 14:47:26 CET 2007 - schwab@suse.de
|
Mon Nov 12 14:47:26 CET 2007 - schwab@suse.de
|
||||||
|
|
||||||
|
23
gdb.spec
23
gdb.spec
@@ -1,7 +1,7 @@
|
|||||||
#
|
#
|
||||||
# spec file for package gdb (Version 6.7.1)
|
# spec file for package gdb (Version 6.7.50.20080110)
|
||||||
#
|
#
|
||||||
# Copyright (c) 2007 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
# Copyright (c) 2008 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
# This file and all modifications and additions to the pristine
|
# This file and all modifications and additions to the pristine
|
||||||
# package are under the same license as the package itself.
|
# package are under the same license as the package itself.
|
||||||
#
|
#
|
||||||
@@ -28,19 +28,16 @@ License: GPL v2 or later
|
|||||||
Group: Development/Tools/Debuggers
|
Group: Development/Tools/Debuggers
|
||||||
AutoReqProv: on
|
AutoReqProv: on
|
||||||
PreReq: %{install_info_prereq}
|
PreReq: %{install_info_prereq}
|
||||||
Version: 6.7.1
|
Version: 6.7.50.20080110
|
||||||
Release: 1
|
Release: 1
|
||||||
Summary: The GNU Debugger
|
Summary: The GNU Debugger
|
||||||
Source: gdb-%{version}.tar.bz2
|
Source: gdb-%{version}-cvs.tar.bz2
|
||||||
|
Patch1: find-pc-sect-line.diff
|
||||||
Patch2: warn.patch
|
Patch2: warn.patch
|
||||||
Patch3: readline-5.1-random.patch
|
Patch3: readline-5.1-random.patch
|
||||||
Patch4: readnever.patch
|
Patch4: readnever.patch
|
||||||
Patch5: gstack.patch
|
Patch5: gstack.patch
|
||||||
Patch6: sect-index-text.diff
|
Patch6: sect-index-text.diff
|
||||||
Patch7: pie-relocate.diff
|
|
||||||
Patch9: macro-table.diff
|
|
||||||
Patch10: ppc-long-double.diff
|
|
||||||
Patch12: find-pc-sect-line.diff
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
|
|
||||||
%description
|
%description
|
||||||
@@ -68,16 +65,13 @@ Authors:
|
|||||||
Stu Grossman <grossman@cygnus.com>
|
Stu Grossman <grossman@cygnus.com>
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q -n %{name}-%{version}-cvs
|
||||||
|
%patch1
|
||||||
%patch2
|
%patch2
|
||||||
%patch3
|
%patch3
|
||||||
%patch4
|
%patch4
|
||||||
%patch5
|
%patch5
|
||||||
%patch6
|
%patch6
|
||||||
%patch7
|
|
||||||
%patch9 -p1
|
|
||||||
%patch10
|
|
||||||
%patch12
|
|
||||||
|
|
||||||
%build
|
%build
|
||||||
CFLAGS="$RPM_OPT_FLAGS" \
|
CFLAGS="$RPM_OPT_FLAGS" \
|
||||||
@@ -133,7 +127,10 @@ rm -rf $RPM_BUILD_ROOT
|
|||||||
%{_bindir}/gdbserver
|
%{_bindir}/gdbserver
|
||||||
%{_mandir}/man1/gdbserver.1.gz
|
%{_mandir}/man1/gdbserver.1.gz
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu Jan 10 2008 - schwab@suse.de
|
||||||
|
- Update to head of trunk.
|
||||||
* Mon Nov 12 2007 - schwab@suse.de
|
* Mon Nov 12 2007 - schwab@suse.de
|
||||||
- Update to gdb 6.7.1.
|
- Update to gdb 6.7.1.
|
||||||
* hppa*64*-*-hpux11* target broken
|
* hppa*64*-*-hpux11* target broken
|
||||||
|
136
macro-table.diff
136
macro-table.diff
@@ -1,136 +0,0 @@
|
|||||||
2007-09-21 Jim Blandy <jimb@codesourcery.com>
|
|
||||||
|
|
||||||
* macrotab.h (new_macro_table): Document that removing information
|
|
||||||
from an obstack/bcache-managed macro table leaks memory.
|
|
||||||
* macrotab.c (macro_free, macro_bcache_free): Instead of asserting
|
|
||||||
that data is never freed in obstack/bcache-managed macro tables,
|
|
||||||
just leak the storage.
|
|
||||||
(macro_undef): If we're undefining a macro at exactly the same
|
|
||||||
source location that we defined it, simply remove the definition
|
|
||||||
altogether.
|
|
||||||
|
|
||||||
diff -r 77afe7ffac2f gdb/macrotab.c
|
|
||||||
--- a/gdb/macrotab.c Fri Sep 21 14:38:59 2007 -0700
|
|
||||||
+++ b/gdb/macrotab.c Fri Sep 21 17:32:52 2007 -0700
|
|
||||||
@@ -87,8 +87,14 @@ static void
|
|
||||||
static void
|
|
||||||
macro_free (void *object, struct macro_table *t)
|
|
||||||
{
|
|
||||||
- gdb_assert (! t->obstack);
|
|
||||||
- xfree (object);
|
|
||||||
+ if (t->obstack)
|
|
||||||
+ /* There are cases where we need to remove entries from a macro
|
|
||||||
+ table, even when reading debugging information. This should be
|
|
||||||
+ rare, and there's no easy way to free arbitrary data from an
|
|
||||||
+ obstack, so we just leak it. */
|
|
||||||
+ ;
|
|
||||||
+ else
|
|
||||||
+ xfree (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -120,12 +126,18 @@ macro_bcache_str (struct macro_table *t,
|
|
||||||
|
|
||||||
|
|
||||||
/* Free a possibly bcached object OBJ. That is, if the macro table T
|
|
||||||
- has a bcache, it's an error; otherwise, xfree OBJ. */
|
|
||||||
+ has a bcache, do nothing; otherwise, xfree OBJ. */
|
|
||||||
static void
|
|
||||||
macro_bcache_free (struct macro_table *t, void *obj)
|
|
||||||
{
|
|
||||||
- gdb_assert (! t->bcache);
|
|
||||||
- xfree (obj);
|
|
||||||
+ if (t->bcache)
|
|
||||||
+ /* There are cases where we need to remove entries from a macro
|
|
||||||
+ table, even when reading debugging information. This should be
|
|
||||||
+ rare, and there's no easy way to free data from a bcache, so we
|
|
||||||
+ just leak it. */
|
|
||||||
+ ;
|
|
||||||
+ else
|
|
||||||
+ xfree (obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -781,25 +793,39 @@ macro_undef (struct macro_source_file *s
|
|
||||||
|
|
||||||
if (n)
|
|
||||||
{
|
|
||||||
- /* This function is the only place a macro's end-of-scope
|
|
||||||
- location gets set to anything other than "end of the
|
|
||||||
- compilation unit" (i.e., end_file is zero). So if this macro
|
|
||||||
- already has its end-of-scope set, then we're probably seeing
|
|
||||||
- a second #undefinition for the same #definition. */
|
|
||||||
struct macro_key *key = (struct macro_key *) n->key;
|
|
||||||
|
|
||||||
- if (key->end_file)
|
|
||||||
+ /* If we're removing a definition at exactly the same point that
|
|
||||||
+ we defined it, then just delete the entry altogether. GCC
|
|
||||||
+ 4.1.2 will generate DWARF that says to do this if you pass it
|
|
||||||
+ arguments like '-DFOO -UFOO -DFOO=2'. */
|
|
||||||
+ if (source == key->start_file
|
|
||||||
+ && line == key->start_line)
|
|
||||||
+ splay_tree_remove (source->table->definitions, n->key);
|
|
||||||
+
|
|
||||||
+ else
|
|
||||||
{
|
|
||||||
- complaint (&symfile_complaints,
|
|
||||||
- _("macro '%s' is #undefined twice, at %s:%d and %s:%d"), name,
|
|
||||||
- source->filename, line, key->end_file->filename,
|
|
||||||
- key->end_line);
|
|
||||||
+ /* This function is the only place a macro's end-of-scope
|
|
||||||
+ location gets set to anything other than "end of the
|
|
||||||
+ compilation unit" (i.e., end_file is zero). So if this
|
|
||||||
+ macro already has its end-of-scope set, then we're
|
|
||||||
+ probably seeing a second #undefinition for the same
|
|
||||||
+ #definition. */
|
|
||||||
+ if (key->end_file)
|
|
||||||
+ {
|
|
||||||
+ complaint (&symfile_complaints,
|
|
||||||
+ _("macro '%s' is #undefined twice,"
|
|
||||||
+ " at %s:%d and %s:%d"),
|
|
||||||
+ name,
|
|
||||||
+ source->filename, line,
|
|
||||||
+ key->end_file->filename, key->end_line);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* Whether or not we've seen a prior #undefinition, wipe out
|
|
||||||
+ the old ending point, and make this the ending point. */
|
|
||||||
+ key->end_file = source;
|
|
||||||
+ key->end_line = line;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- /* Whatever the case, wipe out the old ending point, and
|
|
||||||
- make this the ending point. */
|
|
||||||
- key->end_file = source;
|
|
||||||
- key->end_line = line;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
diff -r 77afe7ffac2f gdb/macrotab.h
|
|
||||||
--- a/gdb/macrotab.h Fri Sep 21 14:38:59 2007 -0700
|
|
||||||
+++ b/gdb/macrotab.h Fri Sep 21 17:32:52 2007 -0700
|
|
||||||
@@ -152,15 +152,15 @@ struct macro_source_file
|
|
||||||
amongst compilation units in an executable file; if BCACHE is zero,
|
|
||||||
don't cache these things.
|
|
||||||
|
|
||||||
- Note that, if either OBSTACK or BCACHE are non-zero, then you
|
|
||||||
- should only ever add information the macro table --- you should
|
|
||||||
- never remove things from it. You'll get an error if you try. At
|
|
||||||
- the moment, since we only provide obstacks and bcaches for macro
|
|
||||||
- tables for symtabs, this restriction makes a nice sanity check.
|
|
||||||
- Obstacks and bcaches are pretty much grow-only structures anyway.
|
|
||||||
- However, if we find that it's occasionally useful to delete things
|
|
||||||
- even from the symtab's tables, and the storage leak isn't a
|
|
||||||
- problem, this restriction could be lifted. */
|
|
||||||
+ Note that, if either OBSTACK or BCACHE are non-zero, then removing
|
|
||||||
+ information from the table may leak memory. Neither obstacks nor
|
|
||||||
+ bcaches really allow you to remove information, so although we can
|
|
||||||
+ update the data structure to record the change, we can't free the
|
|
||||||
+ old data. At the moment, since we only provide obstacks and
|
|
||||||
+ bcaches for macro tables for symtabs, this isn't a problem; only
|
|
||||||
+ odd debugging information makes a definition and then deletes it at
|
|
||||||
+ the same source location (although 'gcc -DFOO -UFOO -DFOO=2' does
|
|
||||||
+ do that in GCC 4.1.2.). */
|
|
||||||
struct macro_table *new_macro_table (struct obstack *obstack,
|
|
||||||
struct bcache *bcache);
|
|
||||||
|
|
@@ -1,583 +0,0 @@
|
|||||||
--- gdb/Makefile.in
|
|
||||||
+++ gdb/Makefile.in
|
|
||||||
@@ -2450,7 +2450,7 @@ objfiles.o: objfiles.c $(defs_h) $(bfd_h
|
|
||||||
$(objfiles_h) $(gdb_stabs_h) $(target_h) $(bcache_h) $(mdebugread_h) \
|
|
||||||
$(gdb_assert_h) $(gdb_stat_h) $(gdb_obstack_h) $(gdb_string_h) \
|
|
||||||
$(hashtab_h) $(breakpoint_h) $(block_h) $(dictionary_h) $(source_h) \
|
|
||||||
- $(parser_defs_h) $(expression_h)
|
|
||||||
+ $(parser_defs_h) $(expression_h) $(auxv_h) $(elf_common_h)
|
|
||||||
observer.o: observer.c $(defs_h) $(observer_h) $(command_h) $(gdbcmd_h) \
|
|
||||||
$(observer_inc)
|
|
||||||
obsd-tdep.o: obsd-tdep.c $(defs_h) $(frame_h) $(symtab_h) $(obsd_tdep_h)
|
|
||||||
@@ -2643,9 +2643,9 @@ solib-sunos.o: solib-sunos.c $(defs_h) $
|
|
||||||
$(bcache_h) $(regcache_h)
|
|
||||||
solib-svr4.o: solib-svr4.c $(defs_h) $(elf_external_h) $(elf_common_h) \
|
|
||||||
$(elf_mips_h) $(symtab_h) $(bfd_h) $(symfile_h) $(objfiles_h) \
|
|
||||||
- $(gdbcore_h) $(target_h) $(inferior_h) $(gdb_assert_h) \
|
|
||||||
+ $(gdbcore_h) $(target_h) $(inferior_h) $(command_h) $(gdb_assert_h) \
|
|
||||||
$(solist_h) $(solib_h) $(solib_svr4_h) $(bfd_target_h) $(elf_bfd_h) \
|
|
||||||
- $(exec_h)
|
|
||||||
+ $(exec_h) $(auxv_h)
|
|
||||||
solib-target.o: solib-target.c $(defs_h) $(objfiles_h) $(solist_h) \
|
|
||||||
$(symtab_h) $(symfile_h) $(target_h) $(vec_h) $(xml_support_h) \
|
|
||||||
$(gdb_string_h)
|
|
||||||
--- gdb/breakpoint.c
|
|
||||||
+++ gdb/breakpoint.c
|
|
||||||
@@ -3869,6 +3869,7 @@ describe_other_breakpoints (CORE_ADDR pc
|
|
||||||
printf_filtered ("%s%s ",
|
|
||||||
((b->enable_state == bp_disabled ||
|
|
||||||
b->enable_state == bp_shlib_disabled ||
|
|
||||||
+ b->enable_state == bp_startup_disabled ||
|
|
||||||
b->enable_state == bp_call_disabled)
|
|
||||||
? " (disabled)"
|
|
||||||
: b->enable_state == bp_permanent
|
|
||||||
@@ -4541,6 +4542,60 @@ re_enable_breakpoints_in_shlibs (void)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+void
|
|
||||||
+disable_breakpoints_at_startup (int silent)
|
|
||||||
+{
|
|
||||||
+ struct breakpoint *b;
|
|
||||||
+ int disabled_startup_breaks = 0;
|
|
||||||
+
|
|
||||||
+ if (bfd_get_start_address (exec_bfd) != entry_point_address ())
|
|
||||||
+ {
|
|
||||||
+ ALL_BREAKPOINTS (b)
|
|
||||||
+ {
|
|
||||||
+ if ((b->type == bp_breakpoint
|
|
||||||
+ || b->type == bp_hardware_breakpoint)
|
|
||||||
+ && b->enable_state == bp_enabled
|
|
||||||
+ && !b->loc->duplicate)
|
|
||||||
+ {
|
|
||||||
+ b->enable_state = bp_startup_disabled;
|
|
||||||
+ if (!silent)
|
|
||||||
+ {
|
|
||||||
+ if (!disabled_startup_breaks)
|
|
||||||
+ {
|
|
||||||
+ target_terminal_ours_for_output ();
|
|
||||||
+ warning ("Temporarily disabling breakpoints:");
|
|
||||||
+ }
|
|
||||||
+ disabled_startup_breaks = 1;
|
|
||||||
+ warning ("breakpoint #%d addr 0x%s",
|
|
||||||
+ b->number, paddr_nz (b->loc->address));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/* Try to reenable any breakpoints after startup. */
|
|
||||||
+void
|
|
||||||
+re_enable_breakpoints_at_startup (void)
|
|
||||||
+{
|
|
||||||
+ struct breakpoint *b;
|
|
||||||
+
|
|
||||||
+ if (bfd_get_start_address (exec_bfd) != entry_point_address ())
|
|
||||||
+ {
|
|
||||||
+ ALL_BREAKPOINTS (b)
|
|
||||||
+ if (b->enable_state == bp_startup_disabled)
|
|
||||||
+ {
|
|
||||||
+ gdb_byte buf[1];
|
|
||||||
+
|
|
||||||
+ /* Do not reenable the breakpoint if the shared library
|
|
||||||
+ is still not mapped in. */
|
|
||||||
+ if (target_read_memory (b->loc->address, buf, 1) == 0)
|
|
||||||
+ b->enable_state = bp_enabled;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
static void
|
|
||||||
solib_load_unload_1 (char *hookname, int tempflag, char *dll_pathname,
|
|
||||||
char *cond_string, enum bptype bp_kind)
|
|
||||||
@@ -6956,6 +7011,7 @@ delete_breakpoint (struct breakpoint *bp
|
|
||||||
&& !b->loc->duplicate
|
|
||||||
&& b->enable_state != bp_disabled
|
|
||||||
&& b->enable_state != bp_shlib_disabled
|
|
||||||
+ && b->enable_state != bp_startup_disabled
|
|
||||||
&& !b->pending
|
|
||||||
&& b->enable_state != bp_call_disabled)
|
|
||||||
{
|
|
||||||
@@ -7180,7 +7236,8 @@ breakpoint_re_set_one (void *bint)
|
|
||||||
break;
|
|
||||||
|
|
||||||
save_enable = b->enable_state;
|
|
||||||
- if (b->enable_state != bp_shlib_disabled)
|
|
||||||
+ if (b->enable_state != bp_shlib_disabled
|
|
||||||
+ && b->enable_state != bp_startup_disabled)
|
|
||||||
b->enable_state = bp_disabled;
|
|
||||||
else
|
|
||||||
/* If resetting a shlib-disabled breakpoint, we don't want to
|
|
||||||
--- gdb/breakpoint.h
|
|
||||||
+++ gdb/breakpoint.h
|
|
||||||
@@ -153,6 +153,7 @@ enum enable_state
|
|
||||||
automatically enabled and reset when the call
|
|
||||||
"lands" (either completes, or stops at another
|
|
||||||
eventpoint). */
|
|
||||||
+ bp_startup_disabled,
|
|
||||||
bp_permanent /* There is a breakpoint instruction hard-wired into
|
|
||||||
the target's code. Don't try to write another
|
|
||||||
breakpoint instruction on top of it, or restore
|
|
||||||
@@ -794,8 +795,12 @@ extern void remove_thread_event_breakpoi
|
|
||||||
|
|
||||||
extern void disable_breakpoints_in_shlibs (void);
|
|
||||||
|
|
||||||
+extern void disable_breakpoints_at_startup (int silent);
|
|
||||||
+
|
|
||||||
extern void re_enable_breakpoints_in_shlibs (void);
|
|
||||||
|
|
||||||
+extern void re_enable_breakpoints_at_startup (void);
|
|
||||||
+
|
|
||||||
extern void create_solib_load_event_breakpoint (char *, int, char *, char *);
|
|
||||||
|
|
||||||
extern void create_solib_unload_event_breakpoint (char *, int,
|
|
||||||
--- gdb/dwarf2read.c
|
|
||||||
+++ gdb/dwarf2read.c
|
|
||||||
@@ -1231,7 +1231,7 @@ dwarf2_build_psymtabs (struct objfile *o
|
|
||||||
else
|
|
||||||
dwarf2_per_objfile->loc_buffer = NULL;
|
|
||||||
|
|
||||||
- if (mainline
|
|
||||||
+ if (mainline == 1
|
|
||||||
|| (objfile->global_psymbols.size == 0
|
|
||||||
&& objfile->static_psymbols.size == 0))
|
|
||||||
{
|
|
||||||
--- gdb/elfread.c
|
|
||||||
+++ gdb/elfread.c
|
|
||||||
@@ -611,7 +611,7 @@ elf_symfile_read (struct objfile *objfil
|
|
||||||
/* If we are reinitializing, or if we have never loaded syms yet,
|
|
||||||
set table to empty. MAINLINE is cleared so that *_read_psymtab
|
|
||||||
functions do not all also re-initialize the psymbol table. */
|
|
||||||
- if (mainline)
|
|
||||||
+ if (mainline == 1)
|
|
||||||
{
|
|
||||||
init_psymbol_list (objfile, 0);
|
|
||||||
mainline = 0;
|
|
||||||
--- gdb/infrun.c
|
|
||||||
+++ gdb/infrun.c
|
|
||||||
@@ -2250,6 +2250,11 @@ process_event_stop_test:
|
|
||||||
code segments in shared libraries might be mapped in now. */
|
|
||||||
re_enable_breakpoints_in_shlibs ();
|
|
||||||
|
|
||||||
+ /* For PIE executables, we dont really know where the
|
|
||||||
+ breakpoints are going to be until we start up the
|
|
||||||
+ inferior. */
|
|
||||||
+ re_enable_breakpoints_at_startup ();
|
|
||||||
+
|
|
||||||
/* If requested, stop when the dynamic linker notifies
|
|
||||||
gdb of events. This allows the user to get control
|
|
||||||
and place breakpoints in initializer routines for
|
|
||||||
--- gdb/objfiles.c
|
|
||||||
+++ gdb/objfiles.c
|
|
||||||
@@ -47,6 +47,8 @@
|
|
||||||
#include "block.h"
|
|
||||||
#include "dictionary.h"
|
|
||||||
#include "source.h"
|
|
||||||
+#include "auxv.h"
|
|
||||||
+#include "elf/common.h"
|
|
||||||
|
|
||||||
/* Prototypes for local functions */
|
|
||||||
|
|
||||||
@@ -259,7 +261,16 @@ init_entry_point_info (struct objfile *o
|
|
||||||
CORE_ADDR
|
|
||||||
entry_point_address (void)
|
|
||||||
{
|
|
||||||
- return symfile_objfile ? symfile_objfile->ei.entry_point : 0;
|
|
||||||
+ int ret;
|
|
||||||
+ CORE_ADDR entry_addr;
|
|
||||||
+
|
|
||||||
+ /* Find the address of the entry point of the program from the
|
|
||||||
+ auxv vector. */
|
|
||||||
+ ret = target_auxv_search (¤t_target, AT_ENTRY, &entry_addr);
|
|
||||||
+ if (ret > 0)
|
|
||||||
+ return entry_addr;
|
|
||||||
+ else
|
|
||||||
+ return symfile_objfile ? symfile_objfile->ei.entry_point : 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Create the terminating entry of OBJFILE's minimal symbol table.
|
|
||||||
--- gdb/solib-svr4.c
|
|
||||||
+++ gdb/solib-svr4.c
|
|
||||||
@@ -31,6 +31,7 @@
|
|
||||||
#include "gdbcore.h"
|
|
||||||
#include "target.h"
|
|
||||||
#include "inferior.h"
|
|
||||||
+#include "command.h"
|
|
||||||
|
|
||||||
#include "gdb_assert.h"
|
|
||||||
|
|
||||||
@@ -41,6 +42,7 @@
|
|
||||||
#include "bfd-target.h"
|
|
||||||
#include "elf-bfd.h"
|
|
||||||
#include "exec.h"
|
|
||||||
+#include "auxv.h"
|
|
||||||
|
|
||||||
static struct link_map_offsets *svr4_fetch_link_map_offsets (void);
|
|
||||||
static int svr4_have_link_map_offsets (void);
|
|
||||||
@@ -249,8 +251,6 @@ static char *debug_loader_name;
|
|
||||||
|
|
||||||
/* Local function prototypes */
|
|
||||||
|
|
||||||
-static int match_main (char *);
|
|
||||||
-
|
|
||||||
static CORE_ADDR bfd_lookup_symbol (bfd *, char *);
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -356,6 +356,8 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
|
||||||
Elf32_External_Dyn *x_dynp_32;
|
|
||||||
Elf64_External_Dyn *x_dynp_64;
|
|
||||||
struct bfd_section *sect;
|
|
||||||
+ CORE_ADDR relocated_dyn_addr, entry_addr;
|
|
||||||
+ int ret;
|
|
||||||
|
|
||||||
if (abfd == NULL)
|
|
||||||
return 0;
|
|
||||||
@@ -363,11 +365,20 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
|
||||||
if (arch_size == -1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
+ /* Find the address of the entry point of the program from the
|
|
||||||
+ auxv vector. */
|
|
||||||
+ ret = target_auxv_search (¤t_target, AT_ENTRY, &entry_addr);
|
|
||||||
+ if (ret <= 0)
|
|
||||||
+ /* No auxv info, maybe an older kernel. Fake our way through. */
|
|
||||||
+ entry_addr = bfd_get_start_address (exec_bfd);
|
|
||||||
+
|
|
||||||
/* Find the start address of the .dynamic section. */
|
|
||||||
sect = bfd_get_section_by_name (abfd, ".dynamic");
|
|
||||||
if (sect == NULL)
|
|
||||||
return 0;
|
|
||||||
dyn_addr = bfd_section_vma (abfd, sect);
|
|
||||||
+ relocated_dyn_addr
|
|
||||||
+ = dyn_addr + entry_addr - bfd_get_start_address (exec_bfd);
|
|
||||||
|
|
||||||
/* Read in .dynamic from the BFD. We will get the actual value
|
|
||||||
from memory later. */
|
|
||||||
@@ -407,7 +418,7 @@ scan_dyntag (int dyntag, bfd *abfd, CORE
|
|
||||||
gdb_byte ptr_buf[8];
|
|
||||||
CORE_ADDR ptr_addr;
|
|
||||||
|
|
||||||
- ptr_addr = dyn_addr + (buf - bufstart) + arch_size / 8;
|
|
||||||
+ ptr_addr = relocated_dyn_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,
|
|
||||||
builtin_type_void_data_ptr);
|
|
||||||
@@ -743,9 +754,55 @@ svr4_current_sos (void)
|
|
||||||
does have a name, so we can no longer use a missing name to
|
|
||||||
decide when to ignore it. */
|
|
||||||
if (IGNORE_FIRST_LINK_MAP_ENTRY (new) && ldsomap == 0)
|
|
||||||
- free_so (new);
|
|
||||||
+ {
|
|
||||||
+ /* It is the first link map entry, i.e. it is the main
|
|
||||||
+ executable. */
|
|
||||||
+ if (bfd_get_start_address (exec_bfd) == entry_point_address ())
|
|
||||||
+ {
|
|
||||||
+ /* Non-pie case, main executable has not been relocated. */
|
|
||||||
+ free_so (new);
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ /* Pie case, main executable has been relocated. */
|
|
||||||
+ struct so_list *gdb_solib;
|
|
||||||
+
|
|
||||||
+ strncpy (new->so_name, exec_bfd->filename,
|
|
||||||
+ SO_NAME_MAX_PATH_SIZE - 1);
|
|
||||||
+ new->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0';
|
|
||||||
+ strcpy (new->so_original_name, new->so_name);
|
|
||||||
+ new->main_relocated = 0;
|
|
||||||
+
|
|
||||||
+ for (gdb_solib = master_so_list ();
|
|
||||||
+ gdb_solib != NULL;
|
|
||||||
+ gdb_solib = gdb_solib->next)
|
|
||||||
+ if (strcmp (gdb_solib->so_name, new->so_name) == 0
|
|
||||||
+ && gdb_solib->main_relocated)
|
|
||||||
+ break;
|
|
||||||
+
|
|
||||||
+ if (gdb_solib == NULL)
|
|
||||||
+ {
|
|
||||||
+ add_to_target_sections (0 /*from_tty*/, ¤t_target, new);
|
|
||||||
+ new->main_p = 1;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ /* We need this in the list of shared libs we return because
|
|
||||||
+ solib_add_stub will loop through it and add the symbol
|
|
||||||
+ file. */
|
|
||||||
+ new->next = 0;
|
|
||||||
+ *link_ptr = new;
|
|
||||||
+ link_ptr = &new->next;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
else
|
|
||||||
{
|
|
||||||
+ /* This is not the first link map entry, i.e. is not the main
|
|
||||||
+ executable. Note however that it could be the DSO supplied on
|
|
||||||
+ certain systems (i.e. Linux 2.6) containing information about
|
|
||||||
+ the vsyscall page. We must ignore such entry. This entry is
|
|
||||||
+ nameless (just like the one for the main executable,
|
|
||||||
+ sigh). */
|
|
||||||
+
|
|
||||||
int errcode;
|
|
||||||
char *buffer;
|
|
||||||
|
|
||||||
@@ -763,10 +820,8 @@ svr4_current_sos (void)
|
|
||||||
}
|
|
||||||
xfree (buffer);
|
|
||||||
|
|
||||||
- /* If this entry has no name, or its name matches the name
|
|
||||||
- for the main executable, don't include it in the list. */
|
|
||||||
- if (! new->so_name[0]
|
|
||||||
- || match_main (new->so_name))
|
|
||||||
+ /* If this entry has no name, don't include it in the list. */
|
|
||||||
+ if (! new->so_name[0])
|
|
||||||
free_so (new);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
@@ -865,24 +920,6 @@ svr4_fetch_objfile_link_map (struct objf
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/* On some systems, the only way to recognize the link map entry for
|
|
||||||
- the main executable file is by looking at its name. Return
|
|
||||||
- non-zero iff SONAME matches one of the known main executable names. */
|
|
||||||
-
|
|
||||||
-static int
|
|
||||||
-match_main (char *soname)
|
|
||||||
-{
|
|
||||||
- char **mainp;
|
|
||||||
-
|
|
||||||
- for (mainp = main_name_list; *mainp != NULL; mainp++)
|
|
||||||
- {
|
|
||||||
- if (strcmp (soname, *mainp) == 0)
|
|
||||||
- return (1);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
- return (0);
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
/* Return 1 if PC lies in the dynamic symbol resolution code of the
|
|
||||||
SVR4 run time loader. */
|
|
||||||
static CORE_ADDR interp_text_sect_low;
|
|
||||||
@@ -1363,6 +1400,8 @@ svr4_solib_create_inferior_hook (void)
|
|
||||||
while (stop_signal != TARGET_SIGNAL_TRAP);
|
|
||||||
stop_soon = NO_STOP_QUIETLY;
|
|
||||||
#endif /* defined(_SCO_DS) */
|
|
||||||
+
|
|
||||||
+ disable_breakpoints_at_startup (1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
--- gdb/solib.c
|
|
||||||
+++ gdb/solib.c
|
|
||||||
@@ -414,15 +414,37 @@ symbol_add_stub (void *arg)
|
|
||||||
/* Have we already loaded this shared object? */
|
|
||||||
ALL_OBJFILES (so->objfile)
|
|
||||||
{
|
|
||||||
- if (strcmp (so->objfile->name, so->so_name) == 0)
|
|
||||||
+ /* Found an already loaded shared library. */
|
|
||||||
+ if (strcmp (so->objfile->name, so->so_name) == 0
|
|
||||||
+ && !so->main_p)
|
|
||||||
return 1;
|
|
||||||
+ /* Found an already loaded main executable. This could happen in
|
|
||||||
+ two circumstances.
|
|
||||||
+ First case: the main file has already been read in as the first
|
|
||||||
+ thing that gdb does at startup, and the file hasn't been
|
|
||||||
+ relocated properly yet. Therefore we need to read it in with the
|
|
||||||
+ proper section info.
|
|
||||||
+ Second case: it has been read in with the correct relocation, and
|
|
||||||
+ therefore we need to skip it. */
|
|
||||||
+ if (strcmp (so->objfile->name, so->so_name) == 0
|
|
||||||
+ && so->main_p
|
|
||||||
+ && so->main_relocated)
|
|
||||||
+ return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sap = build_section_addr_info_from_section_table (so->sections,
|
|
||||||
so->sections_end);
|
|
||||||
|
|
||||||
- so->objfile = symbol_file_add (so->so_name, so->from_tty,
|
|
||||||
- sap, 0, OBJF_SHARED);
|
|
||||||
+ if (so->main_p)
|
|
||||||
+ {
|
|
||||||
+ so->objfile = symbol_file_add (so->so_name, /*so->from_tty*/ 0,
|
|
||||||
+ sap, 1, 0);
|
|
||||||
+ so->main_relocated = 1;
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ so->objfile = symbol_file_add (so->so_name, so->from_tty,
|
|
||||||
+ sap, 0, OBJF_SHARED);
|
|
||||||
+
|
|
||||||
free_section_addr_info (sap);
|
|
||||||
|
|
||||||
return (1);
|
|
||||||
@@ -603,28 +625,7 @@ update_solib_list (int from_tty, struct
|
|
||||||
/* Fill in the rest of each of the `struct so_list' nodes. */
|
|
||||||
for (i = inferior; i; i = i->next)
|
|
||||||
{
|
|
||||||
- i->from_tty = from_tty;
|
|
||||||
-
|
|
||||||
- /* Fill in the rest of the `struct so_list' node. */
|
|
||||||
- catch_errors (solib_map_sections, i,
|
|
||||||
- "Error while mapping shared library sections:\n",
|
|
||||||
- RETURN_MASK_ALL);
|
|
||||||
-
|
|
||||||
- /* If requested, add the shared object's sections to the TARGET's
|
|
||||||
- section table. Do this immediately after mapping the object so
|
|
||||||
- that later nodes in the list can query this object, as is needed
|
|
||||||
- in solib-osf.c. */
|
|
||||||
- if (target)
|
|
||||||
- {
|
|
||||||
- int count = (i->sections_end - i->sections);
|
|
||||||
- if (count > 0)
|
|
||||||
- {
|
|
||||||
- int space = target_resize_to_sections (target, count);
|
|
||||||
- memcpy (target->to_sections + space,
|
|
||||||
- i->sections,
|
|
||||||
- count * sizeof (i->sections[0]));
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ add_to_target_sections (from_tty, target, i);
|
|
||||||
|
|
||||||
/* Notify any observer that the shared object has been
|
|
||||||
loaded now that we've added it to GDB's tables. */
|
|
||||||
@@ -720,6 +721,39 @@ solib_add (char *pattern, int from_tty,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+void
|
|
||||||
+add_to_target_sections (int from_tty, struct target_ops *target,
|
|
||||||
+ struct so_list *solib)
|
|
||||||
+{
|
|
||||||
+ /* If this is set, then the sections have been already added to the
|
|
||||||
+ target list. */
|
|
||||||
+ if (solib->main_p)
|
|
||||||
+ return;
|
|
||||||
+
|
|
||||||
+ solib->from_tty = from_tty;
|
|
||||||
+
|
|
||||||
+ /* Fill in the rest of the `struct so_list' node. */
|
|
||||||
+ catch_errors (solib_map_sections, solib,
|
|
||||||
+ "Error while mapping shared library sections:\n",
|
|
||||||
+ RETURN_MASK_ALL);
|
|
||||||
+
|
|
||||||
+ /* If requested, add the shared object's sections to the TARGET's
|
|
||||||
+ section table. Do this immediately after mapping the object so
|
|
||||||
+ that later nodes in the list can query this object, as is needed
|
|
||||||
+ in solib-osf.c. */
|
|
||||||
+ if (target)
|
|
||||||
+ {
|
|
||||||
+ int count = solib->sections_end - solib->sections;
|
|
||||||
+ if (count > 0)
|
|
||||||
+ {
|
|
||||||
+ int space = target_resize_to_sections (target, count);
|
|
||||||
+ memcpy (target->to_sections + space,
|
|
||||||
+ solib->sections,
|
|
||||||
+ count * sizeof (solib->sections[0]));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
|
|
||||||
/*
|
|
||||||
|
|
||||||
--- gdb/solist.h
|
|
||||||
+++ gdb/solist.h
|
|
||||||
@@ -61,6 +61,8 @@ struct so_list
|
|
||||||
bfd *abfd;
|
|
||||||
char symbols_loaded; /* flag: symbols read in yet? */
|
|
||||||
char from_tty; /* flag: print msgs? */
|
|
||||||
+ char main_p; /* flag: is this the main executable? */
|
|
||||||
+ char main_relocated; /* flag: has it been relocated yet? */
|
|
||||||
struct objfile *objfile; /* objfile for loaded lib */
|
|
||||||
struct section_table *sections;
|
|
||||||
struct section_table *sections_end;
|
|
||||||
@@ -126,6 +128,10 @@ struct so_list *master_so_list (void);
|
|
||||||
/* Find solib binary file and open it. */
|
|
||||||
extern int solib_open (char *in_pathname, char **found_pathname);
|
|
||||||
|
|
||||||
+/* Add the list of sections in so_list to the target to_sections. */
|
|
||||||
+extern void add_to_target_sections (int, struct target_ops *,
|
|
||||||
+ struct so_list *);
|
|
||||||
+
|
|
||||||
/* FIXME: gdbarch needs to control this variable */
|
|
||||||
extern struct target_so_ops *current_target_so_ops;
|
|
||||||
|
|
||||||
--- gdb/symfile-mem.c
|
|
||||||
+++ gdb/symfile-mem.c
|
|
||||||
@@ -108,7 +108,7 @@ symbol_file_add_from_memory (struct bfd
|
|
||||||
}
|
|
||||||
|
|
||||||
objf = symbol_file_add_from_bfd (nbfd, from_tty,
|
|
||||||
- sai, 0, OBJF_SHARED);
|
|
||||||
+ sai, 2, OBJF_SHARED);
|
|
||||||
|
|
||||||
/* This might change our ideas about frames already looked at. */
|
|
||||||
reinit_frame_cache ();
|
|
||||||
--- gdb/symfile.c
|
|
||||||
+++ gdb/symfile.c
|
|
||||||
@@ -780,7 +780,7 @@ syms_from_objfile (struct objfile *objfi
|
|
||||||
|
|
||||||
/* Now either addrs or offsets is non-zero. */
|
|
||||||
|
|
||||||
- if (mainline)
|
|
||||||
+ if (mainline == 1)
|
|
||||||
{
|
|
||||||
/* We will modify the main symbol table, make sure that all its users
|
|
||||||
will be cleaned up if an error occurs during symbol reading. */
|
|
||||||
@@ -808,7 +808,7 @@ syms_from_objfile (struct objfile *objfi
|
|
||||||
|
|
||||||
We no longer warn if the lowest section is not a text segment (as
|
|
||||||
happens for the PA64 port. */
|
|
||||||
- if (!mainline && addrs && addrs->other[0].name)
|
|
||||||
+ if (addrs && addrs->other[0].name)
|
|
||||||
{
|
|
||||||
asection *lower_sect;
|
|
||||||
asection *sect;
|
|
||||||
@@ -977,14 +977,14 @@ new_symfile_objfile (struct objfile *obj
|
|
||||||
/* If this is the main symbol file we have to clean up all users of the
|
|
||||||
old main symbol file. Otherwise it is sufficient to fixup all the
|
|
||||||
breakpoints that may have been redefined by this symbol file. */
|
|
||||||
- if (mainline)
|
|
||||||
+ if (mainline == 1)
|
|
||||||
{
|
|
||||||
/* OK, make it the "real" symbol file. */
|
|
||||||
symfile_objfile = objfile;
|
|
||||||
|
|
||||||
clear_symtab_users ();
|
|
||||||
}
|
|
||||||
- else
|
|
||||||
+ else if (mainline == 0)
|
|
||||||
{
|
|
||||||
breakpoint_re_set ();
|
|
||||||
}
|
|
||||||
@@ -1030,7 +1030,7 @@ symbol_file_add_with_addrs_or_offsets (b
|
|
||||||
interactively wiping out any existing symbols. */
|
|
||||||
|
|
||||||
if ((have_full_symbols () || have_partial_symbols ())
|
|
||||||
- && mainline
|
|
||||||
+ && mainline == 1
|
|
||||||
&& from_tty
|
|
||||||
&& !query ("Load new symbol table from \"%s\"? ", name))
|
|
||||||
error (_("Not confirmed."));
|
|
||||||
@@ -1214,6 +1214,11 @@ symbol_file_clear (int from_tty)
|
|
||||||
symfile_objfile->name)
|
|
||||||
: !query (_("Discard symbol table? "))))
|
|
||||||
error (_("Not confirmed."));
|
|
||||||
+
|
|
||||||
+#ifdef CLEAR_SOLIB
|
|
||||||
+ CLEAR_SOLIB ();
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
free_all_objfiles ();
|
|
||||||
|
|
||||||
/* solib descriptors may have handles to objfiles. Since their
|
|
||||||
@@ -2471,6 +2476,8 @@ reread_symbols (void)
|
|
||||||
/* Discard cleanups as symbol reading was successful. */
|
|
||||||
discard_cleanups (old_cleanups);
|
|
||||||
|
|
||||||
+ init_entry_point_info (objfile);
|
|
||||||
+
|
|
||||||
/* If the mtime has changed between the time we set new_modtime
|
|
||||||
and now, we *want* this to be out of date, so don't call stat
|
|
||||||
again now. */
|
|
@@ -1,18 +0,0 @@
|
|||||||
--- gdb/ppc-linux-tdep.c
|
|
||||||
+++ gdb/ppc-linux-tdep.c
|
|
||||||
@@ -1065,6 +1065,7 @@
|
|
||||||
{
|
|
||||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
|
||||||
|
|
||||||
+#if 0
|
|
||||||
/* NOTE: jimb/2004-03-26: The System V ABI PowerPC Processor
|
|
||||||
Supplement says that long doubles are sixteen bytes long.
|
|
||||||
However, as one of the known warts of its ABI, PPC GNU/Linux uses
|
|
||||||
@@ -1074,6 +1075,7 @@
|
|
||||||
double' on PPC GNU/Linux are non-conformant. */
|
|
||||||
/* NOTE: cagney/2005-01-25: True for both 32- and 64-bit. */
|
|
||||||
set_gdbarch_long_double_bit (gdbarch, 8 * TARGET_CHAR_BIT);
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
if (tdep->wordsize == 4)
|
|
||||||
{
|
|
Reference in New Issue
Block a user