mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-26 17:18:55 +00:00
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.
This commit is contained in:
367
gdb/irix5-nat.c
367
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,27 +505,196 @@ 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;
|
||||
|
||||
read_memory (debug_base, (char *) &lm, sizeof (struct obj_list *));
|
||||
|
||||
if (lm == 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)
|
||||
return NULL;
|
||||
|
||||
/* Get address of first list entry. */
|
||||
read_memory (debug_base, (char *) &listp, sizeof (struct obj_list *));
|
||||
|
||||
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;
|
||||
|
||||
return s.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;
|
||||
}
|
||||
|
||||
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
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user