From 1c4dcb577190b1b205381f74ac29eb0102811af6 Mon Sep 17 00:00:00 2001 From: Kevin Buettner Date: Thu, 20 Sep 2001 20:07:55 +0000 Subject: [PATCH] Make set_solib_svr4_fetch_link_map_offsets() work as intended. --- gdb/ChangeLog | 8 ++++++++ gdb/solib-svr4.c | 35 +++++++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 238e7326be6..69d6362c398 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2001-09-20 Kevin Buettner + + * solib-svr4.c (fetch_link_map_offsets): Add comment. + (fetch_link_map_offsets_init): New static global. + (set_solib_svr4_fetch_link_map_offsets, init_fetch_link_map_offsets): + Revise implementation to use ``fetch_link_map_offsets_init'' + instead of ``fetch_link_map_offsets''. + 2001-09-20 Alan Modra * coffread.c: Replace all occurrences of bfd_read with bfd_bread. 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;