mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-11-25 13:09:48 +00:00
* 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:
parent
6fe7699b81
commit
4b188b9f37
@ -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
|
||||
|
@ -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)
|
||||
|
157
gdb/solib-svr4.c
157
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);
|
||||
};
|
||||
|
||||
/* 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;
|
||||
|
Loading…
Reference in New Issue
Block a user