This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFA] Fix handling of "set sysroot foo"
- From: Doug Evans <dje at google dot com>
- To: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Fri, 3 May 2013 21:21:18 -0700
- Subject: Re: [RFA] Fix handling of "set sysroot foo"
- References: <yjt2ppxzsk97 dot fsf at ruffy2 dot mtv dot corp dot google dot com> <20130421075444 dot GA4967 at host2 dot jankratochvil dot net>
How about this?
2013-05-03 Doug Evans <dje@google.com>
* solist.h (struct target_so_ops): New member clear_so.
* solib-svr4.c (svr4_clear_so): New function.
(_initialize_svr4_solib): Set svr4_so_ops.clear_so.
* solib.c (clear_so): Renamed from free_so_symbols.
All callers updated. Call target clear_so if it exists.
Index: solib-svr4.c
===================================================================
RCS file: /cvs/src/src/gdb/solib-svr4.c,v
retrieving revision 1.176
diff -u -p -r1.176 solib-svr4.c
--- solib-svr4.c 19 Apr 2013 15:10:53 -0000 1.176
+++ solib-svr4.c 4 May 2013 04:13:14 -0000
@@ -966,6 +966,14 @@ svr4_free_so (struct so_list *so)
xfree (so->lm_info);
}
+/* Implement target_so_ops.clear_so. */
+
+static void
+svr4_clear_so (struct so_list *so)
+{
+ so->lm_info->l_addr_p = 0;
+}
+
/* Free so_list built so far (called via cleanup). */
static void
@@ -2448,6 +2456,7 @@ _initialize_svr4_solib (void)
svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses;
svr4_so_ops.free_so = svr4_free_so;
+ svr4_so_ops.clear_so = svr4_clear_so;
svr4_so_ops.clear_solib = svr4_clear_solib;
svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
Index: solib.c
===================================================================
RCS file: /cvs/src/src/gdb/solib.c,v
retrieving revision 1.171
diff -u -p -r1.171 solib.c
--- solib.c 22 Apr 2013 16:46:15 -0000 1.171
+++ solib.c 4 May 2013 04:13:14 -0000
@@ -499,17 +499,20 @@ solib_map_sections (struct so_list *so)
return 1;
}
-/* Free symbol-file related contents of SO. If we have opened a BFD
- for SO, close it. If we have placed SO's sections in some target's
- section table, the caller is responsible for removing them.
+/* Free symbol-file related contents of SO and reset for possible reloading
+ of SO. If we have opened a BFD for SO, close it. If we have placed SO's
+ sections in some target's section table, the caller is responsible for
+ removing them.
This function doesn't mess with objfiles at all. If there is an
objfile associated with SO that needs to be removed, the caller is
responsible for taking care of that. */
static void
-free_so_symbols (struct so_list *so)
+clear_so (struct so_list *so)
{
+ struct target_so_ops *ops = solib_ops (target_gdbarch ());
+
if (so->sections)
{
xfree (so->sections);
@@ -528,6 +531,10 @@ free_so_symbols (struct so_list *so)
/* Restore the target-supplied file name. SO_NAME may be the path
of the symbol file. */
strcpy (so->so_name, so->so_original_name);
+
+ /* Do the same for target-specific data. */
+ if (ops->clear_so != NULL)
+ ops->clear_so (so);
}
/* Free the storage associated with the `struct so_list' object SO.
@@ -546,7 +553,7 @@ free_so (struct so_list *so)
{
struct target_so_ops *ops = solib_ops (target_gdbarch ());
- free_so_symbols (so);
+ clear_so (so);
ops->free_so (so);
xfree (so);
@@ -1238,7 +1245,7 @@ reload_shared_libraries_1 (int from_tty)
&& !solib_used (so))
free_objfile (so->objfile);
remove_target_sections (so, so->abfd);
- free_so_symbols (so);
+ clear_so (so);
}
/* If this shared library is now associated with a new symbol
Index: solist.h
===================================================================
RCS file: /cvs/src/src/gdb/solist.h,v
retrieving revision 1.38
diff -u -p -r1.38 solist.h
--- solist.h 1 Jan 2013 06:32:51 -0000 1.38
+++ solist.h 4 May 2013 04:13:14 -0000
@@ -88,6 +88,11 @@ struct target_so_ops
associated with a so_list entry. */
void (*free_so) (struct so_list *so);
+ /* Reset private data structures associated with SO.
+ This is called when SO is about to be reloaded.
+ It is also called before free_so when SO is about to be freed. */
+ void (*clear_so) (struct so_list *so);
+
/* Reset or free private data structures not associated with
so_list entries. */
void (*clear_solib) (void);