/* Handle SunOS shared libraries for GDB, the GNU Debugger.
Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
- 2001, 2004, 2007, 2008 Free Software Foundation, Inc.
+ 2001, 2004, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
This file is part of GDB.
#include "objfiles.h"
#include "gdbcore.h"
#include "inferior.h"
+#include "gdbthread.h"
#include "solist.h"
#include "bcache.h"
#include "regcache.h"
Assume that the address is unsigned. */
#define SOLIB_EXTRACT_ADDRESS(MEMBER) \
- extract_unsigned_integer (&(MEMBER), sizeof (MEMBER))
+ extract_unsigned_integer (&(MEMBER), sizeof (MEMBER), \
+ gdbarch_byte_order (target_gdbarch))
/* local data declarations */
static CORE_ADDR
LM_ADDR (struct so_list *so)
{
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
int lm_addr_offset = offsetof (struct link_map, lm_addr);
int lm_addr_size = fieldsize (struct link_map, lm_addr);
return (CORE_ADDR) extract_signed_integer (so->lm_info->lm + lm_addr_offset,
- lm_addr_size);
+ lm_addr_size, byte_order);
}
static CORE_ADDR
LM_NEXT (struct so_list *so)
{
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
int lm_next_offset = offsetof (struct link_map, lm_next);
int lm_next_size = fieldsize (struct link_map, lm_next);
/* Assume that the address is unsigned. */
return extract_unsigned_integer (so->lm_info->lm + lm_next_offset,
- lm_next_size);
+ lm_next_size, byte_order);
}
static CORE_ADDR
LM_NAME (struct so_list *so)
{
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
int lm_name_offset = offsetof (struct link_map, lm_name);
int lm_name_size = fieldsize (struct link_map, lm_name);
/* Assume that the address is unsigned. */
return extract_unsigned_integer (so->lm_info->lm + lm_name_offset,
- lm_name_size);
+ lm_name_size, byte_order);
}
static CORE_ADDR debug_base; /* Base of dynamic linker structures */
memset (objfile, 0, sizeof (struct objfile));
objfile->psymbol_cache = bcache_xmalloc ();
objfile->macro_cache = bcache_xmalloc ();
+ objfile->filename_cache = bcache_xmalloc ();
obstack_init (&objfile->objfile_obstack);
objfile->name = xstrdup ("rt_common");
*/
static void
-sunos_solib_create_inferior_hook (void)
+sunos_solib_create_inferior_hook (int from_tty)
{
+ struct thread_info *tp;
+ struct inferior *inf;
+
if ((debug_base = locate_base ()) == 0)
{
/* Can't find the symbol or the executable is statically linked. */
can go groveling around in the dynamic linker structures to find
out what we need to know about them. */
+ inf = current_inferior ();
+ tp = inferior_thread ();
+
clear_proceed_status ();
- stop_soon = STOP_QUIETLY;
- stop_signal = TARGET_SIGNAL_0;
+
+ inf->stop_soon = STOP_QUIETLY;
+ tp->stop_signal = TARGET_SIGNAL_0;
do
{
- target_resume (pid_to_ptid (-1), 0, stop_signal);
+ target_resume (pid_to_ptid (-1), 0, tp->stop_signal);
wait_for_inferior (0);
}
- while (stop_signal != TARGET_SIGNAL_TRAP);
- stop_soon = NO_STOP_QUIETLY;
+ while (tp->stop_signal != TARGET_SIGNAL_TRAP);
+ inf->stop_soon = NO_STOP_QUIETLY;
/* We are now either at the "mapping complete" breakpoint (or somewhere
else, a condition we aren't prepared to deal with anyway), so adjust
if (gdbarch_decr_pc_after_break (target_gdbarch))
{
stop_pc -= gdbarch_decr_pc_after_break (target_gdbarch);
- write_pc (stop_pc);
+ regcache_write_pc (get_current_regcache (), stop_pc);
}
if (!disable_break ())
static void
sunos_relocate_section_addresses (struct so_list *so,
- struct section_table *sec)
+ struct target_section *sec)
{
sec->addr += LM_ADDR (so);
sec->endaddr += LM_ADDR (so);
sunos_so_ops.current_sos = sunos_current_sos;
sunos_so_ops.open_symbol_file_object = open_symbol_file_object;
sunos_so_ops.in_dynsym_resolve_code = sunos_in_dynsym_resolve_code;
+ sunos_so_ops.bfd_open = solib_bfd_open;
/* FIXME: Don't do this here. *_gdbarch_init() should set so_ops. */
current_target_so_ops = &sunos_so_ops;