* solib-pa64.c (pa64_solib_create_inferior_hook): Don't set

DT_HP_DEBUG_PRIVATE.  Add warning if DT_HP_DEBUG_PRIVATE is not set.
	Revise comment.
	(pa64_current_sos): Remove map private warning warning.
	* solib-som.c: Include string.h and sys/utsname.h.
	(get_hpux_major_release): New function.
	(som_solib_create_inferior_hook): Read dynamic linker header.  Warn
	about shared library private mapping on HP-UX 11 and later.  Only force
	private mapping of shared libraries on HP-UX 10 and earlier.
	(link_map_start): Delete warning.
This commit is contained in:
Dave Anglin 2008-08-09 18:21:59 +00:00
parent e0c6219855
commit 7be6775552
3 changed files with 81 additions and 21 deletions

View File

@ -1,3 +1,16 @@
2008-08-09 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* solib-pa64.c (pa64_solib_create_inferior_hook): Don't set
DT_HP_DEBUG_PRIVATE. Add warning if DT_HP_DEBUG_PRIVATE is not set.
Revise comment.
(pa64_current_sos): Remove map private warning warning.
* solib-som.c: Include string.h and sys/utsname.h.
(get_hpux_major_release): New function.
(som_solib_create_inferior_hook): Read dynamic linker header. Warn
about shared library private mapping on HP-UX 11 and later. Only force
private mapping of shared libraries on HP-UX 10 and earlier.
(link_map_start): Delete warning.
2008-08-09 Xuepeng Guo <xuepeng.guo@intel.com> 2008-08-09 Xuepeng Guo <xuepeng.guo@intel.com>
H.J. Lu <hongjiu.lu@intel.com> H.J. Lu <hongjiu.lu@intel.com>
Mark Kettenis <kettenis@gnu.org> Mark Kettenis <kettenis@gnu.org>

View File

