/* Read ELF (Executable and Linking Format) object files for GDB.
Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
+ 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Written by Fred Fish at Cygnus Support.
break;
}
- if (bfd_get_section_size (sect) > 0 && j == num_segments)
+ /* We should have found a segment for every non-empty section.
+ If we haven't, we will not relocate this section by any
+ offsets we apply to the segments. As an exception, do not
+ warn about SHT_NOBITS sections; in normal ELF execution
+ environments, SHT_NOBITS means zero-initialized and belongs
+ in a segment, but in no-OS environments some tools (e.g. ARM
+ RealView) use SHT_NOBITS for uninitialized data. Since it is
+ uninitialized, it doesn't need a program header. Such
+ binaries are not relocatable. */
+ if (bfd_get_section_size (sect) > 0 && j == num_segments
+ && (bfd_get_section_flags (abfd, sect) & SEC_LOAD) != 0)
warning (_("Loadable segment \"%s\" outside of ELF segments"),
bfd_section_name (abfd, sect));
}
address = gdbarch_smash_text_address (gdbarch, address);
return prim_record_minimal_symbol_and_info
- (name, address, ms_type, NULL, bfd_section->index, bfd_section, objfile);
+ (name, address, ms_type, bfd_section->index, bfd_section, objfile);
}
/*
/* If filesym is nonzero, it points to a file symbol, but we haven't
seen any section info for it yet. */
asymbol *filesym = 0;
- /* Name of filesym, as saved on the objfile_obstack. */
- char *filesymname = obsavestring ("", 0, &objfile->objfile_obstack);
+ /* Name of filesym. This is either a constant string or is saved on
+ the objfile's obstack. */
+ char *filesymname = "";
struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
int stripped = (bfd_get_symcount (objfile->obfd) == 0);
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)
+ /* Relocate all non-absolute and non-TLS symbols by the
+ section offset. */
+ if (sym->section != &bfd_abs_section
+ && !(sym->section->flags & SEC_THREAD_LOCAL))
{
symaddr += offset;
}
int max_index;
size_t size;
- max_index
- = max (SECT_OFF_BSS (objfile),
- max (SECT_OFF_DATA (objfile),
- SECT_OFF_RODATA (objfile)));
+ max_index = SECT_OFF_BSS (objfile);
+ if (objfile->sect_index_data > max_index)
+ max_index = objfile->sect_index_data;
+ if (objfile->sect_index_rodata > max_index)
+ max_index = objfile->sect_index_rodata;
/* max_index is the largest index we'll
use into this array, so we must
if (len > 4 && strcmp (sym->name + len - 4, "@plt") == 0)
{
- char *base_name = alloca (len - 4 + 1);
+ char *base_name = xmalloc (len - 4 + 1);
struct minimal_symbol *mtramp;
memcpy (base_name, sym->name, len - 4);
mtramp = record_minimal_symbol (base_name, symaddr,
mst_solib_trampoline,
sym->section, objfile);
+ xfree (base_name);
if (mtramp)
{
MSYMBOL_SIZE (mtramp) = MSYMBOL_SIZE (msym);