X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsolib-sunos.c;h=e8a1f32488d139c717f8ca4420ce3dd72cc8d930;hb=a778ab81e80a778f4d9b0cf754aa6dc956bdcfd2;hp=79ae9cc02a5e31e0956b223b6b71a9971506a156;hpb=8a3fe4f86c51d363e10efed1046ebcbdc853ae99;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-sunos.c b/gdb/solib-sunos.c index 79ae9cc02a..e8a1f32488 100644 --- a/gdb/solib-sunos.c +++ b/gdb/solib-sunos.c @@ -1,13 +1,13 @@ /* Handle SunOS shared libraries for GDB, the GNU Debugger. - Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - 2000, 2001, 2004 Free Software Foundation, Inc. + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, + 2001, 2004, 2007, 2008, 2009, 2010 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, @@ -16,9 +16,7 @@ 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 . */ #include "defs.h" @@ -38,6 +36,7 @@ #include "objfiles.h" #include "gdbcore.h" #include "inferior.h" +#include "gdbthread.h" #include "solist.h" #include "bcache.h" #include "regcache.h" @@ -121,7 +120,8 @@ static char *main_name_list[] = 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 */ @@ -141,33 +141,36 @@ static CORE_ADDR flag_addr; 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 */ @@ -186,9 +189,9 @@ allocate_rt_common_objfile (void) objfile = (struct objfile *) xmalloc (sizeof (struct objfile)); memset (objfile, 0, sizeof (struct objfile)); - objfile->md = NULL; 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"); @@ -738,8 +741,11 @@ sunos_special_symbol_handling (void) */ 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. */ @@ -761,26 +767,36 @@ sunos_solib_create_inferior_hook (void) 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); - wait_for_inferior (); + 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 the PC as necessary after a breakpoint, disable the breakpoint, and - add any shared libraries that were mapped in. */ + add any shared libraries that were mapped in. + + Note that adjust_pc_after_break did not perform any PC adjustment, + as the breakpoint the inferior just hit was not inserted by GDB, + but by the dynamic loader itself, and is therefore not found on + the GDB software break point list. Thus we have to adjust the + PC here. */ - if (DECR_PC_AFTER_BREAK) + if (gdbarch_decr_pc_after_break (target_gdbarch)) { - stop_pc -= DECR_PC_AFTER_BREAK; - write_register (PC_REGNUM, stop_pc); + stop_pc -= gdbarch_decr_pc_after_break (target_gdbarch); + regcache_write_pc (get_current_regcache (), stop_pc); } if (!disable_break ()) @@ -806,7 +822,7 @@ sunos_free_so (struct so_list *so) 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); @@ -825,6 +841,7 @@ _initialize_sunos_solib (void) 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;