X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fpa64solib.c;h=0bb3de8c8a31e07b414753f471709bac7d9fc63b;hb=1a6923e0319d4ede81d2d821d8a84bb97113b071;hp=f71d1b1c2473672050af7318098ce35b4d96bf2d;hpb=4e052eda914ce3a3c48b31a0d13bce89c364495e;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/pa64solib.c b/gdb/pa64solib.c index f71d1b1c24..0bb3de8c8a 100644 --- a/gdb/pa64solib.c +++ b/gdb/pa64solib.c @@ -1,5 +1,7 @@ /* Handle HP ELF shared libraries for GDB, the GNU Debugger. - Copyright 1999, 2001 Free Software Foundation, Inc. + + Copyright 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, + Inc. This file is part of GDB. @@ -47,9 +49,10 @@ #include "gdb-stabs.h" #include "gdb_stat.h" #include "gdbcmd.h" -#include "assert.h" #include "language.h" #include "regcache.h" +#include "exec.h" +#include "hppa-tdep.h" #include @@ -57,9 +60,6 @@ #define O_BINARY 0 #endif -/* Defined in exec.c; used to prevent dangling pointer bug. */ -extern struct target_ops exec_ops; - static CORE_ADDR bfd_lookup_symbol (bfd *, char *); /* This lives in hppa-tdep.c. */ extern struct unwind_table_entry *find_unwind_entry (CORE_ADDR pc); @@ -80,7 +80,7 @@ struct so_list struct load_module_desc pa64_solib_desc; struct section_table *sections; struct section_table *sections_end; - boolean loaded; + int loaded; }; static struct so_list *so_list_head; @@ -89,30 +89,30 @@ 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 - (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. */ + is compared against a 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. */ static LONGEST pa64_solib_total_st_size; /* When the threshold is reached for any shlib, we refuse to add symbols for subsequent shlibs, even if those shlibs' symbols would - be small enough to fit under the threshold. (Although this may + be small enough to fit under the threshold. Although this may result in one, early large shlib preventing the loading of later, - smalller shlibs' symbols, it allows us to issue one informational + smaller shlibs' symbols, it allows us to issue one informational message. The alternative, to issue a message for each shlib whose symbols aren't loaded, could be a big annoyance where the threshold - is exceeded due to a very large number of shlibs.) */ + is exceeded due to a very large number of shlibs. */ static int pa64_solib_st_size_threshold_exceeded; /* When adding fields, be sure to clear them in _initialize_pa64_solib. */ typedef struct { CORE_ADDR dld_flags_addr; - long long dld_flags; - sec_ptr dyninfo_sect; - boolean have_read_dld_descriptor; - boolean is_valid; + LONGEST dld_flags; + struct bfd_section *dyninfo_sect; + int have_read_dld_descriptor; + int is_valid; CORE_ADDR load_map; CORE_ADDR load_map_addr; struct load_module_desc dld_desc; @@ -127,11 +127,11 @@ static void pa64_solib_sharedlibrary_command (char *, int); static void *pa64_target_read_memory (void *, CORE_ADDR, size_t, int); -static boolean read_dld_descriptor (struct target_ops *); +static int read_dld_descriptor (struct target_ops *, int readsyms); -static boolean read_dynamic_info (asection *, dld_cache_t *); +static int read_dynamic_info (asection *, dld_cache_t *); -static void add_to_solist (boolean, char *, struct load_module_desc *, +static void add_to_solist (int, char *, int, struct load_module_desc *, CORE_ADDR, struct target_ops *); /* When examining the shared library for debugging information we have to @@ -221,10 +221,10 @@ pa64_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty, { bfd *tmp_bfd; asection *sec; - obj_private_data_t *obj_private; - struct section_addr_info section_addrs; + struct hppa_objfile_private *obj_private; + struct section_addr_info *section_addrs; + struct cleanup *my_cleanups; - memset (§ion_addrs, 0, sizeof (section_addrs)); /* We need the BFD so that we can look at its sections. We open up the file temporarily, then close it when we are done. */ tmp_bfd = bfd_openr (name, gnutarget); @@ -251,7 +251,7 @@ pa64_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty, /* Now find the true lowest section in the shared library. */ sec = NULL; - bfd_map_over_sections (tmp_bfd, find_lowest_section, (PTR) &sec); + bfd_map_over_sections (tmp_bfd, find_lowest_section, &sec); if (sec) { @@ -262,33 +262,38 @@ pa64_solib_add_solib_objfile (struct so_list *so, char *name, int from_tty, text_addr += sec->filepos; } + section_addrs = alloc_section_addr_info (bfd_count_sections (tmp_bfd)); + my_cleanups = make_cleanup (xfree, section_addrs); + /* We are done with the temporary bfd. Get rid of it and make sure nobody else can us it. */ bfd_close (tmp_bfd); tmp_bfd = NULL; /* Now let the generic code load up symbols for this library. */ - section_addrs.other[0].addr = text_addr; - section_addrs.other[0].name = ".text"; - so->objfile = symbol_file_add (name, from_tty, §ion_addrs, 0, OBJF_SHARED); + section_addrs->other[0].addr = text_addr; + section_addrs->other[0].name = ".text"; + so->objfile = symbol_file_add (name, from_tty, section_addrs, 0, OBJF_SHARED); so->abfd = so->objfile->obfd; /* Mark this as a shared library and save private data. */ so->objfile->flags |= OBJF_SHARED; - if (so->objfile->obj_private == NULL) + obj_private = (struct hppa_objfile_private *) + objfile_data (so->objfile, hppa_objfile_priv_data); + if (obj_private == NULL) { - obj_private = (obj_private_data_t *) - obstack_alloc (&so->objfile->psymbol_obstack, - sizeof (obj_private_data_t)); + obj_private = (struct hppa_objfile_private *) + obstack_alloc (&so->objfile->objfile_obstack, + sizeof (struct hppa_objfile_private)); + set_objfile_data (so->objfile, hppa_objfile_priv_data, obj_private); obj_private->unwind_info = NULL; obj_private->so_info = NULL; - so->objfile->obj_private = (PTR) obj_private; } - obj_private = (obj_private_data_t *) so->objfile->obj_private; obj_private->so_info = so; obj_private->dp = so->pa64_solib_desc.linkage_ptr; + do_cleanups (my_cleanups); } /* Load debugging information for a shared library. TARGET may be @@ -368,11 +373,11 @@ pa64_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 -pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target) +pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target, int readsyms) { struct minimal_symbol *msymbol; CORE_ADDR addr; @@ -415,7 +420,7 @@ pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target) /* Read in the load map pointer if we have not done so already. */ if (! dld_cache.have_read_dld_descriptor) - if (! read_dld_descriptor (target)) + if (! read_dld_descriptor (target, readsyms)) return; /* If the libraries were not mapped private, warn the user. */ @@ -439,7 +444,7 @@ pa64_solib_add (char *arg_string, int from_tty, struct target_ops *target) if (!dll_path) error ("pa64_solib_add, unable to read shared library path."); - add_to_solist (from_tty, dll_path, &dll_desc, 0, target); + add_to_solist (from_tty, dll_path, readsyms, &dll_desc, 0, target); } } @@ -644,7 +649,7 @@ pa64_solib_have_load_event (int pid) { CORE_ADDR event_kind; - event_kind = read_register (ARG0_REGNUM); + event_kind = read_register (HPPA_ARG0_REGNUM); return (event_kind == DLD_CB_LOAD); } @@ -655,7 +660,7 @@ pa64_solib_have_unload_event (int pid) { CORE_ADDR event_kind; - event_kind = read_register (ARG0_REGNUM); + event_kind = read_register (HPPA_ARG0_REGNUM); return (event_kind == DLD_CB_UNLOAD); } @@ -669,7 +674,7 @@ char * pa64_solib_loaded_library_pathname (int pid) { static char dll_path[MAXPATHLEN]; - CORE_ADDR dll_path_addr = read_register (ARG3_REGNUM); + CORE_ADDR dll_path_addr = read_register (HPPA_ARG3_REGNUM); read_memory_string (dll_path_addr, dll_path, MAXPATHLEN); return dll_path; } @@ -684,7 +689,7 @@ char * pa64_solib_unloaded_library_pathname (int pid) { static char dll_path[MAXPATHLEN]; - CORE_ADDR dll_path_addr = read_register (ARG3_REGNUM); + CORE_ADDR dll_path_addr = read_register (HPPA_ARG3_REGNUM); read_memory_string (dll_path_addr, dll_path, MAXPATHLEN); return dll_path; } @@ -700,7 +705,7 @@ pa64_solib_in_dynamic_linker (int pid, CORE_ADDR pc) return 0; if (!dld_cache.have_read_dld_descriptor) - if (!read_dld_descriptor (¤t_target)) + if (!read_dld_descriptor (¤t_target, auto_solib_add)) return 0; return (pc >= dld_cache.dld_desc.text_base @@ -818,7 +823,7 @@ static void pa64_solib_sharedlibrary_command (char *args, int from_tty) { dont_repeat (); - pa64_solib_add (args, from_tty, (struct target_ops *) 0); + pa64_solib_add (args, from_tty, (struct target_ops *) 0, 1); } /* Return the name of the shared library containing ADDR or NULL if ADDR @@ -886,28 +891,37 @@ _initialize_pa64_solib (void) "Load shared object library symbols for files matching REGEXP."); add_info ("sharedlibrary", pa64_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); + + 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_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 */ + /* ??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 */ pa64_solib_restart (); } @@ -926,8 +940,8 @@ so_lib_thread_start_addr (struct so_list *so) descriptor. If the library is archive bound, then return zero, else return nonzero. */ -static boolean -read_dld_descriptor (struct target_ops *target) +static int +read_dld_descriptor (struct target_ops *target, int readsyms) { char *dll_path; asection *dyninfo_sect; @@ -986,7 +1000,7 @@ read_dld_descriptor (struct target_ops *target) pa64_target_read_memory, 0, dld_cache.load_map); - add_to_solist(0, dll_path, &dld_cache.dld_desc, 0, target); + add_to_solist(0, dll_path, readsyms, &dld_cache.dld_desc, 0, target); return 1; } @@ -995,7 +1009,7 @@ read_dld_descriptor (struct target_ops *target) which is stored in dld_cache. The routine elf_locate_base in solib.c was used as a model for this. */ -static boolean +static int read_dynamic_info (asection *dyninfo_sect, dld_cache_t *dld_cache_p) { char *buf; @@ -1093,7 +1107,7 @@ pa64_target_read_memory (void *buffer, CORE_ADDR ptr, size_t bufsiz, int ident) be read from the inferior process at the address load_module_desc_addr. */ static void -add_to_solist (boolean from_tty, char *dll_path, +add_to_solist (int from_tty, char *dll_path, int readsyms, struct load_module_desc *load_module_desc_p, CORE_ADDR load_module_desc_addr, struct target_ops *target) { @@ -1149,7 +1163,7 @@ add_to_solist (boolean from_tty, char *dll_path, new_so->pa64_solib_desc_addr = load_module_desc_addr; new_so->loaded = 1; new_so->name = obsavestring (dll_path, strlen(dll_path), - &symfile_objfile->symbol_obstack); + &symfile_objfile->objfile_obstack); /* If we are not going to load the library, tell the user if we haven't already and return. */ @@ -1157,8 +1171,9 @@ add_to_solist (boolean from_tty, char *dll_path, st_size = pa64_solib_sizeof_symbol_table (dll_path); pa64_solib_st_size_threshhold_exceeded = !from_tty + && readsyms && ( (st_size + pa64_solib_total_st_size) - > (auto_solib_add * (LONGEST)1000000)); + > (auto_solib_limit * (LONGEST) (1024 * 1024))); if (pa64_solib_st_size_threshhold_exceeded) { pa64_solib_add_solib_objfile (new_so, dll_path, from_tty, 1); @@ -1214,13 +1229,13 @@ bfd_lookup_symbol (bfd *abfd, char *symname) if (storage_needed > 0) { symbol_table = (asymbol **) xmalloc (storage_needed); - back_to = make_cleanup (xfree, (PTR) symbol_table); + back_to = make_cleanup (xfree, symbol_table); number_of_symbols = bfd_canonicalize_symtab (abfd, symbol_table); for (i = 0; i < number_of_symbols; i++) { sym = *symbol_table++; - if (STREQ (sym->name, symname)) + if (strcmp (sym->name, symname) == 0) { /* Bfd symbols are section relative. */ symaddr = sym->value + sym->section->vma;