* 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.
This commit is contained in:
parent
fac51dd9e5
commit
0892cb63bd
4 changed files with 35 additions and 6 deletions
|
@ -1,3 +1,11 @@
|
||||||
|
2013-05-06 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.
|
||||||
|
|
||||||
2013-05-06 Tom Tromey <tromey@redhat.com>
|
2013-05-06 Tom Tromey <tromey@redhat.com>
|
||||||
|
|
||||||
* ada-lang.c (ada_value_primitive_packed_val): Don't
|
* ada-lang.c (ada_value_primitive_packed_val): Don't
|
||||||
|
|
|
@ -966,6 +966,14 @@ svr4_free_so (struct so_list *so)
|
||||||
xfree (so->lm_info);
|
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). */
|
/* Free so_list built so far (called via cleanup). */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2448,6 +2456,7 @@ _initialize_svr4_solib (void)
|
||||||
|
|
||||||
svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses;
|
svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses;
|
||||||
svr4_so_ops.free_so = svr4_free_so;
|
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.clear_solib = svr4_clear_solib;
|
||||||
svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
|
svr4_so_ops.solib_create_inferior_hook = svr4_solib_create_inferior_hook;
|
||||||
svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
|
svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling;
|
||||||
|
|
19
gdb/solib.c
19
gdb/solib.c
|
@ -499,17 +499,20 @@ solib_map_sections (struct so_list *so)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free symbol-file related contents of SO. If we have opened a BFD
|
/* Free symbol-file related contents of SO and reset for possible reloading
|
||||||
for SO, close it. If we have placed SO's sections in some target's
|
of SO. If we have opened a BFD for SO, close it. If we have placed SO's
|
||||||
section table, the caller is responsible for removing them.
|
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
|
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
|
objfile associated with SO that needs to be removed, the caller is
|
||||||
responsible for taking care of that. */
|
responsible for taking care of that. */
|
||||||
|
|
||||||
static void
|
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)
|
if (so->sections)
|
||||||
{
|
{
|
||||||
xfree (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
|
/* Restore the target-supplied file name. SO_NAME may be the path
|
||||||
of the symbol file. */
|
of the symbol file. */
|
||||||
strcpy (so->so_name, so->so_original_name);
|
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.
|
/* 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 ());
|
struct target_so_ops *ops = solib_ops (target_gdbarch ());
|
||||||
|
|
||||||
free_so_symbols (so);
|
clear_so (so);
|
||||||
ops->free_so (so);
|
ops->free_so (so);
|
||||||
|
|
||||||
xfree (so);
|
xfree (so);
|
||||||
|
@ -1238,7 +1245,7 @@ reload_shared_libraries_1 (int from_tty)
|
||||||
&& !solib_used (so))
|
&& !solib_used (so))
|
||||||
free_objfile (so->objfile);
|
free_objfile (so->objfile);
|
||||||
remove_target_sections (so, so->abfd);
|
remove_target_sections (so, so->abfd);
|
||||||
free_so_symbols (so);
|
clear_so (so);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If this shared library is now associated with a new symbol
|
/* If this shared library is now associated with a new symbol
|
||||||
|
|
|
@ -88,6 +88,11 @@ struct target_so_ops
|
||||||
associated with a so_list entry. */
|
associated with a so_list entry. */
|
||||||
void (*free_so) (struct so_list *so);
|
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
|
/* Reset or free private data structures not associated with
|
||||||
so_list entries. */
|
so_list entries. */
|
||||||
void (*clear_solib) (void);
|
void (*clear_solib) (void);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue