From 4b188b9f378958b975c48f5de1bd11ea042ef632 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Wed, 27 Apr 2005 14:30:15 +0000 Subject: [PATCH] * solib-svr4.c: Update copyright year. Include "gdb_assert.h". (SVR4_FETCH_LINK_MAP_OFFSETS): Don't define if not already defined. (legacy_fetch_link_map_offsets): Remove prototype. (fetch_link_map_offsets_gdbarch_data): Remove. (LM_ADDR, LM_NEXT, IGNORE_FIRST_LINK_MAP_ENTRY) (first_link_map_member, open_symbol_file_object, svr4_current_sos) (svr4_fetch_objfile_link_map): Call svr4_fetch_link_map_offsets instead of SVR4_FETCH_LINK_MAP_OFFSETS. (solib_svr4_data): New variable. (struct solib_svr4_ops): New. (solib_svr4_init): New fynction. (legacy_fetch_link_map_offsets, init_fetch_link_map_offsets): Remove functions. (svr4_fetch_link_map_offsets, svr4_have_link_map_offsets): Rewrite using the new `struct solib_svr4_ops'. (_initialize_svr4_solib): Replace registration of per-architecture data. Add temporary hack to set svr4_legacy_fetch_link_map_offsets if SVR4_FETCH_LINK_MAP_OFFSETS is set. * Makefile.in (solib-svr4.o): Update dependencies. --- gdb/ChangeLog | 24 +++++++++ gdb/Makefile.in | 4 +- gdb/solib-svr4.c | 149 ++++++++++++++++++++++--------------------------------- 3 files changed, 84 insertions(+), 93 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7137fe1..49f45af 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,27 @@ +2005-04-27 Mark Kettenis + + * solib-svr4.c: Update copyright year. Include "gdb_assert.h". + (SVR4_FETCH_LINK_MAP_OFFSETS): Don't define if not already + defined. + (legacy_fetch_link_map_offsets): Remove prototype. + (fetch_link_map_offsets_gdbarch_data): Remove. + (LM_ADDR, LM_NEXT, IGNORE_FIRST_LINK_MAP_ENTRY) + (first_link_map_member, open_symbol_file_object, svr4_current_sos) + (svr4_fetch_objfile_link_map): Call svr4_fetch_link_map_offsets + instead of SVR4_FETCH_LINK_MAP_OFFSETS. + (solib_svr4_data): New variable. + (struct solib_svr4_ops): New. + (solib_svr4_init): New fynction. + (legacy_fetch_link_map_offsets, init_fetch_link_map_offsets): + Remove functions. + (svr4_fetch_link_map_offsets, svr4_have_link_map_offsets): Rewrite + using the new `struct solib_svr4_ops'. + (_initialize_svr4_solib): Replace registration of per-architecture + data. Add temporary hack to set + svr4_legacy_fetch_link_map_offsets if SVR4_FETCH_LINK_MAP_OFFSETS + is set. + * Makefile.in (solib-svr4.o): Update dependencies. + 2005-04-26 Mark Kettenis * configure.tgt (*-*-freebsd*): Set gdb_osabi to diff --git a/gdb/Makefile.in b/gdb/Makefile.in index fdbb819..a64d403 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -2540,8 +2540,8 @@ solib-sunos.o: solib-sunos.c $(defs_h) $(gdb_string_h) $(symtab_h) $(bfd_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) $(solist_h) $(solib_svr4_h) \ - $(bfd_target_h) $(exec_h) + $(gdbcore_h) $(target_h) $(inferior_h) $(gdb_assert_h) \ + $(solist_h) $(solib_svr4_h) $(bfd_target_h) $(exec_h) sol-thread.o: sol-thread.c $(defs_h) $(gdbthread_h) $(target_h) \ $(inferior_h) $(gdb_stat_h) $(gdbcmd_h) $(gdbcore_h) $(regcache_h) \ $(symfile_h) $(gdb_string_h) $(gregset_h) diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 6106d9e..253be0a 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1,7 +1,7 @@ /* Handle SVR4 shared libraries for GDB, the GNU Debugger. Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - 2000, 2001, 2003, 2004 + 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GDB. @@ -35,30 +35,20 @@ #include "target.h" #include "inferior.h" +#include "gdb_assert.h" + #include "solist.h" #include "solib-svr4.h" #include "bfd-target.h" #include "exec.h" -#ifndef SVR4_FETCH_LINK_MAP_OFFSETS -#define SVR4_FETCH_LINK_MAP_OFFSETS() svr4_fetch_link_map_offsets () -#endif - static struct link_map_offsets *svr4_fetch_link_map_offsets (void); -static struct link_map_offsets *legacy_fetch_link_map_offsets (void); static int svr4_have_link_map_offsets (void); -/* fetch_link_map_offsets_gdbarch_data is a handle used to obtain the - architecture specific link map offsets fetching function. */ - -static struct gdbarch_data *fetch_link_map_offsets_gdbarch_data; - -/* legacy_svr4_fetch_link_map_offsets_hook is a pointer to a function - which is used to fetch link map offsets. It will only be set - by solib-legacy.c, if at all. */ - -struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook) (void) = 0; +/* This hook is set to a function that provides native link map + offsets if the code in solib-legacy.c is linked in. */ +struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook) (void); /* Link map info to include in an allocated so_list entry */ @@ -138,7 +128,7 @@ static char *main_name_list[] = static CORE_ADDR LM_ADDR (struct so_list *so) { - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); return (CORE_ADDR) extract_signed_integer (so->lm_info->lm + lmo->l_addr_offset, lmo->l_addr_size); @@ -147,7 +137,7 @@ LM_ADDR (struct so_list *so) static CORE_ADDR LM_NEXT (struct so_list *so) { - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); /* Assume that the address is unsigned. */ return extract_unsigned_integer (so->lm_info->lm + lmo->l_next_offset, @@ -157,7 +147,7 @@ LM_NEXT (struct so_list *so) static CORE_ADDR LM_NAME (struct so_list *so) { - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); /* Assume that the address is unsigned. */ return extract_unsigned_integer (so->lm_info->lm + lmo->l_name_offset, @@ -167,7 +157,7 @@ LM_NAME (struct so_list *so) static int IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so) { - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); /* Assume that the address is unsigned. */ return extract_unsigned_integer (so->lm_info->lm + lmo->l_prev_offset, @@ -477,7 +467,7 @@ static CORE_ADDR first_link_map_member (void) { CORE_ADDR lm = 0; - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); char *r_map_buf = xmalloc (lmo->r_map_size); struct cleanup *cleanups = make_cleanup (xfree, r_map_buf); @@ -524,7 +514,7 @@ open_symbol_file_object (void *from_ttyp) char *filename; int errcode; int from_tty = *(int *)from_ttyp; - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); char *l_name_buf = xmalloc (lmo->l_name_size); struct cleanup *cleanups = make_cleanup (xfree, l_name_buf); @@ -612,7 +602,7 @@ svr4_current_sos (void) lm = first_link_map_member (); while (lm) { - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); struct so_list *new = (struct so_list *) xmalloc (sizeof (struct so_list)); struct cleanup *old_chain = make_cleanup (xfree, new); @@ -694,7 +684,7 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) while (lm) { /* Get info on the layout of the r_debug and link_map structures. */ - struct link_map_offsets *lmo = SVR4_FETCH_LINK_MAP_OFFSETS (); + struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); int errcode; char *buffer; struct lm_info objfile_lm_info; @@ -1283,92 +1273,65 @@ svr4_relocate_section_addresses (struct so_list *so, sec->addr = svr4_truncate_ptr (sec->addr + LM_ADDR (so)); sec->endaddr = svr4_truncate_ptr (sec->endaddr + LM_ADDR (so)); } + +/* Architecture-specific operations. */ -/* Fetch a link_map_offsets structure for native targets using struct - definitions from link.h. See solib-legacy.c for the function - which does the actual work. - - Note: For non-native targets (i.e. cross-debugging situations), - a target specific fetch_link_map_offsets() function should be - defined and registered via set_solib_svr4_fetch_link_map_offsets(). */ +/* Per-architecture data key. */ +static struct gdbarch_data *solib_svr4_data; -static struct link_map_offsets * -legacy_fetch_link_map_offsets (void) +struct solib_svr4_ops { - if (legacy_svr4_fetch_link_map_offsets_hook) - return legacy_svr4_fetch_link_map_offsets_hook (); - else - { - internal_error (__FILE__, __LINE__, - _("legacy_fetch_link_map_offsets called without legacy " - "link_map support enabled.")); - return 0; - } -} + /* Return a description of the layout of `struct link_map'. */ + struct link_map_offsets *(*fetch_link_map_offsets)(void); +}; -/* Fetch a link_map_offsets structure using the method registered in the - architecture vector. */ +/* Return a default for the architecture-specific operations. */ -static struct link_map_offsets * -svr4_fetch_link_map_offsets (void) +static void * +solib_svr4_init (struct obstack *obstack) { - struct link_map_offsets *(*flmo)(void) = - gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data); + struct solib_svr4_ops *ops; - if (flmo == NULL) - { - internal_error (__FILE__, __LINE__, - _("svr4_fetch_link_map_offsets: fetch_link_map_offsets " - "method not defined for this architecture.")); - return 0; - } - else - return (flmo ()); + ops = OBSTACK_ZALLOC (obstack, struct solib_svr4_ops); + ops->fetch_link_map_offsets = legacy_svr4_fetch_link_map_offsets_hook; + return ops; } -/* Return 1 if a link map offset fetcher has been defined, 0 otherwise. */ -static int -svr4_have_link_map_offsets (void) -{ - struct link_map_offsets *(*flmo)(void) = - gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data); - if (flmo == NULL - || (flmo == legacy_fetch_link_map_offsets - && legacy_svr4_fetch_link_map_offsets_hook == NULL)) - return 0; - else - return 1; -} - -/* set_solib_svr4_fetch_link_map_offsets() is intended to be called by - a _gdbarch_init() function. It is used to establish an - architecture specific link_map_offsets fetcher for the architecture - being defined. */ +/* Set the architecture-specific `struct link_map_offsets' fetcher for + GDBARCH to FLMO. */ void set_solib_svr4_fetch_link_map_offsets (struct gdbarch *gdbarch, struct link_map_offsets *(*flmo) (void)) { - deprecated_set_gdbarch_data (gdbarch, fetch_link_map_offsets_gdbarch_data, flmo); + struct solib_svr4_ops *ops = gdbarch_data (gdbarch, solib_svr4_data); + + ops->fetch_link_map_offsets = flmo; } -/* Initialize the architecture-specific link_map_offsets fetcher. - This is called after _gdbarch_init() has set up its `struct - gdbarch' for the new architecture, and is only called if the - link_map_offsets fetcher isn't already initialized (which is - usually done by calling set_solib_svr4_fetch_link_map_offsets() - above in _gdbarch_init()). Therefore we attempt to provide a - reasonable alternative (for native targets anyway) if the - _gdbarch_init() fails to call - set_solib_svr4_fetch_link_map_offsets(). */ +/* Fetch a link_map_offsets structure using the architecture-specific + `struct link_map_offsets' fetcher. */ -static void * -init_fetch_link_map_offsets (struct gdbarch *gdbarch) +static struct link_map_offsets * +svr4_fetch_link_map_offsets (void) { - return legacy_fetch_link_map_offsets; + struct solib_svr4_ops *ops = gdbarch_data (current_gdbarch, solib_svr4_data); + + gdb_assert (ops->fetch_link_map_offsets); + return ops->fetch_link_map_offsets (); } +/* Return 1 if a link map offset fetcher has been defined, 0 otherwise. */ + +static int +svr4_have_link_map_offsets (void) +{ + struct solib_svr4_ops *ops = gdbarch_data (current_gdbarch, solib_svr4_data); + return (ops->fetch_link_map_offsets != NULL); +} + + /* Most OS'es that have SVR4-style ELF dynamic libraries define a `struct r_debug' and a `struct link_map' that are binary compatible with the origional SVR4 implementation. */ @@ -1447,8 +1410,12 @@ extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */ void _initialize_svr4_solib (void) { - fetch_link_map_offsets_gdbarch_data = - gdbarch_data_register_post_init (init_fetch_link_map_offsets); + solib_svr4_data = gdbarch_data_register_pre_init (solib_svr4_init); + + /* FIXME: Eliminate this ASAP. */ +#ifdef SVR4_FETCH_LINK_MAP_OFFSETS + svr4_legacy_fetch_link_map_offsets = SVR4_FETCH_LINK_MAP_OFFSETS; +#endif svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses; svr4_so_ops.free_so = svr4_free_so; -- 2.7.4