Index: gdb/gdb/breakpoint.c diff -u gdb/gdb/breakpoint.c:1.1.1.1.4.2 gdb/gdb/breakpoint.c:1.1.1.1.4.2.2.1 --- gdb/gdb/breakpoint.c:1.1.1.1.4.2 Sat Jan 14 21:56:52 2006 +++ gdb/gdb/breakpoint.c Sun Jan 15 21:50:59 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/breakpoint.c,v 1.1.1.1.4.2.2.1 2006/01/16 02:50:59 dawes Exp $ */ /* Everything about breakpoints, for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, @@ -215,6 +216,8 @@ extern int addressprint; /* Print machine addresses? */ +static int internal_breakpoint_number = -1; + /* Are we executing breakpoint commands? */ static int executing_breakpoint_commands; @@ -1184,7 +1187,7 @@ ALL_BREAKPOINTS_SAFE (b, temp) { /* Solib breakpoints must be explicitly reset after an exec(). */ - if (b->type == bp_shlib_event) + if (b->type == bp_shlib_event || b->type == bp_xfree86mod_event) { delete_breakpoint (b); continue; @@ -2025,6 +2028,14 @@ return PRINT_NOTHING; break; + case bp_xfree86mod_event: + /* Did we stop because the user set the stop_on_solib_events + variable? (If so, we report this as a generic, "Stopped due + to shlib event" message.) */ + printf_filtered ("Stopped due to XFree86 module event\n"); + return PRINT_NOTHING; + break; + case bp_thread_event: /* Not sure how we will get here. GDB should not stop for these breakpoints. */ @@ -3026,6 +3037,7 @@ bs_class = bp_nostop; break; case bp_shlib_event: + case bp_xfree86mod_event: bs_class = shlib_event; break; case bp_thread_event: @@ -3213,7 +3225,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_xfree86mod_event, "XFree86 module events"} }; static char *bpdisps[] = @@ -3364,6 +3377,7 @@ case bp_shlib_event: case bp_thread_event: case bp_overlay_event: + case bp_xfree86mod_event: if (addressprint) { annotate_field (4); @@ -3870,7 +3884,6 @@ static struct breakpoint * create_internal_breakpoint (CORE_ADDR address, enum bptype type) { - static int internal_breakpoint_number = -1; struct symtab_and_line sal; struct breakpoint *b; @@ -4019,6 +4032,32 @@ delete_breakpoint (b); } +#ifdef XFREE86_MODULE_SUPPORT +void remove_xfree86mod_event_breakpoints (void) +{ + register struct breakpoint *b, *temp; + + ALL_BREAKPOINTS_SAFE (b, temp) + if (b->type == bp_xfree86mod_event) + delete_breakpoint (b); +} + +void create_xfree86mod_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_xfree86mod_event); + b->number = internal_breakpoint_number--; + b->disposition = disp_donttouch; + b->type = bp_xfree86mod_event; + +} +#endif + #ifdef SOLIB_ADD void remove_solib_event_breakpoints (void) @@ -4496,6 +4535,7 @@ case bp_shlib_event: case bp_thread_event: case bp_overlay_event: + case bp_xfree86mod_event: break; } if (say_where) @@ -6855,6 +6895,7 @@ b->type != bp_shlib_event && b->type != bp_thread_event && b->type != bp_overlay_event && + b->type != bp_xfree86mod_event && b->number >= 0) breaks_to_delete = 1; } @@ -6869,6 +6910,7 @@ b->type != bp_shlib_event && b->type != bp_thread_event && b->type != bp_overlay_event && + b->type != bp_xfree86mod_event && b->number >= 0) delete_breakpoint (b); } @@ -7063,6 +7105,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_xfree86mod_event: /* Like bp_shlib_event, this breakpoint type is special. Once it is set up, we do not want to touch it. */ Index: gdb/gdb/breakpoint.h diff -u gdb/gdb/breakpoint.h:1.1.1.1.4.2 gdb/gdb/breakpoint.h:1.1.1.1.4.2.2.1 --- gdb/gdb/breakpoint.h:1.1.1.1.4.2 Sat Jan 14 21:56:52 2006 +++ gdb/gdb/breakpoint.h Sun Jan 15 21:50:59 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/breakpoint.h,v 1.1.1.1.4.2.2.1 2006/01/16 02:50:59 dawes Exp $ */ /* Data structures associated with breakpoints in GDB. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc. @@ -136,7 +137,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_xfree86mod_event + }; @@ -669,10 +675,14 @@ extern struct breakpoint *create_thread_event_breakpoint (CORE_ADDR); +extern void create_xfree86mod_event_breakpoint (CORE_ADDR); + extern void remove_solib_event_breakpoints (void); extern void remove_thread_event_breakpoints (void); +extern void remove_xfree86mod_event_breakpoints (void); + extern void disable_breakpoints_in_shlibs (int silent); extern void re_enable_breakpoints_in_shlibs (void); Index: gdb/gdb/dbxread.c diff -u gdb/gdb/dbxread.c:1.1.1.1.4.2 gdb/gdb/dbxread.c:1.1.1.1.4.2.2.1 --- gdb/gdb/dbxread.c:1.1.1.1.4.2 Sat Jan 14 21:56:56 2006 +++ gdb/gdb/dbxread.c Sun Jan 15 21:50:59 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/dbxread.c,v 1.1.1.1.4.2.2.1 2006/01/16 02:50:59 dawes Exp $ */ /* Read dbx symbol tables and convert to internal format, for GDB. Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 @@ -1210,7 +1211,7 @@ do_cleanups (back_to); } -#ifdef SOFUN_ADDRESS_MAYBE_MISSING +#if defined(SOFUN_ADDRESS_MAYBE_MISSING) || defined(XFREE86_MODULE_SUPPORT) CORE_ADDR find_stab_function_addr (char *namestring, char *filename, struct objfile *objfile) @@ -3144,7 +3145,7 @@ case 'F': function_stab_type = type; -#ifdef SOFUN_ADDRESS_MAYBE_MISSING +#if defined(SOFUN_ADDRESS_MAYBE_MISSING) || defined(XFREE86_MODULE_SUPPORT) /* Deal with the SunPRO 3.0 compiler which omits the address from N_FUN symbols. */ if (type == N_FUN Index: gdb/gdb/elfread.c diff -u gdb/gdb/elfread.c:1.1.1.1.4.2 gdb/gdb/elfread.c:1.1.1.1.4.2.2.1 --- gdb/gdb/elfread.c:1.1.1.1.4.2 Sat Jan 14 21:56:57 2006 +++ gdb/gdb/elfread.c Sun Jan 15 21:50:59 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/elfread.c,v 1.1.1.1.4.2.2.1 2006/01/16 02:50:59 dawes Exp $ */ /* Read ELF (Executable and Linking Format) object files for GDB. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 @@ -265,7 +266,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 +308,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 +361,7 @@ { if (sym->name[0] == '.') continue; - symaddr += offset; + symaddr += ANOFFSET (objfile->section_offsets, 0); } } else if (sym->section->flags & SEC_CODE) @@ -440,7 +457,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/gdb/fork-child.c diff -u gdb/gdb/fork-child.c:1.1.1.1.4.1 gdb/gdb/fork-child.c:1.1.1.1.4.1.2.1 --- gdb/gdb/fork-child.c:1.1.1.1.4.1 Sat Jan 14 21:45:10 2006 +++ gdb/gdb/fork-child.c Sun Jan 15 21:50:59 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/fork-child.c,v 1.1.1.1.4.1.2.1 2006/01/16 02:50:59 dawes Exp $ */ /* Fork a Unix child process, and set up to debug it, for GDB. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. @@ -377,6 +378,9 @@ #ifdef SOLIB_CREATE_INFERIOR_HOOK SOLIB_CREATE_INFERIOR_HOOK (pid); #endif +#ifdef XFREE86_MODULE_SUPPORT + xfree86mod_create_inferior_hook(pid); +#endif } /* An inferior Unix process CHILD_PID has been created by a call to Index: gdb/gdb/i386bsd-nat.c diff -u gdb/gdb/i386bsd-nat.c:1.1.1.1.4.2 gdb/gdb/i386bsd-nat.c:1.1.1.1.4.2.2.2 --- gdb/gdb/i386bsd-nat.c:1.1.1.1.4.2 Sat Jan 14 21:57:04 2006 +++ gdb/gdb/i386bsd-nat.c Mon Jan 16 20:17:55 2006 @@ -306,7 +306,7 @@ /* For some mysterious reason, some of the reserved bits in the debug control register get set. Mask these off, otherwise the ptrace call below will fail. */ - dbregs.dr7 &= ~(0x0000fc00); + DBREG_DRX ((&dbregs), 7) &= ~(0x0000fc00); DBREG_DRX ((&dbregs), regnum) = value; @@ -355,7 +355,7 @@ return 0; #endif - return dbregs.dr6; + return DBREG_DRX ((&dbregs), 6); } #endif /* PT_GETDBREGS */ @@ -417,6 +417,11 @@ #define SC_SP_OFFSET i386bsd_sc_sp_offset #endif + /* + * NetBSD 3.0's does not provide struct sigcontext + * for userland. + */ +#ifndef __NetBSD__ /* Override the default value for the offset of the program counter in the sigcontext structure. */ sc_pc_offset = offsetof (struct sigcontext, sc_pc); @@ -443,4 +448,5 @@ } SC_SP_OFFSET = sc_sp_offset; +#endif } Index: gdb/gdb/infrun.c diff -u gdb/gdb/infrun.c:1.1.1.1.4.2 gdb/gdb/infrun.c:1.1.1.1.4.2.2.1 --- gdb/gdb/infrun.c:1.1.1.1.4.2 Sat Jan 14 21:57:05 2006 +++ gdb/gdb/infrun.c Sun Jan 15 21:50:59 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/infrun.c,v 1.1.1.1.4.2.2.1 2006/01/16 02:50:59 dawes Exp $ */ /* Target-struct-independent code to start (run) and stop an inferior process. @@ -1488,12 +1489,16 @@ if (breakpoints_inserted) remove_breakpoints (); - /* Check for any newly added shared libraries if we're - supposed to be adding them automatically. Switch - terminal for any messages produced by - breakpoint_re_set. */ + /* 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 XFREE86_MODULE_SUPPORT + xfree86mod_add (NULL, 0, NULL); +#endif target_terminal_inferior (); /* Reinsert breakpoints and continue. */ @@ -2432,6 +2437,10 @@ breakpoint_re_set. */ target_terminal_ours_for_output (); SOLIB_ADD (NULL, 0, NULL, auto_solib_add); +#ifdef XFREE86_MODULE_SUPPORT + xfree86mod_add (NULL, 0, NULL); +#endif + target_terminal_inferior (); /* Try to reenable shared library breakpoints, additional Index: gdb/gdb/objfiles.c diff -u gdb/gdb/objfiles.c:1.1.1.1.4.2 gdb/gdb/objfiles.c:1.1.1.1.4.2.2.1 --- gdb/gdb/objfiles.c:1.1.1.1.4.2 Sat Jan 14 21:57:12 2006 +++ gdb/gdb/objfiles.c Sun Jan 15 21:51:00 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/objfiles.c,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:00 dawes Exp $ */ /* GDB routines for manipulating objfiles. Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, @@ -191,10 +192,10 @@ objfile->md = md; objfile->mmfd = fd; /* Update pointers to functions to *our* copies */ - obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc); - obstack_freefun (&objfile->psymbol_cache.cache, xmfree); - obstack_chunkfun (&objfile->macro_cache.cache, xmmalloc); - obstack_freefun (&objfile->macro_cache.cache, xmfree); + obstack_chunkfun (&objfile->psymbol_cache->cache, xmmalloc); + obstack_freefun (&objfile->psymbol_cache->cache, xmfree); + obstack_chunkfun (&objfile->macro_cache->cache, xmmalloc); + obstack_freefun (&objfile->macro_cache->cache, xmfree); obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc); obstack_freefun (&objfile->psymbol_obstack, xmfree); obstack_chunkfun (&objfile->symbol_obstack, xmmalloc); @@ -222,10 +223,10 @@ objfile->mmfd = fd; objfile->flags |= OBJF_MAPPED; mmalloc_setkey (objfile->md, 0, objfile); - obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache, + obstack_specify_allocation_with_arg (&objfile->psymbol_cache->cache, 0, 0, xmmalloc, xmfree, objfile->md); - obstack_specify_allocation_with_arg (&objfile->macro_cache.cache, + obstack_specify_allocation_with_arg (&objfile->macro_cache->cache, 0, 0, xmmalloc, xmfree, objfile->md); obstack_specify_allocation_with_arg (&objfile->psymbol_obstack, Index: gdb/gdb/symfile.c diff -u gdb/gdb/symfile.c:1.1.1.1.4.2 gdb/gdb/symfile.c:1.1.1.1.4.2.2.2 --- gdb/gdb/symfile.c:1.1.1.1.4.2 Sat Jan 14 21:57:24 2006 +++ gdb/gdb/symfile.c Mon Jan 23 11:36:07 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/symfile.c,v 1.1.1.1.4.2.2.2 2006/01/23 16:36:07 dawes Exp $ */ /* Generic symbol file reading for the GNU debugger, GDB. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, @@ -119,8 +120,6 @@ static void cashier_psymtab (struct partial_symtab *); -bfd *symfile_bfd_open (char *); - int get_section_index (struct objfile *, char *); static void find_sym_fns (struct objfile *); @@ -512,7 +511,7 @@ struct other_sections *osp ; osp = &addrs->other[i] ; - if (osp->addr == 0) + if (osp->addr == 0 || osp->sectindex < 0) continue; /* Record all sections in offsets */ @@ -679,9 +678,13 @@ /* Calculate offsets for sections. */ for (i=0 ; i < MAX_SECTIONS && addrs->other[i].name; i++) { + sect = bfd_get_section_by_name (objfile->obfd, addrs->other[i].name); + /* This is the index used by BFD. */ + addrs->other[i].sectindex = sect ? sect->index : -1 ; + if (addrs->other[i].addr != 0) { - sect = bfd_get_section_by_name (objfile->obfd, addrs->other[i].name); + if (sect) { addrs->other[i].addr -= bfd_section_vma (objfile->obfd, sect); @@ -841,11 +844,74 @@ struct objfile *objfile; struct partial_symtab *psymtab; bfd *abfd; + char *component_name = NULL; + +#ifdef XFREE86_MODULE_SUPPORT + struct cleanup *old_chain; + char *p; + + /* Make a copy of the string that we can safely write into. */ - /* Open a bfd for the file, and give user a chance to burp if we'd be - interactively wiping out any existing symbols. */ + name = xstrdup (name); + old_chain = make_cleanup (xfree, name); + p = strstr(name, ".a:"); + if (p) + { + bfd *archive_bfd; + 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); + } +#if 0 + printf_unfiltered ("%s %s\n", abfd->filename, component_name); +#endif + 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) = xstrdup (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 @@ -884,7 +950,8 @@ pre_add_symbol_hook (name); else { - printf_filtered ("Reading symbols from %s...", name); + printf_filtered ("Reading symbols from %s...", + component_name ? component_name : name); wrap_here (""); gdb_flush (gdb_stdout); } @@ -925,6 +992,10 @@ } } +#ifdef XFREE86_MODULE_SUPPORT + do_cleanups (old_chain); +#endif + if (objfile->sf == NULL) return objfile; /* No symbols. */ @@ -1093,7 +1164,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; @@ -1133,7 +1204,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/gdb/symfile.h diff -u gdb/gdb/symfile.h:1.1.1.1.4.1 gdb/gdb/symfile.h:1.1.1.1.4.1.2.1 --- gdb/gdb/symfile.h:1.1.1.1.4.1 Sat Jan 14 21:45:38 2006 +++ gdb/gdb/symfile.h Sun Jan 15 21:51:00 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/symfile.h,v 1.1.1.1.4.1.2.1 2006/01/16 02:51:00 dawes Exp $ */ /* Definitions for reading symbol files into GDB. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 @@ -250,7 +251,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/gdb/xfree86mod.c diff -u /dev/null gdb/gdb/xfree86mod.c:1.1.4.1 --- /dev/null Mon Jan 23 15:02:13 2006 +++ gdb/gdb/xfree86mod.c Mon Jan 16 20:59:32 2006 @@ -0,0 +1,332 @@ +/* $XOZ: gdb/gdb/xfree86mod.c,v 1.1.4.1 2006/01/17 01:59:32 dawes Exp $ */ +/* Handle XFree86 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. */ + +/* + * The XFree86 module support for gdb was written by Paul Flinders + * for gdb 4.17, and later updated for gdb 5.1. + * See http://www.dawa.demon.co.uk/xfree-gdb for Paul's patches. + * + * Paul's work was updated for gdb 6.0 by Michal Ludvig . + * + * Further updates/fixes by David Dawes : + * + * - Add support for building on some other ELF platforms (Solaris/x86, + * FreeBSD). + * - Fix some memory allocation problems, which show up on Solaris/x86, + * and when using the mmalloc library. + * - Fixed a bug that prevented auto-reading of module symbols. + * + * TODO: + * + * - Add support for other XFree86 platforms. + * - Add support for unloaded and reloaded modules. + * - Autoload modules symbols when debugging a core that has modules loaded. + */ + + +#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 XFree86 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 *xfree86mod_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 +xfree86mod_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_xfree86mod_event_breakpoints (); + + /* And our copy of the inferior's modules */ + for (mod = mod_list_head; mod; mod = next_mod) + { + next_mod = mod->next; + xfree (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 = xfree86mod_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_xfree86mod_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); + xfree (name); + } + install_minimal_symbols (mod->objfile); + xfree (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 + xfree (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 (void *arg) +{ + struct mod_list *mod = (struct mod_list *) arg; + struct section_addr_info *text_addr; + + text_addr = xmalloc (sizeof (struct section_addr_info)); + memset (text_addr, 0, sizeof (struct section_addr_info)); + + 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 +xfree86mod_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 (); + xfree86mod_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_xfree86mod (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/gdb/xfree86mod.h diff -u /dev/null gdb/gdb/xfree86mod.h:1.1.4.1 --- /dev/null Mon Jan 23 15:02:13 2006 +++ gdb/gdb/xfree86mod.h Mon Jan 16 20:59:32 2006 @@ -0,0 +1,70 @@ +/* $XOZ: gdb/gdb/xfree86mod.h,v 1.1.4.1 2006/01/17 01:59:32 dawes Exp $ */ +/* Handle XFree86 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 XFree86 module support requires shared library support +#endif + +#define XFREE86_MODULE_SUPPORT + +#ifdef __STDC__ /* Forward decl's for prototypes */ +struct target_ops; +#endif + +/* XFree86 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 xfree86mod_create_inferior_hook(); +extern void xfree86mod_add PARAMS ((char *, int, struct target_ops *)); + Index: gdb/gdb/config/nm-linux.h diff -u gdb/gdb/config/nm-linux.h:1.1.1.1.4.2 gdb/gdb/config/nm-linux.h:1.1.1.1.4.2.2.1 --- gdb/gdb/config/nm-linux.h:1.1.1.1.4.2 Sat Jan 14 21:57:50 2006 +++ gdb/gdb/config/nm-linux.h Sun Jan 15 21:51:02 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/config/nm-linux.h,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:02 dawes Exp $ */ /* Native support for GNU/Linux. Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. @@ -41,6 +42,7 @@ #ifdef HAVE_LINK_H #define SVR4_SHARED_LIBS #include "solib.h" /* Support for shared libraries. */ +#include "xfree86mod.h" /* Support for XFree86 modules. */ #endif Index: gdb/gdb/config/nm-nbsd.h diff -u gdb/gdb/config/nm-nbsd.h:1.1.1.1.4.2 gdb/gdb/config/nm-nbsd.h:1.1.1.1.4.2.2.1 --- gdb/gdb/config/nm-nbsd.h:1.1.1.1.4.2 Sat Jan 14 21:57:50 2006 +++ gdb/gdb/config/nm-nbsd.h Sun Jan 15 21:51:02 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/config/nm-nbsd.h,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:02 dawes Exp $ */ /* Native-dependent definitions for NetBSD. Copyright 1994, 1996, 1999 Free Software Foundation, Inc. @@ -25,3 +26,4 @@ #define ATTACH_DETACH #include "solib.h" /* Support for shared libraries. */ +#include "xfree86mod.h" /* Support for XFree86 modules. */ Index: gdb/gdb/config/nm-sysv4.h diff -u gdb/gdb/config/nm-sysv4.h:1.1.1.1 gdb/gdb/config/nm-sysv4.h:1.1.1.1.6.1 --- gdb/gdb/config/nm-sysv4.h:1.1.1.1 Sat Jan 14 14:09:39 2006 +++ gdb/gdb/config/nm-sysv4.h Sun Jan 15 21:51:02 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/config/nm-sysv4.h,v 1.1.1.1.6.1 2006/01/16 02:51:02 dawes Exp $ */ /* Definitions for running gdb on a host machine running any flavor of SVR4. Copyright 1991, 1992, 1993, 1998 Free Software Foundation, Inc. Written by Fred Fish at Cygnus Support (fnf@cygnus.com). @@ -23,6 +24,7 @@ #define SVR4_SHARED_LIBS #include "solib.h" +#include "xfree86mod.h" /* SVR4 has /proc support, so use it instead of ptrace. */ Index: gdb/gdb/config/i386/fbsd.mh diff -u gdb/gdb/config/i386/fbsd.mh:1.1.1.1.4.2 gdb/gdb/config/i386/fbsd.mh:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/fbsd.mh:1.1.1.1.4.2 Sat Jan 14 21:58:10 2006 +++ gdb/gdb/config/i386/fbsd.mh Sun Jan 15 21:51:04 2006 @@ -1,7 +1,8 @@ +# $XOZ: gdb/gdb/config/i386/fbsd.mh,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ # Host: Intel 386 running FreeBSD XM_FILE= xm-i386.h 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 i386bsd-nat.o i386fbsd-nat.o gcore.o fbsd-proc.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 i386bsd-nat.o i386fbsd-nat.o gcore.o fbsd-proc.o xfree86mod.o Index: gdb/gdb/config/i386/i386sol2.mh diff -u gdb/gdb/config/i386/i386sol2.mh:1.1.1.1.4.2 gdb/gdb/config/i386/i386sol2.mh:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/i386sol2.mh:1.1.1.1.4.2 Sat Jan 14 21:58:11 2006 +++ gdb/gdb/config/i386/i386sol2.mh Sun Jan 15 21:51:04 2006 @@ -1,9 +1,10 @@ +# $XOZ: gdb/gdb/config/i386/i386sol2.mh,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ # Host: Intel 386 running Solaris 2 (SVR4) XM_FILE= xm-i386v4.h -XM_CLIBS= -lsocket -lnsl +XM_CLIBS= -R/usr/local/lib -lsocket -lnsl NAT_FILE= nm-i386sol2.h NATDEPFILES= core-regset.o fork-child.o i386v4-nat.o corelow.o \ procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o gcore.o \ - solib.o solib-svr4.o solib-legacy.o + solib.o solib-svr4.o solib-legacy.o xfree86mod.o Index: gdb/gdb/config/i386/i386v4.mh diff -u gdb/gdb/config/i386/i386v4.mh:1.1.1.1 gdb/gdb/config/i386/i386v4.mh:1.1.1.1.6.1 --- gdb/gdb/config/i386/i386v4.mh:1.1.1.1 Sat Jan 14 14:09:40 2006 +++ gdb/gdb/config/i386/i386v4.mh Sun Jan 15 21:51:04 2006 @@ -1,3 +1,4 @@ +# $XOZ: gdb/gdb/config/i386/i386v4.mh,v 1.1.1.1.6.1 2006/01/16 02:51:04 dawes Exp $ # Host: Intel 386 running SVR4 XM_FILE= xm-i386v4.h @@ -5,6 +6,6 @@ XM_CLIBS= -lsocket -lnsl NAT_FILE= nm-i386v4.h -NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-nat.o \ +NATDEPFILES= corelow.o core-regset.o fork-child.o i386v4-nat.o xfree86mod.o \ solib.o solib-svr4.o solib-legacy.o \ procfs.o proc-api.o proc-events.o proc-flags.o proc-why.o Index: gdb/gdb/config/i386/linux.mh diff -u gdb/gdb/config/i386/linux.mh:1.1.1.1.4.2 gdb/gdb/config/i386/linux.mh:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/linux.mh:1.1.1.1.4.2 Sat Jan 14 21:58:11 2006 +++ gdb/gdb/config/i386/linux.mh Sun Jan 15 21:51:04 2006 @@ -1,10 +1,11 @@ +# $XOZ: gdb/gdb/config/i386/linux.mh,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ # Host: Intel 386 running GNU/Linux. XM_FILE= xm-i386.h 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 \ + core-aout.o i386-nat.o i386-linux-nat.o xfree86mod.o \ proc-service.o thread-db.o lin-lwp.o linux-proc.o gcore.o # The dynamically loaded libthread_db needs access to symbols in the Index: gdb/gdb/config/i386/nbsdelf.mh diff -u gdb/gdb/config/i386/nbsdelf.mh:1.1.1.1.4.2 gdb/gdb/config/i386/nbsdelf.mh:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/nbsdelf.mh:1.1.1.1.4.2 Sat Jan 14 21:58:11 2006 +++ gdb/gdb/config/i386/nbsdelf.mh Sun Jan 15 21:51:04 2006 @@ -1,4 +1,5 @@ +# $XOZ: gdb/gdb/config/i386/nbsdelf.mh,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ # Host: Intel 386 running NetBSD -NATDEPFILES= fork-child.o infptrace.o inftarg.o i386bsd-nat.o +NATDEPFILES= fork-child.o infptrace.o inftarg.o i386bsd-nat.o xfree86mod.o XM_FILE= xm-nbsd.h NAT_FILE= nm-nbsd.h Index: gdb/gdb/config/i386/nm-fbsd.h diff -u gdb/gdb/config/i386/nm-fbsd.h:1.1.1.1.4.2 gdb/gdb/config/i386/nm-fbsd.h:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/nm-fbsd.h:1.1.1.1.4.2 Sat Jan 14 21:58:11 2006 +++ gdb/gdb/config/i386/nm-fbsd.h Sun Jan 15 21:51:04 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/config/i386/nm-fbsd.h,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ */ /* Native-dependent definitions for FreeBSD/i386. Copyright 1986, 1987, 1989, 1992, 1994, 1996, 1997, 2000, 2001 Free Software Foundation, Inc. @@ -97,6 +98,7 @@ #ifdef SVR4_SHARED_LIBS #include "elf/common.h" /* Additional ELF shared library info. */ #endif +#include "xfree86mod.h" /* Support for XFree86 modules. */ #ifndef SVR4_SHARED_LIBS Index: gdb/gdb/config/i386/nm-obsd.h diff -u gdb/gdb/config/i386/nm-obsd.h:1.1.1.1 gdb/gdb/config/i386/nm-obsd.h:1.1.1.1.6.1 --- gdb/gdb/config/i386/nm-obsd.h:1.1.1.1 Sat Jan 14 14:09:40 2006 +++ gdb/gdb/config/i386/nm-obsd.h Sun Jan 15 21:51:04 2006 @@ -1,3 +1,4 @@ +/* $XOZ: gdb/gdb/config/i386/nm-obsd.h,v 1.1.1.1.6.1 2006/01/16 02:51:04 dawes Exp $ */ /* Native-dependent definitions for OpenBSD/i386. Copyright 2001 Free Software Foundation, Inc. @@ -52,6 +53,7 @@ /* Shared library support. */ #include "solib.h" /* Support for shared libraries. */ +#include "xfree86mod.h" /* Support for XFree86 modules. */ /* Make structure definitions match up with those expected in `solib.c'. */ Index: gdb/gdb/config/i386/obsd.mh diff -u gdb/gdb/config/i386/obsd.mh:1.1.1.1.4.2 gdb/gdb/config/i386/obsd.mh:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/obsd.mh:1.1.1.1.4.2 Sat Jan 14 21:58:12 2006 +++ gdb/gdb/config/i386/obsd.mh Sun Jan 15 21:51:04 2006 @@ -1,10 +1,11 @@ +# $XOZ: gdb/gdb/config/i386/obsd.mh,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ # Host: Intel 386 running OpenBSD XM_FILE= xm-i386.h NAT_FILE= nm-obsd.h NATDEPFILES= fork-child.o infptrace.o inftarg.o i386bsd-nat.o i386obsd-nat.o \ - solib.o solib-sunos.o + solib.o solib-sunos.o xfree86mod.o # The OpenBSD yacc generates yyname and yyrule tables that conflict at # link time if we define YYDEBUG to a non-zero value. Index: gdb/gdb/config/i386/x86-64linux.mh diff -u gdb/gdb/config/i386/x86-64linux.mh:1.1.1.1.4.2 gdb/gdb/config/i386/x86-64linux.mh:1.1.1.1.4.2.2.1 --- gdb/gdb/config/i386/x86-64linux.mh:1.1.1.1.4.2 Sat Jan 14 21:58:14 2006 +++ gdb/gdb/config/i386/x86-64linux.mh Sun Jan 15 21:51:04 2006 @@ -1,10 +1,11 @@ +# $XOZ: gdb/gdb/config/i386/x86-64linux.mh,v 1.1.1.1.4.2.2.1 2006/01/16 02:51:04 dawes Exp $ # Host: AMD x86-64 running GNU/Linux XM_FILE= xm-i386.h NAT_FILE= nm-x86-64linux.h NATDEPFILES= infptrace.o inftarg.o fork-child.o corelow.o \ - core-aout.o i386-nat.o x86-64-linux-nat.o \ + core-aout.o i386-nat.o x86-64-linux-nat.o xfree86mod.o \ proc-service.o thread-db.o lin-lwp.o \ linux-proc.o gcore.o