-/* Handle SOM shared libraries for GDB, the GNU Debugger.
+/* Handle SOM shared libraries.
- Copyright 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.
This file is part of GDB.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330,
- Boston, MA 02111-1307, USA. */
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-#include "som.h"
#include "symtab.h"
#include "bfd.h"
#include "symfile.h"
#include "hppa-tdep.h"
#include "solist.h"
+#include "solib.h"
#undef SOLIB_SOM_DBG
{
flagword aflag = bfd_get_section_flags(so->abfd, sec->the_bfd_section);
- /* solib.c does something similar, but it only recognizes ".text", SOM calls
- the text section "$CODE$". */
- if (strcmp (sec->the_bfd_section->name, "$CODE$") == 0)
- {
- so->textsection = sec;
- }
-
if (aflag & SEC_CODE)
{
sec->addr += so->lm_info->text_addr - so->lm_info->text_link_addr;
msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile);
if (msymbol == NULL)
{
- warning (_(\
+ warning (_("\
Unable to find __dld_d_trap symbol in object file.\n\
Suggest linking with /opt/langtools/lib/end.o.\n\
GDB will be unable to track shl_load/shl_unload calls"));
clear_symtab_users ();
}
-/* This operation removes the "hook" between GDB and the dynamic linker,
- which causes the dld to notify GDB of shared library events.
-
- After this operation completes, the dld will no longer notify GDB of
- shared library events. To resume notifications, GDB must call
- som_solib_create_inferior_hook.
-
- This operation does not remove any knowledge of shared libraries
- of which GDB may already have been notified.
- */
-static void
-som_solib_remove_inferior_hook (int pid)
-{
- CORE_ADDR addr;
- struct minimal_symbol *msymbol;
- int status;
- char dld_flags_buffer[4];
- unsigned int dld_flags_value;
- struct cleanup *old_cleanups = save_inferior_ptid ();
-
- /* Ensure that we're really operating on the specified process. */
- inferior_ptid = pid_to_ptid (pid);
-
- /* We won't bother to remove the solib breakpoints from this process.
-
- In fact, on PA64 the breakpoint is hard-coded into the dld callback,
- and thus we're not supposed to remove it.
-
- Rather, we'll merely clear the dld_flags bit that enables callbacks.
- */
- msymbol = lookup_minimal_symbol ("__dld_flags", NULL, NULL);
-
- addr = SYMBOL_VALUE_ADDRESS (msymbol);
- status = target_read_memory (addr, dld_flags_buffer, 4);
-
- dld_flags_value = extract_unsigned_integer (dld_flags_buffer, 4);
-
- dld_flags_value &= ~DLD_FLAGS_HOOKVALID;
- store_unsigned_integer (dld_flags_buffer, 4, dld_flags_value);
- status = target_write_memory (addr, dld_flags_buffer, 4);
-
- do_cleanups (old_cleanups);
-}
-
static void
som_special_symbol_handling (void)
{
read_memory (addr, buf, 4);
addr = extract_unsigned_integer (buf, 4);
if (addr == 0)
- error (_("Debugging dynamic executables loaded via the hpux8 dld.sl is not supported."));
+ return 0;
read_memory (addr, buf, 4);
return extract_unsigned_integer (buf, 4);
new->lm_info = xmalloc (sizeof (struct lm_info));
make_cleanup (xfree, new->lm_info);
- read_memory (lm, (char *)&dbuf, sizeof (struct dld_list));
+ read_memory (lm, (gdb_byte *)&dbuf, sizeof (struct dld_list));
- addr = extract_unsigned_integer (&dbuf.name, sizeof (dbuf.name));
+ addr = extract_unsigned_integer ((gdb_byte *)&dbuf.name,
+ sizeof (dbuf.name));
target_read_string (addr, &namebuf, SO_NAME_MAX_PATH_SIZE - 1, &errcode);
if (errcode != 0)
warning (_("Can't read pathname for load map: %s."),
lmi->lm_addr = lm;
#define EXTRACT(_fld) \
- extract_unsigned_integer (&dbuf._fld, sizeof (dbuf._fld));
+ extract_unsigned_integer ((gdb_byte *)&dbuf._fld, sizeof (dbuf._fld));
lmi->text_addr = EXTRACT (text_addr);
tmp = EXTRACT (info);
paddr_nz (new->lm_info->tsd_start_addr));
#endif
+ new->addr_low = lmi->text_addr;
+ new->addr_high = lmi->text_end;
+
/* Link the new object onto the list. */
new->next = NULL;
*link_ptr = new;
som_so_ops.in_dynsym_resolve_code = som_in_dynsym_resolve_code;
}
-void som_solib_select (struct gdbarch_tdep *tdep)
+void som_solib_select (struct gdbarch *gdbarch)
{
- current_target_so_ops = &som_so_ops;
+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+ set_solib_ops (gdbarch, &som_so_ops);
tdep->solib_thread_start_addr = som_solib_thread_start_addr;
tdep->solib_get_got_by_pc = som_solib_get_got_by_pc;