diff options
Diffstat (limited to 'bfd/coff-mips.c')
-rw-r--r-- | bfd/coff-mips.c | 470 |
1 files changed, 290 insertions, 180 deletions
diff --git a/bfd/coff-mips.c b/bfd/coff-mips.c index bbd7b9e..95dba88 100644 --- a/bfd/coff-mips.c +++ b/bfd/coff-mips.c @@ -1,7 +1,7 @@ /* BFD back-end for MIPS Extended-Coff files. - Copyright 1990, 1991, 1992 Free Software Foundation, Inc. + Copyright 1990, 1991, 1992, 1993 Free Software Foundation, Inc. Original version by Per Bothner. - Full support by Ian Lance Taylor, ian@cygnus.com. + Full support added by Ian Lance Taylor, ian@cygnus.com. This file is part of BFD, the Binary File Descriptor library. @@ -133,7 +133,106 @@ typedef struct ecoff_symbol_struct of the swapping routines from coffswap.h, and some of the generic COFF routines in coffgen.c, but, unlike the real COFF targets, does not use coffcode.h itself. */ - + +/* Prototypes for static functions. */ + +static boolean ecoff_bad_format_hook PARAMS ((bfd *abfd, PTR filehdr)); +static asection *ecoff_make_section_hook PARAMS ((bfd *abfd, char *name)); +static boolean ecoff_new_section_hook PARAMS ((bfd *abfd, asection *section)); +static boolean ecoff_mkobject PARAMS ((bfd *abfd)); +static PTR ecoff_mkobject_hook PARAMS ((bfd *abfd, PTR filehdr, PTR aouthdr)); +static boolean ecoff_set_arch_mach_hook PARAMS ((bfd *abfd, PTR filehdr)); +static long ecoff_sec_to_styp_flags PARAMS ((CONST char *name, + flagword flags)); +static flagword ecoff_styp_to_sec_flags PARAMS ((bfd *abfd, PTR hdr)); +static boolean ecoff_slurp_symbolic_info PARAMS ((bfd *abfd)); +static asymbol *ecoff_make_empty_symbol PARAMS ((bfd *abfd)); +static void ecoff_set_symbol_info PARAMS ((bfd *abfd, SYMR *ecoff_sym, + asymbol *asym, int ext)); +static boolean ecoff_slurp_symbol_table PARAMS ((bfd *abfd)); +static unsigned int ecoff_get_symtab_upper_bound PARAMS ((bfd *abfd)); +static unsigned int ecoff_get_symtab PARAMS ((bfd *abfd, + asymbol **alocation)); +static void ecoff_emit_aggregate PARAMS ((bfd *abfd, char *string, + RNDXR *rndx, long isym, + CONST char *which)); +static char *ecoff_type_to_string PARAMS ((bfd *abfd, union aux_ext *aux_ptr, + int indx, int bigendian)); +static void ecoff_print_symbol PARAMS ((bfd *abfd, PTR filep, + asymbol *symbol, + bfd_print_symbol_type how)); +static void ecoff_swap_reloc_in PARAMS ((bfd *abfd, RELOC *ext, + struct internal_reloc *intern)); +static unsigned int ecoff_swap_reloc_out PARAMS ((bfd *abfd, PTR src, + PTR dst)); +static bfd_reloc_status_type ecoff_generic_reloc PARAMS ((bfd *abfd, + arelent *reloc, + asymbol *symbol, + PTR data, + asection *section, + bfd *output_bfd)); +static bfd_reloc_status_type ecoff_refhi_reloc PARAMS ((bfd *abfd, + arelent *reloc, + asymbol *symbol, + PTR data, + asection *section, + bfd *output_bfd)); +static bfd_reloc_status_type ecoff_gprel_reloc PARAMS ((bfd *abfd, + arelent *reloc, + asymbol *symbol, + PTR data, + asection *section, + bfd *output_bfd)); +static boolean ecoff_slurp_reloc_table PARAMS ((bfd *abfd, asection *section, + asymbol **symbols)); +static unsigned int ecoff_canonicalize_reloc PARAMS ((bfd *abfd, + asection *section, + arelent **relptr, + asymbol **symbols)); +static boolean ecoff_find_nearest_line PARAMS ((bfd *abfd, + asection *section, + asymbol **symbols, + bfd_vma offset, + CONST char **filename_ptr, + CONST char **fnname_ptr, + unsigned int *retline_ptr)); +static void ecoff_clear_output_flags PARAMS ((bfd *abfd)); +static boolean ecoff_rel PARAMS ((bfd *output_bfd, bfd_seclet_type *seclet, + asection *output_section, PTR data, + boolean relocateable)); +static boolean ecoff_dump_seclet PARAMS ((bfd *abfd, bfd_seclet_type *seclet, + asection *section, PTR data, + boolean relocateable)); +static long ecoff_add_string PARAMS ((bfd *output_bfd, FDR *fdr, + CONST char *string, boolean external)); +static boolean ecoff_get_debug PARAMS ((bfd *output_bfd, + bfd_seclet_type *seclet, + asection *section, + boolean relocateable)); +static boolean ecoff_bfd_seclet_link PARAMS ((bfd *abfd, PTR data, + boolean relocateable)); +static boolean ecoff_set_arch_mach PARAMS ((bfd *abfd, + enum bfd_architecture arch, + unsigned long machine)); +static int ecoff_sizeof_headers PARAMS ((bfd *abfd, boolean reloc)); +static void ecoff_compute_section_file_positions PARAMS ((bfd *abfd)); +static boolean ecoff_set_section_contents PARAMS ((bfd *abfd, + asection *section, + PTR location, + file_ptr offset, + bfd_size_type count)); +static boolean ecoff_write_object_contents PARAMS ((bfd *abfd)); +static unsigned int ecoff_armap_hash PARAMS ((CONST char *s, + unsigned int *rehash, + unsigned int size, + unsigned int hlog)); +static boolean ecoff_slurp_armap PARAMS ((bfd *abfd)); +static boolean ecoff_write_armap PARAMS ((bfd *abfd, unsigned int elength, + struct orl *map, + unsigned int orl_count, + int stridx)); +static bfd_target *ecoff_archive_p PARAMS ((bfd *abfd)); + /* Get the generic COFF swapping routines, except for the reloc, symbol, and lineno ones. Give them ecoff names. */ #define MIPSECOFF @@ -155,9 +254,9 @@ static asection bfd_debug_section = { "*DEBUG*" }; /* See whether the magic number matches. */ static boolean -DEFUN(ecoff_bad_format_hook, (abfd, filehdr), - bfd *abfd AND - PTR filehdr) +ecoff_bad_format_hook (abfd, filehdr) + bfd *abfd; + PTR filehdr; { struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; @@ -170,9 +269,9 @@ DEFUN(ecoff_bad_format_hook, (abfd, filehdr), /* This is a hook needed by SCO COFF, but we have nothing to do. */ static asection * -DEFUN (ecoff_make_section_hook, (abfd, name), - bfd *abfd AND - char *name) +ecoff_make_section_hook (abfd, name) + bfd *abfd; + char *name; { return (asection *) NULL; } @@ -180,9 +279,9 @@ DEFUN (ecoff_make_section_hook, (abfd, name), /* Initialize a new section. */ static boolean -DEFUN (ecoff_new_section_hook, (abfd, section), - bfd *abfd AND - asection *section) +ecoff_new_section_hook (abfd, section) + bfd *abfd; + asection *section; { section->alignment_power = abfd->xvec->align_power_min; @@ -206,12 +305,16 @@ DEFUN (ecoff_new_section_hook, (abfd, section), return true; } +/* Set the alignment of a section; we have nothing to do. */ + #define ecoff_set_alignment_hook \ ((void (*) PARAMS ((bfd *, asection *, PTR))) bfd_void) +/* Create an ECOFF object. */ + static boolean -DEFUN (ecoff_mkobject, (abfd), - bfd *abfd) +ecoff_mkobject (abfd) + bfd *abfd; { abfd->tdata.ecoff_obj_data = ((struct ecoff_tdata *) bfd_zalloc (abfd, sizeof(ecoff_data_type))); @@ -228,7 +331,7 @@ DEFUN (ecoff_mkobject, (abfd), return true; } -/* Create the COFF backend specific information. */ +/* Create the ECOFF backend specific information. */ static PTR ecoff_mkobject_hook (abfd, filehdr, aouthdr) @@ -260,39 +363,39 @@ ecoff_mkobject_hook (abfd, filehdr, aouthdr) } /* Determine the machine architecture and type. */ + static boolean -DEFUN (ecoff_set_arch_mach_hook, (abfd, filehdr), - bfd *abfd AND - PTR filehdr) +ecoff_set_arch_mach_hook (abfd, filehdr) + bfd *abfd; + PTR filehdr; { - long machine; - enum bfd_architecture arch; struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr; + enum bfd_architecture arch; - machine = 0; - switch (internal_f->f_magic) { - case MIPS_MAGIC_1: - case MIPS_MAGIC_2: - case MIPS_MAGIC_3: - arch = bfd_arch_mips; - machine = 0; - break; - - default: /* Unreadable input file type */ - arch = bfd_arch_obscure; - break; - } + switch (internal_f->f_magic) + { + case MIPS_MAGIC_1: + case MIPS_MAGIC_2: + case MIPS_MAGIC_3: + arch = bfd_arch_mips; + break; + + default: + arch = bfd_arch_obscure; + break; + } + + bfd_default_set_arch_mach (abfd, arch, (unsigned long) 0); - bfd_default_set_arch_mach(abfd, arch, machine); return true; } /* Get the section s_flags to use for a section. */ static long -DEFUN (sec_to_styp_flags, (name, flags), - CONST char *name AND - flagword flags) +ecoff_sec_to_styp_flags (name, flags) + CONST char *name; + flagword flags; { long styp; @@ -334,9 +437,9 @@ DEFUN (sec_to_styp_flags, (name, flags), /* Get the BFD flags to use for a section. */ static flagword -DEFUN (styp_to_sec_flags, (abfd, hdr), - bfd *abfd AND - PTR hdr) +ecoff_styp_to_sec_flags (abfd, hdr) + bfd *abfd; + PTR hdr; { struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr; long styp_flags = internal_s->s_flags; @@ -391,8 +494,8 @@ DEFUN (styp_to_sec_flags, (abfd, hdr), object file. */ static boolean -DEFUN (ecoff_slurp_symbolic_info, (abfd), - bfd *abfd) +ecoff_slurp_symbolic_info (abfd) + bfd *abfd; { struct hdr_ext external_symhdr; HDRR *internal_symhdr; @@ -553,8 +656,8 @@ static asymbol *ecoff_scom_symbol_ptr; /* Create an empty symbol. */ static asymbol * -DEFUN (ecoff_make_empty_symbol, (abfd), - bfd *abfd) +ecoff_make_empty_symbol (abfd) + bfd *abfd; { ecoff_symbol_type *new; @@ -575,11 +678,11 @@ DEFUN (ecoff_make_empty_symbol, (abfd), /* Set the BFD flags and section for an ECOFF symbol. */ static void -DEFUN (ecoff_set_symbol_info, (abfd, ecoff_sym, asym, ext), - bfd *abfd AND - SYMR *ecoff_sym AND - asymbol *asym AND - int ext) +ecoff_set_symbol_info (abfd, ecoff_sym, asym, ext) + bfd *abfd; + SYMR *ecoff_sym; + asymbol *asym; + int ext; { asym->the_bfd = abfd; asym->value = ecoff_sym->value; @@ -729,8 +832,8 @@ DEFUN (ecoff_set_symbol_info, (abfd, ecoff_sym, asym, ext), /* Read an ECOFF symbol table. */ static boolean -DEFUN (ecoff_slurp_symbol_table, (abfd), - bfd *abfd) +ecoff_slurp_symbol_table (abfd) + bfd *abfd; { bfd_size_type internal_size; ecoff_symbol_type *internal; @@ -808,8 +911,8 @@ DEFUN (ecoff_slurp_symbol_table, (abfd), } static unsigned int -DEFUN (ecoff_get_symtab_upper_bound, (abfd), - bfd *abfd) +ecoff_get_symtab_upper_bound (abfd) + bfd *abfd; { if (ecoff_slurp_symbolic_info (abfd) == false || bfd_get_symcount (abfd) == 0) @@ -819,9 +922,9 @@ DEFUN (ecoff_get_symtab_upper_bound, (abfd), } static unsigned int -DEFUN (ecoff_get_symtab, (abfd, alocation), - bfd *abfd AND - asymbol **alocation) +ecoff_get_symtab (abfd, alocation) + bfd *abfd; + asymbol **alocation; { unsigned int counter = 0; ecoff_symbol_type *symbase; @@ -842,18 +945,18 @@ DEFUN (ecoff_get_symtab, (abfd, alocation), } /* Turn ECOFF type information into a printable string. - emit_aggregate and type_to_string are from gcc/mips-tdump.c, with - swapping added and used_ptr removed. */ + ecoff_emit_aggregate and ecoff_type_to_string are from + gcc/mips-tdump.c, with swapping added and used_ptr removed. */ /* Write aggregate information to a string. */ static void -DEFUN (emit_aggregate, (abfd, string, rndx, isym, which), - bfd *abfd AND - char *string AND - RNDXR *rndx AND - long isym AND - CONST char *which) +ecoff_emit_aggregate (abfd, string, rndx, isym, which) + bfd *abfd; + char *string; + RNDXR *rndx; + long isym; + CONST char *which; { int ifd = rndx->rfd; int indx = rndx->index; @@ -888,11 +991,11 @@ DEFUN (emit_aggregate, (abfd, string, rndx, isym, which), /* Convert the type information to string format. */ static char * -DEFUN (type_to_string, (abfd, aux_ptr, indx, bigendian), - bfd *abfd AND - union aux_ext *aux_ptr AND - int indx AND - int bigendian) +ecoff_type_to_string (abfd, aux_ptr, indx, bigendian) + bfd *abfd; + union aux_ext *aux_ptr; + int indx; + int bigendian; { AUXU u; struct qual { @@ -989,9 +1092,9 @@ DEFUN (type_to_string, (abfd, aux_ptr, indx, bigendian), case btStruct: /* Structure (Record) */ ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); - emit_aggregate (abfd, p1, &rndx, - AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), - "struct"); + ecoff_emit_aggregate (abfd, p1, &rndx, + AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), + "struct"); indx++; /* skip aux words */ break; @@ -1001,9 +1104,9 @@ DEFUN (type_to_string, (abfd, aux_ptr, indx, bigendian), case btUnion: /* Union */ ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); - emit_aggregate (abfd, p1, &rndx, - AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), - "union"); + ecoff_emit_aggregate (abfd, p1, &rndx, + AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), + "union"); indx++; /* skip aux words */ break; @@ -1013,9 +1116,9 @@ DEFUN (type_to_string, (abfd, aux_ptr, indx, bigendian), case btEnum: /* Enumeration */ ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx); - emit_aggregate (abfd, p1, &rndx, - AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), - "enum"); + ecoff_emit_aggregate (abfd, p1, &rndx, + AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]), + "enum"); indx++; /* skip aux words */ break; @@ -1194,11 +1297,11 @@ DEFUN (type_to_string, (abfd, aux_ptr, indx, bigendian), /* Print information about an ECOFF symbol. */ static void -DEFUN (ecoff_print_symbol, (abfd, filep, symbol, how), - bfd *abfd AND - PTR filep AND - asymbol *symbol AND - bfd_print_symbol_type how) +ecoff_print_symbol (abfd, filep, symbol, how) + bfd *abfd; + PTR filep; + asymbol *symbol; + bfd_print_symbol_type how; { FILE *file = (FILE *)filep; @@ -1341,8 +1444,8 @@ DEFUN (ecoff_print_symbol, (abfd, filep, symbol, how), (AUX_GET_ISYM (bigendian, &aux_base[ecoff_ext.asym.index]) + sym_base), - type_to_string (abfd, aux_base, indx + 1, - bigendian)); + ecoff_type_to_string (abfd, aux_base, indx + 1, + bigendian)); else printf ("\n Local symbol: %d", (indx @@ -1353,7 +1456,8 @@ DEFUN (ecoff_print_symbol, (abfd, filep, symbol, how), default: if (!MIPS_IS_STAB (&ecoff_ext.asym)) printf ("\n Type: %s", - type_to_string (abfd, aux_base, indx, bigendian)); + ecoff_type_to_string (abfd, aux_base, indx, + bigendian)); break; } } @@ -1369,10 +1473,10 @@ DEFUN (ecoff_print_symbol, (abfd, filep, symbol, how), /* Swap a reloc in. */ static void -DEFUN (ecoff_swap_reloc_in, (abfd, ext, intern), - bfd *abfd AND - RELOC *ext AND - struct internal_reloc *intern) +ecoff_swap_reloc_in (abfd, ext, intern) + bfd *abfd; + RELOC *ext; + struct internal_reloc *intern; { intern->r_vaddr = bfd_h_get_32 (abfd, (bfd_byte *) ext->r_vaddr); if (abfd->xvec->header_byteorder_big_p != false) @@ -1404,10 +1508,10 @@ DEFUN (ecoff_swap_reloc_in, (abfd, ext, intern), /* Swap a reloc out. */ static unsigned int -DEFUN (ecoff_swap_reloc_out, (abfd, src, dst), - bfd *abfd AND - PTR src AND - PTR dst) +ecoff_swap_reloc_out (abfd, src, dst) + bfd *abfd; + PTR src; + PTR dst; { struct internal_reloc *intern = (struct internal_reloc *) src; RELOC *ext = (RELOC *) dst; @@ -1813,10 +1917,10 @@ static reloc_howto_type ecoff_howto_table[] = /* Read in the relocs for a section. */ static boolean -DEFUN (ecoff_slurp_reloc_table, (abfd, section, symbols), - bfd *abfd AND - asection *section AND - asymbol **symbols) +ecoff_slurp_reloc_table (abfd, section, symbols) + bfd *abfd; + asection *section; + asymbol **symbols; { RELOC *external_relocs; arelent *internal_relocs; @@ -1918,11 +2022,11 @@ DEFUN (ecoff_slurp_reloc_table, (abfd, section, symbols), /* Get a canonical list of relocs. */ static unsigned int -DEFUN (ecoff_canonicalize_reloc, (abfd, section, relptr, symbols), - bfd *abfd AND - asection *section AND - arelent **relptr AND - asymbol **symbols) +ecoff_canonicalize_reloc (abfd, section, relptr, symbols) + bfd *abfd; + asection *section; + arelent **relptr; + asymbol **symbols; { unsigned int count; @@ -1963,20 +2067,20 @@ DEFUN (ecoff_canonicalize_reloc, (abfd, section, relptr, symbols), wanted location. */ static boolean -DEFUN (ecoff_find_nearest_line, (abfd, - section, - ignore_symbols, - offset, - filename_ptr, - functionname_ptr, - retline_ptr), - bfd *abfd AND - asection *section AND - asymbol **ignore_symbols AND - bfd_vma offset AND - CONST char **filename_ptr AND - CONST char **functionname_ptr AND - unsigned int *retline_ptr) +ecoff_find_nearest_line (abfd, + section, + ignore_symbols, + offset, + filename_ptr, + functionname_ptr, + retline_ptr) + bfd *abfd; + asection *section; + asymbol **ignore_symbols; + bfd_vma offset; + CONST char **filename_ptr; + CONST char **functionname_ptr; + unsigned int *retline_ptr; { FDR *fdr_ptr; FDR *fdr_start; @@ -2137,8 +2241,8 @@ DEFUN (ecoff_find_nearest_line, (abfd, once. */ static void -DEFUN (ecoff_clear_output_flags, (abfd), - bfd *abfd) +ecoff_clear_output_flags (abfd) + bfd *abfd; { register asection *o; register bfd_seclet_type *p; @@ -2156,18 +2260,16 @@ DEFUN (ecoff_clear_output_flags, (abfd), any. */ static boolean -DEFUN (ecoff_rel, (output_bfd, seclet, output_section, data, relocateable), - bfd *output_bfd AND - bfd_seclet_type *seclet AND - asection *output_section AND - PTR data AND - boolean relocateable) +ecoff_rel (output_bfd, seclet, output_section, data, relocateable) + bfd *output_bfd; + bfd_seclet_type *seclet; + asection *output_section; + PTR data; + boolean relocateable; { bfd *input_bfd; HDRR *output_symhdr; HDRR *input_symhdr; - ecoff_symbol_type *sym_ptr; - ecoff_symbol_type *sym_end; if ((output_section->flags & SEC_HAS_CONTENTS) && !(output_section->flags & SEC_NEVER_LOAD) @@ -2274,12 +2376,12 @@ DEFUN (ecoff_rel, (output_bfd, seclet, output_section, data, relocateable), /* Handle an arbitrary seclet on the first pass. */ static boolean -DEFUN (ecoff_dump_seclet, (abfd, seclet, section, data, relocateable), - bfd *abfd AND - bfd_seclet_type *seclet AND - asection *section AND - PTR data AND - boolean relocateable) +ecoff_dump_seclet (abfd, seclet, section, data, relocateable) + bfd *abfd; + bfd_seclet_type *seclet; + asection *section; + PTR data; + boolean relocateable; { switch (seclet->type) { @@ -2325,11 +2427,11 @@ DEFUN (ecoff_dump_seclet, (abfd, seclet, section, data, relocateable), external string base. */ static long -DEFUN (ecoff_add_string, (output_bfd, fdr, string, external), - bfd *output_bfd AND - FDR *fdr AND - CONST char *string AND - boolean external) +ecoff_add_string (output_bfd, fdr, string, external) + bfd *output_bfd; + FDR *fdr; + CONST char *string; + boolean external; { HDRR *symhdr; size_t len; @@ -2356,11 +2458,11 @@ DEFUN (ecoff_add_string, (output_bfd, fdr, string, external), /* Accumulate the debugging information from an input section. */ static boolean -DEFUN (ecoff_get_debug, (output_bfd, seclet, section, relocateable), - bfd *output_bfd AND - bfd_seclet_type *seclet AND - asection *section AND - boolean relocateable) +ecoff_get_debug (output_bfd, seclet, section, relocateable) + bfd *output_bfd; + bfd_seclet_type *seclet; + asection *section; + boolean relocateable; { bfd *input_bfd; HDRR *output_symhdr; @@ -2369,7 +2471,6 @@ DEFUN (ecoff_get_debug, (output_bfd, seclet, section, relocateable), ecoff_data_type *input_ecoff; unsigned int count; struct sym_ext *sym_out; - struct ext_ext *ext_out; ecoff_symbol_type *esym_ptr; ecoff_symbol_type *esym_end; FDR *fdr_ptr; @@ -2698,10 +2799,10 @@ DEFUN (ecoff_get_debug, (output_bfd, seclet, section, relocateable), seclets. */ static boolean -DEFUN (ecoff_bfd_seclet_link, (abfd, data, relocateable), - bfd *abfd AND - PTR data AND - boolean relocateable) +ecoff_bfd_seclet_link (abfd, data, relocateable) + bfd *abfd; + PTR data; + boolean relocateable; { HDRR *symhdr; int ipass; @@ -2970,10 +3071,10 @@ DEFUN (ecoff_bfd_seclet_link, (abfd, data, relocateable), the return value. */ static boolean -DEFUN (ecoff_set_arch_mach, (abfd, arch, machine), - bfd *abfd AND - enum bfd_architecture arch AND - unsigned long machine) +ecoff_set_arch_mach (abfd, arch, machine) + bfd *abfd; + enum bfd_architecture arch; + unsigned long machine; { bfd_default_set_arch_mach (abfd, arch, machine); return arch == bfd_arch_mips; @@ -2994,8 +3095,8 @@ ecoff_sizeof_headers (abfd, reloc) reloc_filepos. */ static void -DEFUN (ecoff_compute_section_file_positions, (abfd), - bfd *abfd) +ecoff_compute_section_file_positions (abfd) + bfd *abfd; { asection *current; file_ptr sofar; @@ -3050,12 +3151,12 @@ DEFUN (ecoff_compute_section_file_positions, (abfd), /* Set the contents of a section. */ static boolean -DEFUN (ecoff_set_section_contents, (abfd, section, location, offset, count), - bfd *abfd AND - asection *section AND - PTR location AND - file_ptr offset AND - bfd_size_type count) +ecoff_set_section_contents (abfd, section, location, offset, count) + bfd *abfd; + asection *section; + PTR location; + file_ptr offset; + bfd_size_type count; { if (abfd->output_has_begun == false) ecoff_compute_section_file_positions (abfd); @@ -3071,8 +3172,8 @@ DEFUN (ecoff_set_section_contents, (abfd, section, location, offset, count), /* Write out an ECOFF file. */ static boolean -DEFUN (ecoff_write_object_contents, (abfd), - bfd *abfd) +ecoff_write_object_contents (abfd) + bfd *abfd; { asection *current; unsigned int count; @@ -3193,7 +3294,8 @@ DEFUN (ecoff_write_object_contents, (abfd), section.s_nreloc = current->reloc_count; section.s_nlnno = 0; - section.s_flags = sec_to_styp_flags (current->name, current->flags); + section.s_flags = ecoff_sec_to_styp_flags (current->name, + current->flags); { SCNHDR buff; @@ -3267,8 +3369,9 @@ DEFUN (ecoff_write_object_contents, (abfd), /* Set up the ``optional'' header. */ internal_a.magic = ZMAGIC; - /* FIXME: What should this be? */ - internal_a.vstamp = 0; + /* FIXME: This is what Ultrix puts in, and it makes the Ultrix + linker happy. But, is it right? */ + internal_a.vstamp = 0x20a; /* At least on Ultrix, these have to be rounded to page boundaries. FIXME: Is this true on other platforms? */ @@ -3515,8 +3618,8 @@ ecoff_armap_hash (s, rehash, size, hlog) /* Read in the armap. */ static boolean -DEFUN (ecoff_slurp_armap, (abfd), - bfd *abfd) +ecoff_slurp_armap (abfd) + bfd *abfd; { char nextname[17]; unsigned int i; @@ -3665,12 +3768,12 @@ DEFUN (ecoff_slurp_armap, (abfd), /* Write out an armap. */ static boolean -DEFUN (ecoff_write_armap, (abfd, elength, map, orl_count, stridx), - bfd *abfd AND - unsigned int elength AND - struct orl *map AND - unsigned int orl_count AND - int stridx) +ecoff_write_armap (abfd, elength, map, orl_count, stridx) + bfd *abfd; + unsigned int elength; + struct orl *map; + unsigned int orl_count; + int stridx; { unsigned int hashsize, hashlog; unsigned int symdefsize; @@ -3720,8 +3823,7 @@ DEFUN (ecoff_write_armap, (abfd, elength, map, orl_count, stridx), complain that the index is out of date. Actually, the Ultrix linker just checks the archive name; the GNU linker may check the date. */ - if (stat (abfd->filename, &statbuf) < 0) - statbuf.st_mtime = time ((PTR) NULL); + stat (abfd->filename, &statbuf); sprintf (hdr.ar_date, "%ld", (long) (statbuf.st_mtime + 60)); /* The DECstation uses zeroes for the uid, gid and mode of the @@ -3837,8 +3939,8 @@ DEFUN (ecoff_write_armap, (abfd, elength, map, orl_count, stridx), and the extended name table. */ static bfd_target * -DEFUN (ecoff_archive_p, (abfd), - bfd *abfd) +ecoff_archive_p (abfd) + bfd *abfd; { char armag[SARMAG + 1]; @@ -3874,6 +3976,10 @@ DEFUN (ecoff_archive_p, (abfd), return abfd->xvec; } +/* This is the COFF backend structure. The backend_data field of the + bfd_target structure is set to this. The section reading code in + coffgen.c uses this structure. */ + static CONST bfd_coff_backend_data bfd_ecoff_std_swap_table = { (void (*) PARAMS ((bfd *,PTR,int,int,PTR))) bfd_void, /* aux_in */ (void (*) PARAMS ((bfd *,PTR,PTR))) bfd_void, /* sym_in */ @@ -3886,7 +3992,7 @@ static CONST bfd_coff_backend_data bfd_ecoff_std_swap_table = { FILHSZ, AOUTSZ, SCNHSZ, 0, 0, 0, true, ecoff_swap_filehdr_in, ecoff_swap_aouthdr_in, ecoff_swap_scnhdr_in, ecoff_bad_format_hook, ecoff_set_arch_mach_hook, ecoff_mkobject_hook, - styp_to_sec_flags, ecoff_make_section_hook, ecoff_set_alignment_hook, + ecoff_styp_to_sec_flags, ecoff_make_section_hook, ecoff_set_alignment_hook, ecoff_slurp_symbol_table }; @@ -3896,9 +4002,12 @@ static CONST bfd_coff_backend_data bfd_ecoff_std_swap_table = { #define ecoff_get_lineno \ ((alent *(*) PARAMS ((bfd *, asymbol *))) bfd_nullvoidptr) +/* These bfd_target functions are defined in other files. */ + #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 +#define ecoff_core_file_matches_executable_p \ + _bfd_dummy_core_file_matches_executable_p #define ecoff_truncate_arname bfd_dont_truncate_arname #define ecoff_openr_next_archived_file bfd_generic_openr_next_archived_file #define ecoff_generic_stat_arch_elt bfd_generic_stat_arch_elt @@ -3909,7 +4018,8 @@ static CONST bfd_coff_backend_data bfd_ecoff_std_swap_table = { #define ecoff_bfd_debug_info_end bfd_void #define ecoff_bfd_debug_info_accumulate \ ((void (*) PARAMS ((bfd *, struct sec *))) bfd_void) -#define ecoff_bfd_get_relocated_section_contents bfd_generic_get_relocated_section_contents +#define ecoff_bfd_get_relocated_section_contents \ + bfd_generic_get_relocated_section_contents #define ecoff_bfd_relax_section bfd_generic_relax_section bfd_target ecoff_little_vec = |