diff options
author | Peter Schauer <Peter.Schauer@mytum.de> | 1996-12-01 08:33:39 +0000 |
---|---|---|
committer | Peter Schauer <Peter.Schauer@mytum.de> | 1996-12-01 08:33:39 +0000 |
commit | 0db3fe94c3a498329fc165e3c0f61c25d8572a7c (patch) | |
tree | 6ecc1e45ddf5c90903fc8feafdd1d4c6c3777230 /gdb/irix5-nat.c | |
parent | 0e0f4106193758b063a6fa877f301c1844dae045 (diff) | |
download | binutils-gdb-0db3fe94c3a498329fc165e3c0f61c25d8572a7c.tar.gz |
Add support for Irix 6.2 native O32 and N32 ABI.
* config.in, configure.in, configure: Check for <objlist.h>.
* configure.tgt: Handle mips*-sgi-irix6* like irix5 for now.
* cp-valprint.c (cp_print_value_fields): Use SYMBOL_VALUE_ADDRESS
instead of SYMBOL_BLOCK_VALUE to get the address of a static member.
* dwarf2read.c: Turn warnings and recoverable errors into complaints,
add new complaints where appropriate.
gcc -Wall cleanup.
(struct line_head): Change line_base from char to int to avoid
problems with compilers whose plain char is represented by an
unsigned char.
(struct partial_die_info): Add is_declaration field.
(dwarf2_tmp_obstack): New obstack for allocating temporary storage
used during symbol reading.
(cu_header_offset): New variable for resolving relative reference
dies.
(optimized_out, basereg, islocal, frame_base_reg, frame_base_offset):
New interface variables for decode_locdesc.
(struct dwarf2_pinfo): New structure for communication between
psymtab and symtab reading, passed via pst->read_symtab_private.
(dwarf2_has_info, dwarf2_build_psymtabs): Accept objects files
without line number sections.
(dwarf2_build_psymtabs_hard): Initialize temporary obstack
for symbol reading.
Allocate and initialize pst->read_symtab_private.
Relocate pst->textlow and pst->texthigh with baseaddr.
(scan_partial_symbols): Do not add DW_AT_declaration symbols
to the partial symbol table.
Add file scope enumerator symbols to the partial symbol table.
Fix typo in highpc computation.
If we didn't find a lowpc, set it to highpc to avoid complaints
from `maint check.
(add_partial_symbol): Relocate symbol values with baseaddr.
Add static DW_TAG_subprogram and DW_TAG_variable symbols to the
minimal symbol table.
Obtain symbol values for DW_TAG_variable symbols from the location
descriptor, skip symbols with missing location desciptors.
Skip symbols for aggregate types without children.
Handle enumerator symbols.
(dwarf2_psymtab_to_symtab): Issue symbol reading message if verbose.
(psymtab_to_symtab_1): Set local variables from
pst->read_symtab_private, set cu_header_offset and baseaddr.
Initialize temporary obstack for symbol reading, initialize
buildsym and add a cleanup to really_free_pendings.
Relocate highpc with baseaddr when calling end_symtab.
If the compilation is from a C file generated by language
preprocessors, do not set the symtab language if it was already
deduced by start_subfile.
Removed verbose sorting symbol table message.
(process_die): Handle DW_TAG_ptr_to_member_type and
DW_TAG_reference_type.
Use read_subroutine_type to get the function type for
DW_TAG_subprogram before calling read_func_scope.
(read_file_scope): Initialize file name to <unknown>, start_subfile
expects a non-NULL name.
If we didn't find a lowpc, set it to highpc to avoid complaints
from finish_symbol.
Relocate lowpc and highpc with baseaddr.
Get rid of Irix6.2 native cc compile machine prefix in comp_dir.
Zero out ftypes for each new compilation unit (may be different
language or different objfile).
Accept compilation units without line number information, pass
comp_dir to decode_lines.
(read_func_scope): Initialize function name to <unknown> to avoid
core dumps when DW_AT_name is missing.
Relocate lowpc and highpc with baseaddr.
Handle DW_AT_frame_base, keep result for DW_OP_fbreg operations.
Pass function type to new_symbol.
(read_lexical_block_scope): Relocate lowpc and highpc with baseaddr.
(read_structure_scope): Set TYPE_TAG_NAME, not TYPE_NAME.
Handle DW_TAG_class_type.
Copy fields to type_obstack, release temporary storage for fields.
Don't add symbol if die is a stub die and has no children.
Handle C++ static member fields.
(read_enumeration): Set TYPE_TAG_NAME, not TYPE_NAME.
Copy fields to type_obstack, release temporary storage for fields.
Let new_symbol handle the symbol creation for enumerators
instead of handcrafting a symbol.
Determine signedness of enum type from enumerators.
(dwarf_read_array_type): Handle variable length arrays.
Use lookup_pointer_type instead of handcrafting a type.
Create array type only if a DW_TAG_subrange_type was found.
(read_tag_pointer_type, read_tag_reference_type):
Use lookup_pointer_type and lookup_reference_type instead
of handcrafting a type.
(read_tag_ptr_to_member_type): New function to handle
DW_TAG_ptr_to_member_type.
(read_subroutine_type): Handle parameter dies.
Use lookup_function_type instead of handcrafting a type.
(read_typedef): Allocate a TYPE_CODE_TYPEDEF type for the typedef.
(read_base_type): If the type has a name, use init_type to create
a new type instead of second guessing a fundamental type.
(read_comp_unit): Reset die reference table before building
a new one.
(dwarf2_read_section): Read section contents into psymbol_obstack.
(dwarf2_read_abbrevs): Handle unterminated abbreviations
for a compile unit gracefully.
(read_partial_die): Zero partial die before reading its info.
Handle DW_AT_declaration.
Fix typo in handling of DW_FORM_block4.
(read_full_die): Fix typo in handling of DW_FORM_block4.
(read_1_signed_byte, read_2_signed_bytes, read_4_signed_bytes):
New routines to get signed values from a buffer.
(read_n_bytes, read_string): Allocate storage from the temporary
obstack. If the host char size permits it, return pointer
to buffer instead of allocating storage.
(set_cu_language): Handle DW_LANG_Mips_Assembler.
(dwarf_attr): Return NULL if reference die for DW_AT_specification
or DW_AT_abstract_origin die is not found.
(record_minimal_symbol): Removed, replaced with a direct call to
prim_record_minimal_symbol, it now handles saving the string itself.
(convert_locdesc): Removed, partial symtab reading now uses
decode_locdesc.
(dwarf_attr): Use dwarf2_get_ref_die_offset to get the absolute
offset for the die reference.
(dwarf_decode_lines): Complain if the line section info is missing.
Use read_1_signed_byte to extract lh.line_base to avoid
problems with compilers whose plain char is represented by an
unsigned char.
Add cleanups for allocated temporary storage.
Start a subfile for the first file in the state machine.
Fix off by one problem with dirs.dirs access.
Use comp_dir when directory index is 0.
Support multiple sequences (from Jason Merrill <jason@cygnus.com>).
(dwarf2_start_subfile): Try to keep line numbers from identical
absolute and relative file names in a common subfile.
(new_symbol): Allocate symbol and symbol name on the symbol_obstack.
Set SYMBOL_LINE from DW_AT_decl_line if present.
Set SYMBOL_TYPE from passed type if not NULL.
Change DW_TAG_variable symbol types with missing type entries
to a sensible type.
Handle optimized_out, offreg and islocal storage classes.
Add external symbols with type information whose address isn't
known as LOC_UNRESOLVED symbols.
Synthesize typedefs for C++ classes, structs, unions and enumerations.
Handle DW_TAG_enumerator symbols, complain for unrecognized
symbol tags.
(die_type): A missing DW_AT_type represents a void type.
Use dwarf2_get_ref_die_offset to get the absolute offset for
the die reference.
(die_containing_type): New function to build type from
DW_AT_containing_type attribut.
(read_type_die): Handle DW_TAG_ptr_to_member_type.
Treat DW_TAG_subprogram like DW_TAG_subroutine_type.
(dwarf_base_type): Fix typo with creation of FT_UNSIGNED_SHORT
fundamental type.
(create_name): Removed, symbol name allocation is now done
in new_symbol.
(dump_die): Use print_address_numeric to print a CORE_ADDR.
(dwarf2_empty_die_ref_table): New function to clear the die
reference table.
(dwarf2_get_ref_die_offset): New function to get the absolute
die offset from a die reference attribute.
(decode_locdesc): Complete rewrite using a stack, code mostly
borrowed from dwarfread.c:locval.
(dwarf_alloc_type): Removed, replaced by direct calls to alloc_type.
(dwarf_alloc_block): Allocate block on temporary obstack.
* elfread.c (elf_symtab_read): When handling Irix dynamic symbols,
skip section name symbols and relocate all others.
(elf_symfile_read): Build dwarf2 psymtab even if offset is non-zero.
* irix5-nat.c (fetch_core_registers): Handle core_reg_sect
from N32 executables. Call registers_fetched after extracting
the registers.
(obj_list_variant, struct link_map, LM_OFFSET, LM_ADDR): New
definitions to enable support of O32 and N32 format objlists.
(struct so_list): New members offset, so_name and lmstart to
eliminate dependencies from the objlist format used.
(solib_map_sections, symbol_add_stub, solib_add,
info_sharedlibrary_command, solib_address, clear_solib): Use
so_name and LM_OFFSET.
(first_link_map_member): Rewrite to enable support of O32 and N32
format objlists.
(next_link_map_member, xfer_link_map_member): New functions to
support O32 and N32 format objlists.
(find_solib): Use first_link_map_member, next_link_map_member and
xfer_link_map_member.
(solib_create_inferior_hook): Use TARGET_SIGNAL_* instead of
host signal numbers.
* mdebugread.c (parse_partial_symbols, handle_psymbol_enumerators):
Pass CORE_ADDR variant to add_psymbol_to_list.
* mips-tdep.c (heuristic_proc_desc): Stop examining the prologue
if we encounter a positive stack adjustment. Handle `move $30,$sp'.
Handle `sd reg,offset($sp)' for 32 bit ABIs.
* symmisc.c (dump_msymbols, print_partial_symbols): Use
print_address_numeric to print a SYMBOL_VALUE_ADDRESS.
(dump_symtab): Print compilation directory if it is not NULL.
* valops.c (search_struct_field, value_struct_elt_for_reference):
Use SYMBOL_VALUE_ADDRESS instead of SYMBOL_BLOCK_VALUE to get the
address of a static member.
Diffstat (limited to 'gdb/irix5-nat.c')
-rw-r--r-- | gdb/irix5-nat.c | 365 |
1 files changed, 282 insertions, 83 deletions
diff --git a/gdb/irix5-nat.c b/gdb/irix5-nat.c index 7bba96da8b8..992c46d72cb 100644 --- a/gdb/irix5-nat.c +++ b/gdb/irix5-nat.c @@ -169,17 +169,53 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) int which; /* Unused */ CORE_ADDR reg_addr; /* Unused */ { - if (core_reg_size != REGISTER_BYTES) + if (core_reg_size == REGISTER_BYTES) + { + memcpy ((char *)registers, core_reg_sect, core_reg_size); + } + else if (core_reg_size == (2 * REGISTER_BYTES) && MIPS_REGSIZE == 4) + { + /* This is a core file from a N32 executable, 64 bits are saved + for all registers. */ + char *srcp = core_reg_sect; + char *dstp = registers; + int regno; + + for (regno = 0; regno < NUM_REGS; regno++) + { + if (regno >= FP0_REGNUM && regno < (FP0_REGNUM + 32)) + { + /* FIXME, this is wrong, N32 has 64 bit FP regs, but GDB + currently assumes that they are 32 bit. */ + *dstp++ = *srcp++; + *dstp++ = *srcp++; + *dstp++ = *srcp++; + *dstp++ = *srcp++; + srcp += 4; + } + else + { + srcp += 4; + *dstp++ = *srcp++; + *dstp++ = *srcp++; + *dstp++ = *srcp++; + *dstp++ = *srcp++; + } + } + } + else { warning ("wrong size gregset struct in core file"); return; } - memcpy ((char *)registers, core_reg_sect, core_reg_size); + registers_fetched (); } /* Irix 5 uses what appears to be a unique form of shared library support. This is a copy of solib.c modified for Irix 5. */ +/* FIXME: Most of this code could be merged with osfsolib.c and solib.c + by using next_link_map_member and xfer_link_map_member in solib.c. */ #include <sys/types.h> #include <signal.h> @@ -192,6 +228,13 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) #define __SYM_H__ #define __SYMCONST_H__ #include <obj.h> +#ifdef HAVE_OBJLIST_H +#include <objlist.h> +#endif + +#ifdef NEW_OBJ_INFO_MAGIC +#define HANDLE_NEW_OBJ_LIST +#endif #include "symtab.h" #include "bfd.h" @@ -207,16 +250,43 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) /* The symbol which starts off the list of shared libraries. */ #define DEBUG_BASE "__rld_obj_head" -/* How to get the loaded address of a shared library. */ -#define LM_ADDR(so) ((so)->lm.o_praw) +/* Irix 6.x introduces a new variant of object lists. + To be able to debug O32 executables under Irix 6, we have to handle both + variants. */ + +typedef enum +{ + OBJ_LIST_OLD, /* Pre Irix 6.x object list. */ + OBJ_LIST_32, /* 32 Bit Elf32_Obj_Info. */ + OBJ_LIST_64 /* 64 Bit Elf64_Obj_Info, FIXME not yet implemented. */ +} obj_list_variant; + +/* Define our own link_map structure. + This will help to share code with osfsolib.c and solib.c. */ + +struct link_map { + obj_list_variant l_variant; /* which variant of object list */ + CORE_ADDR l_lladdr; /* addr in inferior list was read from */ + CORE_ADDR l_next; /* address of next object list entry */ +}; + +/* Irix 5 shared objects are pre-linked to particular addresses + although the dynamic linker may have to relocate them if the + address ranges of the libraries used by the main program clash. + The offset is the difference between the address where the object + is mapped and the binding address of the shared library. */ +#define LM_OFFSET(so) ((so) -> offset) +/* Loaded address of shared library. */ +#define LM_ADDR(so) ((so) -> lmstart) char shadow_contents[BREAKPOINT_MAX]; /* Stash old bkpt addr contents */ struct so_list { struct so_list *next; /* next structure in linked list */ - struct obj_list ll; - struct obj lm; /* copy of link map from inferior */ - struct obj_list *lladdr; /* addr in inferior lm was read from */ + struct link_map lm; + CORE_ADDR offset; /* prelink to load address offset */ + char *so_name; /* shared object lib name */ + CORE_ADDR lmstart; /* lower addr bound of mapped object */ CORE_ADDR lmend; /* upper addr bound of mapped object */ char symbols_loaded; /* flag: symbols read in yet? */ char from_tty; /* flag: print msgs? */ @@ -251,9 +321,15 @@ symbol_add_stub PARAMS ((char *)); static struct so_list * find_solib PARAMS ((struct so_list *)); -static struct obj_list * +static struct link_map * first_link_map_member PARAMS ((void)); +static struct link_map * +next_link_map_member PARAMS ((struct so_list *)); + +static void +xfer_link_map_member PARAMS ((struct so_list *, struct link_map *)); + static CORE_ADDR locate_base PARAMS ((void)); @@ -297,9 +373,8 @@ solib_map_sections (so) struct section_table *p; struct cleanup *old_chain; bfd *abfd; - CORE_ADDR offset; - filename = tilde_expand (so -> lm.o_path); + filename = tilde_expand (so -> so_name); old_chain = make_cleanup (free, filename); scratch_chan = openp (getenv ("PATH"), 1, filename, O_RDONLY, 0, @@ -337,20 +412,13 @@ solib_map_sections (so) bfd_get_filename (exec_bfd), bfd_errmsg (bfd_get_error ())); } - /* Irix 5 shared objects are pre-linked to particular addresses - although the dynamic linker may have to relocate them if the - address ranges of the libraries used by the main program clash. - The offset is the difference between the address where the object - is mapped and the binding address of the shared library. */ - offset = (CORE_ADDR) LM_ADDR (so) - so -> lm.o_base_address; - for (p = so -> sections; p < so -> sections_end; p++) { /* Relocate the section binding addresses as recorded in the shared object's file by the offset to get the address to which the object was actually mapped. */ - p -> addr += offset; - p -> endaddr += offset; + p -> addr += LM_OFFSET (so); + p -> endaddr += LM_OFFSET (so); so -> lmend = (CORE_ADDR) max (p -> endaddr, so -> lmend); if (STREQ (p -> the_bfd_section -> name, ".text")) { @@ -437,31 +505,200 @@ DESCRIPTION Read in a copy of the first member in the inferior's dynamic link map from the inferior's dynamic linker structures, and return - a pointer to the copy in our address space. + a pointer to the link map descriptor. */ -static struct obj_list * +static struct link_map * first_link_map_member () { - struct obj_list *lm; - struct obj_list s; + struct obj_list *listp; + struct obj_list list_old; + struct link_map *lm; + static struct link_map first_lm; + CORE_ADDR lladdr; + CORE_ADDR next_lladdr; + + /* We have not already read in the dynamic linking structures + from the inferior, lookup the address of the base structure. */ + debug_base = locate_base (); + if (debug_base == 0) + return NULL; - read_memory (debug_base, (char *) &lm, sizeof (struct obj_list *)); + /* Get address of first list entry. */ + read_memory (debug_base, (char *) &listp, sizeof (struct obj_list *)); - if (lm == NULL) + if (listp == NULL) return NULL; + /* Get first list entry. */ + lladdr = (CORE_ADDR) listp; + read_memory (lladdr, (char *) &list_old, sizeof (struct obj_list)); + /* The first entry in the list is the object file we are debugging, so skip it. */ - read_memory ((CORE_ADDR) lm, (char *) &s, sizeof (struct obj_list)); + next_lladdr = (CORE_ADDR) list_old.next; + +#ifdef HANDLE_NEW_OBJ_LIST + if (list_old.data == NEW_OBJ_INFO_MAGIC) + { + Elf32_Obj_Info list_32; + + read_memory (lladdr, (char *) &list_32, sizeof (Elf32_Obj_Info)); + if (list_32.oi_size != sizeof (Elf32_Obj_Info)) + return NULL; + next_lladdr = (CORE_ADDR) list_32.oi_next; + } +#endif + + if (next_lladdr == 0) + return NULL; + + first_lm.l_lladdr = next_lladdr; + lm = &first_lm; + return lm; +} + +/* + +LOCAL FUNCTION + + next_link_map_member -- locate next member in dynamic linker's map + +SYNOPSIS + + static struct link_map *next_link_map_member (so_list_ptr) + +DESCRIPTION + + Read in a copy of the next member in the inferior's dynamic + link map from the inferior's dynamic linker structures, and return + a pointer to the link map descriptor. +*/ + +static struct link_map * +next_link_map_member (so_list_ptr) + struct so_list *so_list_ptr; +{ + struct link_map *lm = &so_list_ptr -> lm; + CORE_ADDR next_lladdr = lm -> l_next; + static struct link_map next_lm; + + if (next_lladdr == 0) + { + /* We have hit the end of the list, so check to see if any were + added, but be quiet if we can't read from the target any more. */ + int status = 0; + + if (lm -> l_variant == OBJ_LIST_OLD) + { + struct obj_list list_old; + + status = target_read_memory (lm -> l_lladdr, + (char *) &list_old, + sizeof (struct obj_list)); + next_lladdr = (CORE_ADDR) list_old.next; + } +#ifdef HANDLE_NEW_OBJ_LIST + else if (lm -> l_variant == OBJ_LIST_32) + { + Elf32_Obj_Info list_32; + status = target_read_memory (lm -> l_lladdr, + (char *) &list_32, + sizeof (Elf32_Obj_Info)); + next_lladdr = (CORE_ADDR) list_32.oi_next; + } +#endif + + if (status != 0 || next_lladdr == 0) + return NULL; + } - return s.next; + next_lm.l_lladdr = next_lladdr; + lm = &next_lm; + return lm; } /* LOCAL FUNCTION + xfer_link_map_member -- set local variables from dynamic linker's map + +SYNOPSIS + + static void xfer_link_map_member (so_list_ptr, lm) + +DESCRIPTION + + Read in a copy of the requested member in the inferior's dynamic + link map from the inferior's dynamic linker structures, and fill + in the necessary so_list_ptr elements. +*/ + +static void +xfer_link_map_member (so_list_ptr, lm) + struct so_list *so_list_ptr; + struct link_map *lm; +{ + struct obj_list list_old; + CORE_ADDR lladdr = lm -> l_lladdr; + struct link_map *new_lm = &so_list_ptr -> lm; + int errcode; + + read_memory (lladdr, (char *) &list_old, sizeof (struct obj_list)); + + new_lm -> l_variant = OBJ_LIST_OLD; + new_lm -> l_lladdr = lladdr; + new_lm -> l_next = (CORE_ADDR) list_old.next; + +#ifdef HANDLE_NEW_OBJ_LIST + if (list_old.data == NEW_OBJ_INFO_MAGIC) + { + Elf32_Obj_Info list_32; + + read_memory (lladdr, (char *) &list_32, sizeof (Elf32_Obj_Info)); + if (list_32.oi_size != sizeof (Elf32_Obj_Info)) + return; + new_lm -> l_variant = OBJ_LIST_32; + new_lm -> l_next = (CORE_ADDR) list_32.oi_next; + + target_read_string ((CORE_ADDR) list_32.oi_pathname, + &so_list_ptr -> so_name, + list_32.oi_pathname_len + 1, &errcode); + if (errcode != 0) + memory_error (errcode, (CORE_ADDR) list_32.oi_pathname); + + LM_ADDR (so_list_ptr) = (CORE_ADDR) list_32.oi_ehdr; + LM_OFFSET (so_list_ptr) + = (CORE_ADDR) list_32.oi_ehdr - (CORE_ADDR) list_32.oi_orig_ehdr; + } + else +#endif + { + struct obj obj_old; + + read_memory ((CORE_ADDR) list_old.data, (char *) &obj_old, + sizeof (struct obj)); + + target_read_string ((CORE_ADDR) obj_old.o_path, + &so_list_ptr -> so_name, + INT_MAX, &errcode); + if (errcode != 0) + memory_error (errcode, (CORE_ADDR) obj_old.o_path); + + LM_ADDR (so_list_ptr) = (CORE_ADDR) obj_old.o_praw; + LM_OFFSET (so_list_ptr) + = (CORE_ADDR) obj_old.o_praw - obj_old.o_base_address; + } + + solib_map_sections (so_list_ptr); +} + + +/* + +LOCAL FUNCTION + find_solib -- step through list of shared objects SYNOPSIS @@ -483,7 +720,7 @@ find_solib (so_list_ptr) struct so_list *so_list_ptr; /* Last lm or NULL for first one */ { struct so_list *so_list_next = NULL; - struct obj_list *lm = NULL; + struct link_map *lm = NULL; struct so_list *new; if (so_list_ptr == NULL) @@ -491,49 +728,21 @@ find_solib (so_list_ptr) /* We are setting up for a new scan through the loaded images. */ if ((so_list_next = so_list_head) == NULL) { - /* We have not already read in the dynamic linking structures - from the inferior, lookup the address of the base structure. */ - debug_base = locate_base (); - if (debug_base != 0) - { - /* Read the base structure in and find the address of the first - link map list member. */ - lm = first_link_map_member (); - } + /* Find the first link map list member. */ + lm = first_link_map_member (); } } else { /* We have been called before, and are in the process of walking the shared library list. Advance to the next shared object. */ - if ((lm = so_list_ptr->ll.next) == NULL) - { - /* We have hit the end of the list, so check to see if any were - added, but be quiet if we can't read from the target any more. */ - int status = target_read_memory ((CORE_ADDR) so_list_ptr -> lladdr, - (char *) &(so_list_ptr -> ll), - sizeof (struct obj_list)); - if (status == 0) - { - lm = so_list_ptr->ll.next; - } - else - { - lm = NULL; - } - } + lm = next_link_map_member (so_list_ptr); so_list_next = so_list_ptr -> next; } if ((so_list_next == NULL) && (lm != NULL)) { - int errcode; - char *buffer; - - /* Get next link map structure from inferior image and build a local - abbreviated load_map structure */ new = (struct so_list *) xmalloc (sizeof (struct so_list)); memset ((char *) new, 0, sizeof (struct so_list)); - new -> lladdr = lm; /* Add the new node as the next node in the list, or as the root node if this is the first one. */ if (so_list_ptr != NULL) @@ -545,16 +754,7 @@ find_solib (so_list_ptr) so_list_head = new; } so_list_next = new; - read_memory ((CORE_ADDR) lm, (char *) &(new -> ll), - sizeof (struct obj_list)); - read_memory ((CORE_ADDR) new->ll.data, (char *) &(new -> lm), - sizeof (struct obj)); - target_read_string ((CORE_ADDR)new->lm.o_path, &buffer, - INT_MAX, &errcode); - if (errcode != 0) - memory_error (errcode, (CORE_ADDR)new->lm.o_path); - new->lm.o_path = buffer; - solib_map_sections (new); + xfer_link_map_member (new, lm); } return (so_list_next); } @@ -582,11 +782,10 @@ symbol_add_stub (arg) bfd_map_over_sections (so -> abfd, find_lowest_section, (PTR) &lowest_sect); if (lowest_sect) - text_addr = bfd_section_vma (so -> abfd, lowest_sect) - + (CORE_ADDR) LM_ADDR (so) - so -> lm.o_base_address; + text_addr = bfd_section_vma (so -> abfd, lowest_sect) + LM_OFFSET (so); } - so -> objfile = symbol_file_add (so -> lm.o_path, so -> from_tty, + so -> objfile = symbol_file_add (so -> so_name, so -> from_tty, text_addr, 0, 0, 0); return (1); @@ -636,7 +835,7 @@ solib_add (arg_string, from_tty, target) count = 0; while ((so = find_solib (so)) != NULL) { - if (so -> lm.o_path[0]) + if (so -> so_name[0]) { count += so -> sections_end - so -> sections; } @@ -678,7 +877,7 @@ solib_add (arg_string, from_tty, target) /* Add these section table entries to the target's table. */ while ((so = find_solib (so)) != NULL) { - if (so -> lm.o_path[0]) + if (so -> so_name[0]) { count = so -> sections_end - so -> sections; memcpy ((char *) (target -> to_sections + old), @@ -693,14 +892,14 @@ solib_add (arg_string, from_tty, target) /* Now add the symbol files. */ while ((so = find_solib (so)) != NULL) { - if (so -> lm.o_path[0] && re_exec (so -> lm.o_path)) + if (so -> so_name[0] && re_exec (so -> so_name)) { so -> from_tty = from_tty; if (so -> symbols_loaded) { if (from_tty) { - printf_unfiltered ("Symbols already loaded for %s\n", so -> lm.o_path); + printf_unfiltered ("Symbols already loaded for %s\n", so -> so_name); } } else if (catch_errors @@ -751,7 +950,7 @@ info_sharedlibrary_command (ignore, from_tty) } while ((so = find_solib (so)) != NULL) { - if (so -> lm.o_path[0]) + if (so -> so_name[0]) { if (!header_done) { @@ -766,7 +965,7 @@ info_sharedlibrary_command (ignore, from_tty) local_hex_string_custom ((unsigned long) so -> lmend, "08l")); printf_unfiltered ("%-12s", so -> symbols_loaded ? "Yes" : "No"); - printf_unfiltered ("%s\n", so -> lm.o_path); + printf_unfiltered ("%s\n", so -> so_name); } } if (so_list_head == NULL) @@ -807,11 +1006,11 @@ solib_address (address) while ((so = find_solib (so)) != NULL) { - if (so -> lm.o_path[0]) + if (so -> so_name[0]) { if ((address >= (CORE_ADDR) LM_ADDR (so)) && (address < (CORE_ADDR) so -> lmend)) - return (so->lm.o_path); + return (so->so_name); } } return (0); @@ -845,7 +1044,7 @@ clear_solib() next = so_list_head -> next; if (bfd_filename) free ((PTR)bfd_filename); - free (so_list_head->lm.o_path); + free (so_list_head->so_name); free ((PTR)so_list_head); so_list_head = next; } @@ -993,13 +1192,13 @@ solib_create_inferior_hook() clear_proceed_status (); stop_soon_quietly = 1; - stop_signal = 0; + stop_signal = TARGET_SIGNAL_0; do { target_resume (-1, 0, stop_signal); wait_for_inferior (); } - while (stop_signal != SIGTRAP); + while (stop_signal != TARGET_SIGNAL_TRAP); /* We are now either at the "mapping complete" breakpoint (or somewhere else, a condition we aren't prepared to deal with anyway), so adjust |