/* Read a symbol table in MIPS' format (Third-Eye).
+
Copyright 1986, 1987, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
1998, 1999, 2000, 2001, 2003, 2004
Free Software Foundation, Inc.
+
Contributed by Alessandro Forin (af@cs.cmu.edu) at CMU. Major work
by Per Bothner, John Gilmore and Ian Lance Taylor at Cygnus Support.
#include "elf/common.h"
#include "elf/mips.h"
-extern void _initialize_mipsread (void);
-
-static void mipscoff_new_init (struct objfile *);
-
-static void mipscoff_symfile_init (struct objfile *);
-
-static void mipscoff_symfile_read (struct objfile *, int);
-
-static void mipscoff_symfile_finish (struct objfile *);
-
static void
read_alphacoff_dynamic_symtab (struct section_offsets *,
struct objfile *objfile);
if (!((*ecoff_backend (abfd)->debug_swap.read_debug_info)
(abfd, (asection *) NULL, &ecoff_data (abfd)->debug_info)))
- error ("Error reading symbol table: %s", bfd_errmsg (bfd_get_error ()));
+ error (_("Error reading symbol table: %s"), bfd_errmsg (bfd_get_error ()));
mdebug_build_psymtabs (objfile, &ecoff_backend (abfd)->debug_swap,
&ecoff_data (abfd)->debug_info);
}
/* Alpha OSF/1 encapsulates the dynamic symbols in ELF format in a
- standard coff section. The ELF format for the symbols differs from
- the format defined in elf/external.h. It seems that a normal ELF 32 bit
- format is used, and the representation only changes because longs are
- 64 bit on the alpha. In addition, the handling of text/data section
- indices for symbols is different from the ELF ABI.
- As the BFD linker currently does not support dynamic linking on the alpha,
- there seems to be no reason to pollute BFD with another mixture of object
- file formats for now. */
+ standard COFF section. The ELF format for the symbols differs from
+ the format defined in elf/external.h. It seems that a normal ELF
+ 32-bit format is used, and the representation only changes because
+ longs are 64-bit on the alpha. In addition, the handling of
+ text/data section indices for symbols is different from the ELF
+ ABI. As the BFD linker currently does not support dynamic linking
+ on the alpha, there seems to be no reason to pollute BFD with
+ another mixture of object file formats for now. */
/* Format of an alpha external ELF symbol. */
typedef struct
{
- unsigned char st_name[4]; /* Symbol name, index in string tbl */
- unsigned char st_pad[4]; /* Pad to long word boundary */
- unsigned char st_value[8]; /* Value of the symbol */
- unsigned char st_size[4]; /* Associated symbol size */
- unsigned char st_info[1]; /* Type and binding attributes */
- unsigned char st_other[1]; /* No defined meaning, 0 */
- unsigned char st_shndx[2]; /* Associated section index */
-}
-Elfalpha_External_Sym;
+ unsigned char st_name[4]; /* Symbol name, index in string table. */
+ unsigned char st_pad[4]; /* Pad to long word boundary. */
+ unsigned char st_value[8]; /* Value of the symbol. */
+ unsigned char st_size[4]; /* Associated symbol size. */
+ unsigned char st_info[1]; /* Type and binding attributes. */
+ unsigned char st_other[1]; /* No defined meaning, 0. */
+ unsigned char st_shndx[2]; /* Associated section index. */
+} Elfalpha_External_Sym;
/* Format of an alpha external ELF dynamic info structure. */
typedef struct
+{
+ unsigned char d_tag[4]; /* Tag. */
+ unsigned char d_pad[4]; /* Pad to long word boundary. */
+ union
{
- unsigned char d_tag[4]; /* Tag */
- unsigned char d_pad[4]; /* Pad to long word boundary */
- union
- {
- unsigned char d_ptr[8]; /* Pointer value */
- unsigned char d_val[4]; /* Integer value */
- }
- d_un;
+ unsigned char d_ptr[8]; /* Pointer value. */
+ unsigned char d_val[4]; /* Integer value. */
}
-Elfalpha_External_Dyn;
+ d_un;
+} Elfalpha_External_Dyn;
/* Struct to obtain the section pointers for alpha dynamic symbol info. */
struct alphacoff_dynsecinfo
- {
- asection *sym_sect; /* Section pointer for .dynsym section */
- asection *str_sect; /* Section pointer for .dynstr section */
- asection *dyninfo_sect; /* Section pointer for .dynamic section */
- asection *got_sect; /* Section pointer for .got section */
- };
+{
+ asection *sym_sect; /* Section pointer for .dynsym section. */
+ asection *str_sect; /* Section pointer for .dynstr section. */
+ asection *dyninfo_sect; /* Section pointer for .dynamic section. */
+ asection *got_sect; /* Section pointer for .got section. */
+};
/* We are called once per section from read_alphacoff_dynamic_symtab.
- We need to examine each section we are passed, check to see
- if it is something we are interested in processing, and
- if so, stash away some access information for the section. */
+ We need to examine each section we are passed, check to see if it
+ is something we are interested in processing, and if so, stash away
+ some access information for the section. */
static void
alphacoff_locate_sections (bfd *ignore_abfd, asection *sectp, void *sip)
si = (struct alphacoff_dynsecinfo *) sip;
- if (DEPRECATED_STREQ (sectp->name, ".dynsym"))
- {
- si->sym_sect = sectp;
- }
- else if (DEPRECATED_STREQ (sectp->name, ".dynstr"))
- {
- si->str_sect = sectp;
- }
- else if (DEPRECATED_STREQ (sectp->name, ".dynamic"))
- {
- si->dyninfo_sect = sectp;
- }
- else if (DEPRECATED_STREQ (sectp->name, ".got"))
- {
+ if (strcmp (sectp->name, ".dynsym") == 0)
+ si->sym_sect = sectp;
+ else if (strcmp (sectp->name, ".dynstr") == 0)
+ si->str_sect = sectp;
+ else if (strcmp (sectp->name, ".dynamic") == 0)
+ si->dyninfo_sect = sectp;
+ else if (strcmp (sectp->name, ".got") == 0)
si->got_sect = sectp;
- }
}
-/* Scan an alpha dynamic symbol table for symbols of interest and
- add them to the minimal symbol table. */
+/* Scan an alpha dynamic symbol table for symbols of interest and add
+ them to the minimal symbol table. */
static void
read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets,
int dt_mips_gotsym = -1;
struct cleanup *cleanups;
-
/* We currently only know how to handle alpha dynamic symbols. */
if (bfd_get_arch (abfd) != bfd_arch_alpha)
return;
/* Locate the dynamic symbols sections and read them in. */
memset ((char *) &si, 0, sizeof (si));
bfd_map_over_sections (abfd, alphacoff_locate_sections, (void *) & si);
- if (si.sym_sect == NULL
- || si.str_sect == NULL
- || si.dyninfo_sect == NULL
- || si.got_sect == NULL)
+ if (si.sym_sect == NULL || si.str_sect == NULL
+ || si.dyninfo_sect == NULL || si.got_sect == NULL)
return;
- sym_secsize = bfd_get_section_size_before_reloc (si.sym_sect);
- str_secsize = bfd_get_section_size_before_reloc (si.str_sect);
- dyninfo_secsize = bfd_get_section_size_before_reloc (si.dyninfo_sect);
- got_secsize = bfd_get_section_size_before_reloc (si.got_sect);
+ sym_secsize = bfd_get_section_size (si.sym_sect);
+ str_secsize = bfd_get_section_size (si.str_sect);
+ dyninfo_secsize = bfd_get_section_size (si.dyninfo_sect);
+ got_secsize = bfd_get_section_size (si.got_sect);
sym_secptr = xmalloc (sym_secsize);
cleanups = make_cleanup (free, sym_secptr);
str_secptr = xmalloc (str_secsize);
(file_ptr) 0, got_secsize))
return;
- /* Find the number of local GOT entries and the index for the
- the first dynamic symbol in the GOT. */
+ /* Find the number of local GOT entries and the index for the the
+ first dynamic symbol in the GOT. */
for (dyninfo_p = dyninfo_secptr, dyninfo_end = dyninfo_p + dyninfo_secsize;
dyninfo_p < dyninfo_end;
dyninfo_p += sizeof (Elfalpha_External_Dyn))
if (dt_mips_local_gotno < 0 || dt_mips_gotsym < 0)
return;
- /* Scan all dynamic symbols and enter them into the minimal symbol table
- if appropriate. */
+ /* Scan all dynamic symbols and enter them into the minimal symbol
+ table if appropriate. */
sym_count = sym_secsize / sizeof (Elfalpha_External_Sym);
stripped = (bfd_get_symcount (abfd) == 0);
If sym_value is zero, then we have to get the GOT entry
for the symbol.
- If the GOT entry is nonzero, it represents the quickstart
- address of the function and we use that as the symbol value.
- If the GOT entry is zero, the function address has to be resolved
- by the runtime loader before the executable is started.
- We are unable to find any meaningful address for these
- functions in the executable file, so we skip them. */
+ If the GOT entry is nonzero, it represents the quickstart
+ address of the function and we use that as the symbol
+ value.
+
+ If the GOT entry is zero, the function address has to be
+ resolved by the runtime loader before the executable is
+ started. We are unable to find any meaningful address
+ for these functions in the executable file, so we skip
+ them. */
if (sym_value == 0)
{
int got_entry_offset =
- (i - dt_mips_gotsym + dt_mips_local_gotno) * got_entry_size;
+ (i - dt_mips_gotsym + dt_mips_local_gotno) * got_entry_size;
if (got_entry_offset < 0 || got_entry_offset >= got_secsize)
continue;
}
else
{
- /* Symbols defined in the executable itself. We only care about
- them if this is a stripped executable, otherwise they have
- been retrieved from the normal symbol table already. */
+ /* Symbols defined in the executable itself. We only care
+ about them if this is a stripped executable, otherwise
+ they have been retrieved from the normal symbol table
+ already. */
if (!stripped)
continue;
do_cleanups (cleanups);
}
-/* Initialization */
+/* Initialization. */
static struct sym_fns ecoff_sym_fns =
{
NULL /* next: pointer to next struct sym_fns */
};
+/* Provide a prototype to silence -Wmissing-prototypes. */
+void _initialize_mipsread (void);
+
void
_initialize_mipsread (void)
{