X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsolib-som.c;h=6100cbe6748f83fb7803d8f63a3817dcff16eb6b;hb=b786c521573fce15b05c4b879e05f9cc592e1e4b;hp=7608d5a5f1050e47b52cf7fce3fc2e92a6783536;hpb=7b6bb8daaceb9ecf3f42dea57ae82733d6a3b2f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/solib-som.c b/gdb/solib-som.c index 7608d5a5f1..6100cbe674 100644 --- a/gdb/solib-som.c +++ b/gdb/solib-som.c @@ -1,7 +1,6 @@ /* Handle SOM shared libraries. - Copyright (C) 2004, 2005, 2007, 2008, 2009, 2010, 2011 - Free Software Foundation, Inc. + Copyright (C) 2004-2005, 2007-2012 Free Software Foundation, Inc. This file is part of GDB. @@ -32,7 +31,6 @@ #include "solib.h" #include "solib-som.h" -#include #include #undef SOLIB_SOM_DBG @@ -40,8 +38,8 @@ /* These ought to be defined in some public interface, but aren't. They define the meaning of the various bits in the distinguished __dld_flags variable that is declared in every debuggable a.out on HP-UX, and that - is shared between the debugger and the dynamic linker. - */ + is shared between the debugger and the dynamic linker. */ + #define DLD_FLAGS_MAPPRIVATE 0x1 #define DLD_FLAGS_HOOKVALID 0x2 #define DLD_FLAGS_LISTVALID 0x4 @@ -49,7 +47,8 @@ struct lm_info { - /* Version of this structure (it is expected to change again in hpux10). */ + /* Version of this structure (it is expected to change again in + hpux10). */ unsigned char struct_version; /* Binding mode for this library. */ @@ -87,8 +86,8 @@ struct lm_info }; /* These addresses should be filled in by som_solib_create_inferior_hook. - They are also used elsewhere in this module. - */ + They are also used elsewhere in this module. */ + typedef struct { CORE_ADDR address; @@ -96,7 +95,7 @@ typedef struct } addr_and_unwind_t; -/* When adding fields, be sure to clear them in _initialize_som_solib. */ +/* When adding fields, be sure to clear them in _initialize_som_solib. */ static struct { int is_valid; @@ -130,24 +129,23 @@ 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; +/* Variable storing HP-UX major release number. - if (hpux_major_release == -1) - { - struct utsname x; - char *p; + On non-native system, simply assume that the major release number + is 11. On native systems, hppa-hpux-nat.c initialization code + sets this number to the real one on startup. + + We cannot compute this value here, because we need to make a native + call to "uname". We are are not allowed to do that from here, as + this file is used for both native and cross debugging. */ - uname (&x); - p = strchr (x.release, '.'); - hpux_major_release = p ? atoi (p + 1) : 0; - } +#define DEFAULT_HPUX_MAJOR_RELEASE 11 +int hpux_major_release = DEFAULT_HPUX_MAJOR_RELEASE; +static int +get_hpux_major_release (void) +{ return hpux_major_release; } @@ -238,8 +236,8 @@ GDB will be unable to track shl_load/shl_unload calls")); Note that the above is the pre-HP-UX 9.0 behaviour. At 9.0 and above, the dld provides an export stub named "__d_trap" as well as the function named "__d_trap" itself, but doesn't provide "_DLD_HOOK". - We'll look first for the old flavor and then the new. - */ + We'll look first for the old flavor and then the new. */ + msymbol = lookup_minimal_symbol ("_DLD_HOOK", NULL, symfile_objfile); if (msymbol == NULL) msymbol = lookup_minimal_symbol ("__d_trap", NULL, symfile_objfile); @@ -321,10 +319,11 @@ keep_going: && (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.")); + (_("\ +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. */ if (get_hpux_major_release () < 11) @@ -336,7 +335,7 @@ keep_going: if (status != 0) error (_("Unable to write __dld_flags.")); - /* Now find the address of _start and set a breakpoint there. + /* Now find the address of _start and set a breakpoint there. We still need this code for two reasons: * Not all sites have /opt/langtools/lib/end.o, so it's not always @@ -373,8 +372,8 @@ som_solib_desire_dynamic_linker_symbols (void) we've no work to do. (If you add clauses to this test, be sure to likewise update the - test within the loop.) - */ + test within the loop.) */ + if (dld_cache.is_valid) return; @@ -413,8 +412,8 @@ som_solib_desire_dynamic_linker_symbols (void) cover the body of "shl_unload", the second being 4 bytes past the end of the first. This is a large hack to handle that case, but since I don't seem to have any legitimate way to - look for this thing via the symbol table... - */ + look for this thing via the symbol table... */ + if (dld_cache.unload.unwind != NULL) { u = find_unwind_entry (dld_cache.unload.unwind->region_end + 4); @@ -441,7 +440,7 @@ som_solib_desire_dynamic_linker_symbols (void) } } - /* Did we find everything we were looking for? If so, stop. */ + /* Did we find everything we were looking for? If so, stop. */ if ((dld_cache.load.address != 0) && (dld_cache.load_stub.address != 0) && (dld_cache.unload.address != 0) @@ -456,8 +455,7 @@ som_solib_desire_dynamic_linker_symbols (void) dld_cache.hook_stub.unwind = find_unwind_entry (dld_cache.hook_stub.address); /* We're prepared not to find some of these symbols, which is why - this function is a "desire" operation, and not a "require". - */ + this function is a "desire" operation, and not a "require". */ } static int @@ -473,17 +471,17 @@ som_in_dynsym_resolve_code (CORE_ADDR pc) weren't mapped to a (writeable) private region. However, in that case the debugger probably isn't able to set the fundamental breakpoint in the dld callback anyways, so this hack should be - safe. - */ + safe. */ + if ((pc & (CORE_ADDR) 0xc0000000) == (CORE_ADDR) 0xc0000000) return 1; /* Cache the address of some symbols that are part of the dynamic - linker, if not already known. - */ + linker, if not already known. */ + som_solib_desire_dynamic_linker_symbols (); - /* Are we in the dld callback? Or its export stub? */ + /* Are we in the dld callback? Or its export stub? */ u_pc = find_unwind_entry (pc); if (u_pc == NULL) return 0; @@ -491,7 +489,7 @@ som_in_dynsym_resolve_code (CORE_ADDR pc) if ((u_pc == dld_cache.hook.unwind) || (u_pc == dld_cache.hook_stub.unwind)) return 1; - /* Or the interface of the dld (i.e., "shl_load" or friends)? */ + /* Or the interface of the dld (i.e., "shl_load" or friends)? */ if ((u_pc == dld_cache.load.unwind) || (u_pc == dld_cache.unload.unwind) || (u_pc == dld_cache.unload2.unwind) @@ -499,7 +497,7 @@ som_in_dynsym_resolve_code (CORE_ADDR pc) || (u_pc == dld_cache.unload_stub.unwind)) return 1; - /* Apparently this address isn't part of the dld's text. */ + /* Apparently this address isn't part of the dld's text. */ return 0; } @@ -565,7 +563,7 @@ link_map_start (void) return extract_unsigned_integer (buf, 4, byte_order); } -/* Does this so's name match the main binary? */ +/* Does this so's name match the main binary? */ static int match_main (const char *name) { @@ -705,7 +703,7 @@ som_open_symbol_file_object (void *from_ttyp) /* First link map member should be the executable. */ if ((lm = link_map_start ()) == 0) - return 0; /* failed somehow... */ + return 0; /* failed somehow... */ /* Read address of name from target memory to GDB. */ read_memory (lm + offsetof (struct dld_list, name), buf, 4); @@ -768,10 +766,11 @@ som_solib_get_got_by_pc (CORE_ADDR addr) return got_value; } -/* Return the address of the handle of the shared library in which ADDR belongs. - If ADDR isn't in any known shared library, return zero. */ -/* this function is used in initialize_hp_cxx_exception_support in - hppa-hpux-tdep.c */ +/* Return the address of the handle of the shared library in which + ADDR belongs. If ADDR isn't in any known shared library, return + zero. */ +/* This function is used in initialize_hp_cxx_exception_support in + hppa-hpux-tdep.c. */ static CORE_ADDR som_solib_get_solib_by_pc (CORE_ADDR addr) @@ -824,7 +823,7 @@ som_solib_select (struct gdbarch *gdbarch) } /* The rest of these functions are not part of the solib interface; they - are used by somread.c or hppa-hpux-tdep.c */ + are used by somread.c or hppa-hpux-tdep.c. */ int som_solib_section_offsets (struct objfile *objfile,