From 7c4c5d0c886627d069984c27c6748e41f1b5d681 Mon Sep 17 00:00:00 2001 From: danglin Date: Sat, 9 Aug 2008 18:21:58 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 13 ++++++++++++ gdb/solib-pa64.c | 28 +++++++++++++------------- gdb/solib-som.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 81 insertions(+), 21 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7db01e5eff..930a30cda6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,16 @@ +2008-08-09 John David Anglin + + * 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 H.J. Lu Mark Kettenis diff --git a/gdb/solib-pa64.c b/gdb/solib-pa64.c index af04b4de81..772b5dfc7b 100644 --- a/gdb/solib-pa64.c +++ b/gdb/solib-pa64.c @@ -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; diff --git a/gdb/solib-som.c b/gdb/solib-som.c index 247ada3664..4d876ffd49 100644 --- a/gdb/solib-som.c +++ b/gdb/solib-som.c @@ -30,6 +30,9 @@ #include "solist.h" #include "solib.h" +#include +#include + #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 . 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) { -- 2.11.0