diff options
author | Jim Blandy <jimb@codesourcery.com> | 2000-03-15 16:55:07 +0000 |
---|---|---|
committer | Jim Blandy <jimb@codesourcery.com> | 2000-03-15 16:55:07 +0000 |
commit | 07cd4b9723e0a6d6bfec8980b0afcdbd9fdeb332 (patch) | |
tree | b46d5728b4a5b131a25dd4ff4b2f6fd3fec0faf2 /gdb/target.c | |
parent | 8f2eba6efa236376dc3e15723714d39999652408 (diff) | |
download | gdb-07cd4b9723e0a6d6bfec8980b0afcdbd9fdeb332.zip gdb-07cd4b9723e0a6d6bfec8980b0afcdbd9fdeb332.tar.gz gdb-07cd4b9723e0a6d6bfec8980b0afcdbd9fdeb332.tar.bz2 |
Deal with the inferior unloading shared objects.
* solib.c (current_sos): New function, replacing find_solib.
(find_solib): Deleted.
(free_so): New function.
(clear_solib): Call free_so, instead of writing it out.
(solib_add): Rewritten: compare the inferior's current list of
shared objects with GDB's list, and do the required loads and
unloads.
(info_sharedlibrary_command, solib_address): Don't use find_solib
to walk the list of shared libraries: call solib_add, and then
walk the list at so_list_head normally.
* objfiles.c (free_objfile): Don't call CLEAR_SOLIB, and don't
detach the core target. These tasks are taken care of elsewhere.
* target.c (remove_target_sections): New function.
* target.h (remove_target_sections): New declaration.
* solib.c (symbol_add_stub): Check whether we've already created
an objfile for this shared object first, before doing all that
work to compute section addresses, etc.
* objfiles.c (unlink_objfile): Report an internal error if objfile
doesn't occur in the object_files list.
* solib.c (special_symbol_handling): Delete argument; it's not
used.
* solib.c (SOLIB_EXTRACT_ADDRESS): New macro to extract addresses
from solib structures. Use it throughout solib.c, get rid of all
CORE_ADDR casts.
(struct so_list): Change type of lmaddr to CORE_ADDR.
(first_link_map_member): Change return value type to CORE_ADDR,
update callers.
(solib_add_common_symbols): Change parameter type to CORE_ADDR,
update callers.
(open_symbol_file_object, find_solib): Change type of lm variable
to CORE_ADDR.
Diffstat (limited to 'gdb/target.c')
-rw-r--r-- | gdb/target.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/gdb/target.c b/gdb/target.c index fa9cf88..7bb4886 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -1325,6 +1325,39 @@ target_resize_to_sections (struct target_ops *target, int num_added) } +/* Remove all target sections taken from ABFD. + + Scan the current target stack for targets whose section tables + refer to sections from BFD, and remove those sections. We use this + when we notice that the inferior has unloaded a shared object, for + example. */ +void +remove_target_sections (bfd *abfd) +{ + struct target_ops **t; + + for (t = target_structs; t < target_structs + target_struct_size; t++) + { + struct section_table *src, *dest; + + dest = (*t)->to_sections; + for (src = (*t)->to_sections; src < (*t)->to_sections_end; src++) + if (src->bfd != abfd) + { + /* Keep this section. */ + if (dest < src) *dest = *src; + dest++; + } + + /* If we've dropped any sections, resize the section table. */ + if (dest < src) + target_resize_to_sections (*t, dest - src); + } +} + + + + /* Find a single runnable target in the stack and return it. If for some reason there is more than one, return NULL. */ |