--- Begin Message ---
Package: gdb
Version: 5.0.cvs20011007-3
Severity: wishlist
Tags: patch
This patch by Paul Flinders <[email protected]>.
diff -u -r gdb-5.0.92/gdb/breakpoint.c gdb-5.0.92-xfree/gdb/breakpoint.c
--- gdb-5.0.92/gdb/breakpoint.c Thu Aug 2 13:05:56 2001
+++ gdb-5.0.92-xfree/gdb/breakpoint.c Thu Nov 8 22:12:08 2001
@@ -2940,6 +2940,7 @@
bs_class = bp_nostop;
break;
case bp_shlib_event:
+ case bp_xfreemod_event:
bs_class = shlib_event;
break;
case bp_thread_event:
@@ -3125,7 +3126,8 @@
{bp_catch_vfork, "catch vfork"},
{bp_catch_exec, "catch exec"},
{bp_catch_catch, "catch catch"},
- {bp_catch_throw, "catch throw"}
+ {bp_catch_throw, "catch throw"},
+ {bp_xfreemod_event, "XFree86 module events"}
};
static char *bpdisps[] =
@@ -3331,6 +3333,7 @@
case bp_call_dummy:
case bp_shlib_event:
case bp_thread_event:
+ case bp_xfreemod_event:
#ifdef UI_OUT
if (addressprint)
{
@@ -4053,6 +4056,32 @@
delete_breakpoint (b);
}
+#ifdef XFREE_MODULE_SUPPORT
+void remove_xfreemod_event_breakpoints (void)
+{
+ register struct breakpoint *b, *temp;
+
+ ALL_BREAKPOINTS_SAFE (b, temp)
+ if (b->type == bp_xfreemod_event)
+ delete_breakpoint (b);
+}
+
+void create_xfreemod_event_breakpoint (CORE_ADDR address)
+{
+ struct breakpoint *b;
+ struct symtab_and_line sal;
+
+ INIT_SAL (&sal); /* initialize to zeroes */
+ sal.pc = address;
+ sal.section = find_pc_overlay (sal.pc);
+ b = set_raw_breakpoint (sal, bp_xfreemod_event);
+ b->number = internal_breakpoint_number--;
+ b->disposition = disp_donttouch;
+ b->type = bp_xfreemod_event;
+
+}
+#endif
+
#ifdef SOLIB_ADD
void
remove_solib_event_breakpoints (void)
@@ -4565,6 +4594,7 @@
case bp_watchpoint_scope:
case bp_shlib_event:
case bp_thread_event:
+ case bp_xfreemod_event:
break;
}
if (say_where)
@@ -7140,6 +7170,7 @@
/* This breakpoint is special, it's set up when the inferior
starts and we really don't want to touch it. */
case bp_shlib_event:
+ case bp_xfreemod_event:
/* Like bp_shlib_event, this breakpoint type is special.
Once it is set up, we do not want to touch it. */
diff -u -r gdb-5.0.92/gdb/breakpoint.h gdb-5.0.92-xfree/gdb/breakpoint.h
--- gdb-5.0.92/gdb/breakpoint.h Thu Aug 2 13:05:57 2001
+++ gdb-5.0.92-xfree/gdb/breakpoint.h Thu Nov 8 22:12:08 2001
@@ -126,7 +126,12 @@
/* These are catchpoints to implement "catch catch" and "catch throw"
commands for C++ exception handling. */
bp_catch_catch,
- bp_catch_throw
+ bp_catch_throw,
+
+ /* As for bp_shlib_event but when the xfree module loader informs
+ us that a module has been loaded */
+ bp_xfreemod_event
+
};
@@ -658,9 +663,13 @@
extern struct breakpoint *create_thread_event_breakpoint (CORE_ADDR);
+extern void create_xfreemod_event_breakpoint (CORE_ADDR);
+
extern void remove_solib_event_breakpoints (void);
extern void remove_thread_event_breakpoints (void);
+
+extern void remove_xfreemod_event_breakpoints (void);
extern void disable_breakpoints_in_shlibs (int silent);
diff -u -r gdb-5.0.92/gdb/config/i386/linux.mh
gdb-5.0.92-xfree/gdb/config/i386/linux.mh
--- gdb-5.0.92/gdb/config/i386/linux.mh Wed Mar 21 21:22:49 2001
+++ gdb-5.0.92-xfree/gdb/config/i386/linux.mh Thu Nov 8 22:12:08 2001
@@ -4,7 +4,7 @@
XDEPFILES=
NAT_FILE= nm-linux.h
-NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o \
+NATDEPFILES= infptrace.o xfreemod.o inftarg.o fork-child.o corelow.o \
core-aout.o i386-nat.o i386-linux-nat.o i387-nat.o \
proc-service.o thread-db.o lin-lwp.o
diff -u -r gdb-5.0.92/gdb/config/i386/nm-linux.h
gdb-5.0.92-xfree/gdb/config/i386/nm-linux.h
--- gdb-5.0.92/gdb/config/i386/nm-linux.h Sat Jul 14 12:55:29 2001
+++ gdb-5.0.92-xfree/gdb/config/i386/nm-linux.h Thu Nov 8 22:12:08 2001
@@ -70,6 +70,7 @@
#ifdef HAVE_LINK_H
#define SVR4_SHARED_LIBS
#include "solib.h" /* Support for shared libraries. */
+#include "xfreemod.h" /* Support for XFree86 modules. */
#endif
/* Override copies of {fetch,store}_inferior_registers in `infptrace.c'. */
diff -u -r gdb-5.0.92/gdb/dbxread.c gdb-5.0.92-xfree/gdb/dbxread.c
--- gdb-5.0.92/gdb/dbxread.c Mon Oct 15 21:38:13 2001
+++ gdb-5.0.92-xfree/gdb/dbxread.c Thu Nov 8 22:12:08 2001
@@ -2265,7 +2265,7 @@
case 'F':
function_stab_type = type;
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
+#if defined(SOFUN_ADDRESS_MAYBE_MISSING) || defined(XFREE_MODULE_SUPPORT)
/* Deal with the SunPRO 3.0 compiler which omits the address
from N_FUN symbols. */
if (type == N_FUN
diff -u -r gdb-5.0.92/gdb/elfread.c gdb-5.0.92-xfree/gdb/elfread.c
--- gdb-5.0.92/gdb/elfread.c Tue May 29 11:45:10 2001
+++ gdb-5.0.92-xfree/gdb/elfread.c Thu Nov 8 22:12:08 2001
@@ -289,7 +289,7 @@
symaddr = sym->value;
if (symaddr == 0)
continue;
- symaddr += offset;
+ symaddr += ANOFFSET (objfile->section_offsets, 0);
msym = record_minimal_symbol_and_info
((char *) sym->name, symaddr,
mst_solib_trampoline, NULL, sym->section, objfile);
@@ -331,10 +331,26 @@
interested in will have a section. */
/* Bfd symbols are section relative. */
symaddr = sym->value + sym->section->vma;
- /* Relocate all non-absolute symbols by the section offset. */
- if (sym->section != &bfd_abs_section)
+ /* Relocate all non-absolute symbols. */
+ if (STREQ (sym->section->name, ".text"))
{
- symaddr += offset;
+ symaddr += ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT(objfile));
+ }
+ else if (STREQ (sym->section->name, ".data"))
+ {
+ symaddr += ANOFFSET (objfile->section_offsets,
SECT_OFF_DATA(objfile));
+ }
+ else if (STREQ (sym->section->name, ".bss"))
+ {
+ symaddr += ANOFFSET (objfile->section_offsets,
SECT_OFF_BSS(objfile));
+ }
+ else if (STREQ (sym->section->name, ".rodata"))
+ {
+ symaddr += ANOFFSET (objfile->section_offsets,
SECT_OFF_RODATA(objfile));
+ }
+ else if (sym->section != &bfd_abs_section)
+ {
+ symaddr += ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT(objfile));
}
/* For non-absolute symbols, use the type of the section
they are relative to, to intuit text/data. Bfd provides
@@ -368,7 +384,7 @@
{
if (sym->name[0] == '.')
continue;
- symaddr += offset;
+ symaddr += ANOFFSET (objfile->section_offsets, 0);
}
}
else if (sym->section->flags & SEC_CODE)
@@ -473,7 +489,7 @@
/* Relocate non-absolute symbols by the section
offset. */
if (sym->section != &bfd_abs_section)
{
- symaddr += offset;
+ symaddr += ANOFFSET (objfile->section_offsets, 0);
}
if (index != -1)
sectinfo->sections[index] = symaddr;
diff -u -r gdb-5.0.92/gdb/fork-child.c gdb-5.0.92-xfree/gdb/fork-child.c
--- gdb-5.0.92/gdb/fork-child.c Fri May 4 05:15:24 2001
+++ gdb-5.0.92-xfree/gdb/fork-child.c Thu Nov 8 22:12:08 2001
@@ -374,6 +374,9 @@
#ifdef SOLIB_CREATE_INFERIOR_HOOK
SOLIB_CREATE_INFERIOR_HOOK (pid);
#endif
+#ifdef XFREE_MODULE_SUPPORT
+ xfreemod_create_inferior_hook(pid);
+#endif
}
/* An inferior Unix process CHILD_PID has been created by a call to
diff -u -r gdb-5.0.92/gdb/infrun.c gdb-5.0.92-xfree/gdb/infrun.c
--- gdb-5.0.92/gdb/infrun.c Mon Jul 16 15:46:34 2001
+++ gdb-5.0.92-xfree/gdb/infrun.c Thu Nov 8 22:12:08 2001
@@ -1532,14 +1532,18 @@
if (breakpoints_inserted)
remove_breakpoints ();
- /* Check for any newly added shared libraries if we're
- supposed to be adding them automatically. */
+ /* Check for any newly added shared libraries or xfree
+ modules if we're supposed to be adding them
+ automatically. */
if (auto_solib_add)
{
/* Switch terminal for any messages produced by
breakpoint_re_set. */
target_terminal_ours_for_output ();
SOLIB_ADD (NULL, 0, NULL);
+#ifdef XFREE_MODULE_SUPPORT
+ xfreemod_add (NULL, 0, NULL);
+#endif
target_terminal_inferior ();
}
@@ -2468,6 +2472,10 @@
breakpoint_re_set. */
target_terminal_ours_for_output ();
SOLIB_ADD (NULL, 0, NULL);
+#ifdef XFREE_MODULE_SUPPORT
+ xfreemod_add (NULL, 0, NULL);
+#endif
+
target_terminal_inferior ();
}
diff -u -r gdb-5.0.92/gdb/symfile.c gdb-5.0.92-xfree/gdb/symfile.c
--- gdb-5.0.92/gdb/symfile.c Sun Jul 15 19:57:06 2001
+++ gdb-5.0.92-xfree/gdb/symfile.c Thu Nov 8 22:12:08 2001
@@ -118,7 +118,7 @@
static void cashier_psymtab (struct partial_symtab *);
-bfd *symfile_bfd_open (char *);
+/*bfd *symfile_bfd_open (char *);*/
static void find_sym_fns (struct objfile *);
@@ -804,10 +804,70 @@
struct partial_symtab *psymtab;
bfd *abfd;
- /* Open a bfd for the file, and give user a chance to burp if we'd be
- interactively wiping out any existing symbols. */
+#ifdef XFREE_MODULE_SUPPORT
+ struct cleanup *old_chain;
+ char *p;
+ /* Make a copy of the string that we can safely write into. */
+
+ name = strdup (name);
+ old_chain = make_cleanup(free, name);
+
+ p = strstr(name, ".a:");
+ if (p)
+ {
+ bfd *archive_bfd;
+ char *component_name = p + 3;
+ *(p+2) = 0;
+ archive_bfd = symfile_bfd_open (name, bfd_archive);
+
+ /* Look for the archive member that we want
+ *
+ * FIXME - we will be invoked several times for the same archive
+ * all this opening, closing and scanning is going to be dreadfully
+ * slow.
+ */
+ for (abfd = bfd_openr_next_archived_file (archive_bfd, NULL);
+ abfd;
+ abfd = bfd_openr_next_archived_file (archive_bfd, abfd))
+ {
+ if (abfd->filename == NULL)
+ {
+ /* Some archive formats don't get the filenames filled in
+ until the elements are opened. */
+ struct stat buf;
+ bfd_stat_arch_elt (abfd, &buf);
+ }
+ /* printf_unfiltered("%s %s\n", abfd->filename, component_name); */
+ if ((abfd->filename != NULL) &&
+ (!strcmp (component_name, abfd->filename)))
+ {
+ break;
+ }
+ make_cleanup(bfd_close, abfd);
+ }
+ if (!bfd_check_format (abfd, bfd_object))
+ {
+ /* FIXME: should be checking for errors from bfd_close (for one thing,
+ on error it does not free all the storage associated with the
+ bfd). */
+ bfd_close (archive_bfd);
+ error ("\"%s\": can't read symbols: %s:%s.", name, component_name,
+ bfd_errmsg (bfd_get_error ()));
+ }
+ /* The bfd filename points into the bfd's internal storage,
+ not to a block obtained directly from malloc.
+ Replace it with a copy so that free_objfile does not
+ pass a bogus pointer to free */
+ bfd_get_filename (abfd) = strdup(bfd_get_filename (abfd));
+ }
+ else
+#endif
+ {
+ /* Open a bfd for the file, and give user a chance to burp if we'd be
+ interactively wiping out any existing symbols. */
- abfd = symfile_bfd_open (name);
+ abfd = symfile_bfd_open (name, bfd_object);
+ }
if ((have_full_symbols () || have_partial_symbols ())
&& mainline
@@ -892,6 +952,9 @@
if (target_new_objfile_hook)
target_new_objfile_hook (objfile);
+#ifdef XFREE_MODULE_SUPPORT
+ do_cleanups(old_chain);
+#endif
return (objfile);
}
@@ -1052,7 +1115,7 @@
In case of trouble, error() is called. */
bfd *
-symfile_bfd_open (char *name)
+symfile_bfd_open (char *name, bfd_format format)
{
bfd *sym_bfd;
int desc;
@@ -1092,7 +1155,7 @@
}
sym_bfd->cacheable = true;
- if (!bfd_check_format (sym_bfd, bfd_object))
+ if (!bfd_check_format (sym_bfd, format))
{
/* FIXME: should be checking for errors from bfd_close (for one thing,
on error it does not free all the storage associated with the
diff -u -r gdb-5.0.92/gdb/symfile.h gdb-5.0.92-xfree/gdb/symfile.h
--- gdb-5.0.92/gdb/symfile.h Tue Mar 6 08:21:17 2001
+++ gdb-5.0.92-xfree/gdb/symfile.h Thu Nov 8 22:12:08 2001
@@ -241,7 +241,7 @@
extern void find_lowest_section (bfd *, asection *, PTR);
-extern bfd *symfile_bfd_open (char *);
+extern bfd *symfile_bfd_open (char *, bfd_format);
/* Utility functions for overlay sections: */
extern int overlay_debugging;
diff -N -u -r gdb-5.0.92/gdb/xfreemod.c gdb-5.0.92-xfree/gdb/xfreemod.c
--- gdb-5.0.92/gdb/xfreemod.c Thu Jan 1 01:00:00 1970
+++ gdb-5.0.92-xfree/gdb/xfreemod.c Fri Nov 9 20:32:38 2001
@@ -0,0 +1,308 @@
+/* Handle XFree dynamically loaded modules
+
+This file is not an official part of GDB.
+
+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. */
+
+#include "defs.h"
+
+#include "symtab.h"
+#include "bfd.h"
+#include "symfile.h"
+#include "objfiles.h"
+#include "gdbcore.h"
+#include "gdb-stabs.h"
+#include "target.h"
+#include "breakpoint.h"
+#include "language.h"
+#include "command.h"
+#include "gnu-regex.h"
+
+/* The XFree server has its own dynamic load mechanism. Unlike shared
+ * libraries it loads regular .o (or even .a) files. GDB support for
+ * tracking loaded modules is very similar to shared libraries however
+ * (in fact much of this code originated in solib.c).
+ *
+ * There are a few differences. We don't need to do very much in the
+ * create_inferior hook as no modules are loaded at that point so we
+ * just tidy up after the last run, tell the inferior that we're
+ * around and insert a breakpoint so we get chance to do something
+ * when a module is loaded.
+ *
+ */
+
+static char *xfreemod_break_names[] = {
+ "_loader_debug_state",
+ NULL
+};
+
+#define MOD_LIST "ModList"
+
+static struct mod_list *mod_list_head; /* List of known modules */
+
+/* Called when the inferior starts, just after the shared library hook */
+void xfreemod_create_inferior_hook(void)
+{
+ struct mod_list *mod;
+ struct mod_list *next_mod;
+ struct minimal_symbol *msymbol;
+ char **bkpt_namep;
+
+ /* First, remove any existing breakpoints. Their addresses
+ may have changed since the last time we ran the program. */
+ remove_xfreemod_event_breakpoints ();
+
+ /* And our copy of the inferior's modules */
+ for (mod = mod_list_head; mod; mod = next_mod)
+ {
+ next_mod = mod->next;
+ free(mod);
+ }
+ mod_list_head = 0;
+
+ msymbol = lookup_minimal_symbol ("DebuggerPresent", NULL, symfile_objfile);
+ if (msymbol)
+ {
+ char flag = 1;
+
+ int status = target_write_memory (SYMBOL_VALUE_ADDRESS (msymbol),
+ &flag,
+ sizeof(flag));
+ }
+
+ /* Scan through the list of symbols, trying to look up the symbol and
+ set a breakpoint there. */
+ for (bkpt_namep = xfreemod_break_names; *bkpt_namep != NULL; bkpt_namep++)
+ {
+ msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile);
+ if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0))
+ {
+ create_xfreemod_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol));
+ }
+ }
+}
+
+/* Common symbols are not given addresses until the final link - which
+ * in this case is when the module is loaded so we need to read the
+ * addresses for these symbols from the inferior.
+ */
+void add_common_symbols (struct mod_list *mod)
+{
+ LDRCommonPtr commons;
+ int i;
+ int status;
+
+ if (mod->commonslen)
+ {
+ init_minimal_symbol_collection ();
+ make_cleanup_discard_minimal_symbols ();
+
+ commons = xmalloc (mod->commonslen * sizeof(LDRCommon));
+
+ status = target_read_memory (mod->commons,
+ (char *)commons,
+ mod->commonslen * sizeof(LDRCommon));
+ for (i = 0; i <mod->commonslen; i++)
+ {
+ char *name = xmalloc(commons[i].namelen + 1);
+ status = target_read_memory ((CORE_ADDR)commons[i].name,
+ name,
+ commons[i].namelen + 1);
+ prim_record_minimal_symbol (name, (CORE_ADDR)commons[i].addr,
+ mst_bss, mod->objfile);
+ free(name);
+ }
+ install_minimal_symbols (mod->objfile);
+ free(commons);
+ }
+}
+
+
+/* Read the list of loaded modules from the inferior and add any new
+ * ones to our local copy
+ */
+void add_modules(int from_tty)
+{
+ struct minimal_symbol *msymbol;
+ CORE_ADDR modrec_addr = 0;
+ LDRModuleRec ldr_rec;
+ char *mod_name;
+ struct mod_list *mod;
+
+ msymbol = lookup_minimal_symbol (MOD_LIST, NULL, symfile_objfile);
+ if (msymbol)
+ {
+ int status = target_read_memory (SYMBOL_VALUE_ADDRESS (msymbol),
+ (char *)&modrec_addr,
+ sizeof (CORE_ADDR));
+ while(modrec_addr != 0)
+ {
+ status = target_read_memory (modrec_addr,
+ (char *)&ldr_rec,
+ sizeof (LDRModuleRec));
+ mod_name = xmalloc (ldr_rec.namelen + 1);
+ status = target_read_memory ((CORE_ADDR)ldr_rec.name,
+ mod_name,
+ ldr_rec.namelen + 1);
+
+ for (mod = mod_list_head; mod; mod = mod->next)
+ {
+ if (strcmp(mod_name, mod->mod_name) == 0)
+ break;
+ }
+ if (!mod)
+ {
+ mod = xmalloc(sizeof(struct mod_list));
+ mod->mod_name = mod_name;
+ mod->symbols_loaded = 0;
+ mod->objfile = 0;
+ mod->from_tty = from_tty;
+ mod->text_addr = (CORE_ADDR)ldr_rec.text;
+ mod->data_addr = (CORE_ADDR)ldr_rec.data;
+ mod->rodata_addr = (CORE_ADDR)ldr_rec.rodata;
+ mod->bss_addr = (CORE_ADDR)ldr_rec.bss;
+ mod->commons = (CORE_ADDR)ldr_rec.commons;
+ mod->commonslen = ldr_rec.commonslen;
+ mod->next = mod_list_head;
+ mod_list_head = mod;
+
+ } else
+ {
+ free(mod_name);
+ }
+ modrec_addr = (CORE_ADDR)ldr_rec.next;
+ }
+ }
+}
+
+/* A small stub to get us past the arg-passing pinhole of catch_errors. */
+static int module_add_stub (char *arg)
+{
+ struct mod_list *mod = (struct mod_list *) arg;
+ struct section_addr_info text_addr;
+
+ memset(&text_addr, '\0', sizeof(text_addr));
+ text_addr.other[0].name = ".text";
+ text_addr.other[0].addr = mod->text_addr;
+ text_addr.other[1].name = ".data";
+ text_addr.other[1].addr = mod->data_addr;
+ text_addr.other[2].name = ".rodata";
+ text_addr.other[2].addr = mod->rodata_addr;
+ text_addr.other[3].name = ".bss";
+ text_addr.other[3].addr = mod->bss_addr;
+
+ mod->objfile = symbol_file_add (mod->mod_name, mod->from_tty,
+ &text_addr, 0, OBJF_SHARED);
+ return (1);
+}
+
+void
+xfreemod_add (arg_string, from_tty, target)
+char *arg_string;
+int from_tty;
+struct target_ops *target;
+{
+ struct mod_list *mod;
+ char *re_err;
+
+ if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL)
+ {
+ error ("Invalid regexp: %s", re_err);
+ }
+
+ add_modules(from_tty);
+ for (mod = mod_list_head; mod; mod = mod->next)
+ if (mod->mod_name[0] && re_exec (mod->mod_name))
+ {
+ mod->from_tty = from_tty;
+ if (mod->symbols_loaded)
+ {
+ if (from_tty)
+ {
+ printf_unfiltered ("Symbols already loaded for %s\n", mod->mod_name);
+ }
+ }
+ else
+ {
+ mod->being_read = 1;
+ if ((mod->symbols_loaded =
+ catch_errors((catch_errors_ftype *)module_add_stub, (char *) mod,
+ "Error while reading server module symbols:\n",
+ RETURN_MASK_ALL)))
+ add_common_symbols(mod);
+ mod->being_read = 0;
+ }
+ }
+}
+
+/* Request reading of module's symbols */
+static void module_command (char *args, int from_tty)
+{
+ dont_repeat ();
+ xfreemod_add(args, from_tty, (struct target_ops *) 0);
+}
+
+/* List currently known modules and the status of each */
+static void info_modules_command (char *ignore, int from_tty)
+{
+ struct mod_list *mod;
+ int header_done = 0;
+ int addr_width;
+ char *addr_fmt;
+
+ if (exec_bfd == NULL)
+ {
+ printf_unfiltered ("No exec file.\n");
+ return;
+ }
+
+#ifndef TARGET_ELF64
+ addr_width = 8+4;
+ addr_fmt = "08l";
+#else
+ addr_width = 16+4;
+ addr_fmt = "016l";
+#endif
+
+ for (mod = mod_list_head; mod; mod = mod->next)
+ {
+ if (!header_done)
+ {
+ printf_unfiltered("%-*s%-*s%-12s%s\n", addr_width, "Text",
+ addr_width, "Data", "Syms Read",
+ "Module File");
+ header_done++;
+ }
+ printf_unfiltered ("%-*s", addr_width,
+ local_hex_string_custom (mod->text_addr, addr_fmt));
+ printf_unfiltered ("%-*s", addr_width,
+ local_hex_string_custom (mod->data_addr, addr_fmt));
+ printf_unfiltered ("%-12s", mod->symbols_loaded ? "Yes" : "No");
+ printf_unfiltered ("%s\n", mod->mod_name);
+ }
+ if (mod_list_head == NULL)
+ {
+ printf_unfiltered ("No modules loaded at this time.\n");
+ }
+}
+
+void
+_initialize_xfreemod(void)
+{
+ add_com ("module", class_files, module_command,
+ "Load shared object library symbols for files matching REGEXP.");
+ add_info ("modules", info_modules_command,
+ "Status of loaded shared object libraries.");
+}
diff -N -u -r gdb-5.0.92/gdb/xfreemod.h gdb-5.0.92-xfree/gdb/xfreemod.h
--- gdb-5.0.92/gdb/xfreemod.h Thu Jan 1 01:00:00 1970
+++ gdb-5.0.92-xfree/gdb/xfreemod.h Thu Nov 8 22:12:08 2001
@@ -0,0 +1,69 @@
+/* Handle XFree dynamically loaded modules
+
+This file is not an official part of GDB.
+
+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. */
+
+#include <sys/types.h>
+
+#ifndef SOLIB_ADD
+#error XFree module support requires shared library support
+#endif
+
+#define XFREE_MODULE_SUPPORT
+
+#ifdef __STDC__ /* Forward decl's for prototypes */
+struct target_ops;
+#endif
+
+/* XFree loader Interface to GDB */
+typedef struct {
+ unsigned char *name; /* Name of this symbol */
+ unsigned int namelen; /* Name of this module */
+ void *addr; /* Start address of the .text section */
+} LDRCommon, *LDRCommonPtr;
+
+typedef struct {
+ unsigned int version; /* Version of this struct */
+ unsigned char *name; /* Name of this module */
+ unsigned int namelen; /* Length of name */
+ void *text; /* Start address of the .text section */
+ void *data; /* Start address of the .data section */
+ void *rodata; /* Start address of the .rodata section */
+ void *bss; /* Start address of the .bss section */
+ LDRCommonPtr commons; /* List of commmon symbols */
+ int commonslen; /* Number of common symbols */
+ struct LDRModuleRec *next; /* Next module record in chain */
+} LDRModuleRec, *LDRModulePtr;
+
+/* Local copy of above */
+struct mod_list {
+ struct mod_list *next; /* next structure in linked list */
+ char *mod_name; /* module name */
+ char symbols_loaded; /* flag: symbols read in yet? */
+ char from_tty; /* flag: print msgs? */
+ struct objfile *objfile; /* objfile for loaded module */
+ CORE_ADDR text_addr; /* Address at which text was loaded */
+ CORE_ADDR data_addr; /* Address at which data was loaded */
+ CORE_ADDR rodata_addr; /* Address at which read-only data was loaded */
+ CORE_ADDR bss_addr; /* Address at which bss was loaded */
+ CORE_ADDR commons; /* List of commmon symbols */
+ int commonslen; /* Number of common symbols */
+ int being_read; /* Somewhat hacky, used to identify module for
offsets */
+};
+
+extern void xfreemod_create_inferior_hook();
+extern void xfreemod_add PARAMS ((char *, int, struct target_ops *));
+
-- System Information
Debian Release: testing/unstable
Architecture: i386
Kernel: Linux apocalypse 2.4.13 #1 Thu Oct 25 03:13:42 EST 2001 i686
Locale: LANG=C, LC_CTYPE=en_US.iso-8859-1
Versions of packages gdb depends on:
ii libc6 2.2.4-5 GNU C Library: Shared libraries an
ii libncurses5 5.2.20010318-3 Shared libraries for terminal hand
--
G. Branden Robinson |
Debian GNU/Linux | It tastes good.
[email protected] | -- Bill Clinton
http://www.deadbeast.net/~branden/ |
pgpoCNHxkxGPp.pgp
Description: PGP signature
--- End Message ---