aboutsummaryrefslogtreecommitdiff
path: root/gdb/solib-svr4.c
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2005-04-27 14:30:15 +0000
committerMark Kettenis <kettenis@gnu.org>2005-04-27 14:30:15 +0000
commit4b188b9f378958b975c48f5de1bd11ea042ef632 (patch)
tree7b01327b76545dd2533199d3f36be1308d2e2276 /gdb/solib-svr4.c
parent6fe7699b81b8c5f13f22e051986b5b4f8b37741f (diff)
downloadgdb-4b188b9f378958b975c48f5de1bd11ea042ef632.zip
gdb-4b188b9f378958b975c48f5de1bd11ea042ef632.tar.gz
gdb-4b188b9f378958b975c48f5de1bd11ea042ef632.tar.bz2
* 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.
Diffstat (limited to 'gdb/solib-svr4.c')
-rw-r--r--gdb/solib-svr4.c149
1 files changed, 58 insertions, 91 deletions
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 <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;