* 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>
H.J. Lu <hongjiu.lu@intel.com>
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
needed (so GDB can set breakpoints in the library).
We need to set two flag bits in this routine.
DT_HP_DEBUG_PRIVATE to indicate that shared libraries should be
mapped private.
DT_HP_DEBUG_CALLBACK to indicate that we want the dynamic linker to
call the breakpoint routine for significant events. */
We need to set DT_HP_DEBUG_CALLBACK to indicate that we want the
dynamic linker to call the breakpoint routine for significant events.
We used to set DT_HP_DEBUG_PRIVATE to indicate that shared libraries
should be mapped private. However, this flag can be set using
"chatr +dbg enable". Not setting DT_HP_DEBUG_PRIVATE allows debugging
with shared libraries mapped shareable. */
static 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))
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. */
dld_cache.dld_flags |= DT_HP_DEBUG_PRIVATE;
dld_cache.dld_flags |= DT_HP_DEBUG_CALLBACK;
status = target_write_memory (dld_cache.dld_flags_addr,
(char *) &dld_cache.dld_flags,
@ -454,12 +460,6 @@ pa64_current_sos (void)
if (! read_dld_descriptor ())
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++)
{
struct load_module_desc dll_desc;

View File

@ -30,6 +30,9 @@
#include "solist.h"
#include "solib.h"
#include <sys/utsname.h>
#include <string.h>
#undef SOLIB_SOM_DBG
/* 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
inferior process is executed.
@ -170,6 +205,10 @@ som_solib_create_inferior_hook (void)
if (bfd_section_size (symfile_objfile->obfd, shlib_info) == 0)
return;
/* Read the DL header. */
bfd_get_section_contents (symfile_objfile->obfd, shlib_info,
(char *) &dl_header, 0, sizeof (dl_header));
have_endo = 0;
/* Slam the pid of the process into __d_pid.
@ -274,8 +313,22 @@ keep_going:
error (_("Unable to read __dld_flags."));
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. */
dld_flags |= DLD_FLAGS_MAPPRIVATE;
if (get_hpux_major_release () < 11)
dld_flags |= DLD_FLAGS_MAPPRIVATE;
if (have_endo)
dld_flags |= DLD_FLAGS_HOOKVALID;
store_unsigned_integer (buf, 4, dld_flags);
@ -486,12 +539,6 @@ link_map_start (void)
if ((dld_flags & DLD_FLAGS_LISTVALID) == 0)
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);
if (!sym)
{