diff options
author | Jeff Law <law@redhat.com> | 1995-02-09 19:16:47 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1995-02-09 19:16:47 +0000 |
commit | 506af7a79c56669ddd04f9da63c2d48d048615a6 (patch) | |
tree | 9f9e03580efd100e345115481efc074091b675f3 /gdb/somsolib.c | |
parent | 257fcf3621d67bcd447e05500399e252c4cfdd79 (diff) | |
download | gdb-506af7a79c56669ddd04f9da63c2d48d048615a6.zip gdb-506af7a79c56669ddd04f9da63c2d48d048615a6.tar.gz gdb-506af7a79c56669ddd04f9da63c2d48d048615a6.tar.bz2 |
* somread.c (som_symtab_read): Handle dynamic relocation for both
text and data symbols.
(som_symfile_offsets): If objfile is a shared library, then get
text and data offsets from the shared library structures.
* somsolib.c (som_solib_add): Copy the bfd pointer from the
objfile rather than reopening the file again.
(som_solib_section_offsets): New function.
* somsolib.h (som_solib_section_offsets): Declare.
Diffstat (limited to 'gdb/somsolib.c')
-rw-r--r-- | gdb/somsolib.c | 40 |
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 |