X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fsomsolib.c;h=d623e4b76db9aceeb39462baa43d8fb1c79a6a5c;hb=8513dd2d37a6265302833384f327f064ebc569e3;hp=4b93fdecf38392875ead0d11378b93cc7f75813a;hpb=4b048bc0967a115c456bf2bfb463f90564fdf519;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/somsolib.c b/gdb/somsolib.c index 4b93fdecf3..d623e4b76d 100644 --- a/gdb/somsolib.c +++ b/gdb/somsolib.c @@ -161,11 +161,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 @@ -403,11 +402,11 @@ som_solib_load_symbols (struct so_list *so, char *name, int from_tty, /* 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; @@ -715,7 +714,8 @@ som_solib_add (char *arg_string, int from_tty, struct target_ops *target) if (status != 0) goto err; - new_so->som_solib.next = (void *) extract_unsigned_integer (buf, 4); + new_so->som_solib.next = + address_to_host_pointer (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. @@ -777,12 +777,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 @@ -867,15 +869,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)); @@ -1263,8 +1265,10 @@ som_solib_desire_dynamic_linker_symbols (void) } /* Did we find everything we were looking for? If so, stop. */ - if ((dld_cache.load.address != NULL) && (dld_cache.load_stub.address != NULL) - && (dld_cache.unload.address != NULL) && (dld_cache.unload_stub.address != NULL)) + if ((dld_cache.load.address != 0) + && (dld_cache.load_stub.address != 0) + && (dld_cache.unload.address != 0) + && (dld_cache.unload_stub.address != 0)) { dld_cache.is_valid = 1; break; @@ -1467,7 +1471,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); } @@ -1568,28 +1572,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 (); }