static void elf_symfile_read (struct objfile *objfile, int mainline) { bfd *abfd = objfile->obfd; struct elfinfo ei; struct cleanup *back_to; CORE_ADDR offset; init_minimal_symbol_collection (); back_to = make_cleanup_discard_minimal_symbols (); memset ((char *) &ei, 0, sizeof (ei)); /* Allocate struct to keep track of the symfile */ objfile->sym_stab_info = (struct dbx_symfile_info *) xmmalloc (objfile->md, sizeof (struct dbx_symfile_info)); memset ((char *) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info)); make_cleanup (free_elfinfo, (void *) objfile); /* Process the normal ELF symbol table first. This may write some chain of info into the dbx_symfile_info in objfile->sym_stab_info, which can later be used by elfstab_offset_sections. */ elf_symtab_read (objfile, 0); /* Add the dynamic symbols. */ elf_symtab_read (objfile, 1); /* Install any minimal symbols that have been collected as the current minimal symbols for this objfile. The debug readers below this point should not generate new minimal symbols; if they do it's their responsibility to install them. "mdebug" appears to be the only one which will do this. */ install_minimal_symbols (objfile); do_cleanups (back_to); /* Now process debugging information, which is contained in special ELF sections. */ /* If we are reinitializing, or if we have never loaded syms yet, set table to empty. MAINLINE is cleared so that *_read_psymtab functions do not all also re-initialize the psymbol table. */ if (mainline) { init_psymbol_list (objfile, 0); mainline = 0; } /* We first have to find them... */ bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei); /* ELF debugging information is inserted into the psymtab in the order of least informative first - most informative last. Since the psymtab table is searched `most recent insertion first' this increases the probability that more detailed debug information for a section is found. For instance, an object file might contain both .mdebug (XCOFF) and .debug_info (DWARF2) sections then .mdebug is inserted first (searched last) and DWARF2 is inserted last (searched first). If we don't do this then the XCOFF info is found first - for code in an included file XCOFF info is useless. */ if (ei.mdebugsect) { const struct ecoff_debug_swap *swap; /* .mdebug section, presumably holding ECOFF debugging information. */ swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; if (swap) elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect); } if (ei.stabsect) { asection *str_sect; /* Stab sections have an associated string table that looks like a separate section. */ str_sect = bfd_get_section_by_name (abfd, ".stabstr"); /* FIXME should probably warn about a stab section without a stabstr. */ if (str_sect) elfstab_build_psymtabs (objfile, mainline, ei.stabsect, str_sect->filepos, bfd_section_size (abfd, str_sect)); } if (dwarf2_has_info (abfd)) { /* DWARF 2 sections */ dwarf2_build_psymtabs (objfile, mainline); } else if (ei.dboffset && ei.lnoffset) { /* DWARF sections */ dwarf_build_psymtabs (objfile, mainline, ei.dboffset, ei.dbsize, ei.lnoffset, ei.lnsize); } /* FIXME: kettenis/20030504: This still needs to be integrated with dwarf2read.c in a better way. */ dwarf2_build_frame_info (objfile); }
static void macho_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) { bfd *abfd = objfile->obfd; long storage_needed; std::vector<oso_el> oso_vector; /* We have to hold on to the symbol table until the call to macho_symfile_read_all_oso at the end of this function. */ gdb::def_vector<asymbol *> symbol_table; /* Get symbols from the symbol table only if the file is an executable. The symbol table of object files is not relocated and is expected to be in the executable. */ if (bfd_get_file_flags (abfd) & (EXEC_P | DYNAMIC)) { std::string dsym_filename; /* Process the normal symbol table first. */ storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); if (storage_needed < 0) error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd), bfd_errmsg (bfd_get_error ())); if (storage_needed > 0) { long symcount; symbol_table.resize (storage_needed / sizeof (asymbol *)); minimal_symbol_reader reader (objfile); symcount = bfd_canonicalize_symtab (objfile->obfd, symbol_table.data ()); if (symcount < 0) error (_("Can't read symbols from %s: %s"), bfd_get_filename (objfile->obfd), bfd_errmsg (bfd_get_error ())); macho_symtab_read (reader, objfile, symcount, symbol_table.data (), &oso_vector); reader.install (); } /* Try to read .eh_frame / .debug_frame. */ /* First, locate these sections. We ignore the result status as it only checks for debug info. */ dwarf2_has_info (objfile, NULL); dwarf2_build_frame_info (objfile); /* Check for DSYM file. */ gdb_bfd_ref_ptr dsym_bfd (macho_check_dsym (objfile, &dsym_filename)); if (dsym_bfd != NULL) { struct bfd_section *asect, *dsect; if (mach_o_debug_level > 0) printf_unfiltered (_("dsym file found\n")); /* Set dsym section size. */ for (asect = objfile->obfd->sections, dsect = dsym_bfd->sections; asect && dsect; asect = asect->next, dsect = dsect->next) { if (strcmp (asect->name, dsect->name) != 0) break; bfd_set_section_size (dsym_bfd.get (), dsect, bfd_get_section_size (asect)); } /* Add the dsym file as a separate file. */ symbol_file_add_separate (dsym_bfd.get (), dsym_filename.c_str (), symfile_flags, objfile); /* Don't try to read dwarf2 from main file or shared libraries. */ return; } } if (dwarf2_has_info (objfile, NULL)) { /* DWARF 2 sections */ dwarf2_build_psymtabs (objfile); } /* Then the oso. */ if (!oso_vector.empty ()) macho_symfile_read_all_oso (&oso_vector, objfile, symfile_flags); }