X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsolib-svr4.c;h=e2026388860ba18ff32ec1a1ec9aeb592ddcb227;hb=513f590324f1b11a36acbad0ebf40f800f5e52f7;hp=7bd76a1965e07a635c016e11cff425a9cf800421;hpb=34439770999ff8e32edcfdf3468e660b317f30ea;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c index 7bd76a1965..e202638886 100644 --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c @@ -1,8 +1,7 @@ /* Handle SVR4 shared libraries for GDB, the GNU Debugger. - Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, - 2000, 2001, 2003, 2004, 2005, 2006 - Free Software Foundation, Inc. + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, + 2001, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. This file is part of GDB. @@ -119,19 +118,6 @@ static char *main_name_list[] = NULL }; -/* Macro to extract an address from a solib structure. When GDB is - configured for some 32-bit targets (e.g. Solaris 2.7 sparc), BFD is - configured to handle 64-bit targets, so CORE_ADDR is 64 bits. We - have to extract only the significant bits of addresses to get the - right address when accessing the core file BFD. - - Assume that the address is unsigned. */ - -#define SOLIB_EXTRACT_ADDRESS(MEMBER) \ - extract_unsigned_integer (&(MEMBER), sizeof (MEMBER)) - -/* local data declarations */ - /* link map access functions */ static CORE_ADDR @@ -139,9 +125,8 @@ LM_ADDR_FROM_LINK_MAP (struct so_list *so) { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - return (CORE_ADDR) extract_signed_integer (so->lm_info->lm - + lmo->l_addr_offset, - lmo->l_addr_size); + return extract_typed_address (so->lm_info->lm + lmo->l_addr_offset, + builtin_type_void_data_ptr); } static int @@ -149,7 +134,7 @@ HAS_LM_DYNAMIC_FROM_LINK_MAP () { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - return (lmo->l_ld_size != 0); + return lmo->l_ld_offset >= 0; } static CORE_ADDR @@ -157,11 +142,8 @@ LM_DYNAMIC_FROM_LINK_MAP (struct so_list *so) { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - gdb_assert (lmo->l_ld_size != 0); - - return (CORE_ADDR) extract_signed_integer (so->lm_info->lm - + lmo->l_ld_offset, - lmo->l_ld_size); + return extract_typed_address (so->lm_info->lm + lmo->l_ld_offset, + builtin_type_void_data_ptr); } static CORE_ADDR @@ -239,9 +221,8 @@ LM_NEXT (struct so_list *so) { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - /* Assume that the address is unsigned. */ - return extract_unsigned_integer (so->lm_info->lm + lmo->l_next_offset, - lmo->l_next_size); + return extract_typed_address (so->lm_info->lm + lmo->l_next_offset, + builtin_type_void_data_ptr); } static CORE_ADDR @@ -249,9 +230,8 @@ LM_NAME (struct so_list *so) { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - /* Assume that the address is unsigned. */ - return extract_unsigned_integer (so->lm_info->lm + lmo->l_name_offset, - lmo->l_name_size); + return extract_typed_address (so->lm_info->lm + lmo->l_name_offset, + builtin_type_void_data_ptr); } static int @@ -259,13 +239,16 @@ IGNORE_FIRST_LINK_MAP_ENTRY (struct so_list *so) { struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - /* Assume that the address is unsigned. */ - return extract_unsigned_integer (so->lm_info->lm + lmo->l_prev_offset, - lmo->l_prev_size) == 0; + /* Assume that everything is a library if the dynamic loader was loaded + late by a static executable. */ + if (bfd_get_section_by_name (exec_bfd, ".dynamic") == NULL) + return 0; + + return extract_typed_address (so->lm_info->lm + lmo->l_prev_offset, + builtin_type_void_data_ptr) == 0; } static CORE_ADDR debug_base; /* Base of dynamic linker structures */ -static CORE_ADDR breakpoint_addr; /* Address where end bkpt is set */ /* Validity flag for debug_loader_offset. */ static int debug_loader_offset_p; @@ -408,7 +391,18 @@ elf_locate_base (void) /* Find the start address of the .dynamic section. */ dyninfo_sect = bfd_get_section_by_name (exec_bfd, ".dynamic"); if (dyninfo_sect == NULL) - return 0; + { + /* This may be a static executable. Look for the symbol + conventionally named _r_debug, as a last resort. */ + struct minimal_symbol *msymbol; + + msymbol = lookup_minimal_symbol ("_r_debug", NULL, symfile_objfile); + if (msymbol != NULL) + return SYMBOL_VALUE_ADDRESS (msymbol); + else + return 0; + } + dyninfo_addr = bfd_section_vma (exec_bfd, dyninfo_sect); /* Read in .dynamic section, silently ignore errors. */ @@ -447,7 +441,7 @@ elf_locate_base (void) else if (dyn_tag == DT_MIPS_RLD_MAP) { gdb_byte *pbuf; - int pbuf_size = TARGET_PTR_BIT / HOST_CHAR_BIT; + int pbuf_size = TYPE_LENGTH (builtin_type_void_data_ptr); pbuf = alloca (pbuf_size); /* DT_MIPS_RLD_MAP contains a pointer to the address @@ -456,7 +450,7 @@ elf_locate_base (void) (bfd_byte *) x_dynp->d_un.d_ptr); if (target_read_memory (dyn_ptr, pbuf, pbuf_size)) return 0; - return extract_unsigned_integer (pbuf, pbuf_size); + return extract_typed_address (pbuf, builtin_type_void_data_ptr); } } } @@ -482,7 +476,7 @@ elf_locate_base (void) else if (dyn_tag == DT_MIPS_RLD_MAP) { gdb_byte *pbuf; - int pbuf_size = TARGET_PTR_BIT / HOST_CHAR_BIT; + int pbuf_size = TYPE_LENGTH (builtin_type_void_data_ptr); pbuf = alloca (pbuf_size); /* DT_MIPS_RLD_MAP contains a pointer to the address @@ -491,7 +485,7 @@ elf_locate_base (void) (bfd_byte *) x_dynp->d_un.d_ptr); if (target_read_memory (dyn_ptr, pbuf, pbuf_size)) return 0; - return extract_unsigned_integer (pbuf, pbuf_size); + return extract_typed_address (pbuf, builtin_type_void_data_ptr); } } } @@ -621,7 +615,8 @@ open_symbol_file_object (void *from_ttyp) int errcode; int from_tty = *(int *)from_ttyp; struct link_map_offsets *lmo = svr4_fetch_link_map_offsets (); - gdb_byte *l_name_buf = xmalloc (lmo->l_name_size); + int l_name_size = TYPE_LENGTH (builtin_type_void_data_ptr); + gdb_byte *l_name_buf = xmalloc (l_name_size); struct cleanup *cleanups = make_cleanup (xfree, l_name_buf); if (symfile_objfile) @@ -637,11 +632,10 @@ open_symbol_file_object (void *from_ttyp) return 0; /* failed somehow... */ /* Read address of name from target memory to GDB. */ - read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size); + read_memory (lm + lmo->l_name_offset, l_name_buf, l_name_size); - /* Convert the address to host format. Assume that the address is - unsigned. */ - l_name = extract_unsigned_integer (l_name_buf, lmo->l_name_size); + /* Convert the address to host format. */ + l_name = extract_typed_address (l_name_buf, builtin_type_void_data_ptr); /* Free l_name_buf. */ do_cleanups (cleanups); @@ -837,7 +831,8 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) struct lm_info objfile_lm_info; struct cleanup *old_chain; CORE_ADDR name_address; - gdb_byte *l_name_buf = xmalloc (lmo->l_name_size); + int l_name_size = TYPE_LENGTH (builtin_type_void_data_ptr); + gdb_byte *l_name_buf = xmalloc (l_name_size); old_chain = make_cleanup (xfree, l_name_buf); /* Set up the buffer to contain the portion of the link_map @@ -850,11 +845,11 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) read_memory (lm, objfile_lm_info.lm, lmo->link_map_size); /* Read address of name from target memory to GDB. */ - read_memory (lm + lmo->l_name_offset, l_name_buf, lmo->l_name_size); + read_memory (lm + lmo->l_name_offset, l_name_buf, l_name_size); - /* Extract this object's name. Assume that the address is - unsigned. */ - name_address = extract_unsigned_integer (l_name_buf, lmo->l_name_size); + /* Extract this object's name. */ + name_address = extract_typed_address (l_name_buf, + builtin_type_void_data_ptr); target_read_string (name_address, &buffer, SO_NAME_MAX_PATH_SIZE - 1, &errcode); make_cleanup (xfree, buffer); @@ -873,10 +868,9 @@ svr4_fetch_objfile_link_map (struct objfile *objfile) return lm; } } - /* Not the file we wanted, continue checking. Assume that the - address is unsigned. */ - lm = extract_unsigned_integer (objfile_lm_info.lm + lmo->l_next_offset, - lmo->l_next_size); + /* Not the file we wanted, continue checking. */ + lm = extract_typed_address (objfile_lm_info.lm + lmo->l_next_offset, + builtin_type_void_data_ptr); do_cleanups (old_chain); } return 0; @@ -907,7 +901,7 @@ static CORE_ADDR interp_text_sect_high; static CORE_ADDR interp_plt_sect_low; static CORE_ADDR interp_plt_sect_high; -static int +int svr4_in_dynsym_resolve_code (CORE_ADDR pc) { return ((pc >= interp_text_sect_low && pc < interp_text_sect_high) @@ -980,8 +974,6 @@ exec_entry_point (struct bfd *abfd, struct target_ops *targ) static int enable_break (void) { - int success = 0; - #ifdef BKPT_AT_SYMBOL struct minimal_symbol *msymbol; @@ -1134,11 +1126,10 @@ enable_break (void) "and track explicitly loaded dynamic code.")); } - /* Scan through the list of symbols, trying to look up the symbol and - set a breakpoint there. Terminate loop when we/if we succeed. */ + /* Scan through the lists of symbols, trying to look up the symbol and + set a breakpoint there. Terminate loop when we/if we succeed. */ - breakpoint_addr = 0; - for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++) + for (bkpt_namep = solib_break_names; *bkpt_namep != NULL; bkpt_namep++) { msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile); if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0)) @@ -1148,12 +1139,18 @@ enable_break (void) } } - /* Nothing good happened. */ - success = 0; - + for (bkpt_namep = bkpt_names; *bkpt_namep != NULL; bkpt_namep++) + { + msymbol = lookup_minimal_symbol (*bkpt_namep, NULL, symfile_objfile); + if ((msymbol != NULL) && (SYMBOL_VALUE_ADDRESS (msymbol) != 0)) + { + create_solib_event_breakpoint (SYMBOL_VALUE_ADDRESS (msymbol)); + return 1; + } + } #endif /* BKPT_AT_SYMBOL */ - return (success); + return 0; } /* @@ -1351,17 +1348,10 @@ svr4_solib_create_inferior_hook (void) svr4_relocate_main_executable (); if (!svr4_have_link_map_offsets ()) - { - warning (_("no shared library support for this OS / ABI")); - return; - - } + return; if (!enable_break ()) - { - warning (_("shared library handler failed to enable breakpoint")); - return; - } + return; #if defined(_SCO_DS) /* SCO needs the loop below, other systems should be using the @@ -1522,15 +1512,10 @@ svr4_ilp32_fetch_link_map_offsets (void) /* Everything we need is in the first 20 bytes. */ lmo.link_map_size = 20; lmo.l_addr_offset = 0; - lmo.l_addr_size = 4; lmo.l_name_offset = 4; - lmo.l_name_size = 4; lmo.l_ld_offset = 8; - lmo.l_ld_size = 4; lmo.l_next_offset = 12; - lmo.l_next_size = 4; lmo.l_prev_offset = 16; - lmo.l_prev_size = 4; } return lmp; @@ -1557,22 +1542,17 @@ svr4_lp64_fetch_link_map_offsets (void) /* Everything we need is in the first 40 bytes. */ lmo.link_map_size = 40; lmo.l_addr_offset = 0; - lmo.l_addr_size = 8; lmo.l_name_offset = 8; - lmo.l_name_size = 8; lmo.l_ld_offset = 16; - lmo.l_ld_size = 8; lmo.l_next_offset = 24; - lmo.l_next_size = 8; lmo.l_prev_offset = 32; - lmo.l_prev_size = 8; } return lmp; } -static struct target_so_ops svr4_so_ops; +struct target_so_ops svr4_so_ops; extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */