diff options
Diffstat (limited to 'bfd/coff-mips.c')
-rw-r--r-- | bfd/coff-mips.c | 365 |
1 files changed, 10 insertions, 355 deletions
diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c index 8dd29a9..effbac4 100644 --- a/bfd/coff-mips.c +++ b/bfd/coff-mips.c @@ -34,354 +34,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "intel-coff.h" #include "libcoff.h" /* to allow easier abstraction-breaking */ -/* initialize a section structure with information - * peculiar to this particular implementation of coff - */ - -static boolean -ecoff_new_section_hook(ignore_abfd, ignore) -bfd *ignore_abfd; -asection *ignore; -{ - return true; -} - -/* Take a section header read from a coff file (in HOST byte order), - and make a BFD "section" out of it. */ -static boolean -DEFUN(make_a_section_from_file,(abfd, hdr), - bfd *abfd AND - struct scnhdr *hdr) -{ - asection *return_section; - - { - /* Assorted wastage to null-terminate the name, thanks AT&T! */ - char *name = bfd_alloc(abfd, sizeof (hdr->s_name)+1); - if (name == NULL) { - bfd_error = no_memory; - return false; - } - strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name)); - name[sizeof (hdr->s_name)] = 0; - - return_section = bfd_make_section(abfd, name); - } - - /* s_paddr is presumed to be = to s_vaddr */ -#define assign(to, from) return_section->to = hdr->from - assign(vma, s_vaddr); - /* assign (vma, s_vaddr); */ - assign(size, s_size); - assign(filepos, s_scnptr); - assign(rel_filepos, s_relptr); - assign(reloc_count, s_nreloc); - assign(line_filepos, s_lnnoptr); - /* - return_section->linesize = hdr->s_nlnno * sizeof (struct lineno); - */ - -#undef assign - return_section->lineno_count = hdr->s_nlnno; - return_section->userdata = NULL; - return_section->next = (asection *) NULL; - if ((hdr->s_flags & STYP_TEXT) || (hdr->s_flags & STYP_DATA)) - return_section->flags = (SEC_LOAD | SEC_ALLOC); - else if (hdr->s_flags & STYP_BSS) - return_section->flags = SEC_ALLOC; - - if (hdr->s_nreloc != 0) - return_section->flags |= SEC_RELOC; - if (hdr->s_scnptr != 0) - return_section->flags |= SEC_HAS_CONTENTS; - return true; -} - -bfd_target * -ecoff_real_object_p (abfd, nscns, opthdr) - bfd *abfd; - unsigned short nscns, opthdr; -{ - struct icofdata *tdata; - char *file_info; /* buffer for all the headers */ - long readsize; /* length of file_info */ - struct filehdr* filehdr; /* points into file_info */ - struct scnhdr *sections; /* points into file_info */ - - /* OK, now we know the format, read in the filehdr, soi-disant - "optional header", and all the sections.*/ - readsize = sizeof(struct filehdr) + opthdr + (nscns * sizeof (struct scnhdr)); - file_info = (char*)bfd_alloc (abfd, readsize); - if (file_info == NULL) { - bfd_error = no_memory; - return 0; - } - if (bfd_seek (abfd, 0, false) < 0) return 0; - if (bfd_read (file_info, 1, readsize, abfd) != readsize) return 0; - filehdr = (struct filehdr *) file_info; - sections = (struct scnhdr *) (file_info + sizeof (struct filehdr) + opthdr); - - /* Now copy data as required; construct all asections etc */ - tdata = (struct icofdata *) bfd_zalloc (abfd, sizeof (struct icofdata) + - sizeof (AOUTHDR)); - if (tdata == NULL) { - bfd_release (abfd, file_info); - bfd_error = no_memory; - return 0; - } - - if (nscns != 0) - { - unsigned int i; - for (i = 0; i < nscns; i++) - { - make_a_section_from_file (abfd, sections + i); - } - } - - abfd->flags |= HAS_RELOC | HAS_LINENO | HAS_LOCALS; - - /* FIXME, the guess should be set by OR-ing info from the sections */ - if ((filehdr->f_flags & F_RELFLG) != F_RELFLG) abfd->flags &= ~HAS_RELOC; - if ((filehdr->f_flags & F_EXEC) == F_EXEC) abfd->flags |= EXEC_P; - if ((filehdr->f_flags & F_LNNO) != F_LNNO) abfd->flags &= ~HAS_LINENO; - if ((filehdr->f_flags & F_LSYMS) != F_LSYMS) abfd->flags &= ~HAS_LOCALS; - set_tdata (abfd, tdata); - bfd_get_symcount (abfd) = filehdr->f_nsyms; - if (filehdr->f_nsyms) abfd->flags |= HAS_SYMS; - - tdata->sym_filepos = filehdr->f_symptr; -/* FIXME, needs byte swapping */ - tdata->hdr = *(struct aouthdr *)(file_info + sizeof (struct filehdr)); - tdata->symbols = (coff_symbol_type *)NULL; - bfd_get_start_address (abfd) = exec_hdr (abfd).entry; - return abfd->xvec; -} - -bfd_target * -ecoff_object_p (abfd) - bfd *abfd; -{ - unsigned char short_bytes[SHORT_SIZE]; - unsigned short magic, nscns, opthdr; - - bfd_error = no_error; - - /* figure out how much to read */ - if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) - return 0; - - magic = bfd_h_getshort (abfd, short_bytes); - if (magic != (abfd->xvec->byteorder_big_p ? 0x160 : 0x162)) { - bfd_error = wrong_format; - return 0; - } - if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) - return 0; - nscns = bfd_h_getshort (abfd, short_bytes); - - if (bfd_seek (abfd,(file_ptr) ((sizeof (long)) * 3), true) < 0) - return 0; - if (bfd_read ((PTR)short_bytes, 1, SHORT_SIZE, abfd) != SHORT_SIZE) - return 0; - opthdr = bfd_h_getshort (abfd, short_bytes); - - return ecoff_real_object_p (abfd, nscns, opthdr); -} - -static boolean -ecoff_mkobject (abfd) - bfd *abfd; -{ - char *rawptr; - - - bfd_error = no_error; - - /* Use an intermediate variable for clarity */ - rawptr = (char*)bfd_zalloc (abfd, sizeof (struct icofdata)); - if (rawptr == NULL) { - bfd_error = no_memory; - return false; - } - set_tdata (abfd, rawptr); - return true; -} - -void -ecoff_write_linenumbers(ignore_abfd) -bfd *ignore_abfd; -{ -} - - -static asymbol * -ecoff_make_empty_symbol(abfd) - bfd *abfd; -{ - coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type)); - if (new == NULL) { - bfd_error = no_memory; - return (NULL); - } /* on error */ - new->native = 0; - new->lineno = (alent *) NULL; - new->symbol.the_bfd = abfd; - return &new->symbol; -} - -/*SUPPRESS 558*/ -/*SUPPRESS 529*/ -boolean -ecoff_write_object_contents (ignore_abfd) - bfd *ignore_abfd; -{ - return false; -} - -/* Calculate the file position for each section. */ -/* ARGSUSED */ -boolean -ecoff_set_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - unsigned char *location; - file_ptr offset; - int count; -{ - return false; -} - -/* ARGSUSED */ -boolean -ecoff_set_section_linenos (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - unsigned char *location; - file_ptr offset; - int count; -{ - return 0; -} - -/* ARGSUSED */ -static boolean -ecoff_slurp_symbol_table(abfd) - bfd *abfd; -{ - abort(); -} - -unsigned int -ecoff_get_symtab_upper_bound (abfd) - bfd *abfd; -{ - if (!ecoff_slurp_symbol_table (abfd)) return 0; - - return (bfd_get_symcount (abfd)+1) * (sizeof (coff_symbol_type *)); -} - - -unsigned int -ecoff_get_symtab(abfd, alocation) -bfd *abfd; -asymbol **alocation; -{ - unsigned int counter = 0; - coff_symbol_type *symbase; - coff_symbol_type **location = (coff_symbol_type **)(alocation); - - if (!ecoff_slurp_symbol_table (abfd)) return 0; - - for (symbase = obj_symbols (abfd); counter++ < bfd_get_symcount (abfd);) - *(location++) = symbase++; - *location++ =0; - return counter; -} - -unsigned int -ecoff_get_reloc_upper_bound (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - if (bfd_get_format (abfd) != bfd_object) { - bfd_error = invalid_operation; - return 0; - } - - return (asect->reloc_count + 1) * sizeof(arelent *); -} - - - -/* ARGSUSED */ -boolean -ecoff_slurp_reloc_table (abfd, asect) - bfd *abfd; - sec_ptr asect; -{ - abort(); -} - - -/* This is stupid. This function should be a boolean predicate */ -unsigned int -ecoff_canonicalize_reloc (abfd, section, relptr) - bfd *abfd; - sec_ptr section; - arelent **relptr; -{ - return 0; -} - -boolean -ecoff_get_section_contents (abfd, section, location, offset, count) - bfd *abfd; - sec_ptr section; - PTR location; - file_ptr offset; - int count; -{ - if (count) { - if (offset >= section->size) return false; - - bfd_seek (abfd, section->filepos + offset, SEEK_SET); - - return (bfd_read (location, 1, count, abfd) == count) ? true:false; - } - else return true; -} - -/* ARGSUSED */ -alent * -ecoff_get_lineno(ignore_abfd, ignore_symbol) -bfd *ignore_abfd; -PTR ignore_symbol; -{ -return (alent *)NULL; -} - -#define ecoff_core_file_failing_command _bfd_dummy_core_file_failing_command -#define ecoff_core_file_failing_signal _bfd_dummy_core_file_failing_signal -#define ecoff_core_file_matches_executable_p _bfd_dummy_core_file_matches_executable_p - -/* Archives not supported yet. FIXME. */ -#define ecoff_slurp_armap bfd_false -#define ecoff_slurp_extended_name_table bfd_false -#define ecoff_truncate_arname bfd_dont_truncate_arname -#define ecoff_write_armap bfd_false -#define ecoff_openr_next_archived_file bfd_generic_openr_next_archived_file -#define ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt - -/* Unimplemented routines. FIXME. */ -#define ecoff_print_symbol bfd_void -#define ecoff_set_arch_mach bfd_false -#define ecoff_find_nearest_line bfd_false -#define ecoff_sizeof_headers bfd_0 - -/* We use the generic BFD version of these. */ -#define ecoff_close_and_cleanup bfd_generic_close_and_cleanup +#define BADMAG(x) ECOFFBADMAG(x) +#include "coff-code.h" bfd_target ecoff_little_vec = {"ecoff-littlemips", /* name */ bfd_target_coff_flavour_enum, @@ -398,12 +53,12 @@ bfd_target ecoff_little_vec = _do_getllong, _do_putllong, _do_getlshort, _do_putlshort, /* data */ _do_getllong, _do_putllong, _do_getlshort, _do_putlshort, /* hdrs */ - {_bfd_dummy_target, ecoff_object_p, /* bfd_check_format */ + {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, ecoff_mkobject, bfd_false, /* bfd_set_format */ + {bfd_false, coff_mkobject, bfd_false, /* bfd_set_format */ bfd_false}, - {bfd_false, ecoff_write_object_contents, bfd_false, bfd_false}, - JUMP_TABLE (ecoff) + {bfd_false, coff_write_object_contents, bfd_false, bfd_false}, + JUMP_TABLE (coff) }; bfd_target ecoff_big_vec = @@ -422,11 +77,11 @@ bfd_target ecoff_big_vec = _do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* data */ _do_getblong, _do_putblong, _do_getbshort, _do_putbshort, /* hdrs */ - {_bfd_dummy_target, ecoff_object_p, /* bfd_check_format */ + {_bfd_dummy_target, coff_object_p, /* bfd_check_format */ bfd_generic_archive_p, _bfd_dummy_target}, - {bfd_false, ecoff_mkobject, bfd_false, /* bfd_set_format */ + {bfd_false, coff_mkobject, bfd_false, /* bfd_set_format */ bfd_false}, - {bfd_false, ecoff_write_object_contents, /* bfd_write_contents */ + {bfd_false, coff_write_object_contents, /* bfd_write_contents */ bfd_false, bfd_false}, - JUMP_TABLE(ecoff) + JUMP_TABLE(coff) }; |