@ -322,13 +322,12 @@ bfd_lookup_symbol (bfd *abfd, char *symname)
to tell the dynamic linker that a private copy of the library is to tell the dynamic linker that a private copy of the library is
needed (so GDB can set breakpoints in the library). needed (so GDB can set breakpoints in the library).
We need to set two flag bits in this routine. We need to set DT_HP_DEBUG_CALLBACK to indicate that we want the
dynamic linker to call the breakpoint routine for significant events.
DT_HP_DEBUG_PRIVATE to indicate that shared libraries should be We used to set DT_HP_DEBUG_PRIVATE to indicate that shared libraries
mapped private. should be mapped private. However, this flag can be set using
"chatr +dbg enable". Not setting DT_HP_DEBUG_PRIVATE allows debugging
DT_HP_DEBUG_CALLBACK to indicate that we want the dynamic linker to with shared libraries mapped shareable. */
call the breakpoint routine for significant events. */
static void static void
pa64_solib_create_inferior_hook (void) pa64_solib_create_inferior_hook (void)
@ -360,8 +359,15 @@ pa64_solib_create_inferior_hook (void)
if (! read_dynamic_info (shlib_info, &dld_cache)) if (! read_dynamic_info (shlib_info, &dld_cache))
error (_("Unable to read the .dynamic section.")); error (_("Unable to read the .dynamic section."));
/* If the libraries were not mapped private, warn the user. */
if ((dld_cache.dld_flags & DT_HP_DEBUG_PRIVATE) == 0)
warning
(_("Private mapping of shared library text was not specified\n"
"by the executable; setting a breakpoint in a shared library which\n"
"is not privately mapped will not work. See the HP-UX 11i v3 chatr\n"
"manpage for methods to privately map shared library text."));
/* Turn on the flags we care about. */ /* Turn on the flags we care about. */
dld_cache.dld_flags |= DT_HP_DEBUG_PRIVATE;
dld_cache.dld_flags |= DT_HP_DEBUG_CALLBACK; dld_cache.dld_flags |= DT_HP_DEBUG_CALLBACK;
status = target_write_memory (dld_cache.dld_flags_addr, status = target_write_memory (dld_cache.dld_flags_addr,
(char *) &dld_cache.dld_flags, (char *) &dld_cache.dld_flags,
@ -454,12 +460,6 @@ pa64_current_sos (void)
if (! read_dld_descriptor ()) if (! read_dld_descriptor ())
return NULL; return NULL;
/* If the libraries were not mapped private, warn the user. */
if ((dld_cache.dld_flags & DT_HP_DEBUG_PRIVATE) == 0)
warning (_("The shared libraries were not privately mapped; setting a\n"
"breakpoint in a shared library will not work until you rerun "
"the program.\n"));
for (dll_index = -1; ; dll_index++) for (dll_index = -1; ; dll_index++)
{ {
struct load_module_desc dll_desc; struct load_module_desc dll_desc;

View File

@ -30,6 +30,9 @@
#include "solist.h" #include "solist.h"
#include "solib.h" #include "solib.h"
#include <sys/utsname.h>
#include <string.h>
#undef SOLIB_SOM_DBG #undef SOLIB_SOM_DBG
/* These ought to be defined in some public interface, but aren't. They /* These ought to be defined in some public interface, but aren't. They
@ -125,6 +128,38 @@ som_relocate_section_addresses (struct so_list *so,
; ;
} }
/* Get HP-UX major release number. Returns zero if the
release is not known. */
static int
get_hpux_major_release (void)
{
static int hpux_major_release = -1;
if (hpux_major_release == -1)
{
struct utsname x;
char *p;
uname (&x);
p = strchr (x.release, '.');
hpux_major_release = p ? atoi (p + 1) : 0;
}
return hpux_major_release;
}
/* DL header flag defines. */
#define SHLIB_TEXT_PRIVATE_ENABLE 0x4000
/* The DL header is documented in <shl.h>. We are only interested
in the flags field to determine whether the executable wants shared
libraries mapped private. */
struct {
short junk[37];
short flags;
} dl_header;
/* This hook gets called just before the first instruction in the /* This hook gets called just before the first instruction in the
inferior process is executed. inferior process is executed.
@ -170,6 +205,10 @@ som_solib_create_inferior_hook (void)
if (bfd_section_size (symfile_objfile->obfd, shlib_info) == 0) if (bfd_section_size (symfile_objfile->obfd, shlib_info) == 0)
return; return;
/* Read the DL header. */
bfd_get_section_contents (symfile_objfile->obfd, shlib_info,
(char *) &dl_header, 0, sizeof (dl_header));
have_endo = 0; have_endo = 0;
/* Slam the pid of the process into __d_pid. /* Slam the pid of the process into __d_pid.
@ -274,8 +313,22 @@ keep_going:
error (_("Unable to read __dld_flags.")); error (_("Unable to read __dld_flags."));
dld_flags = extract_unsigned_integer (buf, 4); dld_flags = extract_unsigned_integer (buf, 4);
/* If the libraries were not mapped private on HP-UX 11 and later, warn
the user. On HP-UX 10 and earlier, there is no easy way to specify
that shared libraries should be privately mapped. So, we just force
private mapping. */
if (get_hpux_major_release () >= 11
&& (dl_header.flags & SHLIB_TEXT_PRIVATE_ENABLE) == 0
&& (dld_flags & DLD_FLAGS_MAPPRIVATE) == 0)
warning
(_("Private mapping of shared library text was not specified\n"
"by the executable; setting a breakpoint in a shared library which\n"
"is not privately mapped will not work. See the HP-UX 11i v3 chatr\n"
"manpage for methods to privately map shared library text."));
/* Turn on the flags we care about. */ /* Turn on the flags we care about. */
dld_flags |= DLD_FLAGS_MAPPRIVATE; if (get_hpux_major_release () < 11)
dld_flags |= DLD_FLAGS_MAPPRIVATE;
if (have_endo) if (have_endo)
dld_flags |= DLD_FLAGS_HOOKVALID; dld_flags |= DLD_FLAGS_HOOKVALID;
store_unsigned_integer (buf, 4, dld_flags); store_unsigned_integer (buf, 4, dld_flags);
@ -486,12 +539,6 @@ link_map_start (void)
if ((dld_flags & DLD_FLAGS_LISTVALID) == 0) if ((dld_flags & DLD_FLAGS_LISTVALID) == 0)
error (_("__dld_list is not valid according to __dld_flags.")); error (_("__dld_list is not valid according to __dld_flags."));
/* If the libraries were not mapped private, warn the user. */
if ((dld_flags & DLD_FLAGS_MAPPRIVATE) == 0)
warning (_("The shared libraries were not privately mapped; setting a\n"
"breakpoint in a shared library will not work until you rerun the "
"program.\n"));
sym = lookup_minimal_symbol ("__dld_list", NULL, NULL); sym = lookup_minimal_symbol ("__dld_list", NULL, NULL);
if (!sym) if (!sym)
{ {