diff options
Diffstat (limited to 'gdb/mipsread.c')
-rw-r--r-- | gdb/mipsread.c | 150 |
1 files changed, 68 insertions, 82 deletions
diff --git a/gdb/mipsread.c b/gdb/mipsread.c index d34755e..a0d4805 100644 --- a/gdb/mipsread.c +++ b/gdb/mipsread.c @@ -1,7 +1,9 @@ /* 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. @@ -41,16 +43,6 @@ #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); @@ -114,58 +106,56 @@ mipscoff_symfile_finish (struct objfile *objfile) } /* 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) @@ -174,26 +164,18 @@ 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, @@ -220,7 +202,6 @@ 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; @@ -228,10 +209,8 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, /* 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 (si.sym_sect); @@ -260,8 +239,8 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, (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)) @@ -288,8 +267,8 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, 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); @@ -333,17 +312,20 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, 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; @@ -356,9 +338,10 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, } 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; @@ -402,7 +385,7 @@ read_alphacoff_dynamic_symtab (struct section_offsets *section_offsets, do_cleanups (cleanups); } -/* Initialization */ +/* Initialization. */ static struct sym_fns ecoff_sym_fns = { @@ -415,6 +398,9 @@ 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) { |