From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6311 invoked by alias); 22 Aug 2002 23:19:51 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 6157 invoked from network); 22 Aug 2002 23:19:48 -0000 Received: from unknown (HELO dragon.nuxi.com) (66.92.13.169) by sources.redhat.com with SMTP; 22 Aug 2002 23:19:48 -0000 Received: from dragon.nuxi.com (obrien@localhost [127.0.0.1]) by dragon.nuxi.com (8.12.5/8.12.2) with ESMTP id g7MNJk27057022; Thu, 22 Aug 2002 16:19:46 -0700 (PDT) (envelope-from obrien@dragon.nuxi.com) Received: (from obrien@localhost) by dragon.nuxi.com (8.12.5/8.12.5/Submit) id g7MNJiLh057021; Thu, 22 Aug 2002 16:19:44 -0700 (PDT) Date: Thu, 22 Aug 2002 16:33:00 -0000 From: "David O'Brien" To: gdb-patches@sources.redhat.com Cc: "Mike A. Harris" Subject: GDB 5.2.1 patch for XFree86-4 module support Message-ID: <20020822231944.GA56938@dragon.nuxi.com> Reply-To: obrien@FreeBSD.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.4i X-Operating-System: FreeBSD 5.0-CURRENT Organization: The NUXI BSD Group X-Pgp-Rsa-Fingerprint: B7 4D 3E E9 11 39 5F A3 90 76 5D 69 58 D9 98 7A X-Pgp-Rsa-Keyid: 1024/34F9F9D5 X-SW-Source: 2002-08/txt/msg00736.txt.bz2 I updated the GDB 5.1 patches at http://www.dawa.demon.co.uk/xfree-gdb/ for 5.2.1. Who owns them, and what would it take to get them into the FSF/GDB tree for GDB 5.3? -- -- David (obrien@FreeBSD.org) Index: gdb/breakpoint.c =================================================================== RCS file: /cvs/src/src/gdb/breakpoint.c,v retrieving revision 1.66 diff -u -r1.66 breakpoint.c --- gdb/breakpoint.c 18 Feb 2002 13:35:29 -0000 1.66 +++ gdb/breakpoint.c 22 Aug 2002 20:23:13 -0000 @@ -2896,6 +2896,7 @@ bs_class = bp_nostop; break; case bp_shlib_event: + case bp_xfreemod_event: bs_class = shlib_event; break; case bp_thread_event: @@ -3083,7 +3084,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[] = @@ -3234,6 +3236,7 @@ case bp_shlib_event: case bp_thread_event: case bp_overlay_event: + case bp_xfreemod_event: if (addressprint) { annotate_field (4); @@ -3881,6 +3884,28 @@ 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; + + b = create_internal_breakpoint (address, bp_xfreemod_event); + b->type = bp_xfreemod_event; + +} +#endif + #ifdef SOLIB_ADD void remove_solib_event_breakpoints (void) @@ -4358,6 +4383,7 @@ case bp_shlib_event: case bp_thread_event: case bp_overlay_event: + case bp_xfreemod_event: break; } if (say_where) @@ -6921,6 +6947,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. */ Index: gdb/breakpoint.h =================================================================== RCS file: /cvs/src/src/gdb/breakpoint.h,v retrieving revision 1.11 diff -u -r1.11 breakpoint.h --- gdb/breakpoint.h 6 Feb 2002 18:31:07 -0000 1.11 +++ gdb/breakpoint.h 22 Aug 2002 20:23:13 -0000 @@ -136,7 +136,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 + }; @@ -669,9 +674,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); Index: gdb/dbxread.c =================================================================== RCS file: /cvs/src/src/gdb/dbxread.c,v retrieving revision 1.30.2.1 diff -u -r1.30.2.1 dbxread.c --- gdb/dbxread.c 4 Apr 2002 22:33:49 -0000 1.30.2.1 +++ gdb/dbxread.c 22 Aug 2002 20:23:14 -0000 @@ -3106,7 +3106,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 Index: gdb/elfread.c =================================================================== RCS file: /cvs/src/src/gdb/elfread.c,v retrieving revision 1.20.2.1 diff -u -r1.20.2.1 elfread.c --- gdb/elfread.c 25 Mar 2002 16:50:20 -0000 1.20.2.1 +++ gdb/elfread.c 22 Aug 2002 20:23:14 -0000 @@ -265,7 +265,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); @@ -307,10 +307,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 @@ -344,7 +360,7 @@ { if (sym->name[0] == '.') continue; - symaddr += offset; + symaddr += ANOFFSET (objfile->section_offsets, 0); } } else if (sym->section->flags & SEC_CODE) @@ -450,7 +466,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; Index: gdb/fork-child.c =================================================================== RCS file: /cvs/src/src/gdb/fork-child.c,v retrieving revision 1.17 diff -u -r1.17 fork-child.c --- gdb/fork-child.c 7 Feb 2002 06:11:55 -0000 1.17 +++ gdb/fork-child.c 22 Aug 2002 20:23:14 -0000 @@ -377,6 +377,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 Index: gdb/infrun.c =================================================================== RCS file: /cvs/src/src/gdb/infrun.c,v retrieving revision 1.54 diff -u -r1.54 infrun.c --- gdb/infrun.c 24 Feb 2002 22:31:19 -0000 1.54 +++ gdb/infrun.c 22 Aug 2002 20:23:16 -0000 @@ -1505,12 +1505,16 @@ if (breakpoints_inserted) remove_breakpoints (); - /* Check for any newly added shared libraries if we're - supposed to be adding them automatically. Switch + /* Check for any newly added shared libraries or XFree modules + if we're supposed to be adding them automatically. Switch terminal for any messages produced by breakpoint_re_set. */ target_terminal_ours_for_output (); SOLIB_ADD (NULL, 0, NULL, auto_solib_add); +#ifdef XFREE_MODULE_SUPPORT + if (auto_solib_add) + xfreemod_add (NULL, 0, NULL); +#endif target_terminal_inferior (); /* Reinsert breakpoints and continue. */ @@ -2437,6 +2441,10 @@ breakpoint_re_set. */ target_terminal_ours_for_output (); SOLIB_ADD (NULL, 0, NULL, auto_solib_add); +#ifdef XFREE_MODULE_SUPPORT + if (auto_solib_add) + xfreemod_add (NULL, 0, NULL); +#endif target_terminal_inferior (); /* Try to reenable shared library breakpoints, additional Index: gdb/minsyms.c =================================================================== RCS file: /cvs/src/src/gdb/minsyms.c,v retrieving revision 1.19.2.1 diff -u -r1.19.2.1 minsyms.c --- gdb/minsyms.c 25 Mar 2002 16:50:20 -0000 1.19.2.1 +++ gdb/minsyms.c 22 Aug 2002 20:23:16 -0000 @@ -505,7 +505,7 @@ return lookup_minimal_symbol_by_pc_section (pc, find_pc_mapped_section (pc)); } -#ifdef SOFUN_ADDRESS_MAYBE_MISSING +#if defined(SOFUN_ADDRESS_MAYBE_MISSING) || defined(XFREE_MODULE_SUPPORT) CORE_ADDR find_stab_function_addr (char *namestring, char *filename, struct objfile *objfile) Index: gdb/symfile.c =================================================================== RCS file: /cvs/src/src/gdb/symfile.c,v retrieving revision 1.54.2.3 diff -u -r1.54.2.3 symfile.c --- gdb/symfile.c 22 Jun 2002 16:49:33 -0000 1.54.2.3 +++ gdb/symfile.c 22 Aug 2002 20:23:17 -0000 @@ -118,7 +118,7 @@ static void cashier_psymtab (struct partial_symtab *); -bfd *symfile_bfd_open (char *); +/*bfd *symfile_bfd_open (char *);*/ int get_section_index (struct objfile *, char *); @@ -838,10 +838,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 @@ -926,6 +986,9 @@ if (target_new_objfile_hook) target_new_objfile_hook (objfile); +#ifdef XFREE_MODULE_SUPPORT + do_cleanups(old_chain); +#endif return (objfile); } @@ -1086,7 +1149,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; @@ -1126,7 +1189,7 @@ } sym_bfd->cacheable = 1; - 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 Index: gdb/symfile.h =================================================================== RCS file: /cvs/src/src/gdb/symfile.h,v retrieving revision 1.12.2.1 diff -u -r1.12.2.1 symfile.h --- gdb/symfile.h 16 Jun 2002 14:13:59 -0000 1.12.2.1 +++ gdb/symfile.h 22 Aug 2002 20:23:17 -0000 @@ -250,7 +250,7 @@ extern void find_lowest_section (bfd *, asection *, PTR); -extern bfd *symfile_bfd_open (char *); +extern bfd *symfile_bfd_open (char *, bfd_format); extern int get_section_index (struct objfile *, char *); Index: gdb/xfreemod.c =================================================================== RCS file: gdb/xfreemod.c diff -N gdb/xfreemod.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/xfreemod.c 22 Aug 2002 20:23:17 -0000 @@ -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 "gdb_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 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."); +} Index: gdb/xfreemod.h =================================================================== RCS file: gdb/xfreemod.h diff -N gdb/xfreemod.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ gdb/xfreemod.h 22 Aug 2002 20:23:17 -0000 @@ -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 + +#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 *)); + Index: gdb/config/i386/fbsd.mh =================================================================== RCS file: /cvs/src/src/gdb/config/i386/fbsd.mh,v retrieving revision 1.10 diff -u -r1.10 fbsd.mh --- gdb/config/i386/fbsd.mh 18 Jan 2002 04:50:59 -0000 1.10 +++ gdb/config/i386/fbsd.mh 22 Aug 2002 20:23:17 -0000 @@ -4,4 +4,4 @@ NAT_FILE= nm-fbsd.h # NOTE: Do not spread NATDEPFILES over several lines - it hurts BSD make. -NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o solib-svr4.o solib-legacy.o corelow.o core-aout.o core-regset.o i386-nat.o i387-nat.o i386bsd-nat.o i386fbsd-nat.o +NATDEPFILES= fork-child.o infptrace.o inftarg.o solib.o solib-svr4.o solib-legacy.o corelow.o core-aout.o core-regset.o i386-nat.o i387-nat.o i386bsd-nat.o i386fbsd-nat.o xfreemod.o Index: gdb/config/i386/linux.mh =================================================================== RCS file: /cvs/src/src/gdb/config/i386/linux.mh,v retrieving revision 1.11 diff -u -r1.11 linux.mh --- gdb/config/i386/linux.mh 18 Jan 2002 04:50:59 -0000 1.11 +++ gdb/config/i386/linux.mh 22 Aug 2002 20:23:17 -0000 @@ -5,7 +5,7 @@ NAT_FILE= nm-linux.h NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o linux-proc.o \ core-aout.o i386-nat.o i386-linux-nat.o i387-nat.o \ - proc-service.o thread-db.o lin-lwp.o linux-proc.o gcore.o + proc-service.o thread-db.o lin-lwp.o linux-proc.o gcore.o xfreemod.o # The dynamically loaded libthread_db needs access to symbols in the # gdb executable. Index: gdb/config/i386/nbsd.mh =================================================================== RCS file: /cvs/src/src/gdb/config/i386/Attic/nbsd.mh,v retrieving revision 1.12 diff -u -r1.12 nbsd.mh --- gdb/config/i386/nbsd.mh 18 Jan 2002 04:50:59 -0000 1.12 +++ gdb/config/i386/nbsd.mh 22 Aug 2002 20:23:17 -0000 @@ -6,7 +6,7 @@ # continuation character (backslash) to extend a commented line. As a # consequence, BSD make considers subsequent tab-indented lines to be # "unassociated shell commands". -NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386bsd-nat.o i386nbsd-nat.o solib.o solib-sunos.o +NATDEPFILES= fork-child.o infptrace.o inftarg.o corelow.o i387-nat.o i386bsd-nat.o i386nbsd-nat.o solib.o solib-sunos.o xfreemod.o XM_FILE= xm-nbsd.h NAT_FILE= nm-nbsd.h Index: gdb/config/i386/nm-fbsd.h =================================================================== RCS file: /cvs/src/src/gdb/config/i386/nm-fbsd.h,v retrieving revision 1.5.8.1 diff -u -r1.5.8.1 nm-fbsd.h --- gdb/config/i386/nm-fbsd.h 28 Jun 2002 18:46:05 -0000 1.5.8.1 +++ gdb/config/i386/nm-fbsd.h 22 Aug 2002 20:23:17 -0000 @@ -91,6 +91,7 @@ #endif #include "solib.h" /* Support for shared libraries. */ +#include "xfreemod.h" /* Support for XFree86 modules. */ #ifdef SVR4_SHARED_LIBS #include "elf/common.h" /* Additional ELF shared library info. */ #endif Index: gdb/config/i386/nm-linux.h =================================================================== RCS file: /cvs/src/src/gdb/config/i386/nm-linux.h,v retrieving revision 1.16 diff -u -r1.16 nm-linux.h --- gdb/config/i386/nm-linux.h 24 Feb 2002 22:56:05 -0000 1.16 +++ gdb/config/i386/nm-linux.h 22 Aug 2002 20:23:17 -0000 @@ -1,3 +1,4 @@ +#error gdb/config/i386/nm-linux.h /* Native support for GNU/Linux x86. Copyright 1986, 1987, 1989, 1992, 1993, 1994, 1995, 1996, 1997, @@ -22,12 +23,14 @@ #ifndef NM_LINUX_H #define NM_LINUX_H +#error NM_LINUX_H /* GNU/Linux supports the i386 hardware debugging registers. */ #define I386_USE_GENERIC_WATCHPOINTS #include "i386/nm-i386.h" #include "nm-linux.h" +#include "xfreemod.h" /* Support for XFree86 modules. */ /* Support for the user area. */ Index: gdb/config/i386/nm-x86-64.h =================================================================== RCS file: /cvs/src/src/gdb/config/i386/Attic/nm-x86-64.h,v retrieving revision 1.3.2.1 diff -u -r1.3.2.1 nm-x86-64.h --- gdb/config/i386/nm-x86-64.h 10 Apr 2002 12:53:46 -0000 1.3.2.1 +++ gdb/config/i386/nm-x86-64.h 22 Aug 2002 20:23:17 -0000 @@ -24,6 +24,7 @@ #define NM_X86_64_H #include "nm-linux.h" +#include "xfreemod.h" /* Support for XFree86 modules. */ #define I386_USE_GENERIC_WATCHPOINTS #include "i386/nm-i386.h" Index: gdb/config/i386/x86-64linux.mh =================================================================== RCS file: /cvs/src/src/gdb/config/i386/x86-64linux.mh,v retrieving revision 1.5 diff -u -r1.5 x86-64linux.mh --- gdb/config/i386/x86-64linux.mh 21 Feb 2002 12:48:36 -0000 1.5 +++ gdb/config/i386/x86-64linux.mh 22 Aug 2002 20:23:17 -0000 @@ -6,6 +6,6 @@ NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o \ core-aout.o i386-nat.o x86-64-linux-nat.o \ i387-nat.o proc-service.o thread-db.o lin-lwp.o \ - linux-proc.o gcore.o + linux-proc.o gcore.o xfreemod.o LOADLIBES = -ldl -rdynamic