X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsolib-svr4.c;h=1112e2991277c99af6620874b48536cbc799d252;hb=9ab433aae8243622dbc5756a7f7c82cf0fd5cb1c;hp=1c451f39f422f566e4e02d5d39a101f5d3494a89;hpb=d7fa2ae2549091f294e6dd103a57ddf1219dfe6c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 1c451f39f4..1112e29912 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1,5 +1,6 @@ /* Handle SunOS and SVR4 shared libraries for GDB, the GNU Debugger. - Copyright 1990, 91, 92, 93, 94, 95, 96, 98, 1999, 2000, 2001 + Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, + 2001 Free Software Foundation, Inc. This file is part of GDB. @@ -19,8 +20,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#define _SYSCALL32 /* for Sparc64 cross Sparc32 */ #include "defs.h" +#include "regcache.h" #include @@ -32,12 +33,10 @@ #ifndef SVR4_SHARED_LIBS /* SunOS shared libs need the nlist structure. */ #include +#include #else #include "elf/external.h" -#endif - -#ifdef HAVE_LINK_H -#include +#include "elf/common.h" #endif #include "symtab.h" @@ -57,6 +56,19 @@ #include "solist.h" #include "solib-svr4.h" +#ifndef SVR4_FETCH_LINK_MAP_OFFSETS +#define SVR4_FETCH_LINK_MAP_OFFSETS() fetch_link_map_offsets () +#endif + +static struct link_map_offsets *default_svr4_fetch_link_map_offsets (void); +static struct link_map_offsets *(*fetch_link_map_offsets)(void) = + default_svr4_fetch_link_map_offsets; + +/* legacy_svr4_fetch_link_map_offsets_hook is a pointer to a function + which is used to fetch link map offsets. It will only be set + by solib-legacy.c, if at all. */ +struct link_map_offsets *(*legacy_svr4_fetch_link_map_offsets_hook)(void) = 0; + /* Link map info to include in an allocated so_list entry */ struct lm_info @@ -120,101 +132,24 @@ static char *main_name_list[] = /* Fetch (and possibly build) an appropriate link_map_offsets structure - for native targets using struct definitions from link.h. */ + for native targets using struct definitions from link.h. + + Note: For non-native targets (i.e. cross-debugging situations), + you need to define a target specific fetch_link_map_offsets() + function and call set_solib_svr4_fetch_link_map_offsets () to + register this function. */ -struct link_map_offsets * +static struct link_map_offsets * default_svr4_fetch_link_map_offsets (void) { -#ifdef HAVE_LINK_H - static struct link_map_offsets lmo; - static struct link_map_offsets *lmp = 0; -#if defined (HAVE_STRUCT_LINK_MAP32) - static struct link_map_offsets lmo32; - static struct link_map_offsets *lmp32 = 0; -#endif - -#ifndef offsetof -#define offsetof(TYPE, MEMBER) ((unsigned long) &((TYPE *)0)->MEMBER) -#endif -#define fieldsize(TYPE, MEMBER) (sizeof (((TYPE *)0)->MEMBER)) - - if (lmp == 0) - { - lmp = &lmo; - -#ifdef SVR4_SHARED_LIBS - lmo.r_debug_size = sizeof (struct r_debug); - - lmo.r_map_offset = offsetof (struct r_debug, r_map); - lmo.r_map_size = fieldsize (struct r_debug, r_map); - - lmo.link_map_size = sizeof (struct link_map); - - lmo.l_addr_offset = offsetof (struct link_map, l_addr); - lmo.l_addr_size = fieldsize (struct link_map, l_addr); - - lmo.l_next_offset = offsetof (struct link_map, l_next); - lmo.l_next_size = fieldsize (struct link_map, l_next); - - lmo.l_prev_offset = offsetof (struct link_map, l_prev); - lmo.l_prev_size = fieldsize (struct link_map, l_prev); - - lmo.l_name_offset = offsetof (struct link_map, l_name); - lmo.l_name_size = fieldsize (struct link_map, l_name); -#else /* !SVR4_SHARED_LIBS */ - lmo.link_map_size = sizeof (struct link_map); - - lmo.l_addr_offset = offsetof (struct link_map, lm_addr); - lmo.l_addr_size = fieldsize (struct link_map, lm_addr); - - lmo.l_next_offset = offsetof (struct link_map, lm_next); - lmo.l_next_size = fieldsize (struct link_map, lm_next); - - lmo.l_name_offset = offsetof (struct link_map, lm_name); - lmo.l_name_size = fieldsize (struct link_map, lm_name); -#endif /* SVR4_SHARED_LIBS */ - } - -#if defined (HAVE_STRUCT_LINK_MAP32) - if (lmp32 == 0) + if (legacy_svr4_fetch_link_map_offsets_hook) + return legacy_svr4_fetch_link_map_offsets_hook (); + else { - lmp32 = &lmo32; - - lmo32.r_debug_size = sizeof (struct r_debug32); - - lmo32.r_map_offset = offsetof (struct r_debug32, r_map); - lmo32.r_map_size = fieldsize (struct r_debug32, r_map); - - lmo32.link_map_size = sizeof (struct link_map32); - - lmo32.l_addr_offset = offsetof (struct link_map32, l_addr); - lmo32.l_addr_size = fieldsize (struct link_map32, l_addr); - - lmo32.l_next_offset = offsetof (struct link_map32, l_next); - lmo32.l_next_size = fieldsize (struct link_map32, l_next); - - lmo32.l_prev_offset = offsetof (struct link_map32, l_prev); - lmo32.l_prev_size = fieldsize (struct link_map32, l_prev); - - lmo32.l_name_offset = offsetof (struct link_map32, l_name); - lmo32.l_name_size = fieldsize (struct link_map32, l_name); + internal_error (__FILE__, __LINE__, +"default_svr4_fetch_link_map_offsets called without legacy link_map support enabled."); + return 0; } -#endif /* defined (HAVE_STRUCT_LINK_MAP32) */ - -#if defined (HAVE_STRUCT_LINK_MAP32) - if (bfd_get_arch_size (exec_bfd) == 32) - return lmp32; - else -#endif - return lmp; - -#else - - internal_error (__FILE__, __LINE__, - "default_svr4_fetch_link_map_offsets called without HAVE_LINK_H defined."); - return 0; - -#endif /* HAVE_LINK_H */ } /* Macro to extract an address from a solib structure. @@ -429,7 +364,7 @@ static CORE_ADDR bfd_lookup_symbol (bfd *, char *); static CORE_ADDR bfd_lookup_symbol (bfd *abfd, char *symname) { - unsigned int storage_needed; + long storage_needed; asymbol *sym; asymbol **symbol_table; unsigned int number_of_symbols; @@ -809,7 +744,7 @@ locate_base (void) debug_base = elf_locate_base (); #ifdef HANDLE_SVR4_EXEC_EMULATORS /* Try it the hard way for emulated executables. */ - else if (inferior_pid != 0 && target_has_execution) + else if (!ptid_equal (inferior_ptid, null_ptid) && target_has_execution) proc_iterate_over_mappings (look_for_base); #endif } @@ -949,7 +884,7 @@ open_symbol_file_object (void *from_ttyp) #else static int -open_symbol_file_object (int *from_ttyp) +open_symbol_file_object (void *from_ttyp) { return 1; } @@ -1636,7 +1571,7 @@ svr4_solib_create_inferior_hook (void) stop_signal = TARGET_SIGNAL_0; do { - target_resume (-1, 0, stop_signal); + target_resume (pid_to_ptid (-1), 0, stop_signal); wait_for_inferior (); } while (stop_signal != TARGET_SIGNAL_TRAP); @@ -1686,11 +1621,27 @@ svr4_relocate_section_addresses (struct so_list *so, sec->endaddr += LM_ADDR (so); } +void +set_solib_svr4_fetch_link_map_offsets (struct link_map_offsets *(*flmo) (void)) +{ + fetch_link_map_offsets = flmo; +} + +static void +init_fetch_link_map_offsets (void) +{ + set_solib_svr4_fetch_link_map_offsets (default_svr4_fetch_link_map_offsets); +} + static struct target_so_ops svr4_so_ops; void _initialize_svr4_solib (void) { + register_gdbarch_swap (&fetch_link_map_offsets, + sizeof (fetch_link_map_offsets), + init_fetch_link_map_offsets); + svr4_so_ops.relocate_section_addresses = svr4_relocate_section_addresses; svr4_so_ops.free_so = svr4_free_so; svr4_so_ops.clear_solib = svr4_clear_solib; @@ -1698,7 +1649,6 @@ _initialize_svr4_solib (void) svr4_so_ops.special_symbol_handling = svr4_special_symbol_handling; svr4_so_ops.current_sos = svr4_current_sos; svr4_so_ops.open_symbol_file_object = open_symbol_file_object; - svr4_so_ops.open_symbol_file_object = open_symbol_file_object; svr4_so_ops.in_dynsym_resolve_code = svr4_in_dynsym_resolve_code; /* FIXME: Don't do this here. *_gdbarch_init() should set so_ops. */