gdb/objfiles.c - gdb
Global variables defined
Functions defined
Source code
- #include "defs.h"
- #include "bfd.h"
- #include "symtab.h"
- #include "symfile.h"
- #include "objfiles.h"
- #include "gdb-stabs.h"
- #include "target.h"
- #include "bcache.h"
- #include "expression.h"
- #include "parser-defs.h"
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include "gdb_obstack.h"
- #include "hashtab.h"
- #include "breakpoint.h"
- #include "block.h"
- #include "dictionary.h"
- #include "source.h"
- #include "addrmap.h"
- #include "arch-utils.h"
- #include "exec.h"
- #include "observer.h"
- #include "complaints.h"
- #include "psymtab.h"
- #include "solist.h"
- #include "gdb_bfd.h"
- #include "btrace.h"
- DEFINE_REGISTRY (objfile, REGISTRY_ACCESS_FIELD)
- struct objfile_pspace_info
- {
- struct obj_section **sections;
- int num_sections;
-
- int new_objfiles_available;
-
- int section_map_dirty;
-
- int inhibit_updates;
- };
- static const struct program_space_data *objfiles_pspace_data;
- static void
- objfiles_pspace_data_cleanup (struct program_space *pspace, void *arg)
- {
- struct objfile_pspace_info *info = arg;
- xfree (info->sections);
- xfree (info);
- }
- static struct objfile_pspace_info *
- get_objfile_pspace_data (struct program_space *pspace)
- {
- struct objfile_pspace_info *info;
- info = program_space_data (pspace, objfiles_pspace_data);
- if (info == NULL)
- {
- info = XCNEW (struct objfile_pspace_info);
- set_program_space_data (pspace, objfiles_pspace_data, info);
- }
- return info;
- }
- static const struct bfd_data *objfiles_bfd_data;
- static struct objfile_per_bfd_storage *
- get_objfile_bfd_data (struct objfile *objfile, struct bfd *abfd)
- {
- struct objfile_per_bfd_storage *storage = NULL;
- if (abfd != NULL)
- storage = bfd_data (abfd, objfiles_bfd_data);
- if (storage == NULL)
- {
-
- if (abfd != NULL && !gdb_bfd_requires_relocations (abfd))
- {
- storage = bfd_zalloc (abfd, sizeof (struct objfile_per_bfd_storage));
- set_bfd_data (abfd, objfiles_bfd_data, storage);
- }
- else
- storage = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct objfile_per_bfd_storage);
-
- if (abfd != NULL)
- storage->gdbarch = gdbarch_from_bfd (abfd);
- obstack_init (&storage->storage_obstack);
- storage->filename_cache = bcache_xmalloc (NULL, NULL);
- storage->macro_cache = bcache_xmalloc (NULL, NULL);
- storage->language_of_main = language_unknown;
- }
- return storage;
- }
- static void
- free_objfile_per_bfd_storage (struct objfile_per_bfd_storage *storage)
- {
- bcache_xfree (storage->filename_cache);
- bcache_xfree (storage->macro_cache);
- if (storage->demangled_names_hash)
- htab_delete (storage->demangled_names_hash);
- obstack_free (&storage->storage_obstack, 0);
- }
- static void
- objfile_bfd_data_free (struct bfd *unused, void *d)
- {
- free_objfile_per_bfd_storage (d);
- }
- void
- set_objfile_per_bfd (struct objfile *objfile)
- {
- objfile->per_bfd = get_objfile_bfd_data (objfile, objfile->obfd);
- }
- void
- set_objfile_main_name (struct objfile *objfile,
- const char *name, enum language lang)
- {
- if (objfile->per_bfd->name_of_main == NULL
- || strcmp (objfile->per_bfd->name_of_main, name) != 0)
- objfile->per_bfd->name_of_main
- = obstack_copy0 (&objfile->per_bfd->storage_obstack, name, strlen (name));
- objfile->per_bfd->language_of_main = lang;
- }
- static void
- add_to_objfile_sections_full (struct bfd *abfd, struct bfd_section *asect,
- struct objfile *objfile, int force)
- {
- struct obj_section *section;
- if (!force)
- {
- flagword aflag;
- aflag = bfd_get_section_flags (abfd, asect);
- if (!(aflag & SEC_ALLOC))
- return;
- }
- section = &objfile->sections[gdb_bfd_section_index (abfd, asect)];
- section->objfile = objfile;
- section->the_bfd_section = asect;
- section->ovly_mapped = 0;
- }
- static void
- add_to_objfile_sections (struct bfd *abfd, struct bfd_section *asect,
- void *objfilep)
- {
- add_to_objfile_sections_full (abfd, asect, objfilep, 0);
- }
- void
- build_objfile_section_table (struct objfile *objfile)
- {
- int count = gdb_bfd_count_sections (objfile->obfd);
- objfile->sections = OBSTACK_CALLOC (&objfile->objfile_obstack,
- count,
- struct obj_section);
- objfile->sections_end = (objfile->sections + count);
- bfd_map_over_sections (objfile->obfd,
- add_to_objfile_sections, (void *) objfile);
-
- add_to_objfile_sections_full (objfile->obfd, bfd_com_section_ptr, objfile, 1);
- add_to_objfile_sections_full (objfile->obfd, bfd_und_section_ptr, objfile, 1);
- add_to_objfile_sections_full (objfile->obfd, bfd_abs_section_ptr, objfile, 1);
- add_to_objfile_sections_full (objfile->obfd, bfd_ind_section_ptr, objfile, 1);
- }
- struct objfile *
- allocate_objfile (bfd *abfd, const char *name, int flags)
- {
- struct objfile *objfile;
- char *expanded_name;
- objfile = (struct objfile *) xzalloc (sizeof (struct objfile));
- objfile->psymbol_cache = psymbol_bcache_init ();
-
- obstack_init (&objfile->objfile_obstack);
- objfile_alloc_data (objfile);
- if (name == NULL)
- {
- gdb_assert (abfd == NULL);
- gdb_assert ((flags & OBJF_NOT_FILENAME) != 0);
- expanded_name = xstrdup ("<<anonymous objfile>>");
- }
- else if ((flags & OBJF_NOT_FILENAME) != 0)
- expanded_name = xstrdup (name);
- else
- expanded_name = gdb_abspath (name);
- objfile->original_name = obstack_copy0 (&objfile->objfile_obstack,
- expanded_name,
- strlen (expanded_name));
- xfree (expanded_name);
-
- objfile->obfd = abfd;
- gdb_bfd_ref (abfd);
- if (abfd != NULL)
- {
- objfile->mtime = bfd_get_mtime (abfd);
-
- build_objfile_section_table (objfile);
- }
- objfile->per_bfd = get_objfile_bfd_data (objfile, abfd);
- objfile->pspace = current_program_space;
- terminate_minimal_symbol_table (objfile);
-
- objfile->sect_index_text = -1;
- objfile->sect_index_data = -1;
- objfile->sect_index_bss = -1;
- objfile->sect_index_rodata = -1;
-
- objfile->next = NULL;
- if (object_files == NULL)
- object_files = objfile;
- else
- {
- struct objfile *last_one;
- for (last_one = object_files;
- last_one->next;
- last_one = last_one->next);
- last_one->next = objfile;
- }
-
- objfile->flags |= flags;
-
- get_objfile_pspace_data (objfile->pspace)->new_objfiles_available = 1;
- return objfile;
- }
- struct gdbarch *
- get_objfile_arch (const struct objfile *objfile)
- {
- return objfile->per_bfd->gdbarch;
- }
- int
- entry_point_address_query (CORE_ADDR *entry_p)
- {
- if (symfile_objfile == NULL || !symfile_objfile->per_bfd->ei.entry_point_p)
- return 0;
- *entry_p = (symfile_objfile->per_bfd->ei.entry_point
- + ANOFFSET (symfile_objfile->section_offsets,
- symfile_objfile->per_bfd->ei.the_bfd_section_index));
- return 1;
- }
- CORE_ADDR
- entry_point_address (void)
- {
- CORE_ADDR retval;
- if (!entry_point_address_query (&retval))
- error (_("Entry point address is not known."));
- return retval;
- }
- struct objfile *
- objfile_separate_debug_iterate (const struct objfile *parent,
- const struct objfile *objfile)
- {
- struct objfile *res;
-
- res = objfile->separate_debug_objfile;
- if (res)
- return res;
-
- if (objfile == parent)
- return NULL;
-
- res = objfile->separate_debug_objfile_link;
- if (res)
- return res;
- for (res = objfile->separate_debug_objfile_backlink;
- res != parent;
- res = res->separate_debug_objfile_backlink)
- {
- gdb_assert (res != NULL);
- if (res->separate_debug_objfile_link)
- return res->separate_debug_objfile_link;
- }
- return NULL;
- }
- 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"));
- }
- void
- unlink_objfile (struct objfile *objfile)
- {
- struct objfile **objpp;
- for (objpp = &object_files; *objpp != NULL; objpp = &((*objpp)->next))
- {
- if (*objpp == objfile)
- {
- *objpp = (*objpp)->next;
- objfile->next = NULL;
- return;
- }
- }
- internal_error (__FILE__, __LINE__,
- _("unlink_objfile: objfile already unlinked"));
- }
- void
- add_separate_debug_objfile (struct objfile *objfile, struct objfile *parent)
- {
- gdb_assert (objfile && parent);
-
- gdb_assert (objfile->separate_debug_objfile_backlink == NULL);
- gdb_assert (objfile->separate_debug_objfile_link == NULL);
- gdb_assert (objfile->separate_debug_objfile == NULL);
- gdb_assert (parent->separate_debug_objfile_backlink == NULL);
- gdb_assert (parent->separate_debug_objfile_link == NULL);
- objfile->separate_debug_objfile_backlink = parent;
- objfile->separate_debug_objfile_link = parent->separate_debug_objfile;
- parent->separate_debug_objfile = objfile;
-
- put_objfile_before (objfile, parent);
- }
- void
- free_objfile_separate_debug (struct objfile *objfile)
- {
- struct objfile *child;
- for (child = objfile->separate_debug_objfile; child;)
- {
- struct objfile *next_child = child->separate_debug_objfile_link;
- free_objfile (child);
- child = next_child;
- }
- }
- void
- free_objfile (struct objfile *objfile)
- {
-
- observer_notify_free_objfile (objfile);
-
- free_objfile_separate_debug (objfile);
- if (objfile->separate_debug_objfile_backlink)
- {
-
- struct objfile *child;
- child = objfile->separate_debug_objfile_backlink->separate_debug_objfile;
- if (child == objfile)
- {
-
- objfile->separate_debug_objfile_backlink->separate_debug_objfile =
- objfile->separate_debug_objfile_link;
- }
- else
- {
-
- while (1)
- {
- if (child->separate_debug_objfile_link == objfile)
- {
- child->separate_debug_objfile_link =
- objfile->separate_debug_objfile_link;
- break;
- }
- child = child->separate_debug_objfile_link;
- gdb_assert (child);
- }
- }
- }
-
- preserve_values (objfile);
-
- forget_cached_source_info_for_objfile (objfile);
- breakpoint_free_objfile (objfile);
- btrace_free_objfile (objfile);
-
- if (objfile->sf != NULL)
- {
- (*objfile->sf->sym_finish) (objfile);
- }
-
- objfile_free_data (objfile);
- if (objfile->obfd)
- gdb_bfd_unref (objfile->obfd);
- else
- free_objfile_per_bfd_storage (objfile->per_bfd);
-
- unlink_objfile (objfile);
- if (objfile == symfile_objfile)
- symfile_objfile = NULL;
-
-
- clear_pc_function_cache ();
-
- FIXME
- expression_context_block = NULL;
- innermost_block = NULL;
-
- {
- struct symtab_and_line cursal = get_current_source_symtab_and_line ();
- if (cursal.symtab && SYMTAB_OBJFILE (cursal.symtab) == objfile)
- clear_current_source_symtab_and_line ();
- }
- if (objfile->global_psymbols.list)
- xfree (objfile->global_psymbols.list);
- if (objfile->static_psymbols.list)
- xfree (objfile->static_psymbols.list);
-
- psymbol_bcache_free (objfile->psymbol_cache);
- obstack_free (&objfile->objfile_obstack, 0);
-
- get_objfile_pspace_data (objfile->pspace)->section_map_dirty = 1;
-
- xfree (objfile);
- }
- 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);
- }
- void
- free_all_objfiles (void)
- {
- struct objfile *objfile, *temp;
- struct so_list *so;
-
- for (so = master_so_list (); so; so = so->next)
- gdb_assert (so->objfile == NULL);
- ALL_OBJFILES_SAFE (objfile, temp)
- {
- free_objfile (objfile);
- }
- clear_symtab_users (0);
- }
- static void
- relocate_one_symbol (struct symbol *sym, struct objfile *objfile,
- struct section_offsets *delta)
- {
- fixup_symbol_section (sym, objfile);
-
- if ((SYMBOL_CLASS (sym) == LOC_LABEL
- || SYMBOL_CLASS (sym) == LOC_STATIC)
- && SYMBOL_SECTION (sym) >= 0)
- {
- SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (delta, SYMBOL_SECTION (sym));
- }
- }
- static int
- objfile_relocate1 (struct objfile *objfile,
- const struct section_offsets *new_offsets)
- {
- struct obj_section *s;
- struct section_offsets *delta =
- ((struct section_offsets *)
- alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
- int i;
- int something_changed = 0;
- for (i = 0; i < objfile->num_sections; ++i)
- {
- delta->offsets[i] =
- ANOFFSET (new_offsets, i) - ANOFFSET (objfile->section_offsets, i);
- if (ANOFFSET (delta, i) != 0)
- something_changed = 1;
- }
- if (!something_changed)
- return 0;
-
- {
- struct compunit_symtab *cust;
- struct symtab *s;
- ALL_OBJFILE_FILETABS (objfile, cust, s)
- {
- struct linetable *l;
- int i;
-
- l = SYMTAB_LINETABLE (s);
- if (l)
- {
- for (i = 0; i < l->nitems; ++i)
- l->item[i].pc += ANOFFSET (delta,
- COMPUNIT_BLOCK_LINE_SECTION
- (cust));
- }
- }
- ALL_OBJFILE_COMPUNITS (objfile, cust)
- {
- const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust);
- int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust);
- if (BLOCKVECTOR_MAP (bv))
- addrmap_relocate (BLOCKVECTOR_MAP (bv),
- ANOFFSET (delta, block_line_section));
- for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i)
- {
- struct block *b;
- struct symbol *sym;
- struct dict_iterator iter;
- b = BLOCKVECTOR_BLOCK (bv, i);
- BLOCK_START (b) += ANOFFSET (delta, block_line_section);
- BLOCK_END (b) += ANOFFSET (delta, block_line_section);
-
- ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym)
- {
- relocate_one_symbol (sym, objfile, delta);
- }
- }
- }
- }
-
- {
- struct symbol *iter;
- for (iter = objfile->template_symbols; iter; iter = iter->hash_next)
- relocate_one_symbol (iter, objfile, delta);
- }
- if (objfile->psymtabs_addrmap)
- addrmap_relocate (objfile->psymtabs_addrmap,
- ANOFFSET (delta, SECT_OFF_TEXT (objfile)));
- if (objfile->sf)
- objfile->sf->qf->relocate (objfile, new_offsets, delta);
- {
- int i;
- for (i = 0; i < objfile->num_sections; ++i)
- (objfile->section_offsets)->offsets[i] = ANOFFSET (new_offsets, i);
- }
-
- get_objfile_pspace_data (objfile->pspace)->section_map_dirty = 1;
-
- ALL_OBJFILE_OSECTIONS (objfile, s)
- {
- int idx = s - objfile->sections;
- exec_set_section_address (bfd_get_filename (objfile->obfd), idx,
- obj_section_addr (s));
- }
-
- return 1;
- }
- void
- objfile_relocate (struct objfile *objfile,
- const struct section_offsets *new_offsets)
- {
- struct objfile *debug_objfile;
- int changed = 0;
- changed |= objfile_relocate1 (objfile, new_offsets);
- for (debug_objfile = objfile->separate_debug_objfile;
- debug_objfile;
- debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile))
- {
- struct section_addr_info *objfile_addrs;
- struct section_offsets *new_debug_offsets;
- struct cleanup *my_cleanups;
- objfile_addrs = build_section_addr_info_from_objfile (objfile);
- my_cleanups = make_cleanup (xfree, objfile_addrs);
-
- addr_info_make_relative (objfile_addrs, debug_objfile->obfd);
- gdb_assert (debug_objfile->num_sections
- == gdb_bfd_count_sections (debug_objfile->obfd));
- new_debug_offsets =
- xmalloc (SIZEOF_N_SECTION_OFFSETS (debug_objfile->num_sections));
- make_cleanup (xfree, new_debug_offsets);
- relative_addr_info_to_section_offsets (new_debug_offsets,
- debug_objfile->num_sections,
- objfile_addrs);
- changed |= objfile_relocate1 (debug_objfile, new_debug_offsets);
- do_cleanups (my_cleanups);
- }
-
- if (changed)
- breakpoint_re_set ();
- }
- static int
- objfile_rebase1 (struct objfile *objfile, CORE_ADDR slide)
- {
- struct section_offsets *new_offsets =
- ((struct section_offsets *)
- alloca (SIZEOF_N_SECTION_OFFSETS (objfile->num_sections)));
- int i;
- for (i = 0; i < objfile->num_sections; ++i)
- new_offsets->offsets[i] = slide;
- return objfile_relocate1 (objfile, new_offsets);
- }
- void
- objfile_rebase (struct objfile *objfile, CORE_ADDR slide)
- {
- struct objfile *debug_objfile;
- int changed = 0;
- changed |= objfile_rebase1 (objfile, slide);
- for (debug_objfile = objfile->separate_debug_objfile;
- debug_objfile;
- debug_objfile = objfile_separate_debug_iterate (objfile, debug_objfile))
- changed |= objfile_rebase1 (debug_objfile, slide);
-
- if (changed)
- breakpoint_re_set ();
- }
- int
- objfile_has_partial_symbols (struct objfile *objfile)
- {
- if (!objfile->sf)
- return 0;
-
- if ((objfile->flags & OBJF_PSYMTABS_READ) == 0
- && objfile->sf->sym_read_psymbols != NULL)
- return 1;
- return objfile->sf->qf->has_symbols (objfile);
- }
- int
- objfile_has_full_symbols (struct objfile *objfile)
- {
- return objfile->compunit_symtabs != NULL;
- }
- int
- objfile_has_symbols (struct objfile *objfile)
- {
- struct objfile *o;
- for (o = objfile; o; o = objfile_separate_debug_iterate (objfile, o))
- if (objfile_has_partial_symbols (o) || objfile_has_full_symbols (o))
- return 1;
- return 0;
- }
- int
- have_partial_symbols (void)
- {
- struct objfile *ofp;
- ALL_OBJFILES (ofp)
- {
- if (objfile_has_partial_symbols (ofp))
- return 1;
- }
- return 0;
- }
- int
- have_full_symbols (void)
- {
- struct objfile *ofp;
- ALL_OBJFILES (ofp)
- {
- if (objfile_has_full_symbols (ofp))
- return 1;
- }
- return 0;
- }
- void
- objfile_purge_solibs (void)
- {
- struct objfile *objf;
- struct objfile *temp;
- ALL_OBJFILES_SAFE (objf, temp)
- {
-
- if (!(objf->flags & OBJF_USERLOADED) && (objf->flags & OBJF_SHARED))
- free_objfile (objf);
- }
- }
- int
- have_minimal_symbols (void)
- {
- struct objfile *ofp;
- ALL_OBJFILES (ofp)
- {
- if (ofp->per_bfd->minimal_symbol_count > 0)
- {
- return 1;
- }
- }
- return 0;
- }
- static int
- qsort_cmp (const void *a, const void *b)
- {
- const struct obj_section *sect1 = *(const struct obj_section **) a;
- const struct obj_section *sect2 = *(const struct obj_section **) b;
- const CORE_ADDR sect1_addr = obj_section_addr (sect1);
- const CORE_ADDR sect2_addr = obj_section_addr (sect2);
- if (sect1_addr < sect2_addr)
- return -1;
- else if (sect1_addr > sect2_addr)
- return 1;
- else
- {
-
- const struct objfile *const objfile1 = sect1->objfile;
- const struct objfile *const objfile2 = sect2->objfile;
- if (objfile1->separate_debug_objfile == objfile2
- || objfile2->separate_debug_objfile == objfile1)
- {
-
- return 0;
- }
-
- if (objfile1 == objfile2)
- {
-
- const struct obj_section *osect;
- ALL_OBJFILE_OSECTIONS (objfile1, osect)
- if (osect == sect1)
- return -1;
- else if (osect == sect2)
- return 1;
-
- gdb_assert_not_reached ("section not found");
- }
- else
- {
-
- const struct objfile *objfile;
- ALL_OBJFILES (objfile)
- if (objfile == objfile1)
- return -1;
- else if (objfile == objfile2)
- return 1;
-
- gdb_assert_not_reached ("objfile not found");
- }
- }
-
- gdb_assert_not_reached ("unexpected code path");
- return 0;
- }
- static struct obj_section *
- preferred_obj_section (struct obj_section *a, struct obj_section *b)
- {
- gdb_assert (obj_section_addr (a) == obj_section_addr (b));
- gdb_assert ((a->objfile->separate_debug_objfile == b->objfile)
- || (b->objfile->separate_debug_objfile == a->objfile));
- gdb_assert ((a->objfile->separate_debug_objfile_backlink == b->objfile)
- || (b->objfile->separate_debug_objfile_backlink == a->objfile));
- if (a->objfile->separate_debug_objfile != NULL)
- return a;
- return b;
- }
- static int
- insert_section_p (const struct bfd *abfd,
- const struct bfd_section *section)
- {
- const bfd_vma lma = bfd_section_lma (abfd, section);
- if (overlay_debugging && lma != 0 && lma != bfd_section_vma (abfd, section)
- && (bfd_get_file_flags (abfd) & BFD_IN_MEMORY) == 0)
-
- return 0;
- if ((bfd_get_section_flags (abfd, section) & SEC_THREAD_LOCAL) != 0)
-
- return 0;
- return 1;
- }
- static int
- filter_debuginfo_sections (struct obj_section **map, int map_size)
- {
- int i, j;
- for (i = 0, j = 0; i < map_size - 1; i++)
- {
- struct obj_section *const sect1 = map[i];
- struct obj_section *const sect2 = map[i + 1];
- const struct objfile *const objfile1 = sect1->objfile;
- const struct objfile *const objfile2 = sect2->objfile;
- const CORE_ADDR sect1_addr = obj_section_addr (sect1);
- const CORE_ADDR sect2_addr = obj_section_addr (sect2);
- if (sect1_addr == sect2_addr
- && (objfile1->separate_debug_objfile == objfile2
- || objfile2->separate_debug_objfile == objfile1))
- {
- map[j++] = preferred_obj_section (sect1, sect2);
- ++i;
- }
- else
- map[j++] = sect1;
- }
- if (i < map_size)
- {
- gdb_assert (i == map_size - 1);
- map[j++] = map[i];
- }
-
- gdb_assert (map_size / 2 <= j);
- return j;
- }
- static int
- filter_overlapping_sections (struct obj_section **map, int map_size)
- {
- int i, j;
- for (i = 0, j = 0; i < map_size - 1; )
- {
- int k;
- map[j++] = map[i];
- for (k = i + 1; k < map_size; k++)
- {
- struct obj_section *const sect1 = map[i];
- struct obj_section *const sect2 = map[k];
- const CORE_ADDR sect1_addr = obj_section_addr (sect1);
- const CORE_ADDR sect2_addr = obj_section_addr (sect2);
- const CORE_ADDR sect1_endaddr = obj_section_endaddr (sect1);
- gdb_assert (sect1_addr <= sect2_addr);
- if (sect1_endaddr <= sect2_addr)
- break;
- else
- {
-
- struct objfile *const objf1 = sect1->objfile;
- struct objfile *const objf2 = sect2->objfile;
- const struct bfd_section *const bfds1 = sect1->the_bfd_section;
- const struct bfd_section *const bfds2 = sect2->the_bfd_section;
- const CORE_ADDR sect2_endaddr = obj_section_endaddr (sect2);
- struct gdbarch *const gdbarch = get_objfile_arch (objf1);
- complaint (&symfile_complaints,
- _("unexpected overlap between:\n"
- " (A) section `%s' from `%s' [%s, %s)\n"
- " (B) section `%s' from `%s' [%s, %s).\n"
- "Will ignore section B"),
- bfd_section_name (abfd1, bfds1), objfile_name (objf1),
- paddress (gdbarch, sect1_addr),
- paddress (gdbarch, sect1_endaddr),
- bfd_section_name (abfd2, bfds2), objfile_name (objf2),
- paddress (gdbarch, sect2_addr),
- paddress (gdbarch, sect2_endaddr));
- }
- }
- i = k;
- }
- if (i < map_size)
- {
- gdb_assert (i == map_size - 1);
- map[j++] = map[i];
- }
- return j;
- }
- static void
- update_section_map (struct program_space *pspace,
- struct obj_section ***pmap, int *pmap_size)
- {
- struct objfile_pspace_info *pspace_info;
- int alloc_size, map_size, i;
- struct obj_section *s, **map;
- struct objfile *objfile;
- pspace_info = get_objfile_pspace_data (pspace);
- gdb_assert (pspace_info->section_map_dirty != 0
- || pspace_info->new_objfiles_available != 0);
- map = *pmap;
- xfree (map);
- alloc_size = 0;
- ALL_PSPACE_OBJFILES (pspace, objfile)
- ALL_OBJFILE_OSECTIONS (objfile, s)
- if (insert_section_p (objfile->obfd, s->the_bfd_section))
- alloc_size += 1;
-
- if (alloc_size == 0)
- {
- *pmap = NULL;
- *pmap_size = 0;
- return;
- }
- map = xmalloc (alloc_size * sizeof (*map));
- i = 0;
- ALL_PSPACE_OBJFILES (pspace, objfile)
- ALL_OBJFILE_OSECTIONS (objfile, s)
- if (insert_section_p (objfile->obfd, s->the_bfd_section))
- map[i++] = s;
- qsort (map, alloc_size, sizeof (*map), qsort_cmp);
- map_size = filter_debuginfo_sections(map, alloc_size);
- map_size = filter_overlapping_sections(map, map_size);
- if (map_size < alloc_size)
-
- map = xrealloc (map, map_size * sizeof (*map));
- else
- gdb_assert (alloc_size == map_size);
- *pmap = map;
- *pmap_size = map_size;
- }
- static int
- bsearch_cmp (const void *key, const void *elt)
- {
- const CORE_ADDR pc = *(CORE_ADDR *) key;
- const struct obj_section *section = *(const struct obj_section **) elt;
- if (pc < obj_section_addr (section))
- return -1;
- if (pc < obj_section_endaddr (section))
- return 0;
- return 1;
- }
- struct obj_section *
- find_pc_section (CORE_ADDR pc)
- {
- struct objfile_pspace_info *pspace_info;
- struct obj_section *s, **sp;
-
- s = find_pc_mapped_section (pc);
- if (s)
- return s;
- pspace_info = get_objfile_pspace_data (current_program_space);
- if (pspace_info->section_map_dirty
- || (pspace_info->new_objfiles_available
- && !pspace_info->inhibit_updates))
- {
- update_section_map (current_program_space,
- &pspace_info->sections,
- &pspace_info->num_sections);
-
- pspace_info->new_objfiles_available = 0;
- pspace_info->section_map_dirty = 0;
- }
-
- if (pspace_info->sections == NULL)
- {
- gdb_assert (pspace_info->num_sections == 0);
- return NULL;
- }
- sp = (struct obj_section **) bsearch (&pc,
- pspace_info->sections,
- pspace_info->num_sections,
- sizeof (*pspace_info->sections),
- bsearch_cmp);
- if (sp != NULL)
- return *sp;
- return NULL;
- }
- int
- pc_in_section (CORE_ADDR pc, char *name)
- {
- struct obj_section *s;
- int retval = 0;
- s = find_pc_section (pc);
- retval = (s != NULL
- && s->the_bfd_section->name != NULL
- && strcmp (s->the_bfd_section->name, name) == 0);
- return (retval);
- }
- void
- objfiles_changed (void)
- {
-
- get_objfile_pspace_data (current_program_space)->section_map_dirty = 1;
- }
- void
- inhibit_section_map_updates (struct program_space *pspace)
- {
- get_objfile_pspace_data (pspace)->inhibit_updates = 1;
- }
- void
- resume_section_map_updates (struct program_space *pspace)
- {
- get_objfile_pspace_data (pspace)->inhibit_updates = 0;
- }
- void
- resume_section_map_updates_cleanup (void *arg)
- {
- resume_section_map_updates (arg);
- }
- int
- is_addr_in_objfile (CORE_ADDR addr, const struct objfile *objfile)
- {
- struct obj_section *osect;
- if (objfile == NULL)
- return 0;
- ALL_OBJFILE_OSECTIONS (objfile, osect)
- {
- if (section_is_overlay (osect) && !section_is_mapped (osect))
- continue;
- if (obj_section_addr (osect) <= addr
- && addr < obj_section_endaddr (osect))
- return 1;
- }
- return 0;
- }
- int
- shared_objfile_contains_address_p (struct program_space *pspace,
- CORE_ADDR address)
- {
- struct objfile *objfile;
- ALL_PSPACE_OBJFILES (pspace, objfile)
- {
- if ((objfile->flags & OBJF_SHARED) != 0
- && is_addr_in_objfile (address, objfile))
- return 1;
- }
- return 0;
- }
- void
- default_iterate_over_objfiles_in_search_order
- (struct gdbarch *gdbarch,
- iterate_over_objfiles_in_search_order_cb_ftype *cb,
- void *cb_data, struct objfile *current_objfile)
- {
- int stop = 0;
- struct objfile *objfile;
- ALL_OBJFILES (objfile)
- {
- stop = cb (objfile, cb_data);
- if (stop)
- return;
- }
- }
- const char *
- objfile_name (const struct objfile *objfile)
- {
- if (objfile->obfd != NULL)
- return bfd_get_filename (objfile->obfd);
- return objfile->original_name;
- }
- const char *
- objfile_debug_name (const struct objfile *objfile)
- {
- return lbasename (objfile->original_name);
- }
- extern initialize_file_ftype _initialize_objfiles;
- void
- _initialize_objfiles (void)
- {
- objfiles_pspace_data
- = register_program_space_data_with_cleanup (NULL,
- objfiles_pspace_data_cleanup);
- objfiles_bfd_data = register_bfd_data_with_cleanup (NULL,
- objfile_bfd_data_free);
- }