From 9371d4498c3caa7d9c1ced003cc4e0944a6c0e31 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Thu, 20 Sep 2001 20:07:55 +0000 Subject: Make set_solib_svr4_fetch_link_map_offsets() work as intended. --- gdb/solib-svr4.c | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'gdb/solib-svr4.c') diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index a23b56c2dab..315c0c5228d 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -62,9 +62,21 @@ #endif static struct link_map_offsets *default_svr4_fetch_link_map_offsets (void); + +/* fetch_link_map_offsets is the pointer to the architecture specific + link map offsets fetching function. It uses the gdbarch_swap + mechanism to change its value when the architecture changes. */ static struct link_map_offsets *(*fetch_link_map_offsets)(void) = default_svr4_fetch_link_map_offsets; +/* fetch_link_map_offsets_init is like the above, but obtains its + value from a call to set_solib_svr4_fetch_link_map_offsets(). + This latter function is intended to be called from a *_gdbarch_init() + function. The value of ``fetch_link_map_offsets_init'' is used + to actually set ``fetch_link_map_offsets'' when the architecture + is installed. */ +static struct link_map_offsets *(*fetch_link_map_offsets_init)(void) = 0; + /* 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. */ @@ -1642,16 +1654,35 @@ svr4_relocate_section_addresses (struct so_list *so, sec->endaddr += LM_ADDR (so); } +/* set_solib_svr4_fetch_link_map_offsets() is intended to be called by + a _gdbarch_init() function. It uses ``fetch_link_map_offsets_init'' + to temporarily hold a pointer to the link map offsets fetcher for + a particular architecture. Once the architecture is actually installed, + init_fetch_link_map_offsets(), below, will be called to install this + value in ``fetch_link_map_offsets''. After that, the gdbarch_swap + machinery will manage the contents of this variable whenever the + architecture changes. */ + void set_solib_svr4_fetch_link_map_offsets (struct link_map_offsets *(*flmo) (void)) { - fetch_link_map_offsets = flmo; + fetch_link_map_offsets_init = flmo; } +/* Initialize the value of ``fetch_link_map_offsets'' when a new + architecture is created. set_solib_svr4_fetch_link_map_offsets() + is used to set the value that ``fetch_link_map_offsets'' should + be initialized to. */ + static void init_fetch_link_map_offsets (void) { - set_solib_svr4_fetch_link_map_offsets (default_svr4_fetch_link_map_offsets); + if (fetch_link_map_offsets_init != NULL) + fetch_link_map_offsets = fetch_link_map_offsets_init; + else + fetch_link_map_offsets = default_svr4_fetch_link_map_offsets; + + fetch_link_map_offsets_init = NULL; } static struct target_so_ops svr4_so_ops; -- cgit v1.2.1