diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 85e9fb1ac41..db0f0344ed6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,7 @@ +2005-11-13 Daniel Jacobowitz + + * elfread.c (elf_symtab_read): Remove if (1) and reindent. + 2005-11-13 Daniel Jacobowitz * arm-linux-tdep.c (eabi_linux_arm_le_breakpoint) diff --git a/gdb/elfread.c b/gdb/elfread.c index 057af425e91..f8e08ea19fc 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -164,264 +164,261 @@ elf_symtab_read (struct objfile *objfile, int dynamic, struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info; int stripped = (bfd_get_symcount (objfile->obfd) == 0); - if (1) + for (i = 0; i < number_of_symbols; i++) { - for (i = 0; i < number_of_symbols; i++) + sym = symbol_table[i]; + if (sym->name == NULL || *sym->name == '\0') { - sym = symbol_table[i]; - if (sym->name == NULL || *sym->name == '\0') + /* Skip names that don't exist (shouldn't happen), or names + that are null strings (may happen). */ + continue; + } + + offset = ANOFFSET (objfile->section_offsets, sym->section->index); + if (dynamic + && sym->section == &bfd_und_section + && (sym->flags & BSF_FUNCTION)) + { + struct minimal_symbol *msym; + + /* Symbol is a reference to a function defined in + a shared library. + If its value is non zero then it is usually the address + of the corresponding entry in the procedure linkage table, + plus the desired section offset. + If its value is zero then the dynamic linker has to resolve + the symbol. We are unable to find any meaningful address + for this symbol in the executable file, so we skip it. */ + symaddr = sym->value; + if (symaddr == 0) + continue; + symaddr += offset; + msym = record_minimal_symbol + ((char *) sym->name, symaddr, + mst_solib_trampoline, sym->section, objfile); +#ifdef SOFUN_ADDRESS_MAYBE_MISSING + if (msym != NULL) + msym->filename = filesymname; +#endif + continue; + } + + /* If it is a nonstripped executable, do not enter dynamic + symbols, as the dynamic symbol table is usually a subset + of the main symbol table. */ + if (dynamic && !stripped) + continue; + if (sym->flags & BSF_FILE) + { + /* STT_FILE debugging symbol that helps stabs-in-elf debugging. + Chain any old one onto the objfile; remember new sym. */ + if (sectinfo != NULL) { - /* Skip names that don't exist (shouldn't happen), or names - that are null strings (may happen). */ - continue; + sectinfo->next = dbx->stab_section_info; + dbx->stab_section_info = sectinfo; + sectinfo = NULL; } + filesym = sym; +#ifdef SOFUN_ADDRESS_MAYBE_MISSING + filesymname = + obsavestring ((char *) filesym->name, strlen (filesym->name), + &objfile->objfile_obstack); +#endif + } + else if (sym->flags & BSF_SECTION_SYM) + continue; + else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) + { + struct minimal_symbol *msym; - offset = ANOFFSET (objfile->section_offsets, sym->section->index); - if (dynamic - && sym->section == &bfd_und_section - && (sym->flags & BSF_FUNCTION)) + /* Select global/local/weak symbols. Note that bfd puts abs + symbols in their own section, so all symbols we are + interested in will have a section. */ + /* Bfd symbols are section relative. */ + symaddr = sym->value + sym->section->vma; + /* Relocate all non-absolute symbols by the section offset. */ + if (sym->section != &bfd_abs_section) { - struct minimal_symbol *msym; - - /* Symbol is a reference to a function defined in - a shared library. - If its value is non zero then it is usually the address - of the corresponding entry in the procedure linkage table, - plus the desired section offset. - If its value is zero then the dynamic linker has to resolve - the symbol. We are unable to find any meaningful address - for this symbol in the executable file, so we skip it. */ - symaddr = sym->value; - if (symaddr == 0) - continue; symaddr += offset; - msym = record_minimal_symbol - ((char *) sym->name, symaddr, - mst_solib_trampoline, sym->section, objfile); -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - if (msym != NULL) - msym->filename = filesymname; -#endif - continue; } - - /* If it is a nonstripped executable, do not enter dynamic - symbols, as the dynamic symbol table is usually a subset - of the main symbol table. */ - if (dynamic && !stripped) - continue; - if (sym->flags & BSF_FILE) + /* For non-absolute symbols, use the type of the section + they are relative to, to intuit text/data. Bfd provides + no way of figuring this out for absolute symbols. */ + if (sym->section == &bfd_abs_section) { - /* STT_FILE debugging symbol that helps stabs-in-elf debugging. - Chain any old one onto the objfile; remember new sym. */ - if (sectinfo != NULL) + /* This is a hack to get the minimal symbol type + right for Irix 5, which has absolute addresses + with special section indices for dynamic symbols. */ + unsigned short shndx = + ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx; + + switch (shndx) { - sectinfo->next = dbx->stab_section_info; - dbx->stab_section_info = sectinfo; - sectinfo = NULL; + case SHN_MIPS_TEXT: + ms_type = mst_text; + break; + case SHN_MIPS_DATA: + ms_type = mst_data; + break; + case SHN_MIPS_ACOMMON: + ms_type = mst_bss; + break; + default: + ms_type = mst_abs; } - filesym = sym; -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - filesymname = - obsavestring ((char *) filesym->name, strlen (filesym->name), - &objfile->objfile_obstack); -#endif - } - else if (sym->flags & BSF_SECTION_SYM) - continue; - else if (sym->flags & (BSF_GLOBAL | BSF_LOCAL | BSF_WEAK)) - { - struct minimal_symbol *msym; - /* Select global/local/weak symbols. Note that bfd puts abs - symbols in their own section, so all symbols we are - interested in will have a section. */ - /* Bfd symbols are section relative. */ - symaddr = sym->value + sym->section->vma; - /* Relocate all non-absolute symbols by the section offset. */ - if (sym->section != &bfd_abs_section) + /* If it is an Irix dynamic symbol, skip section name + symbols, relocate all others by section offset. */ + if (ms_type != mst_abs) { + if (sym->name[0] == '.') + continue; symaddr += offset; } - /* For non-absolute symbols, use the type of the section - they are relative to, to intuit text/data. Bfd provides - no way of figuring this out for absolute symbols. */ - if (sym->section == &bfd_abs_section) + } + else if (sym->section->flags & SEC_CODE) + { + if (sym->flags & BSF_GLOBAL) { - /* This is a hack to get the minimal symbol type - right for Irix 5, which has absolute addresses - with special section indices for dynamic symbols. */ - unsigned short shndx = - ((elf_symbol_type *) sym)->internal_elf_sym.st_shndx; - - switch (shndx) + ms_type = mst_text; + } + else if ((sym->name[0] == '.' && sym->name[1] == 'L') + || ((sym->flags & BSF_LOCAL) + && sym->name[0] == '$' + && sym->name[1] == 'L')) + /* Looks like a compiler-generated label. Skip + it. The assembler should be skipping these (to + keep executables small), but apparently with + gcc on the (deleted) delta m88k SVR4, it loses. + So to have us check too should be harmless (but + I encourage people to fix this in the assembler + instead of adding checks here). */ + continue; + else + { + ms_type = mst_file_text; + } + } + else if (sym->section->flags & SEC_ALLOC) + { + if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) + { + if (sym->section->flags & SEC_LOAD) { - case SHN_MIPS_TEXT: - ms_type = mst_text; - break; - case SHN_MIPS_DATA: ms_type = mst_data; - break; - case SHN_MIPS_ACOMMON: + } + else + { ms_type = mst_bss; - break; - default: - ms_type = mst_abs; - } - - /* If it is an Irix dynamic symbol, skip section name - symbols, relocate all others by section offset. */ - if (ms_type != mst_abs) - { - if (sym->name[0] == '.') - continue; - symaddr += offset; } } - else if (sym->section->flags & SEC_CODE) + else if (sym->flags & BSF_LOCAL) { - if (sym->flags & BSF_GLOBAL) - { - ms_type = mst_text; - } - else if ((sym->name[0] == '.' && sym->name[1] == 'L') - || ((sym->flags & BSF_LOCAL) - && sym->name[0] == '$' - && sym->name[1] == 'L')) - /* Looks like a compiler-generated label. Skip - it. The assembler should be skipping these (to - keep executables small), but apparently with - gcc on the (deleted) delta m88k SVR4, it loses. - So to have us check too should be harmless (but - I encourage people to fix this in the assembler - instead of adding checks here). */ - continue; + /* Named Local variable in a Data section. + Check its name for stabs-in-elf. */ + int special_local_sect; + if (strcmp ("Bbss.bss", sym->name) == 0) + special_local_sect = SECT_OFF_BSS (objfile); + else if (strcmp ("Ddata.data", sym->name) == 0) + special_local_sect = SECT_OFF_DATA (objfile); + else if (strcmp ("Drodata.rodata", sym->name) == 0) + special_local_sect = SECT_OFF_RODATA (objfile); else + special_local_sect = -1; + if (special_local_sect >= 0) { - ms_type = mst_file_text; - } - } - else if (sym->section->flags & SEC_ALLOC) - { - if (sym->flags & (BSF_GLOBAL | BSF_WEAK)) - { - if (sym->section->flags & SEC_LOAD) + /* Found a special local symbol. Allocate a + sectinfo, if needed, and fill it in. */ + if (sectinfo == NULL) { - ms_type = mst_data; - } - else - { - ms_type = mst_bss; - } - } - else if (sym->flags & BSF_LOCAL) - { - /* Named Local variable in a Data section. - Check its name for stabs-in-elf. */ - int special_local_sect; - if (strcmp ("Bbss.bss", sym->name) == 0) - special_local_sect = SECT_OFF_BSS (objfile); - else if (strcmp ("Ddata.data", sym->name) == 0) - special_local_sect = SECT_OFF_DATA (objfile); - else if (strcmp ("Drodata.rodata", sym->name) == 0) - special_local_sect = SECT_OFF_RODATA (objfile); - else - special_local_sect = -1; - if (special_local_sect >= 0) - { - /* Found a special local symbol. Allocate a - sectinfo, if needed, and fill it in. */ - if (sectinfo == NULL) + int max_index; + size_t size; + + max_index + = max (SECT_OFF_BSS (objfile), + max (SECT_OFF_DATA (objfile), + SECT_OFF_RODATA (objfile))); + + /* max_index is the largest index we'll + use into this array, so we must + allocate max_index+1 elements for it. + However, 'struct stab_section_info' + already includes one element, so we + need to allocate max_index aadditional + elements. */ + size = (sizeof (struct stab_section_info) + + (sizeof (CORE_ADDR) + * max_index)); + sectinfo = (struct stab_section_info *) + xmalloc (size); + memset (sectinfo, 0, size); + sectinfo->num_sections = max_index; + if (filesym == NULL) { - int max_index; - size_t size; - - max_index - = max (SECT_OFF_BSS (objfile), - max (SECT_OFF_DATA (objfile), - SECT_OFF_RODATA (objfile))); - - /* max_index is the largest index we'll - use into this array, so we must - allocate max_index+1 elements for it. - However, 'struct stab_section_info' - already includes one element, so we - need to allocate max_index aadditional - elements. */ - size = (sizeof (struct stab_section_info) - + (sizeof (CORE_ADDR) - * max_index)); - sectinfo = (struct stab_section_info *) - xmalloc (size); - memset (sectinfo, 0, size); - sectinfo->num_sections = max_index; - if (filesym == NULL) - { - complaint (&symfile_complaints, - _("elf/stab section information %s without a preceding file symbol"), - sym->name); - } - else - { - sectinfo->filename = - (char *) filesym->name; - } + complaint (&symfile_complaints, + _("elf/stab section information %s without a preceding file symbol"), + sym->name); + } + else + { + sectinfo->filename = + (char *) filesym->name; } - if (sectinfo->sections[special_local_sect] != 0) - complaint (&symfile_complaints, - _("duplicated elf/stab section information for %s"), - sectinfo->filename); - /* BFD symbols are section relative. */ - symaddr = sym->value + sym->section->vma; - /* Relocate non-absolute symbols by the - section offset. */ - if (sym->section != &bfd_abs_section) - symaddr += offset; - sectinfo->sections[special_local_sect] = symaddr; - /* The special local symbols don't go in the - minimal symbol table, so ignore this one. */ - continue; - } - /* Not a special stabs-in-elf symbol, do regular - symbol processing. */ - if (sym->section->flags & SEC_LOAD) - { - ms_type = mst_file_data; - } - else - { - ms_type = mst_file_bss; } + if (sectinfo->sections[special_local_sect] != 0) + complaint (&symfile_complaints, + _("duplicated elf/stab section information for %s"), + sectinfo->filename); + /* BFD symbols are section relative. */ + symaddr = sym->value + sym->section->vma; + /* Relocate non-absolute symbols by the + section offset. */ + if (sym->section != &bfd_abs_section) + symaddr += offset; + sectinfo->sections[special_local_sect] = symaddr; + /* The special local symbols don't go in the + minimal symbol table, so ignore this one. */ + continue; + } + /* Not a special stabs-in-elf symbol, do regular + symbol processing. */ + if (sym->section->flags & SEC_LOAD) + { + ms_type = mst_file_data; } else { - ms_type = mst_unknown; + ms_type = mst_file_bss; } } else { - /* FIXME: Solaris2 shared libraries include lots of - odd "absolute" and "undefined" symbols, that play - hob with actions like finding what function the PC - is in. Ignore them if they aren't text, data, or bss. */ - /* ms_type = mst_unknown; */ - continue; /* Skip this symbol. */ + ms_type = mst_unknown; } - msym = record_minimal_symbol - ((char *) sym->name, symaddr, - ms_type, sym->section, objfile); - if (msym) - { - /* Pass symbol size field in via BFD. FIXME!!! */ - unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; - MSYMBOL_SIZE(msym) = size; - } -#ifdef SOFUN_ADDRESS_MAYBE_MISSING - if (msym != NULL) - msym->filename = filesymname; -#endif - ELF_MAKE_MSYMBOL_SPECIAL (sym, msym); } + else + { + /* FIXME: Solaris2 shared libraries include lots of + odd "absolute" and "undefined" symbols, that play + hob with actions like finding what function the PC + is in. Ignore them if they aren't text, data, or bss. */ + /* ms_type = mst_unknown; */ + continue; /* Skip this symbol. */ + } + msym = record_minimal_symbol + ((char *) sym->name, symaddr, + ms_type, sym->section, objfile); + if (msym) + { + /* Pass symbol size field in via BFD. FIXME!!! */ + unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size; + MSYMBOL_SIZE(msym) = size; + } +#ifdef SOFUN_ADDRESS_MAYBE_MISSING + if (msym != NULL) + msym->filename = filesymname; +#endif + ELF_MAKE_MSYMBOL_SPECIAL (sym, msym); } } }