* 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.
This commit is contained in:
Mark Kettenis 2005-04-27 14:30:15 +00:00
parent 6fe7699b81
commit 4b188b9f37
3 changed files with 88 additions and 97 deletions

View File

@ -1,3 +1,27 @@
2005-04-27 Mark Kettenis <kettenis@gnu.org>
* 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 <kettenis@gnu.org>
* configure.tgt (*-*-freebsd*): Set gdb_osabi to

View File

@ -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)

View File

@ -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);
};
/* Return a default for the architecture-specific operations. */
static void *
solib_svr4_init (struct obstack *obstack)
{
struct solib_svr4_ops *ops;
ops = OBSTACK_ZALLOC (obstack, struct solib_svr4_ops);
ops->fetch_link_map_offsets = legacy_svr4_fetch_link_map_offsets_hook;
return ops;
}
/* Fetch a link_map_offsets structure using the method registered in the
architecture vector. */
static struct link_map_offsets *
svr4_fetch_link_map_offsets (void)
{
struct link_map_offsets *(*flmo)(void) =
gdbarch_data (current_gdbarch, fetch_link_map_offsets_gdbarch_data);
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 ());
}
/* 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 <arch>_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 <arch>_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 <arch>_gdbarch_init()). Therefore we attempt to provide a
reasonable alternative (for native targets anyway) if the
<arch>_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;