This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[17/17] target_sections hack
- From: Tom Tromey <tromey at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 14 Dec 2011 16:34:23 -0700
- Subject: [17/17] target_sections hack
I was surprised to discover that one part of gdb relies on BFDs not
being shared.
In particular, if an solib shares exec_bfd, then remove_target_sections
will happily remove all the sections for both, then unpush the file
target. Then re-"run"ing will fail.
Unpushing the target here seems like an abstraction inversion.
(However, I don't really know this code very well.)
This patch fixes the problem via a gross hack: bypass the calls if the
BFD is the same as exec_bfd.
It occurs to me now that this approach will still fail if the inferior
calls dlmopen (causing a single library to be mapped more than once, but
after this series still sharing BFDs). One other idea I had was to
associate a tag with the target_sections; this would be just any handy
void*, like the solib. Then remove_target_sections could search for the
tag in addition to the BFD. Any other thoughts on this?
Tom
>From 6609c92b8da8473cd3ceb21e66d9fe2ee88218de Mon Sep 17 00:00:00 2001
From: Tom Tromey <tromey@redhat.com>
Date: Mon, 12 Dec 2011 15:00:23 -0700
Subject: [PATCH 17/18] target sections hack solib assumes that we will not
share BFDs
* solib.c (solib_map_sections): Conditionally call
add_target_sections.
(update_solib_list): Conditionally call remove_target_sections.
(clear_solib): Conditionally call remove_target_sections.
(reload_shared_libraries_1): Conditionally call
remove_target_sections.
---
gdb/solib.c | 11 +++++++----
1 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/gdb/solib.c b/gdb/solib.c
index 79d1905..c8f3bfa 100644
--- a/gdb/solib.c
+++ b/gdb/solib.c
@@ -507,7 +507,8 @@ solib_map_sections (struct so_list *so)
section tables. Do this immediately after mapping the object so
that later nodes in the list can query this object, as is needed
in solib-osf.c. */
- add_target_sections (so->sections, so->sections_end);
+ if (so->abfd != exec_bfd)
+ add_target_sections (so->sections, so->sections_end);
return 1;
}
@@ -770,7 +771,8 @@ update_solib_list (int from_tty, struct target_ops *target)
/* Some targets' section tables might be referring to
sections from so->abfd; remove them. */
- remove_target_sections (gdb->abfd);
+ if (gdb->abfd != exec_bfd)
+ remove_target_sections (gdb->abfd);
free_so (gdb);
gdb = *gdb_link;
@@ -1150,7 +1152,7 @@ clear_solib (void)
so_list_head = so->next;
observer_notify_solib_unloaded (so);
- if (so->abfd)
+ if (so->abfd && so->abfd != exec_bfd)
remove_target_sections (so->abfd);
free_so (so);
}
@@ -1244,7 +1246,8 @@ reload_shared_libraries_1 (int from_tty)
if (so->objfile && ! (so->objfile->flags & OBJF_USERLOADED)
&& !solib_used (so))
free_objfile (so->objfile);
- remove_target_sections (so->abfd);
+ if (so->abfd != exec_bfd)
+ remove_target_sections (so->abfd);
free_so_symbols (so);
}
--
1.7.6.4