aboutsummaryrefslogtreecommitdiff
path: root/gdb/somsolib.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/somsolib.c')
-rw-r--r--gdb/somsolib.c40
1 files changed, 38 insertions, 2 deletions
diff --git a/gdb/somsolib.c b/gdb/somsolib.c
index 41b6c2b..a426542 100644
--- a/gdb/somsolib.c
+++ b/gdb/somsolib.c
@@ -338,8 +338,7 @@ som_solib_add (arg_string, from_tty, target)
addr = (CORE_ADDR)new_so->som_solib.next;
new_so->objfile = symbol_file_add (name, from_tty, text_addr, 0, 0, 0);
- new_so->abfd = bfd_openr (name, gnutarget);
- new_so->abfd->cacheable = true;
+ new_so->abfd = new_so->objfile->obfd;
if (!bfd_check_format (new_so->abfd, bfd_object))
{
@@ -571,6 +570,43 @@ som_solib_get_got_by_pc (addr)
return got_value;
}
+int
+som_solib_section_offsets (objfile, offsets)
+ struct objfile *objfile;
+ struct section_offsets *offsets;
+{
+ struct so_list *so_list = so_list_head;
+
+ while (so_list)
+ {
+ /* Oh what a pain! We need the offsets before so_list->objfile
+ is valid. The BFDs will never match. Make a best guess. */
+ if (!strcmp (so_list->som_solib.name, objfile->name))
+ {
+ asection *private_section;
+
+ /* The text offset is easy. */
+ ANOFFSET (offsets, 0) = so_list->som_solib.text_addr;
+
+ /* We should look at presumed_dp in the SOM header, but
+ that's not easily available. This should be OK though. */
+ private_section = bfd_get_section_by_name (objfile->obfd,
+ "$PRIVATE$");
+ if (!private_section)
+ {
+ warning ("Unable to find $PRIVATE$ in shared library!");
+ ANOFFSET (offsets, 1) = 0;
+ return 1;
+ }
+ ANOFFSET (offsets, 1) = (so_list->som_solib.data_start
+ - private_section->vma);
+ return 1;
+ }
+ so_list = so_list->next;
+ }
+ return 0;
+}
+
/* Dump information about all the currently loaded shared libraries. */
static void