X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fsomsolib.c;h=7ecc97e64d18c74da01a4c9ea896271672b5dce1;hb=4a146b47d7355c3c0ef7004f35c6c9c9a88b80c0;hp=77c54e1218e077b17ede9db40c262f25f3005437;hpb=8f236061d95d934a70b505449f6235bbfaa90270;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/somsolib.c b/gdb/somsolib.c index 77c54e1218..7ecc97e64d 100644 --- a/gdb/somsolib.c +++ b/gdb/somsolib.c @@ -1,6 +1,7 @@ /* Handle HP SOM shared libraries for GDB, the GNU Debugger. - Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001 - Free Software Foundation, Inc. + + Copyright 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, + 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -38,9 +39,10 @@ #include "gdb-stabs.h" #include "gdb_stat.h" #include "gdbcmd.h" -#include "assert.h" #include "language.h" #include "regcache.h" +#include "gdb_assert.h" +#include "exec.h" #include @@ -54,10 +56,6 @@ /* #define SOLIB_DEBUG */ -/* Defined in exec.c; used to prevent dangling pointer bug. - */ -extern struct target_ops exec_ops; - /* This lives in hppa-tdep.c. */ extern struct unwind_table_entry *find_unwind_entry (CORE_ADDR pc); @@ -73,9 +71,6 @@ extern struct unwind_table_entry *find_unwind_entry (CORE_ADDR pc); /* TODO: - * Most of this code should work for hp300 shared libraries. Does - anyone care enough to weed out any SOM-isms. - * Support for hpux8 dynamic linker. */ /* The basic structure which describes a dynamically loaded object. This @@ -161,11 +156,10 @@ static struct so_list *so_list_head; shared objects on the so_list_head list. (When we say size, here we mean of the information before it is brought into memory and potentially expanded by GDB.) When adding a new shlib, this value - is compared against the threshold size, held by auto_solib_add + is compared against the threshold size, held by auto_solib_limit (in megabytes). If adding symbols for the new shlib would cause - the total size to exceed the threshold, then the new shlib's symbols - are not loaded. - */ + the total size to exceed the threshold, then the new shlib's + symbols are not loaded. */ static LONGEST som_solib_total_st_size; /* When the threshold is reached for any shlib, we refuse to add @@ -192,7 +186,7 @@ addr_and_unwind_t; /* When adding fields, be sure to clear them in _initialize_som_solib. */ static struct { - boolean is_valid; + int is_valid; addr_and_unwind_t hook; addr_and_unwind_t hook_stub; addr_and_unwind_t load; @@ -316,11 +310,11 @@ som_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty, if (so->objfile->obj_private == NULL) { obj_private = (obj_private_data_t *) - obstack_alloc (&so->objfile->psymbol_obstack, + obstack_alloc (&so->objfile->objfile_obstack, sizeof (obj_private_data_t)); obj_private->unwind_info = NULL; obj_private->so_info = NULL; - so->objfile->obj_private = (PTR) obj_private; + so->objfile->obj_private = obj_private; } obj_private = (obj_private_data_t *) so->objfile->obj_private; @@ -402,12 +396,27 @@ som_solib_load_symbols (struct so_list *so, char *name, int from_tty, } +/* FIXME: cagney/2003-02-01: This just isn't right. Given an address + within the target's address space, this converts the value into an + address within the host's (i.e., GDB's) address space. Given that + the host/target address spaces are separate, this can't be right. */ + +static void * +hpux_address_to_host_pointer_hack (CORE_ADDR addr) +{ + void *ptr; + + gdb_assert (sizeof (ptr) == TYPE_LENGTH (builtin_type_void_data_ptr)); + ADDRESS_TO_POINTER (builtin_type_void_data_ptr, &ptr, addr); + return ptr; +} + /* Add symbols from shared libraries into the symtab list, unless the - size threshold (specified by auto_solib_add, in megabytes) would + size threshold specified by auto_solib_limit (in megabytes) would be exceeded. */ void -som_solib_add (char *arg_string, int from_tty, struct target_ops *target) +som_solib_add (char *arg_string, int from_tty, struct target_ops *target, int readsyms) { struct minimal_symbol *msymbol; struct so_list *so_list_tail; @@ -419,7 +428,8 @@ som_solib_add (char *arg_string, int from_tty, struct target_ops *target) int threshold_warning_given = 0; /* First validate our arguments. */ - if ((re_err = re_comp (arg_string ? arg_string : ".")) != NULL) + re_err = re_comp (arg_string ? arg_string : "."); + if (re_err != NULL) { error ("Invalid regexp: %s", re_err); } @@ -633,7 +643,7 @@ som_solib_add (char *arg_string, int from_tty, struct target_ops *target) } name = obsavestring (name, name_len - 1, - &symfile_objfile->symbol_obstack); + &symfile_objfile->objfile_obstack); status = target_read_memory (addr + 8, buf, 4); if (status != 0) @@ -715,8 +725,10 @@ som_solib_add (char *arg_string, int from_tty, struct target_ops *target) if (status != 0) goto err; + /* FIXME: cagney/2003-02-01: I think som_solib.next should be a + CORE_ADDR. */ new_so->som_solib.next = - address_to_host_pointer (extract_unsigned_integer (buf, 4)); + hpux_address_to_host_pointer_hack (extract_unsigned_integer (buf, 4)); /* Note that we don't re-set "addr" to the next pointer * until after we've read the trailing data. @@ -778,12 +790,14 @@ som_solib_add (char *arg_string, int from_tty, struct target_ops *target) st_size = som_solib_sizeof_symbol_table (name); som_solib_st_size_threshold_exceeded = !from_tty && - ((st_size + som_solib_total_st_size) > (auto_solib_add * (LONGEST) 1000000)); + auto_solib_limit > 0 && + readsyms && + ((st_size + som_solib_total_st_size) > (auto_solib_limit * (LONGEST) (1024 * 1024))); if (som_solib_st_size_threshold_exceeded) { if (!threshold_warning_given) - warning ("Symbols for some libraries have not been loaded, because\ndoing so would exceed the size threshold specified by auto-solib-add.\nTo manually load symbols, use the 'sharedlibrary' command.\nTo raise the threshold, set auto-solib-add to a larger value and rerun\nthe program.\n"); + warning ("Symbols for some libraries have not been loaded, because\ndoing so would exceed the size threshold specified by auto-solib-limit.\nTo manually load symbols, use the 'sharedlibrary' command.\nTo raise the threshold, set auto-solib-limit to a larger value and rerun\nthe program.\n"); threshold_warning_given = 1; /* We'll still make note of this shlib, even if we don't @@ -868,15 +882,15 @@ som_solib_create_inferior_hook (void) return; have_endo = 0; - /* Slam the pid of the process into __d_pid; failing is only a warning! */ + /* Slam the pid of the process into __d_pid. + + We used to warn when this failed, but that warning is only useful + on very old HP systems (hpux9 and older). The warnings are an + annoyance to users of modern systems and foul up the testsuite as + well. As a result, the warnings have been disabled. */ msymbol = lookup_minimal_symbol ("__d_pid", NULL, symfile_objfile); if (msymbol == NULL) - { - warning ("Unable to find __d_pid symbol in object file."); - warning ("Suggest linking with /opt/langtools/lib/end.o."); - warning ("GDB will be unable to track shl_load/shl_unload calls"); - goto keep_going; - } + goto keep_going; anaddr = SYMBOL_VALUE_ADDRESS (msymbol); store_unsigned_integer (buf, 4, PIDGET (inferior_ptid)); @@ -919,8 +933,8 @@ som_solib_create_inferior_hook (void) struct minimal_symbol *msymbol2; /* What a crock. */ - msymbol2 = lookup_minimal_symbol_solib_trampoline (SYMBOL_NAME (msymbol), - NULL, objfile); + msymbol2 = lookup_minimal_symbol_solib_trampoline (DEPRECATED_SYMBOL_NAME (msymbol), + objfile); /* Found a symbol with the right name. */ if (msymbol2) { @@ -1208,7 +1222,6 @@ som_solib_desire_dynamic_linker_symbols (void) } dld_msymbol = lookup_minimal_symbol_solib_trampoline ("shl_load", - NULL, objfile); if (dld_msymbol != NULL) { @@ -1248,7 +1261,6 @@ som_solib_desire_dynamic_linker_symbols (void) } dld_msymbol = lookup_minimal_symbol_solib_trampoline ("shl_unload", - NULL, objfile); if (dld_msymbol != NULL) { @@ -1470,7 +1482,7 @@ static void som_solib_sharedlibrary_command (char *args, int from_tty) { dont_repeat (); - som_solib_add (args, from_tty, (struct target_ops *) 0); + som_solib_add (args, from_tty, (struct target_ops *) 0, 1); } @@ -1571,28 +1583,37 @@ _initialize_som_solib (void) "Load shared object library symbols for files matching REGEXP."); add_info ("sharedlibrary", som_sharedlibrary_info_command, "Status of loaded shared object libraries."); + add_show_from_set - (add_set_cmd ("auto-solib-add", class_support, var_zinteger, + (add_set_cmd ("auto-solib-add", class_support, var_boolean, (char *) &auto_solib_add, - "Set autoloading size threshold (in megabytes) of shared library symbols.\n\ -If nonzero, symbols from all shared object libraries will be loaded\n\ -automatically when the inferior begins execution or when the dynamic linker\n\ -informs gdb that a new library has been loaded, until the symbol table\n\ -of the program and libraries exceeds this threshold.\n\ -Otherwise, symbols must be loaded manually, using `sharedlibrary'.", + "Set autoloading of shared library symbols.\n\ +If \"on\", symbols from all shared object libraries will be loaded\n\ +automatically when the inferior begins execution, when the dynamic linker\n\ +informs gdb that a new library has been loaded, or when attaching to the\n\ +inferior. Otherwise, symbols must be loaded manually, using `sharedlibrary'.", &setlist), &showlist); - /* ??rehrauer: On HP-UX, the kernel parameter MAXDSIZ limits how much - data space a process can use. We ought to be reading MAXDSIZ and - setting auto_solib_add to some large fraction of that value. If - not that, we maybe ought to be setting it smaller than the default - for MAXDSIZ (that being 64Mb, I believe). However, [1] this threshold - is only crudely approximated rather than actually measured, and [2] - 50 Mbytes is too small for debugging gdb itself. Thus, the arbitrary - 100 figure. - */ - auto_solib_add = 100; /* Megabytes */ + add_show_from_set + (add_set_cmd ("auto-solib-limit", class_support, var_zinteger, + (char *) &auto_solib_limit, + "Set threshold (in Mb) for autoloading shared library symbols.\n\ +When shared library autoloading is enabled, new libraries will be loaded\n\ +only until the total size of shared library symbols exceeds this\n\ +threshold in megabytes. Is ignored when using `sharedlibrary'.", + &setlist), + &showlist); + + /* ??rehrauer: On HP-UX, the kernel parameter MAXDSIZ limits how + much data space a process can use. We ought to be reading + MAXDSIZ and setting auto_solib_limit to some large fraction of + that value. If not that, we maybe ought to be setting it smaller + than the default for MAXDSIZ (that being 64Mb, I believe). + However, [1] this threshold is only crudely approximated rather + than actually measured, and [2] 50 Mbytes is too small for + debugging gdb itself. Thus, the arbitrary 100 figure. */ + auto_solib_limit = 100; /* Megabytes */ som_solib_restart (); }