1999-04-16 03:35:26 +02:00
|
|
|
|
/* GDB routines for manipulating objfiles.
|
2002-07-12 17:23:10 +02:00
|
|
|
|
|
|
|
|
|
Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
2003-02-04 19:07:01 +01:00
|
|
|
|
2001, 2002, 2003 Free Software Foundation, Inc.
|
2002-07-12 17:23:10 +02:00
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
Contributed by Cygnus Support, using pieces from other GDB modules.
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
This file is part of GDB.
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
|
(at your option) any later version.
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
GNU General Public License for more details.
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 59 Temple Place - Suite 330,
|
|
|
|
|
Boston, MA 02111-1307, USA. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* This file contains support routines for creating, manipulating, and
|
|
|
|
|
destroying objfile structures. */
|
|
|
|
|
|
|
|
|
|
#include "defs.h"
|
|
|
|
|
#include "bfd.h" /* Binary File Description */
|
|
|
|
|
#include "symtab.h"
|
|
|
|
|
#include "symfile.h"
|
|
|
|
|
#include "objfiles.h"
|
|
|
|
|
#include "gdb-stabs.h"
|
|
|
|
|
#include "target.h"
|
2002-07-12 17:23:10 +02:00
|
|
|
|
#include "bcache.h"
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
|
#include "gdb_stat.h"
|
|
|
|
|
#include <fcntl.h>
|
2002-07-29 Andrew Cagney <ac131313@redhat.com>
* gdb_obstack.h: New file.
* symtab.h: Include "gdb_obstack.h" instead of "obstack.h".
(obstack_chunk_alloc, obstack_chunk_free): Delete macros.
* objfiles.h: Include "gdb_obstack.h".
* Makefile.in (gdb_obstack_h): Define.
(symtab_h): Add $(gdb_obstack_h).
(objfiles_h): Add $(gdb_obstack_h).
* objfiles.c: Include "gdb_obstack.h" instead of "obstack.h".
* macrotab.c, cp-valprint.c, dbxread.c: Ditto.
* ch-typeprint.c, ch-valprint.c, dstread.c: Ditto.
* macroexp.c, p-typeprint.c, stabsread.c: Ditto.
* symtab.c, f-typeprint.c, mdebugread.c: Ditto.
* p-valprint.c, symmisc.c, typeprint.c: Ditto.
* symfile.c, coffread.c, c-typeprint.c: Ditto.
* buildsym.c, bcache.c, ada-typeprint.c: Ditto.
* Makefile.in (bcache.o): Update dependencies.
(buildsym.o, c-typeprint.o, ch-typeprint.o): Ditto.
(ch-valprint.o, coffread.o, cp-valprint.o): Ditto.
(dbxread.o, dstread.o, f-typeprint.o): Ditto.
(objfiles.o, p-typeprint.o, p-valprint.o): Ditto.
(stabsread.o, symfile.o, symmisc.o): Ditto.
(symtab.o, typeprint.o, macroexp.o): Ditto.
(macrotab.o, mdebugread.o): Ditto.
(f_lang_h, coff_sym_h, coff_symconst_h): Define.
(coff_ecoff_h, aout_aout64_h): Define.
(aout_stabs_gnu_h, libaout_h): Define.
2002-07-30 00:55:26 +02:00
|
|
|
|
#include "gdb_obstack.h"
|
1999-04-16 03:35:26 +02:00
|
|
|
|
#include "gdb_string.h"
|
2003-02-04 19:07:01 +01:00
|
|
|
|
#include "hashtab.h"
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-04-26 20:34:20 +02:00
|
|
|
|
#include "breakpoint.h"
|
2003-02-19 David Carlton <carlton@math.stanford.edu>
* Makefile.in (SFILES): Add block.c.
(block_h): New.
(COMMON_OBS): Add block.o.
(block.o): New.
(x86-64-tdep.o): Add $(block_h).
(values.o, valops.o, tracepoint.o, symtab.o, symmisc.o, symfile.o)
(stack.o, printcmd.o, p-exp.tab.o, parse.o, objfiles.o)
(objc-exp.tab.o, objc-lang.o, nlmread.o, mips-tdep.o, mdebugread.o)
(m2-exp.tab.o, linespec.o, jv-lang.o, jv-exp.tab.o, infcmd.o)
(f-valprint.o, findvar.o, f-exp.tab.o, expprint.o, coffread.o)
(c-exp.tab.o, buildsym.o, breakpoint.o, blockframe.o, ax-gdb.o)
(alpha-tdep.o, ada-lang.o, ada-exp.tab.o, mi-cmd-stack.o): Ditto.
* value.h: Add opaque declaration for struct block.
* parser-defs.h, objc-lang.h, buildsym.h, breakpoint.h: Ditto.
* ada-lang.h: Ditto.
* x86-64-tdep.c: #include "block.h"
* values.c, valops.c, tracepoint.c, symtab.c, symmisc.c: Ditto.
* symfile.c, stack.c, printcmd.c, p-exp.y, parse.c: Ditto.
* objfiles.c, objc-exp.y, objc-lang.c, nlmread.c: Ditto.
* mips-tdep.c, mdebugread.c, m2-exp.y, linespec.c: Ditto.
* jv-lang.c, jv-exp.y, infcmd.c, f-valprint.c: Ditto.
* findvar.c, f-exp.y, expprint.c, coffread.c, c-exp.y: Ditto.
* buildsym.c, breakpoint.c, blockframe.c, ax-gdb.c: Ditto.
* alpha-tdep.c, ada-lang.c, ada-exp.y: Ditto.
* blockframe.c (blockvector_for_pc_sect): Move to "block.c".
(blockvector_for_pc, block_for_pc_sect, block_for_pc): Ditto.
* symtab.c (block_function): Ditto.
(contained_in): Ditto.
* frame.h: Move block_for_pc and block_for_pc_sect declarations to
block.h. Add opaque declaration for struct block.
* symtab.h: Move block_function and contained_in declarations to
block.h. Add opaque declarations for struct block, struct
blockvector.
(struct block): Move to block.h.
(struct blockvector): Ditto.
(BLOCK_START, BLOCK_END, BLOCK_FUNCTION, BLOCK_SUPERBLOCK)
(BLOCK_GCC_COMPILED, BLOCK_HASHTABLE, BLOCK_NSYMS, BLOCK_SYM)
(BLOCK_BUCKETS, BLOCK_BUCKET, BLOCK_HASHTABLE_SIZE)
(ALL_BLOCK_SYMBOLS, BLOCK_SHOULD_SORT, BLOCKVECTOR_NBLOCKS)
(BLOCKVECTOR_BLOCK, GLOBAL_BLOCK, STATIC_BLOCK, FIRST_LOCAL_BLOCK):
Ditto.
* block.c: New file.
* block.h: New file.
2003-02-19 David Carlton <carlton@math.stanford.edu>
* mi-cmd-stack.c: #include "block.h"
2003-02-20 01:01:07 +01:00
|
|
|
|
#include "block.h"
|
2003-06-11 David Carlton <carlton@bactrian.org>
* dictionary.h: New.
* dictionary.c: New.
* block.h: Add opaque declaration for struct dictionary.
(struct block): Add 'dict' member; delete 'hashtable', 'nsyms',
'sym' members.
(BLOCK_DICT): New macro.
Delete macros BLOCK_HASHTABLE, BLOCK_NSYMS, BLOCK_SYM,
BLOCK_BUCKETS, BLOCK_BUCKET, BLOCK_HASHTABLE_SIZE,
BLOCK_SHOULD_SORT.
(ALL_BLOCK_SYMBOLS): Update definition.
* Makefile.in (SFILES): Add dictionary.c.
(dictionary_h): New.
(COMMON_OBS): Add dictionary.o.
(dictionary.o): New.
(ada-lang.o): Depend on dictionary_h.
(buildsym.o, coffread.o, jv-lang.o, mdebugread.o, objfiles.o)
(stack.o, symmisc.o, symtab.o, tracepoint.o, valops.o)
(mi-cmd-stack.o): Ditto.
(gdbtk-cmds.o): Update dependencies.
(gdbtk-stack.o): Ditto.
* ada-lang.c: Include dictionary.h.
(symtab_for_sym): Update uses of ALL_BLOCK_SYMBOLS.
(fill_in_ada_prototype, debug_print_block): Ditto.
(ada_add_block_symbols): Update uses of ALL_BLOCK_SYMBOLS; replace
explicit iteration by use of ALL_BLOCK_SYMBOLS. Delete variable
'is_sorted'.
* mdebugread.c: Include dictionary.h.
(struct parse_stack): Delete 'maxsyms' member.
(parse_symbol): Update calls to new_block. Delete calls to
shrink_block. Use dictionary methods.
(psymtab_to_symtab_1): Delete calls to sort_symtab_syms.
Update calls to new_symtab. Don't maintain maxsyms data.
(mylookup_symbol): Update use of ALL_BLOCK_SYMBOLS.
(add_symbol): Just call dict_add_symbol.
(new_symtab): Delete 'maxsyms' argument.
(new_symtab): Update calls to new_block.
(new_block): Delete 'maxsyms' argument; add 'function' argument.
(shrink_block): Delete function.
(fixup_sigtramp): Update call to new_block. Add symbol via
dict_add_symbol.
* jv-lang.c: Include dictionary.h.
(get_java_class_symtab): Set the BLOCK_DICT of the blocks
appropriately. Set class_symtab->free_func. Make sure the
blockvector is big enough to hold two blocks.
(add_class_symtab_symbol): Use dictionary methods.
(free_class_block): New function.
(type_from_class): Replace explicit iteration by
ALL_BLOCK_SYMBOLS.
* symtab.h (struct symtab): Replace 'free_ptr' method by
'free_func'.
* dwarf2read.c (psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* dwarfread.c (psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* coffread.c (coff_symfile_read): Delete call to sort_symtab_syms.
Include dictionary.h.
(patch_opaque_types): Update use of ALL_BLOCK_SYMBOLS.
* dbxread.c (dbx_psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* objfiles.c: Include dictionary.h.
(objfile_relocate): Update use of ALL_BLOCK_SYMBOLS.
* buildsym.c: Include dictionary.h.
(finish_block): Use dictionary methods.
(end_symtab): Set free_func to NULL, not free_ptr.
* tracepoint.c: Include dictionary.h.
(add_local_symbols): Update use of ALL_BLOCK_SYMBOLS.
(scope_info): Ditto.
* stack.c: Include dictionary.h.
(print_block_frame_locals): Update use of ALL_BLOCK_SYMBOLS.
(print_block_frame_labels, print_frame_arg_vars)
(print_frame_args): Ditto.
* symmisc.c (free_symtab_block): Use dictionary methods.
(dump_symtab): Ditto.
(free_symtab): Replace use of 'free_ptr' by 'free_func'.
Include dictionary.h.
* symfile.h: Delete declarations of sort_block_syms,
sort_symtab_syms.
* symfile.c (sort_block_syms): Delete.
(sort_symtab_syms): Delete.
* symtab.c: Include dictionary.h.
(lookup_block_symbol): Use dictionary iterators.
(find_pc_sect_symtab): Update use of ALL_BLOCK_SYMBOLS.
(search_symbols, make_symbol_completion_list): Ditto.
(make_symbol_overload_list): Ditto.
* valops.c (value_of_local): Use dict_empty.
Include dictionary.h.
2003-06-11 David Carlton <carlton@bactrian.org>
* generic/gdbtk-stack.c: Include dictionary.h.
(gdb_block_vars): Update use of ALL_BLOCK_SYMBOLS.
(gdb_get_blocks, gdb_get_vars_command): Ditto.
* generic/gdbtk-cmds.c: Include dictionary.h.
(gdb_listfuncs): Update use of ALL_BLOCK_SYMBOLS.
2003-06-11 David Carlton <carlton@bactrian.org>
* mi-cmd-stack.c: Include dictionary.h.
(list_args_or_locals): Update use of ALL_BLOCK_SYMBOLS.
2003-06-12 01:29:49 +02:00
|
|
|
|
#include "dictionary.h"
|
1999-04-26 20:34:20 +02:00
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
/* Prototypes for local functions */
|
|
|
|
|
|
|
|
|
|
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
|
|
|
|
|
|
2001-12-06 21:59:11 +01:00
|
|
|
|
#include "mmalloc.h"
|
|
|
|
|
|
2000-05-28 03:12:42 +02:00
|
|
|
|
static int open_existing_mapped_file (char *, long, int);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
2000-05-28 03:12:42 +02:00
|
|
|
|
static int open_mapped_file (char *filename, long mtime, int flags);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
static void *map_to_file (int);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
static void add_to_objfile_sections (bfd *, sec_ptr, void *);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* Externally visible variables that are owned by this module.
|
|
|
|
|
See declarations in objfile.h for more info. */
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
struct objfile *object_files; /* Linked list of all objfiles */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
struct objfile *current_objfile; /* For symbol file being read in */
|
|
|
|
|
struct objfile *symfile_objfile; /* Main symbol table loaded from */
|
|
|
|
|
struct objfile *rt_common_objfile; /* For runtime common symbols */
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
int mapped_symbol_files; /* Try to use mapped symbol files */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* Locate all mappable sections of a BFD file.
|
|
|
|
|
objfile_p_char is a char * to get it through
|
|
|
|
|
bfd_map_over_sections; we cast it back to its proper type. */
|
|
|
|
|
|
|
|
|
|
#ifndef TARGET_KEEP_SECTION
|
|
|
|
|
#define TARGET_KEEP_SECTION(ASECT) 0
|
|
|
|
|
#endif
|
|
|
|
|
|
1999-08-09 23:36:23 +02:00
|
|
|
|
/* Called via bfd_map_over_sections to build up the section table that
|
|
|
|
|
the objfile references. The objfile contains pointers to the start
|
|
|
|
|
of the table (objfile->sections) and to the first location after
|
|
|
|
|
the end of the table (objfile->sections_end). */
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
static void
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
add_to_objfile_sections (bfd *abfd, sec_ptr asect, void *objfile_p_char)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile *objfile = (struct objfile *) objfile_p_char;
|
|
|
|
|
struct obj_section section;
|
|
|
|
|
flagword aflag;
|
|
|
|
|
|
|
|
|
|
aflag = bfd_get_section_flags (abfd, asect);
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (!(aflag & SEC_ALLOC) && !(TARGET_KEEP_SECTION (asect)))
|
1999-04-16 03:35:26 +02:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
if (0 == bfd_section_size (abfd, asect))
|
|
|
|
|
return;
|
|
|
|
|
section.offset = 0;
|
|
|
|
|
section.objfile = objfile;
|
|
|
|
|
section.the_bfd_section = asect;
|
|
|
|
|
section.ovly_mapped = 0;
|
|
|
|
|
section.addr = bfd_section_vma (abfd, asect);
|
|
|
|
|
section.endaddr = section.addr + bfd_section_size (abfd, asect);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_grow (&objfile->psymbol_obstack, (char *) §ion, sizeof (section));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
objfile->sections_end = (struct obj_section *) (((unsigned long) objfile->sections_end) + 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Builds a section table for OBJFILE.
|
|
|
|
|
Returns 0 if OK, 1 on error (in which case bfd_error contains the
|
1999-08-09 23:36:23 +02:00
|
|
|
|
error).
|
|
|
|
|
|
|
|
|
|
Note that while we are building the table, which goes into the
|
|
|
|
|
psymbol obstack, we hijack the sections_end pointer to instead hold
|
|
|
|
|
a count of the number of sections. When bfd_map_over_sections
|
|
|
|
|
returns, this count is used to compute the pointer to the end of
|
|
|
|
|
the sections table, which then overwrites the count.
|
|
|
|
|
|
|
|
|
|
Also note that the OFFSET and OVLY_MAPPED in each table entry
|
|
|
|
|
are initialized to zero.
|
|
|
|
|
|
|
|
|
|
Also note that if anything else writes to the psymbol obstack while
|
|
|
|
|
we are building the table, we're pretty much hosed. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
build_objfile_section_table (struct objfile *objfile)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
/* objfile->sections can be already set when reading a mapped symbol
|
|
|
|
|
file. I believe that we do need to rebuild the section table in
|
|
|
|
|
this case (we rebuild other things derived from the bfd), but we
|
|
|
|
|
can't free the old one (it's in the psymbol_obstack). So we just
|
|
|
|
|
waste some memory. */
|
|
|
|
|
|
|
|
|
|
objfile->sections_end = 0;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
bfd_map_over_sections (objfile->obfd, add_to_objfile_sections, (char *) objfile);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
objfile->sections = (struct obj_section *)
|
|
|
|
|
obstack_finish (&objfile->psymbol_obstack);
|
|
|
|
|
objfile->sections_end = objfile->sections + (unsigned long) objfile->sections_end;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
return (0);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
1999-10-12 06:37:53 +02:00
|
|
|
|
/* Given a pointer to an initialized bfd (ABFD) and some flag bits
|
|
|
|
|
allocate a new objfile struct, fill it in as best we can, link it
|
|
|
|
|
into the list of all known objfiles, and return a pointer to the
|
|
|
|
|
new objfile struct.
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-10-12 06:37:53 +02:00
|
|
|
|
The FLAGS word contains various bits (OBJF_*) that can be taken as
|
|
|
|
|
requests for specific operations, like trying to open a mapped
|
|
|
|
|
version of the objfile (OBJF_MAPPED). Other bits like
|
|
|
|
|
OBJF_SHARED are simply copied through to the new objfile flags
|
|
|
|
|
member. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
2003-02-04 22:55:26 +01:00
|
|
|
|
/* NOTE: carlton/2003-02-04: This function is called with args NULL, 0
|
|
|
|
|
by jv-lang.c, to create an artificial objfile used to hold
|
|
|
|
|
information about dynamically-loaded Java classes. Unfortunately,
|
|
|
|
|
that branch of this function doesn't get tested very frequently, so
|
|
|
|
|
it's prone to breakage. (E.g. at one time the name was set to NULL
|
|
|
|
|
in that situation, which broke a loop over all names in the dynamic
|
|
|
|
|
library loader.) If you change this function, please try to leave
|
|
|
|
|
things in a consistent state even if abfd is NULL. */
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
struct objfile *
|
2000-07-30 03:48:28 +02:00
|
|
|
|
allocate_objfile (bfd *abfd, int flags)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile *objfile = NULL;
|
|
|
|
|
struct objfile *last_one = NULL;
|
|
|
|
|
|
1999-10-12 06:37:53 +02:00
|
|
|
|
if (mapped_symbol_files)
|
|
|
|
|
flags |= OBJF_MAPPED;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
|
|
|
|
|
if (abfd != NULL)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
/* If we can support mapped symbol files, try to open/reopen the
|
|
|
|
|
mapped file that corresponds to the file from which we wish to
|
|
|
|
|
read symbols. If the objfile is to be mapped, we must malloc
|
|
|
|
|
the structure itself using the mmap version, and arrange that
|
|
|
|
|
all memory allocation for the objfile uses the mmap routines.
|
|
|
|
|
If we are reusing an existing mapped file, from which we get
|
|
|
|
|
our objfile pointer, we have to make sure that we update the
|
|
|
|
|
pointers to the alloc/free functions in the obstack, in case
|
|
|
|
|
these functions have moved within the current gdb. */
|
|
|
|
|
|
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
|
|
fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
|
1999-10-12 06:37:53 +02:00
|
|
|
|
flags);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (fd >= 0)
|
|
|
|
|
{
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
void *md;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if ((md = map_to_file (fd)) == NULL)
|
|
|
|
|
{
|
|
|
|
|
close (fd);
|
|
|
|
|
}
|
|
|
|
|
else if ((objfile = (struct objfile *) mmalloc_getkey (md, 0)) != NULL)
|
|
|
|
|
{
|
|
|
|
|
/* Update memory corruption handler function addresses. */
|
|
|
|
|
init_malloc (md);
|
|
|
|
|
objfile->md = md;
|
|
|
|
|
objfile->mmfd = fd;
|
|
|
|
|
/* Update pointers to functions to *our* copies */
|
2003-02-04 19:07:01 +01:00
|
|
|
|
if (objfile->demangled_names_hash)
|
|
|
|
|
htab_set_functions_ex
|
|
|
|
|
(objfile->demangled_names_hash, htab_hash_string,
|
|
|
|
|
(int (*) (const void *, const void *)) streq, NULL,
|
|
|
|
|
objfile->md, xmcalloc, xmfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_chunkfun (&objfile->psymbol_cache.cache, xmmalloc);
|
2001-12-02 23:38:23 +01:00
|
|
|
|
obstack_freefun (&objfile->psymbol_cache.cache, xmfree);
|
2002-05-15 23:19:21 +02:00
|
|
|
|
obstack_chunkfun (&objfile->macro_cache.cache, xmmalloc);
|
|
|
|
|
obstack_freefun (&objfile->macro_cache.cache, xmfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_chunkfun (&objfile->psymbol_obstack, xmmalloc);
|
2001-12-02 23:38:23 +01:00
|
|
|
|
obstack_freefun (&objfile->psymbol_obstack, xmfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_chunkfun (&objfile->symbol_obstack, xmmalloc);
|
2001-12-02 23:38:23 +01:00
|
|
|
|
obstack_freefun (&objfile->symbol_obstack, xmfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_chunkfun (&objfile->type_obstack, xmmalloc);
|
2001-12-02 23:38:23 +01:00
|
|
|
|
obstack_freefun (&objfile->type_obstack, xmfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
/* If already in objfile list, unlink it. */
|
|
|
|
|
unlink_objfile (objfile);
|
|
|
|
|
/* Forget things specific to a particular gdb, may have changed. */
|
|
|
|
|
objfile->sf = NULL;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
/* Set up to detect internal memory corruption. MUST be
|
|
|
|
|
done before the first malloc. See comments in
|
|
|
|
|
init_malloc() and mmcheck(). */
|
|
|
|
|
|
|
|
|
|
init_malloc (md);
|
|
|
|
|
|
|
|
|
|
objfile = (struct objfile *)
|
|
|
|
|
xmmalloc (md, sizeof (struct objfile));
|
|
|
|
|
memset (objfile, 0, sizeof (struct objfile));
|
|
|
|
|
objfile->md = md;
|
|
|
|
|
objfile->mmfd = fd;
|
|
|
|
|
objfile->flags |= OBJF_MAPPED;
|
|
|
|
|
mmalloc_setkey (objfile->md, 0, objfile);
|
|
|
|
|
obstack_specify_allocation_with_arg (&objfile->psymbol_cache.cache,
|
2001-12-02 23:38:23 +01:00
|
|
|
|
0, 0, xmmalloc, xmfree,
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->md);
|
2002-05-15 23:19:21 +02:00
|
|
|
|
obstack_specify_allocation_with_arg (&objfile->macro_cache.cache,
|
|
|
|
|
0, 0, xmmalloc, xmfree,
|
|
|
|
|
objfile->md);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_specify_allocation_with_arg (&objfile->psymbol_obstack,
|
2001-12-02 23:38:23 +01:00
|
|
|
|
0, 0, xmmalloc, xmfree,
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->md);
|
|
|
|
|
obstack_specify_allocation_with_arg (&objfile->symbol_obstack,
|
2001-12-02 23:38:23 +01:00
|
|
|
|
0, 0, xmmalloc, xmfree,
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->md);
|
|
|
|
|
obstack_specify_allocation_with_arg (&objfile->type_obstack,
|
2001-12-02 23:38:23 +01:00
|
|
|
|
0, 0, xmmalloc, xmfree,
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->md);
|
|
|
|
|
}
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-10-12 06:37:53 +02:00
|
|
|
|
if ((flags & OBJF_MAPPED) && (objfile == NULL))
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
|
|
|
|
warning ("symbol table for '%s' will not be mapped",
|
|
|
|
|
bfd_get_filename (abfd));
|
1999-10-12 06:37:53 +02:00
|
|
|
|
flags &= ~OBJF_MAPPED;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#else /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-10-12 06:37:53 +02:00
|
|
|
|
if (flags & OBJF_MAPPED)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
warning ("mapped symbol tables are not supported on this machine; missing or broken mmap().");
|
|
|
|
|
|
|
|
|
|
/* Turn off the global flag so we don't try to do mapped symbol tables
|
1999-07-07 22:19:36 +02:00
|
|
|
|
any more, which shuts up gdb unless the user specifically gives the
|
|
|
|
|
"mapped" keyword again. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
mapped_symbol_files = 0;
|
1999-10-12 06:37:53 +02:00
|
|
|
|
flags &= ~OBJF_MAPPED;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* If we don't support mapped symbol files, didn't ask for the file to be
|
|
|
|
|
mapped, or failed to open the mapped file for some reason, then revert
|
|
|
|
|
back to an unmapped objfile. */
|
|
|
|
|
|
|
|
|
|
if (objfile == NULL)
|
|
|
|
|
{
|
|
|
|
|
objfile = (struct objfile *) xmalloc (sizeof (struct objfile));
|
|
|
|
|
memset (objfile, 0, sizeof (struct objfile));
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->md = NULL;
|
2002-07-12 17:23:10 +02:00
|
|
|
|
objfile->psymbol_cache = bcache_xmalloc ();
|
|
|
|
|
objfile->macro_cache = bcache_xmalloc ();
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_specify_allocation (&objfile->psymbol_obstack, 0, 0, xmalloc,
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_specify_allocation (&objfile->symbol_obstack, 0, 0, xmalloc,
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree);
|
1999-10-12 06:37:53 +02:00
|
|
|
|
flags &= ~OBJF_MAPPED;
|
2003-02-03 21:39:41 +01:00
|
|
|
|
|
|
|
|
|
terminate_minimal_symbol_table (objfile);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Update the per-objfile information that comes from the bfd, ensuring
|
|
|
|
|
that any data that is reference is saved in the per-objfile data
|
|
|
|
|
region. */
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->obfd = abfd;
|
|
|
|
|
if (objfile->name != NULL)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
2001-12-02 23:38:23 +01:00
|
|
|
|
xmfree (objfile->md, objfile->name);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
if (abfd != NULL)
|
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->name = mstrsave (objfile->md, bfd_get_filename (abfd));
|
|
|
|
|
objfile->mtime = bfd_get_mtime (abfd);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* Build section table. */
|
|
|
|
|
|
|
|
|
|
if (build_objfile_section_table (objfile))
|
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
error ("Can't find the file sections in `%s': %s",
|
|
|
|
|
objfile->name, bfd_errmsg (bfd_get_error ()));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
2003-02-04 22:55:26 +01:00
|
|
|
|
else
|
|
|
|
|
{
|
2003-05-02 19:00:57 +02:00
|
|
|
|
objfile->name = mstrsave (objfile->md, "<<anonymous objfile>>");
|
2003-02-04 22:55:26 +01:00
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Define as functions of OBJFILE. Add
sect_index_text, sect_index_data, sect_index_rodata,
sect_index_bss to objfile structure.
* gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Remove.
* objfiles.c (allocate_objfile): Initialize
sect_index_{text,data,bss,rodata} to -1, for error detection.
* symfile.c (default_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata} from bfd information.
* xcoffread.c (xcoff_symfile_offsets): Ditto.
* somread.c (som_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata}.
* coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
stabsread.c, symfile.c, xcoffread.c:
Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
current objfile.
* xcoffread.c: Add new field objfile to find_targ_sec_arg.
2000-05-04 18:52:34 +02:00
|
|
|
|
/* Initialize the section indexes for this objfile, so that we can
|
|
|
|
|
later detect if they are used w/o being properly assigned to. */
|
|
|
|
|
|
|
|
|
|
objfile->sect_index_text = -1;
|
|
|
|
|
objfile->sect_index_data = -1;
|
|
|
|
|
objfile->sect_index_bss = -1;
|
|
|
|
|
objfile->sect_index_rodata = -1;
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
/* Add this file onto the tail of the linked list of other such files. */
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile->next = NULL;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
if (object_files == NULL)
|
|
|
|
|
object_files = objfile;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
for (last_one = object_files;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
last_one->next;
|
|
|
|
|
last_one = last_one->next);
|
|
|
|
|
last_one->next = objfile;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
1999-10-12 06:37:53 +02:00
|
|
|
|
/* Save passed in flag bits. */
|
|
|
|
|
objfile->flags |= flags;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
return (objfile);
|
|
|
|
|
}
|
|
|
|
|
|
2003-02-03 21:39:41 +01:00
|
|
|
|
|
|
|
|
|
/* Create the terminating entry of OBJFILE's minimal symbol table.
|
|
|
|
|
If OBJFILE->msymbols is zero, allocate a single entry from
|
|
|
|
|
OBJFILE->symbol_obstack; otherwise, just initialize
|
|
|
|
|
OBJFILE->msymbols[OBJFILE->minimal_symbol_count]. */
|
|
|
|
|
void
|
|
|
|
|
terminate_minimal_symbol_table (struct objfile *objfile)
|
|
|
|
|
{
|
|
|
|
|
if (! objfile->msymbols)
|
|
|
|
|
objfile->msymbols = ((struct minimal_symbol *)
|
|
|
|
|
obstack_alloc (&objfile->symbol_obstack,
|
|
|
|
|
sizeof (objfile->msymbols[0])));
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
struct minimal_symbol *m
|
|
|
|
|
= &objfile->msymbols[objfile->minimal_symbol_count];
|
|
|
|
|
|
|
|
|
|
memset (m, 0, sizeof (*m));
|
2003-02-25 David Carlton <carlton@math.stanford.edu>
* symtab.h (SYMBOL_NATURAL_NAME): New macro.
(SYMBOL_LINKAGE_NAME): Ditto.
(SYMBOL_PRINT_NAME): Use SYMBOL_NATURAL_NAME and
SYMBOL_LINKAGE_NAME.
(struct general_symbol_info): Expand comment.
(DEPRECATED_SYMBOL_NAME): Rename from SYMBOL_NAME.
(SYMBOL_MATCHES_NAME): Use DEPRECATED_SYMBOL_NAME.
(SYMBOL_MATCHES_REGEXP): Ditto.
* symtab.c (symbol_natural_name): New function.
* objfiles.h: Replace all uses of SYMBOL_NAME by
DEPRECATED_SYMBOL_NAME.
* xcoffread.c, valops.c, typeprint.c, tracepoint.c: Ditto.
* symtab.c, symmisc.c, symfile.c, stack.c, stabsread.c: Ditto.
* somsolib.c, sol-thread.c, rs6000-tdep.c, p-valprint.c: Ditto.
* printcmd.c, objfiles.c, objc-lang.c, mipsread.c: Ditto.
* minsyms.c, mdebugread.c, linespec.c, jv-lang.c: Ditto.
* i386-tdep.c, i386-linux-tdep.c, hpread.c, hppa-tdep.c: Ditto.
* gnu-v2-abi.c, f-valprint.c, findvar.c, expprint.c: Ditto.
* dwarfread.c, dwarf2read.c, dbxread.c, c-valprint.c: Ditto.
* cp-valprint.c, coffread.c, buildsym.c, breakpoint.c: Ditto.
* blockframe.c, ax-gdb.c, arm-linux-tdep.c, ada-lang.c: Ditto.
* ada-exp.y: Ditto.
* ada-exp.y: Update copyright.
* sol-thread.c, mipsread.c, jv-lang.c, f-valprint.c: Ditto.
* cp-valprint.c: Ditto.
2003-02-25 David Carlton <carlton@math.stanford.edu>
* generic/gdbtk.h: Replace all instances of SYMBOL_NAME by
DEPRECATED_SYMBOL_NAME.
* generic/gdbtk-stack.c, generic/gdbtk-cmds.c: Ditto.
* generic/gdbtk-stack.c, generic/gdbtk-cmds.c: Update copyright.
2003-02-25 David Carlton <carlton@math.stanford.edu>
* mi-cmd-stack.c: Replace all instances of SYMBOL_NAME with
DEPRECATED_SYMBOL_NAME. Update copyright.
2003-02-25 22:36:23 +01:00
|
|
|
|
DEPRECATED_SYMBOL_NAME (m) = NULL;
|
2003-02-03 21:39:41 +01:00
|
|
|
|
SYMBOL_VALUE_ADDRESS (m) = 0;
|
|
|
|
|
MSYMBOL_INFO (m) = NULL;
|
|
|
|
|
MSYMBOL_TYPE (m) = mst_unknown;
|
|
|
|
|
SYMBOL_INIT_LANGUAGE_SPECIFIC (m, language_unknown);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
gdb/ChangeLog:
2003-01-23 Alexander Larsson <alexl@redhat.com>
Jim Blandy <jimb@redhat.com>
Add support for executables whose debug info has been separated
out into a separate file, leaving only a link behind.
* objfiles.h (struct objfile): New fields: separate_debug_objfile
and separate_debug_objfile_backlink.
(put_objfile_before): New declaration.
* symfile.c: #include "filenames.h".
(symbol_file_add_with_addrs_or_offsets): If this objfile has its
debug info in a separate file, read that, too. Save the addrs
argument, so we can use it again to read the separated debug info;
syms_from_objfile modifies the table we pass it.
(reread_symbols): After re-reading an objfile, call
reread_separate_symbols to refresh its separate debug info
objfile, if it has one.
(reread_separate_symbols, find_separate_debug_file,
get_debug_link_info, separate_debug_file_exists): New functions.
(debug_file_directory): New global var.
(_initialize_symfile): Initialize debug_file_directory, and
provide the new `set debug-file-directory' command to let the user
change it.
* objfiles.c (free_objfile): If this objfile has its debug info in
a separate objfile, free that one too. If this is itself a
separate debug info objfile, clear our parent's backlink.
(put_objfile_before): New function.
* utils.c (gnu_debuglink_crc32): New function.
* defs.h (gnu_debuglink_crc32): New declaration.
* Makefile.in (symfile.o): Note dependency on "filenames.h".
* configure.in: Handle --with-separate-debug-dir config option.
* acinclude.m4 (AC_DEFINE_DIR): New macro.
* acconfig.h (DEBUGDIR): New macro.
* configure, aclocal.m4, config.in: Regenerated.
gdb/doc/ChangeLog:
2003-01-23 Jim Blandy <jimb@redhat.com>
* gdb.texinfo (Separate Debug Files): New section.
2003-01-24 00:03:32 +01:00
|
|
|
|
/* Put one object file before a specified on in the global list.
|
|
|
|
|
This can be used to make sure an object file is destroyed before
|
|
|
|
|
another when using ALL_OBJFILES_SAFE to free all objfiles. */
|
|
|
|
|
void
|
|
|
|
|
put_objfile_before (struct objfile *objfile, struct objfile *before_this)
|
|
|
|
|
{
|
|
|
|
|
struct objfile **objp;
|
|
|
|
|
|
|
|
|
|
unlink_objfile (objfile);
|
|
|
|
|
|
|
|
|
|
for (objp = &object_files; *objp != NULL; objp = &((*objp)->next))
|
|
|
|
|
{
|
|
|
|
|
if (*objp == before_this)
|
|
|
|
|
{
|
|
|
|
|
objfile->next = *objp;
|
|
|
|
|
*objp = objfile;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal_error (__FILE__, __LINE__,
|
|
|
|
|
"put_objfile_before: before objfile not in list");
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
/* Put OBJFILE at the front of the list. */
|
|
|
|
|
|
|
|
|
|
void
|
2000-07-30 03:48:28 +02:00
|
|
|
|
objfile_to_front (struct objfile *objfile)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile **objp;
|
|
|
|
|
for (objp = &object_files; *objp != NULL; objp = &((*objp)->next))
|
|
|
|
|
{
|
|
|
|
|
if (*objp == objfile)
|
|
|
|
|
{
|
|
|
|
|
/* Unhook it from where it is. */
|
|
|
|
|
*objp = objfile->next;
|
|
|
|
|
/* Put it in the front. */
|
|
|
|
|
objfile->next = object_files;
|
|
|
|
|
object_files = objfile;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Unlink OBJFILE from the list of known objfiles, if it is found in the
|
|
|
|
|
list.
|
|
|
|
|
|
|
|
|
|
It is not a bug, or error, to call this function if OBJFILE is not known
|
|
|
|
|
to be in the current list. This is done in the case of mapped objfiles,
|
|
|
|
|
for example, just to ensure that the mapped objfile doesn't appear twice
|
|
|
|
|
in the list. Since the list is threaded, linking in a mapped objfile
|
|
|
|
|
twice would create a circular list.
|
|
|
|
|
|
|
|
|
|
If OBJFILE turns out to be in the list, we zap it's NEXT pointer after
|
|
|
|
|
unlinking it, just to ensure that we have completely severed any linkages
|
|
|
|
|
between the OBJFILE and the list. */
|
|
|
|
|
|
|
|
|
|
void
|
2000-07-30 03:48:28 +02:00
|
|
|
|
unlink_objfile (struct objfile *objfile)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
struct objfile **objpp;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (*objpp == objfile)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
*objpp = (*objpp)->next;
|
|
|
|
|
objfile->next = NULL;
|
Deal with the inferior unloading shared objects.
* solib.c (current_sos): New function, replacing find_solib.
(find_solib): Deleted.
(free_so): New function.
(clear_solib): Call free_so, instead of writing it out.
(solib_add): Rewritten: compare the inferior's current list of
shared objects with GDB's list, and do the required loads and
unloads.
(info_sharedlibrary_command, solib_address): Don't use find_solib
to walk the list of shared libraries: call solib_add, and then
walk the list at so_list_head normally.
* objfiles.c (free_objfile): Don't call CLEAR_SOLIB, and don't
detach the core target. These tasks are taken care of elsewhere.
* target.c (remove_target_sections): New function.
* target.h (remove_target_sections): New declaration.
* solib.c (symbol_add_stub): Check whether we've already created
an objfile for this shared object first, before doing all that
work to compute section addresses, etc.
* objfiles.c (unlink_objfile): Report an internal error if objfile
doesn't occur in the object_files list.
* solib.c (special_symbol_handling): Delete argument; it's not
used.
* solib.c (SOLIB_EXTRACT_ADDRESS): New macro to extract addresses
from solib structures. Use it throughout solib.c, get rid of all
CORE_ADDR casts.
(struct so_list): Change type of lmaddr to CORE_ADDR.
(first_link_map_member): Change return value type to CORE_ADDR,
update callers.
(solib_add_common_symbols): Change parameter type to CORE_ADDR,
update callers.
(open_symbol_file_object, find_solib): Change type of lm variable
to CORE_ADDR.
2000-03-15 17:55:07 +01:00
|
|
|
|
return;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
Deal with the inferior unloading shared objects.
* solib.c (current_sos): New function, replacing find_solib.
(find_solib): Deleted.
(free_so): New function.
(clear_solib): Call free_so, instead of writing it out.
(solib_add): Rewritten: compare the inferior's current list of
shared objects with GDB's list, and do the required loads and
unloads.
(info_sharedlibrary_command, solib_address): Don't use find_solib
to walk the list of shared libraries: call solib_add, and then
walk the list at so_list_head normally.
* objfiles.c (free_objfile): Don't call CLEAR_SOLIB, and don't
detach the core target. These tasks are taken care of elsewhere.
* target.c (remove_target_sections): New function.
* target.h (remove_target_sections): New declaration.
* solib.c (symbol_add_stub): Check whether we've already created
an objfile for this shared object first, before doing all that
work to compute section addresses, etc.
* objfiles.c (unlink_objfile): Report an internal error if objfile
doesn't occur in the object_files list.
* solib.c (special_symbol_handling): Delete argument; it's not
used.
* solib.c (SOLIB_EXTRACT_ADDRESS): New macro to extract addresses
from solib structures. Use it throughout solib.c, get rid of all
CORE_ADDR casts.
(struct so_list): Change type of lmaddr to CORE_ADDR.
(first_link_map_member): Change return value type to CORE_ADDR,
update callers.
(solib_add_common_symbols): Change parameter type to CORE_ADDR,
update callers.
(open_symbol_file_object, find_solib): Change type of lm variable
to CORE_ADDR.
2000-03-15 17:55:07 +01:00
|
|
|
|
|
2001-02-08 07:03:54 +01:00
|
|
|
|
internal_error (__FILE__, __LINE__,
|
|
|
|
|
"unlink_objfile: objfile already unlinked");
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Destroy an objfile and all the symtabs and psymtabs under it. Note
|
|
|
|
|
that as much as possible is allocated on the symbol_obstack and
|
|
|
|
|
psymbol_obstack, so that the memory can be efficiently freed.
|
|
|
|
|
|
|
|
|
|
Things which we do NOT free because they are not in malloc'd memory
|
|
|
|
|
or not in memory specific to the objfile include:
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
objfile -> sf
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
FIXME: If the objfile is using reusable symbol information (via mmalloc),
|
|
|
|
|
then we need to take into account the fact that more than one process
|
|
|
|
|
may be using the symbol information at the same time (when mmalloc is
|
|
|
|
|
extended to support cooperative locking). When more than one process
|
|
|
|
|
is using the mapped symbol info, we need to be more careful about when
|
|
|
|
|
we free objects in the reusable area. */
|
|
|
|
|
|
|
|
|
|
void
|
2000-07-30 03:48:28 +02:00
|
|
|
|
free_objfile (struct objfile *objfile)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
gdb/ChangeLog:
2003-01-23 Alexander Larsson <alexl@redhat.com>
Jim Blandy <jimb@redhat.com>
Add support for executables whose debug info has been separated
out into a separate file, leaving only a link behind.
* objfiles.h (struct objfile): New fields: separate_debug_objfile
and separate_debug_objfile_backlink.
(put_objfile_before): New declaration.
* symfile.c: #include "filenames.h".
(symbol_file_add_with_addrs_or_offsets): If this objfile has its
debug info in a separate file, read that, too. Save the addrs
argument, so we can use it again to read the separated debug info;
syms_from_objfile modifies the table we pass it.
(reread_symbols): After re-reading an objfile, call
reread_separate_symbols to refresh its separate debug info
objfile, if it has one.
(reread_separate_symbols, find_separate_debug_file,
get_debug_link_info, separate_debug_file_exists): New functions.
(debug_file_directory): New global var.
(_initialize_symfile): Initialize debug_file_directory, and
provide the new `set debug-file-directory' command to let the user
change it.
* objfiles.c (free_objfile): If this objfile has its debug info in
a separate objfile, free that one too. If this is itself a
separate debug info objfile, clear our parent's backlink.
(put_objfile_before): New function.
* utils.c (gnu_debuglink_crc32): New function.
* defs.h (gnu_debuglink_crc32): New declaration.
* Makefile.in (symfile.o): Note dependency on "filenames.h".
* configure.in: Handle --with-separate-debug-dir config option.
* acinclude.m4 (AC_DEFINE_DIR): New macro.
* acconfig.h (DEBUGDIR): New macro.
* configure, aclocal.m4, config.in: Regenerated.
gdb/doc/ChangeLog:
2003-01-23 Jim Blandy <jimb@redhat.com>
* gdb.texinfo (Separate Debug Files): New section.
2003-01-24 00:03:32 +01:00
|
|
|
|
if (objfile->separate_debug_objfile)
|
|
|
|
|
{
|
|
|
|
|
free_objfile (objfile->separate_debug_objfile);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (objfile->separate_debug_objfile_backlink)
|
|
|
|
|
{
|
|
|
|
|
/* We freed the separate debug file, make sure the base objfile
|
|
|
|
|
doesn't reference it. */
|
|
|
|
|
objfile->separate_debug_objfile_backlink->separate_debug_objfile = NULL;
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
/* First do any symbol file specific actions required when we are
|
|
|
|
|
finished with a particular symbol file. Note that if the objfile
|
|
|
|
|
is using reusable symbol information (via mmalloc) then each of
|
|
|
|
|
these routines is responsible for doing the correct thing, either
|
|
|
|
|
freeing things which are valid only during this particular gdb
|
|
|
|
|
execution, or leaving them to be reused during the next one. */
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (objfile->sf != NULL)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
(*objfile->sf->sym_finish) (objfile);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* We always close the bfd. */
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (objfile->obfd != NULL)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
char *name = bfd_get_filename (objfile->obfd);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (!bfd_close (objfile->obfd))
|
1999-04-16 03:35:26 +02:00
|
|
|
|
warning ("cannot close \"%s\": %s",
|
|
|
|
|
name, bfd_errmsg (bfd_get_error ()));
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree (name);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Remove it from the chain of all objfiles. */
|
|
|
|
|
|
|
|
|
|
unlink_objfile (objfile);
|
|
|
|
|
|
|
|
|
|
/* If we are going to free the runtime common objfile, mark it
|
|
|
|
|
as unallocated. */
|
|
|
|
|
|
|
|
|
|
if (objfile == rt_common_objfile)
|
|
|
|
|
rt_common_objfile = NULL;
|
|
|
|
|
|
|
|
|
|
/* Before the symbol table code was redone to make it easier to
|
|
|
|
|
selectively load and remove information particular to a specific
|
|
|
|
|
linkage unit, gdb used to do these things whenever the monolithic
|
|
|
|
|
symbol table was blown away. How much still needs to be done
|
|
|
|
|
is unknown, but we play it safe for now and keep each action until
|
|
|
|
|
it is shown to be no longer needed. */
|
1999-07-07 22:19:36 +02:00
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
/* I *think* all our callers call clear_symtab_users. If so, no need
|
|
|
|
|
to call this here. */
|
|
|
|
|
clear_pc_function_cache ();
|
|
|
|
|
|
|
|
|
|
/* The last thing we do is free the objfile struct itself for the
|
2001-12-02 23:38:23 +01:00
|
|
|
|
non-reusable case, or detach from the mapped file for the
|
|
|
|
|
reusable case. Note that the mmalloc_detach or the xmfree() is
|
|
|
|
|
the last thing we can do with this objfile. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (objfile->flags & OBJF_MAPPED)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
/* Remember the fd so we can close it. We can't close it before
|
1999-07-07 22:19:36 +02:00
|
|
|
|
doing the detach, and after the detach the objfile is gone. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
int mmfd;
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
mmfd = objfile->mmfd;
|
|
|
|
|
mmalloc_detach (objfile->md);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
objfile = NULL;
|
|
|
|
|
close (mmfd);
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* If we still have an objfile, then either we don't support reusable
|
|
|
|
|
objfiles or this one was not reusable. So free it normally. */
|
|
|
|
|
|
|
|
|
|
if (objfile != NULL)
|
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if (objfile->name != NULL)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
2001-12-02 23:38:23 +01:00
|
|
|
|
xmfree (objfile->md, objfile->name);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
if (objfile->global_psymbols.list)
|
2001-12-02 23:38:23 +01:00
|
|
|
|
xmfree (objfile->md, objfile->global_psymbols.list);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
if (objfile->static_psymbols.list)
|
2001-12-02 23:38:23 +01:00
|
|
|
|
xmfree (objfile->md, objfile->static_psymbols.list);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
/* Free the obstacks for non-reusable objfiles */
|
2002-07-12 17:23:10 +02:00
|
|
|
|
bcache_xfree (objfile->psymbol_cache);
|
|
|
|
|
bcache_xfree (objfile->macro_cache);
|
2003-02-04 19:07:01 +01:00
|
|
|
|
if (objfile->demangled_names_hash)
|
|
|
|
|
htab_delete (objfile->demangled_names_hash);
|
1999-07-07 22:19:36 +02:00
|
|
|
|
obstack_free (&objfile->psymbol_obstack, 0);
|
|
|
|
|
obstack_free (&objfile->symbol_obstack, 0);
|
|
|
|
|
obstack_free (&objfile->type_obstack, 0);
|
2001-12-02 23:38:23 +01:00
|
|
|
|
xmfree (objfile->md, objfile);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
objfile = NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-05-22 11:02:23 +02:00
|
|
|
|
static void
|
|
|
|
|
do_free_objfile_cleanup (void *obj)
|
|
|
|
|
{
|
|
|
|
|
free_objfile (obj);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct cleanup *
|
|
|
|
|
make_cleanup_free_objfile (struct objfile *obj)
|
|
|
|
|
{
|
|
|
|
|
return make_cleanup (do_free_objfile_cleanup, obj);
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* Free all the object files at once and clean up their users. */
|
|
|
|
|
|
|
|
|
|
void
|
2000-07-30 03:48:28 +02:00
|
|
|
|
free_all_objfiles (void)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile *objfile, *temp;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILES_SAFE (objfile, temp)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
|
|
|
|
free_objfile (objfile);
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
clear_symtab_users ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Relocate OBJFILE to NEW_OFFSETS. There should be OBJFILE->NUM_SECTIONS
|
|
|
|
|
entries in new_offsets. */
|
|
|
|
|
void
|
2000-07-30 03:48:28 +02:00
|
|
|
|
objfile_relocate (struct objfile *objfile, struct section_offsets *new_offsets)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
1999-09-09 02:02:17 +02:00
|
|
|
|
struct section_offsets *delta =
|
2003-06-07 01:33:00 +02:00
|
|
|
|
((struct section_offsets *)
|
|
|
|
|
alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
int something_changed = 0;
|
|
|
|
|
for (i = 0; i < objfile->num_sections; ++i)
|
|
|
|
|
{
|
2000-08-07 17:02:48 +02:00
|
|
|
|
delta->offsets[i] =
|
1999-04-16 03:35:26 +02:00
|
|
|
|
ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i);
|
|
|
|
|
if (ANOFFSET (delta, i) != 0)
|
|
|
|
|
something_changed = 1;
|
|
|
|
|
}
|
|
|
|
|
if (!something_changed)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* OK, get all the symtabs. */
|
|
|
|
|
{
|
|
|
|
|
struct symtab *s;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILE_SYMTABS (objfile, s)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
|
|
|
|
struct linetable *l;
|
|
|
|
|
struct blockvector *bv;
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
/* First the line table. */
|
|
|
|
|
l = LINETABLE (s);
|
|
|
|
|
if (l)
|
|
|
|
|
{
|
|
|
|
|
for (i = 0; i < l->nitems; ++i)
|
|
|
|
|
l->item[i].pc += ANOFFSET (delta, s->block_line_section);
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
/* Don't relocate a shared blockvector more than once. */
|
|
|
|
|
if (!s->primary)
|
|
|
|
|
continue;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
bv = BLOCKVECTOR (s);
|
|
|
|
|
for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
|
|
|
|
|
{
|
|
|
|
|
struct block *b;
|
2001-10-13 01:51:30 +02:00
|
|
|
|
struct symbol *sym;
|
2003-06-11 David Carlton <carlton@bactrian.org>
* dictionary.h: New.
* dictionary.c: New.
* block.h: Add opaque declaration for struct dictionary.
(struct block): Add 'dict' member; delete 'hashtable', 'nsyms',
'sym' members.
(BLOCK_DICT): New macro.
Delete macros BLOCK_HASHTABLE, BLOCK_NSYMS, BLOCK_SYM,
BLOCK_BUCKETS, BLOCK_BUCKET, BLOCK_HASHTABLE_SIZE,
BLOCK_SHOULD_SORT.
(ALL_BLOCK_SYMBOLS): Update definition.
* Makefile.in (SFILES): Add dictionary.c.
(dictionary_h): New.
(COMMON_OBS): Add dictionary.o.
(dictionary.o): New.
(ada-lang.o): Depend on dictionary_h.
(buildsym.o, coffread.o, jv-lang.o, mdebugread.o, objfiles.o)
(stack.o, symmisc.o, symtab.o, tracepoint.o, valops.o)
(mi-cmd-stack.o): Ditto.
(gdbtk-cmds.o): Update dependencies.
(gdbtk-stack.o): Ditto.
* ada-lang.c: Include dictionary.h.
(symtab_for_sym): Update uses of ALL_BLOCK_SYMBOLS.
(fill_in_ada_prototype, debug_print_block): Ditto.
(ada_add_block_symbols): Update uses of ALL_BLOCK_SYMBOLS; replace
explicit iteration by use of ALL_BLOCK_SYMBOLS. Delete variable
'is_sorted'.
* mdebugread.c: Include dictionary.h.
(struct parse_stack): Delete 'maxsyms' member.
(parse_symbol): Update calls to new_block. Delete calls to
shrink_block. Use dictionary methods.
(psymtab_to_symtab_1): Delete calls to sort_symtab_syms.
Update calls to new_symtab. Don't maintain maxsyms data.
(mylookup_symbol): Update use of ALL_BLOCK_SYMBOLS.
(add_symbol): Just call dict_add_symbol.
(new_symtab): Delete 'maxsyms' argument.
(new_symtab): Update calls to new_block.
(new_block): Delete 'maxsyms' argument; add 'function' argument.
(shrink_block): Delete function.
(fixup_sigtramp): Update call to new_block. Add symbol via
dict_add_symbol.
* jv-lang.c: Include dictionary.h.
(get_java_class_symtab): Set the BLOCK_DICT of the blocks
appropriately. Set class_symtab->free_func. Make sure the
blockvector is big enough to hold two blocks.
(add_class_symtab_symbol): Use dictionary methods.
(free_class_block): New function.
(type_from_class): Replace explicit iteration by
ALL_BLOCK_SYMBOLS.
* symtab.h (struct symtab): Replace 'free_ptr' method by
'free_func'.
* dwarf2read.c (psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* dwarfread.c (psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* coffread.c (coff_symfile_read): Delete call to sort_symtab_syms.
Include dictionary.h.
(patch_opaque_types): Update use of ALL_BLOCK_SYMBOLS.
* dbxread.c (dbx_psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* objfiles.c: Include dictionary.h.
(objfile_relocate): Update use of ALL_BLOCK_SYMBOLS.
* buildsym.c: Include dictionary.h.
(finish_block): Use dictionary methods.
(end_symtab): Set free_func to NULL, not free_ptr.
* tracepoint.c: Include dictionary.h.
(add_local_symbols): Update use of ALL_BLOCK_SYMBOLS.
(scope_info): Ditto.
* stack.c: Include dictionary.h.
(print_block_frame_locals): Update use of ALL_BLOCK_SYMBOLS.
(print_block_frame_labels, print_frame_arg_vars)
(print_frame_args): Ditto.
* symmisc.c (free_symtab_block): Use dictionary methods.
(dump_symtab): Ditto.
(free_symtab): Replace use of 'free_ptr' by 'free_func'.
Include dictionary.h.
* symfile.h: Delete declarations of sort_block_syms,
sort_symtab_syms.
* symfile.c (sort_block_syms): Delete.
(sort_symtab_syms): Delete.
* symtab.c: Include dictionary.h.
(lookup_block_symbol): Use dictionary iterators.
(find_pc_sect_symtab): Update use of ALL_BLOCK_SYMBOLS.
(search_symbols, make_symbol_completion_list): Ditto.
(make_symbol_overload_list): Ditto.
* valops.c (value_of_local): Use dict_empty.
Include dictionary.h.
2003-06-11 David Carlton <carlton@bactrian.org>
* generic/gdbtk-stack.c: Include dictionary.h.
(gdb_block_vars): Update use of ALL_BLOCK_SYMBOLS.
(gdb_get_blocks, gdb_get_vars_command): Ditto.
* generic/gdbtk-cmds.c: Include dictionary.h.
(gdb_listfuncs): Update use of ALL_BLOCK_SYMBOLS.
2003-06-11 David Carlton <carlton@bactrian.org>
* mi-cmd-stack.c: Include dictionary.h.
(list_args_or_locals): Update use of ALL_BLOCK_SYMBOLS.
2003-06-12 01:29:49 +02:00
|
|
|
|
struct dict_iterator iter;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
|
|
|
|
|
b = BLOCKVECTOR_BLOCK (bv, i);
|
|
|
|
|
BLOCK_START (b) += ANOFFSET (delta, s->block_line_section);
|
|
|
|
|
BLOCK_END (b) += ANOFFSET (delta, s->block_line_section);
|
|
|
|
|
|
2003-06-11 David Carlton <carlton@bactrian.org>
* dictionary.h: New.
* dictionary.c: New.
* block.h: Add opaque declaration for struct dictionary.
(struct block): Add 'dict' member; delete 'hashtable', 'nsyms',
'sym' members.
(BLOCK_DICT): New macro.
Delete macros BLOCK_HASHTABLE, BLOCK_NSYMS, BLOCK_SYM,
BLOCK_BUCKETS, BLOCK_BUCKET, BLOCK_HASHTABLE_SIZE,
BLOCK_SHOULD_SORT.
(ALL_BLOCK_SYMBOLS): Update definition.
* Makefile.in (SFILES): Add dictionary.c.
(dictionary_h): New.
(COMMON_OBS): Add dictionary.o.
(dictionary.o): New.
(ada-lang.o): Depend on dictionary_h.
(buildsym.o, coffread.o, jv-lang.o, mdebugread.o, objfiles.o)
(stack.o, symmisc.o, symtab.o, tracepoint.o, valops.o)
(mi-cmd-stack.o): Ditto.
(gdbtk-cmds.o): Update dependencies.
(gdbtk-stack.o): Ditto.
* ada-lang.c: Include dictionary.h.
(symtab_for_sym): Update uses of ALL_BLOCK_SYMBOLS.
(fill_in_ada_prototype, debug_print_block): Ditto.
(ada_add_block_symbols): Update uses of ALL_BLOCK_SYMBOLS; replace
explicit iteration by use of ALL_BLOCK_SYMBOLS. Delete variable
'is_sorted'.
* mdebugread.c: Include dictionary.h.
(struct parse_stack): Delete 'maxsyms' member.
(parse_symbol): Update calls to new_block. Delete calls to
shrink_block. Use dictionary methods.
(psymtab_to_symtab_1): Delete calls to sort_symtab_syms.
Update calls to new_symtab. Don't maintain maxsyms data.
(mylookup_symbol): Update use of ALL_BLOCK_SYMBOLS.
(add_symbol): Just call dict_add_symbol.
(new_symtab): Delete 'maxsyms' argument.
(new_symtab): Update calls to new_block.
(new_block): Delete 'maxsyms' argument; add 'function' argument.
(shrink_block): Delete function.
(fixup_sigtramp): Update call to new_block. Add symbol via
dict_add_symbol.
* jv-lang.c: Include dictionary.h.
(get_java_class_symtab): Set the BLOCK_DICT of the blocks
appropriately. Set class_symtab->free_func. Make sure the
blockvector is big enough to hold two blocks.
(add_class_symtab_symbol): Use dictionary methods.
(free_class_block): New function.
(type_from_class): Replace explicit iteration by
ALL_BLOCK_SYMBOLS.
* symtab.h (struct symtab): Replace 'free_ptr' method by
'free_func'.
* dwarf2read.c (psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* dwarfread.c (psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* coffread.c (coff_symfile_read): Delete call to sort_symtab_syms.
Include dictionary.h.
(patch_opaque_types): Update use of ALL_BLOCK_SYMBOLS.
* dbxread.c (dbx_psymtab_to_symtab_1): Delete call to
sort_symtab_syms.
* objfiles.c: Include dictionary.h.
(objfile_relocate): Update use of ALL_BLOCK_SYMBOLS.
* buildsym.c: Include dictionary.h.
(finish_block): Use dictionary methods.
(end_symtab): Set free_func to NULL, not free_ptr.
* tracepoint.c: Include dictionary.h.
(add_local_symbols): Update use of ALL_BLOCK_SYMBOLS.
(scope_info): Ditto.
* stack.c: Include dictionary.h.
(print_block_frame_locals): Update use of ALL_BLOCK_SYMBOLS.
(print_block_frame_labels, print_frame_arg_vars)
(print_frame_args): Ditto.
* symmisc.c (free_symtab_block): Use dictionary methods.
(dump_symtab): Ditto.
(free_symtab): Replace use of 'free_ptr' by 'free_func'.
Include dictionary.h.
* symfile.h: Delete declarations of sort_block_syms,
sort_symtab_syms.
* symfile.c (sort_block_syms): Delete.
(sort_symtab_syms): Delete.
* symtab.c: Include dictionary.h.
(lookup_block_symbol): Use dictionary iterators.
(find_pc_sect_symtab): Update use of ALL_BLOCK_SYMBOLS.
(search_symbols, make_symbol_completion_list): Ditto.
(make_symbol_overload_list): Ditto.
* valops.c (value_of_local): Use dict_empty.
Include dictionary.h.
2003-06-11 David Carlton <carlton@bactrian.org>
* generic/gdbtk-stack.c: Include dictionary.h.
(gdb_block_vars): Update use of ALL_BLOCK_SYMBOLS.
(gdb_get_blocks, gdb_get_vars_command): Ditto.
* generic/gdbtk-cmds.c: Include dictionary.h.
(gdb_listfuncs): Update use of ALL_BLOCK_SYMBOLS.
2003-06-11 David Carlton <carlton@bactrian.org>
* mi-cmd-stack.c: Include dictionary.h.
(list_args_or_locals): Update use of ALL_BLOCK_SYMBOLS.
2003-06-12 01:29:49 +02:00
|
|
|
|
ALL_BLOCK_SYMBOLS (b, iter, sym)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
2000-08-05 01:13:50 +02:00
|
|
|
|
fixup_symbol_section (sym, objfile);
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
/* The RS6000 code from which this was taken skipped
|
2003-05-14 Elena Zannoni <ezannoni@redhat.com>
* symtab.h (enum domain_enum): Rename from namespace_enum.
(UNDEF_DOMAIN, VAR_DOMAIN, STRUCT_DOMAIN, LABEL_DOMAIN,
VARIABLES_DOMAIN, FUNCTIONS_DOMAIN, TYPES_DOMAIN, METHODS_DOMAIN):
Rename from UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE,
LABEL_NAMESPACE, VARIABLES_NAMESPACE, FUNCTIONS_NAMESPACE,
TYPES_NAMESPACE, METHODS_NAMESPACE.
(SYMBOL_NAMESPACE): Rename to SYMBOL_DOMAIN.
(struct symbol, struct partial_symbol): Rename field
'namespace_enum namespace' to 'domain_enum domain'.
(PSYMBOL_NAMESPACE): Rename to PSYMBOL_DOMAIN.
Delete old define kludge for namespace.
* ada-exp.y, ada-lang.c, ada-lang.h, alpha-tdep.c, arm-tdep.c,
blockframe.c, c-exp.y, c-valprint.c, coffread.c, dbxread.c,
dwarf2read.c, dwarfread.c, f-exp.y, gdbtypes.c, gdbtypes.h,
gnu-v3-abi.c, hppa-tdep.c, hpread.c, jv-exp.y, jv-lang.c,
language.c, linespec.c, m2-exp.y, m3-nat.c, mdebugread.c,
mips-tdep.c, nlmread.c, objc-exp.y, objc-lang.c, objfiles.c,
p-exp.y, p-valprint.c, parse.c, printcmd.c, scm-lang.c, source.c,
stabsread.c, stack.c, symfile.c, symfile.h, symmisc.c, symtab.c,
valops.c, values.c, xcoffread.c, xstormy16-tdep.c: Replace all
occurrences of the above.
2003-05-12 Elena Zannoni <ezannoni@redhat.com>
* mi-mi-cmd-stack.c (list_args_or_locals): Rename VAR_NAMESPACE to
VAR_DOMAIN.
2003-05-14 19:43:20 +02:00
|
|
|
|
any symbols in STRUCT_DOMAIN or UNDEF_DOMAIN.
|
1999-07-07 22:19:36 +02:00
|
|
|
|
But I'm leaving out that test, on the theory that
|
|
|
|
|
they can't possibly pass the tests below. */
|
|
|
|
|
if ((SYMBOL_CLASS (sym) == LOC_LABEL
|
|
|
|
|
|| SYMBOL_CLASS (sym) == LOC_STATIC
|
|
|
|
|
|| SYMBOL_CLASS (sym) == LOC_INDIRECT)
|
|
|
|
|
&& SYMBOL_SECTION (sym) >= 0)
|
|
|
|
|
{
|
|
|
|
|
SYMBOL_VALUE_ADDRESS (sym) +=
|
|
|
|
|
ANOFFSET (delta, SYMBOL_SECTION (sym));
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
#ifdef MIPS_EFI_SYMBOL_NAME
|
1999-07-07 22:19:36 +02:00
|
|
|
|
/* Relocate Extra Function Info for ecoff. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
else if (SYMBOL_CLASS (sym) == LOC_CONST
|
2003-05-14 Elena Zannoni <ezannoni@redhat.com>
* symtab.h (enum domain_enum): Rename from namespace_enum.
(UNDEF_DOMAIN, VAR_DOMAIN, STRUCT_DOMAIN, LABEL_DOMAIN,
VARIABLES_DOMAIN, FUNCTIONS_DOMAIN, TYPES_DOMAIN, METHODS_DOMAIN):
Rename from UNDEF_NAMESPACE, VAR_NAMESPACE, STRUCT_NAMESPACE,
LABEL_NAMESPACE, VARIABLES_NAMESPACE, FUNCTIONS_NAMESPACE,
TYPES_NAMESPACE, METHODS_NAMESPACE.
(SYMBOL_NAMESPACE): Rename to SYMBOL_DOMAIN.
(struct symbol, struct partial_symbol): Rename field
'namespace_enum namespace' to 'domain_enum domain'.
(PSYMBOL_NAMESPACE): Rename to PSYMBOL_DOMAIN.
Delete old define kludge for namespace.
* ada-exp.y, ada-lang.c, ada-lang.h, alpha-tdep.c, arm-tdep.c,
blockframe.c, c-exp.y, c-valprint.c, coffread.c, dbxread.c,
dwarf2read.c, dwarfread.c, f-exp.y, gdbtypes.c, gdbtypes.h,
gnu-v3-abi.c, hppa-tdep.c, hpread.c, jv-exp.y, jv-lang.c,
language.c, linespec.c, m2-exp.y, m3-nat.c, mdebugread.c,
mips-tdep.c, nlmread.c, objc-exp.y, objc-lang.c, objfiles.c,
p-exp.y, p-valprint.c, parse.c, printcmd.c, scm-lang.c, source.c,
stabsread.c, stack.c, symfile.c, symfile.h, symmisc.c, symtab.c,
valops.c, values.c, xcoffread.c, xstormy16-tdep.c: Replace all
occurrences of the above.
2003-05-12 Elena Zannoni <ezannoni@redhat.com>
* mi-mi-cmd-stack.c (list_args_or_locals): Rename VAR_NAMESPACE to
VAR_DOMAIN.
2003-05-14 19:43:20 +02:00
|
|
|
|
&& SYMBOL_DOMAIN (sym) == LABEL_DOMAIN
|
2003-02-25 David Carlton <carlton@math.stanford.edu>
* symtab.h (SYMBOL_NATURAL_NAME): New macro.
(SYMBOL_LINKAGE_NAME): Ditto.
(SYMBOL_PRINT_NAME): Use SYMBOL_NATURAL_NAME and
SYMBOL_LINKAGE_NAME.
(struct general_symbol_info): Expand comment.
(DEPRECATED_SYMBOL_NAME): Rename from SYMBOL_NAME.
(SYMBOL_MATCHES_NAME): Use DEPRECATED_SYMBOL_NAME.
(SYMBOL_MATCHES_REGEXP): Ditto.
* symtab.c (symbol_natural_name): New function.
* objfiles.h: Replace all uses of SYMBOL_NAME by
DEPRECATED_SYMBOL_NAME.
* xcoffread.c, valops.c, typeprint.c, tracepoint.c: Ditto.
* symtab.c, symmisc.c, symfile.c, stack.c, stabsread.c: Ditto.
* somsolib.c, sol-thread.c, rs6000-tdep.c, p-valprint.c: Ditto.
* printcmd.c, objfiles.c, objc-lang.c, mipsread.c: Ditto.
* minsyms.c, mdebugread.c, linespec.c, jv-lang.c: Ditto.
* i386-tdep.c, i386-linux-tdep.c, hpread.c, hppa-tdep.c: Ditto.
* gnu-v2-abi.c, f-valprint.c, findvar.c, expprint.c: Ditto.
* dwarfread.c, dwarf2read.c, dbxread.c, c-valprint.c: Ditto.
* cp-valprint.c, coffread.c, buildsym.c, breakpoint.c: Ditto.
* blockframe.c, ax-gdb.c, arm-linux-tdep.c, ada-lang.c: Ditto.
* ada-exp.y: Ditto.
* ada-exp.y: Update copyright.
* sol-thread.c, mipsread.c, jv-lang.c, f-valprint.c: Ditto.
* cp-valprint.c: Ditto.
2003-02-25 David Carlton <carlton@math.stanford.edu>
* generic/gdbtk.h: Replace all instances of SYMBOL_NAME by
DEPRECATED_SYMBOL_NAME.
* generic/gdbtk-stack.c, generic/gdbtk-cmds.c: Ditto.
* generic/gdbtk-stack.c, generic/gdbtk-cmds.c: Update copyright.
2003-02-25 David Carlton <carlton@math.stanford.edu>
* mi-cmd-stack.c: Replace all instances of SYMBOL_NAME with
DEPRECATED_SYMBOL_NAME. Update copyright.
2003-02-25 22:36:23 +01:00
|
|
|
|
&& strcmp (DEPRECATED_SYMBOL_NAME (sym), MIPS_EFI_SYMBOL_NAME) == 0)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
ecoff_relocate_efi (sym, ANOFFSET (delta,
|
1999-04-16 03:35:26 +02:00
|
|
|
|
s->block_line_section));
|
|
|
|
|
#endif
|
1999-07-07 22:19:36 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
struct partial_symtab *p;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILE_PSYMTABS (objfile, p)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Define as functions of OBJFILE. Add
sect_index_text, sect_index_data, sect_index_rodata,
sect_index_bss to objfile structure.
* gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Remove.
* objfiles.c (allocate_objfile): Initialize
sect_index_{text,data,bss,rodata} to -1, for error detection.
* symfile.c (default_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata} from bfd information.
* xcoffread.c (xcoff_symfile_offsets): Ditto.
* somread.c (som_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata}.
* coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
stabsread.c, symfile.c, xcoffread.c:
Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
current objfile.
* xcoffread.c: Add new field objfile to find_targ_sec_arg.
2000-05-04 18:52:34 +02:00
|
|
|
|
p->textlow += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
|
|
|
|
p->texthigh += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
1999-07-07 22:19:36 +02:00
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
struct partial_symbol **psym;
|
|
|
|
|
|
|
|
|
|
for (psym = objfile->global_psymbols.list;
|
|
|
|
|
psym < objfile->global_psymbols.next;
|
|
|
|
|
psym++)
|
2000-08-05 01:13:50 +02:00
|
|
|
|
{
|
|
|
|
|
fixup_psymbol_section (*psym, objfile);
|
|
|
|
|
if (SYMBOL_SECTION (*psym) >= 0)
|
|
|
|
|
SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
|
|
|
|
|
SYMBOL_SECTION (*psym));
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
for (psym = objfile->static_psymbols.list;
|
|
|
|
|
psym < objfile->static_psymbols.next;
|
|
|
|
|
psym++)
|
2000-08-05 01:13:50 +02:00
|
|
|
|
{
|
|
|
|
|
fixup_psymbol_section (*psym, objfile);
|
|
|
|
|
if (SYMBOL_SECTION (*psym) >= 0)
|
|
|
|
|
SYMBOL_VALUE_ADDRESS (*psym) += ANOFFSET (delta,
|
|
|
|
|
SYMBOL_SECTION (*psym));
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
struct minimal_symbol *msym;
|
|
|
|
|
ALL_OBJFILE_MSYMBOLS (objfile, msym)
|
|
|
|
|
if (SYMBOL_SECTION (msym) >= 0)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
SYMBOL_VALUE_ADDRESS (msym) += ANOFFSET (delta, SYMBOL_SECTION (msym));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
/* Relocating different sections by different amounts may cause the symbols
|
|
|
|
|
to be out of order. */
|
|
|
|
|
msymbols_sort (objfile);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
int i;
|
|
|
|
|
for (i = 0; i < objfile->num_sections; ++i)
|
2000-08-07 17:02:48 +02:00
|
|
|
|
(objfile->section_offsets)->offsets[i] = ANOFFSET (new_offsets, i);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
2000-11-03 20:00:06 +01:00
|
|
|
|
if (objfile->ei.entry_point != ~(CORE_ADDR) 0)
|
|
|
|
|
{
|
|
|
|
|
/* Relocate ei.entry_point with its section offset, use SECT_OFF_TEXT
|
|
|
|
|
only as a fallback. */
|
|
|
|
|
struct obj_section *s;
|
|
|
|
|
s = find_pc_section (objfile->ei.entry_point);
|
|
|
|
|
if (s)
|
|
|
|
|
objfile->ei.entry_point += ANOFFSET (delta, s->the_bfd_section->index);
|
|
|
|
|
else
|
|
|
|
|
objfile->ei.entry_point += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
|
|
|
|
}
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct obj_section *s;
|
|
|
|
|
bfd *abfd;
|
|
|
|
|
|
|
|
|
|
abfd = objfile->obfd;
|
|
|
|
|
|
1999-08-09 23:36:23 +02:00
|
|
|
|
ALL_OBJFILE_OSECTIONS (objfile, s)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
2000-09-13 03:47:16 +02:00
|
|
|
|
int idx = s->the_bfd_section->index;
|
|
|
|
|
|
|
|
|
|
s->addr += ANOFFSET (delta, idx);
|
|
|
|
|
s->endaddr += ANOFFSET (delta, idx);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (objfile->ei.entry_func_lowpc != INVALID_ENTRY_LOWPC)
|
|
|
|
|
{
|
Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Define as functions of OBJFILE. Add
sect_index_text, sect_index_data, sect_index_rodata,
sect_index_bss to objfile structure.
* gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Remove.
* objfiles.c (allocate_objfile): Initialize
sect_index_{text,data,bss,rodata} to -1, for error detection.
* symfile.c (default_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata} from bfd information.
* xcoffread.c (xcoff_symfile_offsets): Ditto.
* somread.c (som_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata}.
* coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
stabsread.c, symfile.c, xcoffread.c:
Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
current objfile.
* xcoffread.c: Add new field objfile to find_targ_sec_arg.
2000-05-04 18:52:34 +02:00
|
|
|
|
objfile->ei.entry_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
|
|
|
|
objfile->ei.entry_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (objfile->ei.entry_file_lowpc != INVALID_ENTRY_LOWPC)
|
|
|
|
|
{
|
Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Define as functions of OBJFILE. Add
sect_index_text, sect_index_data, sect_index_rodata,
sect_index_bss to objfile structure.
* gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Remove.
* objfiles.c (allocate_objfile): Initialize
sect_index_{text,data,bss,rodata} to -1, for error detection.
* symfile.c (default_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata} from bfd information.
* xcoffread.c (xcoff_symfile_offsets): Ditto.
* somread.c (som_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata}.
* coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
stabsread.c, symfile.c, xcoffread.c:
Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
current objfile.
* xcoffread.c: Add new field objfile to find_targ_sec_arg.
2000-05-04 18:52:34 +02:00
|
|
|
|
objfile->ei.entry_file_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
|
|
|
|
objfile->ei.entry_file_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (objfile->ei.main_func_lowpc != INVALID_ENTRY_LOWPC)
|
|
|
|
|
{
|
Elena Zannoni <ezannoni@kwikemart.cygnus.com>
* objfiles.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Define as functions of OBJFILE. Add
sect_index_text, sect_index_data, sect_index_rodata,
sect_index_bss to objfile structure.
* gdb-stabs.h (SECT_OFF_DATA, SECT_OFF_TEXT, SECT_OFF_BSS,
SECT_OFF_RODATA): Remove.
* objfiles.c (allocate_objfile): Initialize
sect_index_{text,data,bss,rodata} to -1, for error detection.
* symfile.c (default_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata} from bfd information.
* xcoffread.c (xcoff_symfile_offsets): Ditto.
* somread.c (som_symfile_offsets): Initialize
sect_index_{text,data,bss,rodata}.
* coffread.c, dbxread.c, elfread.c, hp-psymtab-read.c,
hp-symtab-read.c, hpread.c, mdebugread.c, minsyms.c,
mipsread.c, objfiles.c, os9kread.c, pa64solib.c, partial-stab.h,
remote-os9k.c, remote-vx.c, remote.c, rs6000-nat.c, somsolib.c,
stabsread.c, symfile.c, xcoffread.c:
Update use of SECT_OFF_{TEXT,DATA,BSS,RODATA} to depend on the
current objfile.
* xcoffread.c: Add new field objfile to find_targ_sec_arg.
2000-05-04 18:52:34 +02:00
|
|
|
|
objfile->ei.main_func_lowpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
|
|
|
|
objfile->ei.main_func_highpc += ANOFFSET (delta, SECT_OFF_TEXT (objfile));
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Relocate breakpoints as necessary, after things are relocated. */
|
|
|
|
|
breakpoint_re_set ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Many places in gdb want to test just to see if we have any partial
|
|
|
|
|
symbols available. This function returns zero if none are currently
|
|
|
|
|
available, nonzero otherwise. */
|
|
|
|
|
|
|
|
|
|
int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
have_partial_symbols (void)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile *ofp;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILES (ofp)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
|
|
|
|
if (ofp->psymtabs != NULL)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Many places in gdb want to test just to see if we have any full
|
|
|
|
|
symbols available. This function returns zero if none are currently
|
|
|
|
|
available, nonzero otherwise. */
|
|
|
|
|
|
|
|
|
|
int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
have_full_symbols (void)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile *ofp;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILES (ofp)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
|
|
|
|
if (ofp->symtabs != NULL)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* This operations deletes all objfile entries that represent solibs that
|
|
|
|
|
weren't explicitly loaded by the user, via e.g., the add-symbol-file
|
|
|
|
|
command.
|
1999-07-07 22:19:36 +02:00
|
|
|
|
*/
|
1999-04-16 03:35:26 +02:00
|
|
|
|
void
|
2000-07-30 03:48:28 +02:00
|
|
|
|
objfile_purge_solibs (void)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
1999-07-07 22:19:36 +02:00
|
|
|
|
struct objfile *objf;
|
|
|
|
|
struct objfile *temp;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
ALL_OBJFILES_SAFE (objf, temp)
|
|
|
|
|
{
|
|
|
|
|
/* We assume that the solib package has been purged already, or will
|
|
|
|
|
be soon.
|
1999-07-07 22:19:36 +02:00
|
|
|
|
*/
|
1999-10-12 06:37:53 +02:00
|
|
|
|
if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
|
1999-04-16 03:35:26 +02:00
|
|
|
|
free_objfile (objf);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Many places in gdb want to test just to see if we have any minimal
|
|
|
|
|
symbols available. This function returns zero if none are currently
|
|
|
|
|
available, nonzero otherwise. */
|
|
|
|
|
|
|
|
|
|
int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
have_minimal_symbols (void)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct objfile *ofp;
|
|
|
|
|
|
|
|
|
|
ALL_OBJFILES (ofp)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
2003-02-03 21:39:41 +01:00
|
|
|
|
if (ofp->minimal_symbol_count > 0)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
1999-04-16 03:35:26 +02:00
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
|
|
|
|
|
|
|
|
|
|
/* Given the name of a mapped symbol file in SYMSFILENAME, and the timestamp
|
|
|
|
|
of the corresponding symbol file in MTIME, try to open an existing file
|
|
|
|
|
with the name SYMSFILENAME and verify it is more recent than the base
|
|
|
|
|
file by checking it's timestamp against MTIME.
|
|
|
|
|
|
|
|
|
|
If SYMSFILENAME does not exist (or can't be stat'd), simply returns -1.
|
|
|
|
|
|
|
|
|
|
If SYMSFILENAME does exist, but is out of date, we check to see if the
|
|
|
|
|
user has specified creation of a mapped file. If so, we don't issue
|
|
|
|
|
any warning message because we will be creating a new mapped file anyway,
|
|
|
|
|
overwriting the old one. If not, then we issue a warning message so that
|
|
|
|
|
the user will know why we aren't using this existing mapped symbol file.
|
|
|
|
|
In either case, we return -1.
|
|
|
|
|
|
|
|
|
|
If SYMSFILENAME does exist and is not out of date, but can't be opened for
|
|
|
|
|
some reason, then prints an appropriate system error message and returns -1.
|
|
|
|
|
|
|
|
|
|
Otherwise, returns the open file descriptor. */
|
|
|
|
|
|
|
|
|
|
static int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
open_existing_mapped_file (char *symsfilename, long mtime, int flags)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
int fd = -1;
|
|
|
|
|
struct stat sbuf;
|
|
|
|
|
|
|
|
|
|
if (stat (symsfilename, &sbuf) == 0)
|
|
|
|
|
{
|
|
|
|
|
if (sbuf.st_mtime < mtime)
|
|
|
|
|
{
|
1999-10-12 06:37:53 +02:00
|
|
|
|
if (!(flags & OBJF_MAPPED))
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
warning ("mapped symbol file `%s' is out of date, ignored it",
|
|
|
|
|
symsfilename);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if ((fd = open (symsfilename, O_RDWR)) < 0)
|
|
|
|
|
{
|
|
|
|
|
if (error_pre_print)
|
|
|
|
|
{
|
|
|
|
|
printf_unfiltered (error_pre_print);
|
|
|
|
|
}
|
|
|
|
|
print_sys_errmsg (symsfilename, errno);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return (fd);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Look for a mapped symbol file that corresponds to FILENAME and is more
|
|
|
|
|
recent than MTIME. If MAPPED is nonzero, the user has asked that gdb
|
|
|
|
|
use a mapped symbol file for this file, so create a new one if one does
|
|
|
|
|
not currently exist.
|
|
|
|
|
|
|
|
|
|
If found, then return an open file descriptor for the file, otherwise
|
|
|
|
|
return -1.
|
|
|
|
|
|
|
|
|
|
This routine is responsible for implementing the policy that generates
|
|
|
|
|
the name of the mapped symbol file from the name of a file containing
|
|
|
|
|
symbols that gdb would like to read. Currently this policy is to append
|
|
|
|
|
".syms" to the name of the file.
|
|
|
|
|
|
|
|
|
|
This routine is also responsible for implementing the policy that
|
|
|
|
|
determines where the mapped symbol file is found (the search path).
|
|
|
|
|
This policy is that when reading an existing mapped file, a file of
|
|
|
|
|
the correct name in the current directory takes precedence over a
|
|
|
|
|
file of the correct name in the same directory as the symbol file.
|
|
|
|
|
When creating a new mapped file, it is always created in the current
|
|
|
|
|
directory. This helps to minimize the chances of a user unknowingly
|
|
|
|
|
creating big mapped files in places like /bin and /usr/local/bin, and
|
|
|
|
|
allows a local copy to override a manually installed global copy (in
|
|
|
|
|
/bin for example). */
|
|
|
|
|
|
|
|
|
|
static int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
open_mapped_file (char *filename, long mtime, int flags)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
int fd;
|
|
|
|
|
char *symsfilename;
|
|
|
|
|
|
|
|
|
|
/* First try to open an existing file in the current directory, and
|
|
|
|
|
then try the directory where the symbol file is located. */
|
|
|
|
|
|
2001-07-05 23:32:39 +02:00
|
|
|
|
symsfilename = concat ("./", lbasename (filename), ".syms", (char *) NULL);
|
1999-10-12 06:37:53 +02:00
|
|
|
|
if ((fd = open_existing_mapped_file (symsfilename, mtime, flags)) < 0)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree (symsfilename);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
symsfilename = concat (filename, ".syms", (char *) NULL);
|
2000-02-29 13:58:51 +01:00
|
|
|
|
fd = open_existing_mapped_file (symsfilename, mtime, flags);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* If we don't have an open file by now, then either the file does not
|
|
|
|
|
already exist, or the base file has changed since it was created. In
|
|
|
|
|
either case, if the user has specified use of a mapped file, then
|
|
|
|
|
create a new mapped file, truncating any existing one. If we can't
|
|
|
|
|
create one, print a system error message saying why we can't.
|
|
|
|
|
|
|
|
|
|
By default the file is rw for everyone, with the user's umask taking
|
|
|
|
|
care of turning off the permissions the user wants off. */
|
|
|
|
|
|
2000-02-29 13:58:51 +01:00
|
|
|
|
if ((fd < 0) && (flags & OBJF_MAPPED))
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree (symsfilename);
|
2001-07-05 23:32:39 +02:00
|
|
|
|
symsfilename = concat ("./", lbasename (filename), ".syms",
|
1999-04-16 03:35:26 +02:00
|
|
|
|
(char *) NULL);
|
|
|
|
|
if ((fd = open (symsfilename, O_RDWR | O_CREAT | O_TRUNC, 0666)) < 0)
|
|
|
|
|
{
|
|
|
|
|
if (error_pre_print)
|
|
|
|
|
{
|
|
|
|
|
printf_unfiltered (error_pre_print);
|
|
|
|
|
}
|
|
|
|
|
print_sys_errmsg (symsfilename, errno);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-12-15 02:01:51 +01:00
|
|
|
|
xfree (symsfilename);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
return (fd);
|
|
|
|
|
}
|
|
|
|
|
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
static void *
|
2000-07-30 03:48:28 +02:00
|
|
|
|
map_to_file (int fd)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
void *md;
|
1999-04-16 03:35:26 +02:00
|
|
|
|
CORE_ADDR mapto;
|
|
|
|
|
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
md = mmalloc_attach (fd, 0);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
if (md != NULL)
|
|
|
|
|
{
|
|
|
|
|
mapto = (CORE_ADDR) mmalloc_getkey (md, 1);
|
|
|
|
|
md = mmalloc_detach (md);
|
|
|
|
|
if (md != NULL)
|
|
|
|
|
{
|
|
|
|
|
/* FIXME: should figure out why detach failed */
|
|
|
|
|
md = NULL;
|
|
|
|
|
}
|
|
|
|
|
else if (mapto != (CORE_ADDR) NULL)
|
|
|
|
|
{
|
|
|
|
|
/* This mapping file needs to be remapped at "mapto" */
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
md = mmalloc_attach (fd, mapto);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
/* This is a freshly created mapping file. */
|
|
|
|
|
mapto = (CORE_ADDR) mmalloc_findbase (20 * 1024 * 1024);
|
|
|
|
|
if (mapto != 0)
|
|
|
|
|
{
|
|
|
|
|
/* To avoid reusing the freshly created mapping file, at the
|
1999-07-07 22:19:36 +02:00
|
|
|
|
address selected by mmap, we must truncate it before trying
|
|
|
|
|
to do an attach at the address we want. */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
ftruncate (fd, 0);
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
md = mmalloc_attach (fd, mapto);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
if (md != NULL)
|
|
|
|
|
{
|
2003-01-18 Andrew Cagney <ac131313@redhat.com>
* ada-valprint.c: Eliminate PTR.
* breakpoint.c, corelow.c, cris-tdep.c, dbxread.c: Ditto.
* defs.h, dve3900-rom.c, dwarf2read.c, dwarfread.c: Ditto.
* exec.c, hppa-tdep.c, hpread.c, infcmd.c, mdebugread.c: Ditto.
* objfiles.c, objfiles.h, ocd.c, remote-es.c: Ditto.
* remote-mips.c, remote-sds.c, remote-vx.c: Ditto.
* solib-svr4.c, solib.c, stack.c, symfile.c, symfile.h: Ditto.
* symmisc.c, v850ice.c, xcoffread.c, cli/cli-script.c: Ditto.
2003-01-18 16:55:53 +01:00
|
|
|
|
mmalloc_setkey (md, 1, mapto);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return (md);
|
|
|
|
|
}
|
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* Returns a section whose range includes PC and SECTION,
|
|
|
|
|
or NULL if none found. Note the distinction between the return type,
|
|
|
|
|
struct obj_section (which is defined in gdb), and the input type
|
|
|
|
|
struct sec (which is a bfd-defined data type). The obj_section
|
|
|
|
|
contains a pointer to the bfd struct sec section. */
|
|
|
|
|
|
|
|
|
|
struct obj_section *
|
2000-07-30 03:48:28 +02:00
|
|
|
|
find_pc_sect_section (CORE_ADDR pc, struct sec *section)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct obj_section *s;
|
|
|
|
|
struct objfile *objfile;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
|
1999-08-09 23:36:23 +02:00
|
|
|
|
ALL_OBJSECTIONS (objfile, s)
|
1999-07-07 22:19:36 +02:00
|
|
|
|
if ((section == 0 || section == s->the_bfd_section) &&
|
|
|
|
|
s->addr <= pc && pc < s->endaddr)
|
|
|
|
|
return (s);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
1999-07-07 22:19:36 +02:00
|
|
|
|
return (NULL);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Returns a section whose range includes PC or NULL if none found.
|
|
|
|
|
Backward compatibility, no section. */
|
|
|
|
|
|
|
|
|
|
struct obj_section *
|
2000-07-30 03:48:28 +02:00
|
|
|
|
find_pc_section (CORE_ADDR pc)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
return find_pc_sect_section (pc, find_pc_mapped_section (pc));
|
|
|
|
|
}
|
1999-07-07 22:19:36 +02:00
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
|
|
|
|
|
/* In SVR4, we recognize a trampoline by it's section name.
|
|
|
|
|
That is, if the pc is in a section named ".plt" then we are in
|
|
|
|
|
a trampoline. */
|
|
|
|
|
|
|
|
|
|
int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
in_plt_section (CORE_ADDR pc, char *name)
|
1999-04-16 03:35:26 +02:00
|
|
|
|
{
|
|
|
|
|
struct obj_section *s;
|
|
|
|
|
int retval = 0;
|
1999-07-07 22:19:36 +02:00
|
|
|
|
|
|
|
|
|
s = find_pc_section (pc);
|
|
|
|
|
|
1999-04-16 03:35:26 +02:00
|
|
|
|
retval = (s != NULL
|
|
|
|
|
&& s->the_bfd_section->name != NULL
|
|
|
|
|
&& STREQ (s->the_bfd_section->name, ".plt"));
|
1999-07-07 22:19:36 +02:00
|
|
|
|
return (retval);
|
1999-04-16 03:35:26 +02:00
|
|
|
|
}
|
1999-08-16 21:57:19 +02:00
|
|
|
|
|
|
|
|
|
/* Return nonzero if NAME is in the import list of OBJFILE. Else
|
|
|
|
|
return zero. */
|
|
|
|
|
|
|
|
|
|
int
|
2000-07-30 03:48:28 +02:00
|
|
|
|
is_in_import_list (char *name, struct objfile *objfile)
|
1999-08-16 21:57:19 +02:00
|
|
|
|
{
|
|
|
|
|
register int i;
|
|
|
|
|
|
|
|
|
|
if (!objfile || !name || !*name)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < objfile->import_list_size; i++)
|
|
|
|
|
if (objfile->import_list[i] && STREQ (name, objfile->import_list[i]))
|
|
|
|
|
return 1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|