* 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:
parent
e0c6219855
commit
7be6775552
3 changed files with 81 additions and 21 deletions
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue