2003-10-31 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Fri, 31 Oct 2003 21:13:45 +0000 (21:13 +0000)
committerAndrew Cagney <cagney@redhat.com>
Fri, 31 Oct 2003 21:13:45 +0000 (21:13 +0000)
* solib-svr4.c: Update copyright.  Include "bfd-target.h" and
"exec.h".
(exec_entry_point): New function.
(enable_break): Create a "tmp_bfd_target", use that and
entry_point_address when computing the relocation offset.
(svr4_relocate_main_executable): Ditto with exec_bfd and exec_ops.
* Makefile.in (solib-svr4.o): Update dependencies.

gdb/ChangeLog
gdb/Makefile.in
gdb/solib-svr4.c

index dedcd94cf624a17584b1c266686274f3e2832af2..48c231066d3c9ddc137a8f19652728b2e3fe7a82 100644 (file)
@@ -1,3 +1,13 @@
+2003-10-31  Andrew Cagney  <cagney@redhat.com>
+
+       * solib-svr4.c: Update copyright.  Include "bfd-target.h" and
+       "exec.h".
+       (exec_entry_point): New function.
+       (enable_break): Create a "tmp_bfd_target", use that and
+       entry_point_address when computing the relocation offset.
+       (svr4_relocate_main_executable): Ditto with exec_bfd and exec_ops.
+       * Makefile.in (solib-svr4.o): Update dependencies.
+
 2003-10-31  Andrew Cagney  <cagney@redhat.com>
 
        * defs.h (XZALLOC): Define.
index 9a546f11c4d96a1a1ed2a035619e80bc08081dde..9f4196cbcb9b3c40ef76d0c8c7421e617b87921a 100644 (file)
@@ -2298,7 +2298,8 @@ solib-sunos.o: solib-sunos.c $(defs_h) $(gdb_string_h) $(symtab_h) $(bfd_h) \
        $(bcache_h) $(regcache_h)
 solib-svr4.o: solib-svr4.c $(defs_h) $(elf_external_h) $(elf_common_h) \
        $(elf_mips_h) $(symtab_h) $(bfd_h) $(symfile_h) $(objfiles_h) \
-       $(gdbcore_h) $(target_h) $(inferior_h) $(solist_h) $(solib_svr4_h)
+       $(gdbcore_h) $(target_h) $(inferior_h) $(solist_h) $(solib_svr4_h) \
+       $(bfd_target_h) $(exec_h)
 sol-thread.o: sol-thread.c $(defs_h) $(gdbthread_h) $(target_h) \
        $(inferior_h) $(gdb_stat_h) $(gdbcmd_h) $(gdbcore_h) $(regcache_h) \
        $(symfile_h) $(gdb_string_h) $(gregset_h)
index 7fda5e4e0202b1a6289441251ec1f4131ebf7cee..ff35ba998fe41fd2751d0e39a6897bc57d608b49 100644 (file)
@@ -1,7 +1,7 @@
 /* Handle SVR4 shared libraries for GDB, the GNU Debugger.
-   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
-   2001
-   Free Software Foundation, Inc.
+
+   Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
+   2000, 2001, 2003 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -37,6 +37,9 @@
 #include "solist.h"
 #include "solib-svr4.h"
 
+#include "bfd-target.h"
+#include "exec.h"
+
 #ifndef SVR4_FETCH_LINK_MAP_OFFSETS
 #define SVR4_FETCH_LINK_MAP_OFFSETS() svr4_fetch_link_map_offsets ()
 #endif
@@ -911,6 +914,24 @@ svr4_in_dynsym_resolve_code (CORE_ADDR pc)
          || in_plt_section (pc, NULL));
 }
 
+/* Given an executable's ABFD and target, compute the entry-point
+   address.  */
+
+static CORE_ADDR
+exec_entry_point (struct bfd *abfd, struct target_ops *targ)
+{
+  /* KevinB wrote ... for most targets, the address returned by
+     bfd_get_start_address() is the entry point for the start
+     function.  But, for some targets, bfd_get_start_address() returns
+     the address of a function descriptor from which the entry point
+     address may be extracted.  This address is extracted by
+     gdbarch_convert_from_func_ptr_addr().  The method
+     gdbarch_convert_from_func_ptr_addr() is the merely the identify
+     function for targets which don't use function descriptors.  */
+  return gdbarch_convert_from_func_ptr_addr (current_gdbarch,
+                                            bfd_get_start_address (abfd),
+                                            targ);
+}
 
 /*
 
@@ -984,6 +1005,7 @@ enable_break (void)
       int load_addr_found = 0;
       struct so_list *inferior_sos;
       bfd *tmp_bfd = NULL;
+      struct target_ops *tmp_bfd_target;
       int tmp_fd = -1;
       char *tmp_pathname = NULL;
       CORE_ADDR sym_addr = 0;
@@ -1019,6 +1041,11 @@ enable_break (void)
          goto bkpt_at_symbol;
        }
 
+      /* Now convert the TMP_BFD into a target.  That way target, as
+         well as BFD operations can be used.  Note that closing the
+         target will also close the underlying bfd.  */
+      tmp_bfd_target = target_bfd_reopen (tmp_bfd);
+
       /* If the entry in _DYNAMIC for the dynamic linker has already
          been filled in, we can read its base address from there. */
       inferior_sos = svr4_current_sos ();
@@ -1042,7 +1069,8 @@ enable_break (void)
         the current pc (which should point at the entry point for the
         dynamic linker) and subtracting the offset of the entry point.  */
       if (!load_addr_found)
-       load_addr = read_pc () - tmp_bfd->start_address;
+       load_addr = (read_pc ()
+                    - exec_entry_point (tmp_bfd, tmp_bfd_target));
 
       /* Record the relocated start and end address of the dynamic linker
          text and plt section for svr4_in_dynsym_resolve_code.  */
@@ -1080,8 +1108,9 @@ enable_break (void)
            break;
        }
 
-      /* We're done with the temporary bfd.  */
-      bfd_close (tmp_bfd);
+      /* We're done with both the temporary bfd and target.  Remember,
+         closing the target closes the underlying bfd.  */
+      target_close (tmp_bfd_target, 0);
 
       if (sym_addr != 0)
        {
@@ -1200,7 +1229,7 @@ svr4_relocate_main_executable (void)
   interp_sect = bfd_get_section_by_name (exec_bfd, ".interp");
   if (interp_sect == NULL 
       && (bfd_get_file_flags (exec_bfd) & DYNAMIC) != 0
-      && bfd_get_start_address (exec_bfd) != pc)
+      && (exec_entry_point (exec_bfd, &exec_ops) != pc))
     {
       struct cleanup *old_chain;
       struct section_offsets *new_offsets;
@@ -1232,7 +1261,7 @@ svr4_relocate_main_executable (void)
         The same language also appears in Edition 4.0 of the System V
         ABI and is left unspecified in some of the earlier editions.  */
 
-      displacement = pc - bfd_get_start_address (exec_bfd);
+      displacement = pc - exec_entry_point (exec_bfd, &exec_ops);
       changed = 0;
 
       new_offsets = xcalloc (symfile_objfile->num_sections,