/* 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.
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
{
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
{
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
{
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
{
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
{
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
{
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;
/* 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. */
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
(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);
}
}
}
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
(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);
}
}
}
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)
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);
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
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);
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;
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)
static int
enable_break (void)
{
- int success = 0;
-
#ifdef BKPT_AT_SYMBOL
struct minimal_symbol *msymbol;
"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))
}
}
- /* 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;
}
/*
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
natural pointer/address correspondence. (For example, on the MIPS,
converting a 32-bit pointer to a 64-bit CORE_ADDR requires you to
sign-extend the value. There, simply truncating the bits above
- TARGET_PTR_BIT, as we do below, is no good.) This should probably
+ gdbarch_ptr_bit, as we do below, is no good.) This should probably
be a new gdbarch method or something. */
static CORE_ADDR
svr4_truncate_ptr (CORE_ADDR addr)
{
- if (TARGET_PTR_BIT == sizeof (CORE_ADDR) * 8)
+ if (gdbarch_ptr_bit (current_gdbarch) == sizeof (CORE_ADDR) * 8)
/* We don't need to truncate anything, and the bit twiddling below
will fail due to overflow problems. */
return addr;
else
- return addr & (((CORE_ADDR) 1 << TARGET_PTR_BIT) - 1);
+ return addr & (((CORE_ADDR) 1 << gdbarch_ptr_bit (current_gdbarch)) - 1);
}
/* 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;
/* 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;
}
\f
-static struct target_so_ops svr4_so_ops;
+struct target_so_ops svr4_so_ops;
extern initialize_file_ftype _initialize_svr4_solib; /* -Wmissing-prototypes */