open_existing_mapped_file PARAMS ((char *, long, int));
static int
-open_mapped_file PARAMS ((char *filename, long mtime, int mapped));
+open_mapped_file PARAMS ((char *filename, long mtime, int flags));
static PTR
map_to_file PARAMS ((int));
#define TARGET_KEEP_SECTION(ASECT) 0
#endif
+/* 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). */
+
static void
add_to_objfile_sections (abfd, asect, objfile_p_char)
bfd *abfd;
/* Builds a section table for OBJFILE.
Returns 0 if OK, 1 on error (in which case bfd_error contains the
- error). */
+ 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. */
int
build_objfile_section_table (objfile)
return (0);
}
-/* Given a pointer to an initialized bfd (ABFD) and a flag that indicates
- whether or not an objfile is to be mapped (MAPPED), 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.
-
- USER_LOADED is simply recorded in the objfile. This record offers a way for
- run_command to remove old objfile entries which are no longer valid (i.e.,
- are associated with an old inferior), but to preserve ones that the user
- explicitly loaded via the add-symbol-file command.
+/* 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.
- IS_SOLIB is also simply recorded in the objfile. */
+ 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. */
struct objfile *
-allocate_objfile (abfd, mapped, user_loaded, is_solib)
+allocate_objfile (abfd, flags)
bfd *abfd;
- int mapped;
- int user_loaded;
- int is_solib;
+ int flags;
{
struct objfile *objfile = NULL;
struct objfile *last_one = NULL;
- mapped |= mapped_symbol_files;
+ if (mapped_symbol_files)
+ flags |= OBJF_MAPPED;
#if defined(USE_MMALLOC) && defined(HAVE_MMAP)
if (abfd != NULL)
int fd;
fd = open_mapped_file (bfd_get_filename (abfd), bfd_get_mtime (abfd),
- mapped);
+ flags);
if (fd >= 0)
{
PTR md;
}
}
- if (mapped && (objfile == NULL))
+ if ((flags & OBJF_MAPPED) && (objfile == NULL))
{
warning ("symbol table for '%s' will not be mapped",
bfd_get_filename (abfd));
+ flags &= ~OBJF_MAPPED;
}
}
#else /* !defined(USE_MMALLOC) || !defined(HAVE_MMAP) */
- if (mapped)
+ if (flags & OBJF_MAPPED)
{
warning ("mapped symbol tables are not supported on this machine; missing or broken mmap().");
"mapped" keyword again. */
mapped_symbol_files = 0;
+ flags &= ~OBJF_MAPPED;
}
#endif /* defined(USE_MMALLOC) && defined(HAVE_MMAP) */
free);
obstack_specify_allocation (&objfile->type_obstack, 0, 0, xmalloc,
free);
+ flags &= ~OBJF_MAPPED;
}
/* Update the per-objfile information that comes from the bfd, ensuring
last_one->next = objfile;
}
- /* Record whether this objfile was created because the user explicitly
- caused it (e.g., used the add-symbol-file command).
- */
- objfile->user_loaded = user_loaded;
-
- /* Record whether this objfile definitely represents a solib. */
- objfile->is_solib = is_solib;
+ /* Save passed in flag bits. */
+ objfile->flags |= flags;
return (objfile);
}
if (objfile->static_psymbols.list)
mfree (objfile->md, objfile->static_psymbols.list);
/* Free the obstacks for non-reusable objfiles */
- obstack_free (&objfile->psymbol_cache.cache, 0);
+ free_bcache (&objfile->psymbol_cache);
obstack_free (&objfile->psymbol_obstack, 0);
obstack_free (&objfile->symbol_obstack, 0);
obstack_free (&objfile->type_obstack, 0);
struct objfile *objfile;
struct section_offsets *new_offsets;
{
- struct section_offsets *delta = (struct section_offsets *)
- alloca (sizeof (struct section_offsets)
- + objfile->num_sections * sizeof (delta->offsets));
+ struct section_offsets *delta =
+ (struct section_offsets *) alloca (SIZEOF_SECTION_OFFSETS);
{
int i;
abfd = objfile->obfd;
- for (s = objfile->sections;
- s < objfile->sections_end; ++s)
+ ALL_OBJFILE_OSECTIONS (objfile, s)
{
flagword flags;
/* We assume that the solib package has been purged already, or will
be soon.
*/
- if (!objf->user_loaded && objf->is_solib)
+ if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
free_objfile (objf);
}
}
Otherwise, returns the open file descriptor. */
static int
-open_existing_mapped_file (symsfilename, mtime, mapped)
+open_existing_mapped_file (symsfilename, mtime, flags)
char *symsfilename;
long mtime;
- int mapped;
+ int flags;
{
int fd = -1;
struct stat sbuf;
{
if (sbuf.st_mtime < mtime)
{
- if (!mapped)
+ if (!(flags & OBJF_MAPPED))
{
warning ("mapped symbol file `%s' is out of date, ignored it",
symsfilename);
/bin for example). */
static int
-open_mapped_file (filename, mtime, mapped)
+open_mapped_file (filename, mtime, flags)
char *filename;
long mtime;
- int mapped;
+ int flags;
{
int fd;
char *symsfilename;
then try the directory where the symbol file is located. */
symsfilename = concat ("./", basename (filename), ".syms", (char *) NULL);
- if ((fd = open_existing_mapped_file (symsfilename, mtime, mapped)) < 0)
+ if ((fd = open_existing_mapped_file (symsfilename, mtime, flags)) < 0)
{
free (symsfilename);
symsfilename = concat (filename, ".syms", (char *) NULL);
struct obj_section *s;
struct objfile *objfile;
- ALL_OBJFILES (objfile)
- for (s = objfile->sections; s < objfile->sections_end; ++s)
-#if defined(HPUXHPPA)
- if ((section == 0 || section == s->the_bfd_section) &&
- s->addr <= pc && pc <= s->endaddr)
-#else
+ ALL_OBJSECTIONS (objfile, s)
if ((section == 0 || section == s->the_bfd_section) &&
s->addr <= pc && pc < s->endaddr)
-#endif
return (s);
return (NULL);
&& STREQ (s->the_bfd_section->name, ".plt"));
return (retval);
}
+
+/* Return nonzero if NAME is in the import list of OBJFILE. Else
+ return zero. */
+
+int
+is_in_import_list (name, objfile)
+ char *name;
+ struct objfile *objfile;
+{
+ 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;
+}
+