elfread.c revision 98944
1249259Sdim/* Read ELF (Executable and Linking Format) object files for GDB. 2249259Sdim Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 3249259Sdim 2001, 2002 4249259Sdim Free Software Foundation, Inc. 5249259Sdim Written by Fred Fish at Cygnus Support. 6249259Sdim 7249259Sdim This file is part of GDB. 8249259Sdim 9249259Sdim This program is free software; you can redistribute it and/or modify 10249259Sdim it under the terms of the GNU General Public License as published by 11249259Sdim the Free Software Foundation; either version 2 of the License, or 12249259Sdim (at your option) any later version. 13249259Sdim 14249259Sdim This program is distributed in the hope that it will be useful, 15249259Sdim but WITHOUT ANY WARRANTY; without even the implied warranty of 16249259Sdim MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17249259Sdim GNU General Public License for more details. 18249259Sdim 19249259Sdim You should have received a copy of the GNU General Public License 20249259Sdim along with this program; if not, write to the Free Software 21249259Sdim Foundation, Inc., 59 Temple Place - Suite 330, 22249259Sdim Boston, MA 02111-1307, USA. */ 23249259Sdim 24249259Sdim#include "defs.h" 25249259Sdim#include "bfd.h" 26249259Sdim#include "gdb_string.h" 27249259Sdim#include "elf-bfd.h" 28249259Sdim#include "elf/mips.h" 29249259Sdim#include "symtab.h" 30249259Sdim#include "symfile.h" 31249259Sdim#include "objfiles.h" 32249259Sdim#include "buildsym.h" 33249259Sdim#include "stabsread.h" 34249259Sdim#include "gdb-stabs.h" 35249259Sdim#include "complaints.h" 36249259Sdim#include "demangle.h" 37249259Sdim 38249259Sdimextern void _initialize_elfread (void); 39249259Sdim 40249259Sdim/* The struct elfinfo is available only during ELF symbol table and 41249259Sdim psymtab reading. It is destroyed at the completion of psymtab-reading. 42249259Sdim It's local to elf_symfile_read. */ 43249259Sdim 44251662Sdimstruct elfinfo 45249259Sdim { 46249259Sdim file_ptr dboffset; /* Offset to dwarf debug section */ 47249259Sdim unsigned int dbsize; /* Size of dwarf debug section */ 48249259Sdim file_ptr lnoffset; /* Offset to dwarf line number section */ 49249259Sdim unsigned int lnsize; /* Size of dwarf line number section */ 50249259Sdim asection *stabsect; /* Section pointer for .stab section */ 51249259Sdim asection *stabindexsect; /* Section pointer for .stab.index section */ 52249259Sdim asection *mdebugsect; /* Section pointer for .mdebug section */ 53251662Sdim }; 54249259Sdim 55249259Sdim/* Various things we might complain about... */ 56249259Sdim 57249259Sdimstruct complaint section_info_complaint = 58249259Sdim{"elf/stab section information %s without a preceding file symbol", 0, 0}; 59249259Sdim 60249259Sdimstruct complaint section_info_dup_complaint = 61249259Sdim{"duplicated elf/stab section information for %s", 0, 0}; 62249259Sdim 63251662Sdimstruct complaint stab_info_mismatch_complaint = 64249259Sdim{"elf/stab section information missing for %s", 0, 0}; 65249259Sdim 66249259Sdimstruct complaint stab_info_questionable_complaint = 67249259Sdim{"elf/stab section information questionable for %s", 0, 0}; 68249259Sdim 69249259Sdimstatic void free_elfinfo (void *); 70249259Sdim 71249259Sdim/* We are called once per section from elf_symfile_read. We 72249259Sdim need to examine each section we are passed, check to see 73249259Sdim if it is something we are interested in processing, and 74249259Sdim if so, stash away some access information for the section. 75249259Sdim 76249259Sdim For now we recognize the dwarf debug information sections and 77249259Sdim line number sections from matching their section names. The 78249259Sdim ELF definition is no real help here since it has no direct 79249259Sdim knowledge of DWARF (by design, so any debugging format can be 80249259Sdim used). 81249259Sdim 82249259Sdim We also recognize the ".stab" sections used by the Sun compilers 83249259Sdim released with Solaris 2. 84249259Sdim 85249259Sdim FIXME: The section names should not be hardwired strings (what 86249259Sdim should they be? I don't think most object file formats have enough 87249259Sdim section flags to specify what kind of debug section it is 88249259Sdim -kingdon). */ 89249259Sdim 90249259Sdimstatic void 91249259Sdimelf_locate_sections (bfd *ignore_abfd, asection *sectp, void *eip) 92249259Sdim{ 93249259Sdim register struct elfinfo *ei; 94249259Sdim 95249259Sdim ei = (struct elfinfo *) eip; 96249259Sdim if (STREQ (sectp->name, ".debug")) 97249259Sdim { 98249259Sdim ei->dboffset = sectp->filepos; 99249259Sdim ei->dbsize = bfd_get_section_size_before_reloc (sectp); 100249259Sdim } 101249259Sdim else if (STREQ (sectp->name, ".line")) 102249259Sdim { 103249259Sdim ei->lnoffset = sectp->filepos; 104249259Sdim ei->lnsize = bfd_get_section_size_before_reloc (sectp); 105249259Sdim } 106249259Sdim else if (STREQ (sectp->name, ".stab")) 107249259Sdim { 108249259Sdim ei->stabsect = sectp; 109249259Sdim } 110249259Sdim else if (STREQ (sectp->name, ".stab.index")) 111249259Sdim { 112249259Sdim ei->stabindexsect = sectp; 113249259Sdim } 114249259Sdim else if (STREQ (sectp->name, ".mdebug")) 115249259Sdim { 116249259Sdim ei->mdebugsect = sectp; 117249259Sdim } 118249259Sdim} 119249259Sdim 120249259Sdim#if 0 /* Currently unused */ 121249259Sdim 122249259Sdimchar * 123249259Sdimelf_interpreter (bfd *abfd) 124249259Sdim{ 125249259Sdim sec_ptr interp_sec; 126249259Sdim unsigned size; 127249259Sdim char *interp = NULL; 128249259Sdim 129249259Sdim interp_sec = bfd_get_section_by_name (abfd, ".interp"); 130249259Sdim if (interp_sec) 131249259Sdim { 132249259Sdim size = bfd_section_size (abfd, interp_sec); 133249259Sdim interp = alloca (size); 134249259Sdim if (bfd_get_section_contents (abfd, interp_sec, interp, (file_ptr) 0, 135249259Sdim size)) 136249259Sdim { 137249259Sdim interp = savestring (interp, size - 1); 138249259Sdim } 139249259Sdim else 140249259Sdim { 141249259Sdim interp = NULL; 142249259Sdim } 143249259Sdim } 144249259Sdim return (interp); 145249259Sdim} 146249259Sdim 147249259Sdim#endif 148249259Sdim 149249259Sdimstatic struct minimal_symbol * 150249259Sdimrecord_minimal_symbol_and_info (char *name, CORE_ADDR address, 151249259Sdim enum minimal_symbol_type ms_type, char *info, /* FIXME, is this really char *? */ 152249259Sdim asection *bfd_section, struct objfile *objfile) 153249259Sdim{ 154249259Sdim if (ms_type == mst_text || ms_type == mst_file_text) 155249259Sdim address = SMASH_TEXT_ADDRESS (address); 156249259Sdim 157249259Sdim return prim_record_minimal_symbol_and_info 158249259Sdim (name, address, ms_type, info, bfd_section->index, bfd_section, objfile); 159249259Sdim} 160249259Sdim 161249259Sdim/* 162249259Sdim 163249259Sdim LOCAL FUNCTION 164249259Sdim 165249259Sdim elf_symtab_read -- read the symbol table of an ELF file 166249259Sdim 167249259Sdim SYNOPSIS 168249259Sdim 169249259Sdim void elf_symtab_read (struct objfile *objfile, int dynamic) 170249259Sdim 171249259Sdim DESCRIPTION 172249259Sdim 173249259Sdim Given an objfile and a flag that specifies whether or not the objfile 174249259Sdim is for an executable or not (may be shared library for example), add 175249259Sdim all the global function and data symbols to the minimal symbol table. 176249259Sdim 177249259Sdim In stabs-in-ELF, as implemented by Sun, there are some local symbols 178249259Sdim defined in the ELF symbol table, which can be used to locate 179249259Sdim the beginnings of sections from each ".o" file that was linked to 180249259Sdim form the executable objfile. We gather any such info and record it 181249259Sdim in data structures hung off the objfile's private data. 182249259Sdim 183249259Sdim */ 184249259Sdim 185249259Sdimstatic void 186249259Sdimelf_symtab_read (struct objfile *objfile, int dynamic) 187249259Sdim{ 188249259Sdim long storage_needed; 189249259Sdim asymbol *sym; 190249259Sdim asymbol **symbol_table; 191249259Sdim long number_of_symbols; 192249259Sdim long i; 193249259Sdim int index; 194249259Sdim struct cleanup *back_to; 195249259Sdim CORE_ADDR symaddr; 196249259Sdim CORE_ADDR offset; 197249259Sdim enum minimal_symbol_type ms_type; 198249259Sdim /* If sectinfo is nonNULL, it contains section info that should end up 199249259Sdim filed in the objfile. */ 200249259Sdim struct stab_section_info *sectinfo = NULL; 201249259Sdim /* If filesym is nonzero, it points to a file symbol, but we haven't 202249259Sdim seen any section info for it yet. */ 203249259Sdim asymbol *filesym = 0; 204249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING 205249259Sdim /* Name of filesym, as saved on the symbol_obstack. */ 206249259Sdim char *filesymname = obsavestring ("", 0, &objfile->symbol_obstack); 207249259Sdim#endif 208249259Sdim struct dbx_symfile_info *dbx = objfile->sym_stab_info; 209249259Sdim unsigned long size; 210249259Sdim int stripped = (bfd_get_symcount (objfile->obfd) == 0); 211249259Sdim 212249259Sdim if (dynamic) 213249259Sdim { 214249259Sdim storage_needed = bfd_get_dynamic_symtab_upper_bound (objfile->obfd); 215249259Sdim 216249259Sdim /* Nothing to be done if there is no dynamic symtab. */ 217249259Sdim if (storage_needed < 0) 218249259Sdim return; 219249259Sdim } 220249259Sdim else 221249259Sdim { 222249259Sdim storage_needed = bfd_get_symtab_upper_bound (objfile->obfd); 223249259Sdim if (storage_needed < 0) 224249259Sdim error ("Can't read symbols from %s: %s", bfd_get_filename (objfile->obfd), 225249259Sdim bfd_errmsg (bfd_get_error ())); 226249259Sdim } 227249259Sdim if (storage_needed > 0) 228249259Sdim { 229249259Sdim symbol_table = (asymbol **) xmalloc (storage_needed); 230249259Sdim back_to = make_cleanup (xfree, symbol_table); 231249259Sdim if (dynamic) 232249259Sdim number_of_symbols = bfd_canonicalize_dynamic_symtab (objfile->obfd, 233249259Sdim symbol_table); 234249259Sdim else 235249259Sdim number_of_symbols = bfd_canonicalize_symtab (objfile->obfd, symbol_table); 236249259Sdim if (number_of_symbols < 0) 237249259Sdim error ("Can't read symbols from %s: %s", bfd_get_filename (objfile->obfd), 238249259Sdim bfd_errmsg (bfd_get_error ())); 239249259Sdim 240249259Sdim for (i = 0; i < number_of_symbols; i++) 241249259Sdim { 242249259Sdim sym = symbol_table[i]; 243249259Sdim if (sym->name == NULL || *sym->name == '\0') 244249259Sdim { 245249259Sdim /* Skip names that don't exist (shouldn't happen), or names 246249259Sdim that are null strings (may happen). */ 247249259Sdim continue; 248249259Sdim } 249249259Sdim 250249259Sdim offset = ANOFFSET (objfile->section_offsets, sym->section->index); 251249259Sdim if (dynamic 252249259Sdim && sym->section == &bfd_und_section 253249259Sdim && (sym->flags & BSF_FUNCTION)) 254249259Sdim { 255249259Sdim struct minimal_symbol *msym; 256249259Sdim 257249259Sdim /* Symbol is a reference to a function defined in 258249259Sdim a shared library. 259249259Sdim If its value is non zero then it is usually the address 260249259Sdim of the corresponding entry in the procedure linkage table, 261249259Sdim plus the desired section offset. 262249259Sdim If its value is zero then the dynamic linker has to resolve 263249259Sdim the symbol. We are unable to find any meaningful address 264249259Sdim for this symbol in the executable file, so we skip it. */ 265249259Sdim symaddr = sym->value; 266249259Sdim if (symaddr == 0) 267249259Sdim continue; 268249259Sdim symaddr += offset; 269249259Sdim msym = record_minimal_symbol_and_info 270249259Sdim ((char *) sym->name, symaddr, 271249259Sdim mst_solib_trampoline, NULL, sym->section, objfile); 272249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING 273249259Sdim if (msym != NULL) 274249259Sdim msym->filename = filesymname; 275249259Sdim#endif 276249259Sdim continue; 277249259Sdim } 278249259Sdim 279249259Sdim /* If it is a nonstripped executable, do not enter dynamic 280249259Sdim symbols, as the dynamic symbol table is usually a subset 281249259Sdim of the main symbol table. */ 282249259Sdim if (dynamic && !stripped) 283249259Sdim continue; 284249259Sdim if (sym->flags & BSF_FILE) 285249259Sdim { 286249259Sdim /* STT_FILE debugging symbol that helps stabs-in-elf debugging. 287249259Sdim Chain any old one onto the objfile; remember new sym. */ 288249259Sdim if (sectinfo != NULL) 289249259Sdim { 290249259Sdim sectinfo->next = dbx->stab_section_info; 291249259Sdim dbx->stab_section_info = sectinfo; 292249259Sdim sectinfo = NULL; 293249259Sdim } 294249259Sdim filesym = sym; 295249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING 296249259Sdim filesymname = 297249259Sdim obsavestring ((char *) filesym->name, strlen (filesym->name), 298249259Sdim &objfile->symbol_obstack); 299249259Sdim#endif 300249259Sdim } 301249259Sdim else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) 302249259Sdim { 303249259Sdim struct minimal_symbol *msym; 304249259Sdim 305249259Sdim /* Select global/local/weak symbols. Note that bfd puts abs 306249259Sdim symbols in their own section, so all symbols we are 307249259Sdim interested in will have a section. */ 308249259Sdim /* Bfd symbols are section relative. */ 309249259Sdim symaddr = sym->value + sym->section->vma; 310249259Sdim /* Relocate all non-absolute symbols by the section offset. */ 311249259Sdim if (sym->section != &bfd_abs_section) 312249259Sdim { 313249259Sdim symaddr += offset; 314249259Sdim } 315249259Sdim /* For non-absolute symbols, use the type of the section 316249259Sdim they are relative to, to intuit text/data. Bfd provides 317249259Sdim no way of figuring this out for absolute symbols. */ 318249259Sdim if (sym->section == &bfd_abs_section) 319249259Sdim { 320249259Sdim /* This is a hack to get the minimal symbol type 321249259Sdim right for Irix 5, which has absolute addresses 322249259Sdim with special section indices for dynamic symbols. */ 323249259Sdim unsigned short shndx = 324249259Sdim ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx; 325249259Sdim 326249259Sdim switch (shndx) 327249259Sdim { 328249259Sdim case SHN_MIPS_TEXT: 329249259Sdim ms_type = mst_text; 330249259Sdim break; 331249259Sdim case SHN_MIPS_DATA: 332249259Sdim ms_type = mst_data; 333249259Sdim break; 334249259Sdim case SHN_MIPS_ACOMMON: 335249259Sdim ms_type = mst_bss; 336249259Sdim break; 337249259Sdim default: 338249259Sdim ms_type = mst_abs; 339249259Sdim } 340249259Sdim 341249259Sdim /* If it is an Irix dynamic symbol, skip section name 342249259Sdim symbols, relocate all others by section offset. */ 343249259Sdim if (ms_type != mst_abs) 344249259Sdim { 345249259Sdim if (sym->name[0] == '.') 346249259Sdim continue; 347249259Sdim symaddr += offset; 348249259Sdim } 349249259Sdim } 350249259Sdim else if (sym->section->flags & SEC_CODE) 351249259Sdim { 352249259Sdim if (sym->flags & BSF_GLOBAL) 353249259Sdim { 354249259Sdim ms_type = mst_text; 355249259Sdim } 356249259Sdim else if ((sym->name[0] == '.' && sym->name[1] == 'L') 357249259Sdim || ((sym->flags & BSF_LOCAL) 358249259Sdim && sym->name[0] == '$' 359249259Sdim && sym->name[1] == 'L')) 360249259Sdim /* Looks like a compiler-generated label. Skip it. 361249259Sdim The assembler should be skipping these (to keep 362249259Sdim executables small), but apparently with gcc on the 363249259Sdim delta m88k SVR4, it loses. So to have us check too 364249259Sdim should be harmless (but I encourage people to fix this 365249259Sdim in the assembler instead of adding checks here). */ 366249259Sdim continue; 367249259Sdim#ifdef HARRIS_TARGET 368249259Sdim else if (sym->name[0] == '.' && sym->name[1] == '.') 369249259Sdim { 370249259Sdim /* Looks like a Harris compiler generated label for the 371249259Sdim purpose of marking instructions that are relevant to 372249259Sdim DWARF dies. The assembler can't get rid of these 373249259Sdim because they are relocatable addresses that the 374249259Sdim linker needs to resolve. */ 375249259Sdim continue; 376249259Sdim } 377249259Sdim#endif 378249259Sdim else 379249259Sdim { 380249259Sdim ms_type = mst_file_text; 381249259Sdim } 382249259Sdim } 383249259Sdim else if (sym->section->flags & SEC_ALLOC) 384249259Sdim { 385249259Sdim if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) 386249259Sdim { 387249259Sdim if (sym->section->flags & SEC_LOAD) 388249259Sdim { 389249259Sdim ms_type = mst_data; 390249259Sdim } 391249259Sdim else 392249259Sdim { 393249259Sdim ms_type = mst_bss; 394249259Sdim } 395249259Sdim } 396249259Sdim else if (sym->flags & BSF_LOCAL) 397249259Sdim { 398249259Sdim /* Named Local variable in a Data section. Check its 399249259Sdim name for stabs-in-elf. The STREQ macro checks the 400249259Sdim first character inline, so we only actually do a 401249259Sdim strcmp function call on names that start with 'B' 402249259Sdim or 'D' */ 403249259Sdim index = SECT_OFF_MAX; 404249259Sdim if (STREQ ("Bbss.bss", sym->name)) 405249259Sdim { 406249259Sdim index = SECT_OFF_BSS (objfile); 407249259Sdim } 408249259Sdim else if (STREQ ("Ddata.data", sym->name)) 409249259Sdim { 410249259Sdim index = SECT_OFF_DATA (objfile); 411249259Sdim } 412249259Sdim else if (STREQ ("Drodata.rodata", sym->name)) 413249259Sdim { 414249259Sdim index = SECT_OFF_RODATA (objfile); 415249259Sdim } 416249259Sdim if (index != SECT_OFF_MAX) 417249259Sdim { 418249259Sdim /* Found a special local symbol. Allocate a 419249259Sdim sectinfo, if needed, and fill it in. */ 420249259Sdim if (sectinfo == NULL) 421249259Sdim { 422249259Sdim sectinfo = (struct stab_section_info *) 423249259Sdim xmmalloc (objfile->md, sizeof (*sectinfo)); 424249259Sdim memset (sectinfo, 0, 425249259Sdim sizeof (*sectinfo)); 426249259Sdim if (filesym == NULL) 427249259Sdim { 428249259Sdim complain (§ion_info_complaint, 429249259Sdim sym->name); 430249259Sdim } 431249259Sdim else 432249259Sdim { 433249259Sdim sectinfo->filename = 434249259Sdim (char *) filesym->name; 435249259Sdim } 436249259Sdim } 437249259Sdim if (index != -1) 438249259Sdim { 439249259Sdim if (sectinfo->sections[index] != 0) 440249259Sdim { 441249259Sdim complain (§ion_info_dup_complaint, 442249259Sdim sectinfo->filename); 443249259Sdim } 444249259Sdim } 445249259Sdim else 446249259Sdim internal_error (__FILE__, __LINE__, 447249259Sdim "Section index uninitialized."); 448249259Sdim /* Bfd symbols are section relative. */ 449249259Sdim symaddr = sym->value + sym->section->vma; 450249259Sdim /* Relocate non-absolute symbols by the section offset. */ 451249259Sdim if (sym->section != &bfd_abs_section) 452249259Sdim { 453249259Sdim symaddr += offset; 454249259Sdim } 455249259Sdim if (index != -1) 456249259Sdim sectinfo->sections[index] = symaddr; 457249259Sdim else 458249259Sdim internal_error (__FILE__, __LINE__, 459249259Sdim "Section index uninitialized."); 460249259Sdim /* The special local symbols don't go in the 461249259Sdim minimal symbol table, so ignore this one. */ 462249259Sdim continue; 463249259Sdim } 464249259Sdim /* Not a special stabs-in-elf symbol, do regular 465249259Sdim symbol processing. */ 466249259Sdim if (sym->section->flags & SEC_LOAD) 467249259Sdim { 468249259Sdim ms_type = mst_file_data; 469249259Sdim } 470249259Sdim else 471249259Sdim { 472249259Sdim ms_type = mst_file_bss; 473249259Sdim } 474249259Sdim } 475249259Sdim else 476249259Sdim { 477249259Sdim ms_type = mst_unknown; 478249259Sdim } 479249259Sdim } 480249259Sdim else 481249259Sdim { 482249259Sdim /* FIXME: Solaris2 shared libraries include lots of 483263508Sdim odd "absolute" and "undefined" symbols, that play 484249259Sdim hob with actions like finding what function the PC 485249259Sdim is in. Ignore them if they aren't text, data, or bss. */ 486249259Sdim /* ms_type = mst_unknown; */ 487249259Sdim continue; /* Skip this symbol. */ 488249259Sdim } 489249259Sdim /* Pass symbol size field in via BFD. FIXME!!! */ 490249259Sdim size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; 491249259Sdim msym = record_minimal_symbol_and_info 492249259Sdim ((char *) sym->name, symaddr, 493249259Sdim ms_type, (void *) size, sym->section, objfile); 494249259Sdim#ifdef SOFUN_ADDRESS_MAYBE_MISSING 495249259Sdim if (msym != NULL) 496249259Sdim msym->filename = filesymname; 497249259Sdim#endif 498249259Sdim ELF_MAKE_MSYMBOL_SPECIAL (sym, msym); 499249259Sdim } 500249259Sdim } 501249259Sdim do_cleanups (back_to); 502249259Sdim } 503249259Sdim} 504249259Sdim 505249259Sdim/* Scan and build partial symbols for a symbol file. 506249259Sdim We have been initialized by a call to elf_symfile_init, which 507249259Sdim currently does nothing. 508249259Sdim 509249259Sdim SECTION_OFFSETS is a set of offsets to apply to relocate the symbols 510263508Sdim in each section. We simplify it down to a single offset for all 511263508Sdim symbols. FIXME. 512263508Sdim 513249259Sdim MAINLINE is true if we are reading the main symbol 514263508Sdim table (as opposed to a shared lib or dynamically loaded file). 515263508Sdim 516263508Sdim This function only does the minimum work necessary for letting the 517263508Sdim user "name" things symbolically; it does not read the entire symtab. 518263508Sdim Instead, it reads the external and static symbols and puts them in partial 519263508Sdim symbol tables. When more extensive information is requested of a 520249259Sdim file, the corresponding partial symbol table is mutated into a full 521249259Sdim fledged symbol table by going back and reading the symbols 522249259Sdim for real. 523249259Sdim 524249259Sdim We look for sections with specific names, to tell us what debug 525249259Sdim format to look for: FIXME!!! 526249259Sdim 527249259Sdim dwarf_build_psymtabs() builds psymtabs for DWARF symbols; 528249259Sdim elfstab_build_psymtabs() handles STABS symbols; 529249259Sdim mdebug_build_psymtabs() handles ECOFF debugging information. 530249259Sdim 531249259Sdim Note that ELF files have a "minimal" symbol table, which looks a lot 532249259Sdim like a COFF symbol table, but has only the minimal information necessary 533249259Sdim for linking. We process this also, and use the information to 534249259Sdim build gdb's minimal symbol table. This gives us some minimal debugging 535249259Sdim capability even for files compiled without -g. */ 536249259Sdim 537249259Sdimstatic void 538249259Sdimelf_symfile_read (struct objfile *objfile, int mainline) 539249259Sdim{ 540249259Sdim bfd *abfd = objfile->obfd; 541249259Sdim struct elfinfo ei; 542249259Sdim struct cleanup *back_to; 543249259Sdim CORE_ADDR offset; 544249259Sdim 545249259Sdim init_minimal_symbol_collection (); 546249259Sdim back_to = make_cleanup_discard_minimal_symbols (); 547249259Sdim 548249259Sdim memset ((char *) &ei, 0, sizeof (ei)); 549249259Sdim 550249259Sdim /* Allocate struct to keep track of the symfile */ 551249259Sdim objfile->sym_stab_info = (struct dbx_symfile_info *) 552249259Sdim xmmalloc (objfile->md, sizeof (struct dbx_symfile_info)); 553249259Sdim memset ((char *) objfile->sym_stab_info, 0, sizeof (struct dbx_symfile_info)); 554249259Sdim make_cleanup (free_elfinfo, (void *) objfile); 555249259Sdim 556249259Sdim /* Process the normal ELF symbol table first. This may write some 557249259Sdim chain of info into the dbx_symfile_info in objfile->sym_stab_info, 558249259Sdim which can later be used by elfstab_offset_sections. */ 559249259Sdim 560249259Sdim elf_symtab_read (objfile, 0); 561249259Sdim 562249259Sdim /* Add the dynamic symbols. */ 563249259Sdim 564249259Sdim elf_symtab_read (objfile, 1); 565249259Sdim 566249259Sdim /* Now process debugging information, which is contained in 567249259Sdim special ELF sections. */ 568249259Sdim 569249259Sdim /* If we are reinitializing, or if we have never loaded syms yet, 570249259Sdim set table to empty. MAINLINE is cleared so that *_read_psymtab 571249259Sdim functions do not all also re-initialize the psymbol table. */ 572249259Sdim if (mainline) 573249259Sdim { 574249259Sdim init_psymbol_list (objfile, 0); 575249259Sdim mainline = 0; 576249259Sdim } 577249259Sdim 578249259Sdim /* We first have to find them... */ 579249259Sdim bfd_map_over_sections (abfd, elf_locate_sections, (void *) & ei); 580249259Sdim 581249259Sdim /* ELF debugging information is inserted into the psymtab in the 582249259Sdim order of least informative first - most informative last. Since 583249259Sdim the psymtab table is searched `most recent insertion first' this 584249259Sdim increases the probability that more detailed debug information 585249259Sdim for a section is found. 586249259Sdim 587249259Sdim For instance, an object file might contain both .mdebug (XCOFF) 588249259Sdim and .debug_info (DWARF2) sections then .mdebug is inserted first 589249259Sdim (searched last) and DWARF2 is inserted last (searched first). If 590249259Sdim we don't do this then the XCOFF info is found first - for code in 591249259Sdim an included file XCOFF info is useless. */ 592249259Sdim 593249259Sdim if (ei.mdebugsect) 594249259Sdim { 595249259Sdim const struct ecoff_debug_swap *swap; 596249259Sdim 597249259Sdim /* .mdebug section, presumably holding ECOFF debugging 598249259Sdim information. */ 599249259Sdim swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap; 600249259Sdim if (swap) 601249259Sdim elfmdebug_build_psymtabs (objfile, swap, ei.mdebugsect); 602249259Sdim } 603249259Sdim if (ei.stabsect) 604249259Sdim { 605249259Sdim asection *str_sect; 606249259Sdim 607249259Sdim /* Stab sections have an associated string table that looks like 608249259Sdim a separate section. */ 609249259Sdim str_sect = bfd_get_section_by_name (abfd, ".stabstr"); 610249259Sdim 611249259Sdim /* FIXME should probably warn about a stab section without a stabstr. */ 612249259Sdim if (str_sect) 613249259Sdim elfstab_build_psymtabs (objfile, 614249259Sdim mainline, 615249259Sdim ei.stabsect->filepos, 616249259Sdim bfd_section_size (abfd, ei.stabsect), 617249259Sdim str_sect->filepos, 618249259Sdim bfd_section_size (abfd, str_sect)); 619249259Sdim } 620249259Sdim if (dwarf2_has_info (abfd)) 621249259Sdim { 622249259Sdim /* DWARF 2 sections */ 623249259Sdim dwarf2_build_psymtabs (objfile, mainline); 624249259Sdim } 625249259Sdim else if (ei.dboffset && ei.lnoffset) 626249259Sdim { 627249259Sdim /* DWARF sections */ 628249259Sdim dwarf_build_psymtabs (objfile, 629249259Sdim mainline, 630249259Sdim ei.dboffset, ei.dbsize, 631249259Sdim ei.lnoffset, ei.lnsize); 632263508Sdim } 633263508Sdim 634263508Sdim if (DWARF2_BUILD_FRAME_INFO_P ()) 635263508Sdim DWARF2_BUILD_FRAME_INFO(objfile); 636263508Sdim 637263508Sdim /* Install any minimal symbols that have been collected as the current 638263508Sdim minimal symbols for this objfile. */ 639249259Sdim 640249259Sdim install_minimal_symbols (objfile); 641249259Sdim 642249259Sdim do_cleanups (back_to); 643249259Sdim} 644249259Sdim 645249259Sdim/* This cleans up the objfile's sym_stab_info pointer, and the chain of 646249259Sdim stab_section_info's, that might be dangling from it. */ 647249259Sdim 648249259Sdimstatic void 649249259Sdimfree_elfinfo (void *objp) 650249259Sdim{ 651249259Sdim struct objfile *objfile = (struct objfile *) objp; 652249259Sdim struct dbx_symfile_info *dbxinfo = objfile->sym_stab_info; 653249259Sdim struct stab_section_info *ssi, *nssi; 654249259Sdim 655249259Sdim ssi = dbxinfo->stab_section_info; 656249259Sdim while (ssi) 657249259Sdim { 658249259Sdim nssi = ssi->next; 659249259Sdim xmfree (objfile->md, ssi); 660249259Sdim ssi = nssi; 661249259Sdim } 662249259Sdim 663249259Sdim dbxinfo->stab_section_info = 0; /* Just say No mo info about this. */ 664249259Sdim} 665249259Sdim 666249259Sdim 667249259Sdim/* Initialize anything that needs initializing when a completely new symbol 668249259Sdim file is specified (not just adding some symbols from another file, e.g. a 669249259Sdim shared library). 670249259Sdim 671249259Sdim We reinitialize buildsym, since we may be reading stabs from an ELF file. */ 672249259Sdim 673249259Sdimstatic void 674249259Sdimelf_new_init (struct objfile *ignore) 675249259Sdim{ 676249259Sdim stabsread_new_init (); 677249259Sdim buildsym_new_init (); 678249259Sdim} 679249259Sdim 680249259Sdim/* Perform any local cleanups required when we are done with a particular 681249259Sdim objfile. I.E, we are in the process of discarding all symbol information 682249259Sdim for an objfile, freeing up all memory held for it, and unlinking the 683249259Sdim objfile struct from the global list of known objfiles. */ 684249259Sdim 685249259Sdimstatic void 686249259Sdimelf_symfile_finish (struct objfile *objfile) 687249259Sdim{ 688249259Sdim if (objfile->sym_stab_info != NULL) 689249259Sdim { 690249259Sdim xmfree (objfile->md, objfile->sym_stab_info); 691249259Sdim } 692249259Sdim} 693249259Sdim 694249259Sdim/* ELF specific initialization routine for reading symbols. 695249259Sdim 696249259Sdim It is passed a pointer to a struct sym_fns which contains, among other 697249259Sdim things, the BFD for the file whose symbols are being read, and a slot for 698249259Sdim a pointer to "private data" which we can fill with goodies. 699249259Sdim 700249259Sdim For now at least, we have nothing in particular to do, so this function is 701249259Sdim just a stub. */ 702249259Sdim 703249259Sdimstatic void 704249259Sdimelf_symfile_init (struct objfile *objfile) 705249259Sdim{ 706 /* ELF objects may be reordered, so set OBJF_REORDERED. If we 707 find this causes a significant slowdown in gdb then we could 708 set it in the debug symbol readers only when necessary. */ 709 objfile->flags |= OBJF_REORDERED; 710} 711 712/* When handling an ELF file that contains Sun STABS debug info, 713 some of the debug info is relative to the particular chunk of the 714 section that was generated in its individual .o file. E.g. 715 offsets to static variables are relative to the start of the data 716 segment *for that module before linking*. This information is 717 painfully squirreled away in the ELF symbol table as local symbols 718 with wierd names. Go get 'em when needed. */ 719 720void 721elfstab_offset_sections (struct objfile *objfile, struct partial_symtab *pst) 722{ 723 char *filename = pst->filename; 724 struct dbx_symfile_info *dbx = objfile->sym_stab_info; 725 struct stab_section_info *maybe = dbx->stab_section_info; 726 struct stab_section_info *questionable = 0; 727 int i; 728 char *p; 729 730 /* The ELF symbol info doesn't include path names, so strip the path 731 (if any) from the psymtab filename. */ 732 while (0 != (p = strchr (filename, '/'))) 733 filename = p + 1; 734 735 /* FIXME: This linear search could speed up significantly 736 if it was chained in the right order to match how we search it, 737 and if we unchained when we found a match. */ 738 for (; maybe; maybe = maybe->next) 739 { 740 if (filename[0] == maybe->filename[0] 741 && STREQ (filename, maybe->filename)) 742 { 743 /* We found a match. But there might be several source files 744 (from different directories) with the same name. */ 745 if (0 == maybe->found) 746 break; 747 questionable = maybe; /* Might use it later. */ 748 } 749 } 750 751 if (maybe == 0 && questionable != 0) 752 { 753 complain (&stab_info_questionable_complaint, filename); 754 maybe = questionable; 755 } 756 757 if (maybe) 758 { 759 /* Found it! Allocate a new psymtab struct, and fill it in. */ 760 maybe->found++; 761 pst->section_offsets = (struct section_offsets *) 762 obstack_alloc (&objfile->psymbol_obstack, SIZEOF_SECTION_OFFSETS); 763 for (i = 0; i < SECT_OFF_MAX; i++) 764 (pst->section_offsets)->offsets[i] = maybe->sections[i]; 765 return; 766 } 767 768 /* We were unable to find any offsets for this file. Complain. */ 769 if (dbx->stab_section_info) /* If there *is* any info, */ 770 complain (&stab_info_mismatch_complaint, filename); 771} 772 773/* Register that we are able to handle ELF object file formats. */ 774 775static struct sym_fns elf_sym_fns = 776{ 777 bfd_target_elf_flavour, 778 elf_new_init, /* sym_new_init: init anything gbl to entire symtab */ 779 elf_symfile_init, /* sym_init: read initial info, setup for sym_read() */ 780 elf_symfile_read, /* sym_read: read a symbol file into symtab */ 781 elf_symfile_finish, /* sym_finish: finished with file, cleanup */ 782 default_symfile_offsets, /* sym_offsets: Translate ext. to int. relocation */ 783 NULL /* next: pointer to next struct sym_fns */ 784}; 785 786void 787_initialize_elfread (void) 788{ 789 add_symtab_fns (&elf_sym_fns); 790} 791