(root)/
binutils-2.41/
bfd/
coffswap.h
       1  /* Generic COFF swapping routines, for BFD.
       2     Copyright (C) 1990-2023 Free Software Foundation, Inc.
       3     Written by Cygnus Support.
       4  
       5     This file is part of BFD, the Binary File Descriptor library.
       6  
       7     This program is free software; you can redistribute it and/or modify
       8     it under the terms of the GNU General Public License as published by
       9     the Free Software Foundation; either version 3 of the License, or
      10     (at your option) any later version.
      11  
      12     This program is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15     GNU General Public License for more details.
      16  
      17     You should have received a copy of the GNU General Public License
      18     along with this program; if not, write to the Free Software
      19     Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
      20     MA 02110-1301, USA.  */
      21  
      22  /* This file contains routines used to swap COFF data.  It is a header
      23     file because the details of swapping depend on the details of the
      24     structures used by each COFF implementation.  This is included by
      25     coffcode.h, as well as by the ECOFF backend.
      26  
      27     Any file which uses this must first include "coff/internal.h" and
      28     "coff/CPU.h".  The functions will then be correct for that CPU.  */
      29  
      30  #ifndef GET_FCN_LNNOPTR
      31  #define GET_FCN_LNNOPTR(abfd, ext) \
      32    H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
      33  #endif
      34  
      35  #ifndef GET_FCN_ENDNDX
      36  #define GET_FCN_ENDNDX(abfd, ext) \
      37    H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx)
      38  #endif
      39  
      40  #ifndef PUT_FCN_LNNOPTR
      41  #define PUT_FCN_LNNOPTR(abfd, in, ext) \
      42    H_PUT_32 (abfd,  in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
      43  #endif
      44  #ifndef PUT_FCN_ENDNDX
      45  #define PUT_FCN_ENDNDX(abfd, in, ext) \
      46    H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx)
      47  #endif
      48  #ifndef GET_LNSZ_LNNO
      49  #define GET_LNSZ_LNNO(abfd, ext) \
      50    H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno)
      51  #endif
      52  #ifndef GET_LNSZ_SIZE
      53  #define GET_LNSZ_SIZE(abfd, ext) \
      54    H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size)
      55  #endif
      56  #ifndef PUT_LNSZ_LNNO
      57  #define PUT_LNSZ_LNNO(abfd, in, ext) \
      58    H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno)
      59  #endif
      60  #ifndef PUT_LNSZ_SIZE
      61  #define PUT_LNSZ_SIZE(abfd, in, ext) \
      62    H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size)
      63  #endif
      64  #ifndef GET_SCN_SCNLEN
      65  #define GET_SCN_SCNLEN(abfd, ext) \
      66    H_GET_32 (abfd, ext->x_scn.x_scnlen)
      67  #endif
      68  #ifndef GET_SCN_NRELOC
      69  #define GET_SCN_NRELOC(abfd, ext) \
      70    H_GET_16 (abfd, ext->x_scn.x_nreloc)
      71  #endif
      72  #ifndef GET_SCN_NLINNO
      73  #define GET_SCN_NLINNO(abfd, ext) \
      74    H_GET_16 (abfd, ext->x_scn.x_nlinno)
      75  #endif
      76  #ifndef PUT_SCN_SCNLEN
      77  #define PUT_SCN_SCNLEN(abfd, in, ext) \
      78    H_PUT_32 (abfd, in, ext->x_scn.x_scnlen)
      79  #endif
      80  #ifndef PUT_SCN_NRELOC
      81  #define PUT_SCN_NRELOC(abfd, in, ext) \
      82    H_PUT_16 (abfd, in, ext->x_scn.x_nreloc)
      83  #endif
      84  #ifndef PUT_SCN_NLINNO
      85  #define PUT_SCN_NLINNO(abfd, in, ext) \
      86    H_PUT_16 (abfd, in, ext->x_scn.x_nlinno)
      87  #endif
      88  #ifndef GET_LINENO_LNNO
      89  #define GET_LINENO_LNNO(abfd, ext) \
      90    H_GET_16 (abfd, ext->l_lnno);
      91  #endif
      92  #ifndef PUT_LINENO_LNNO
      93  #define PUT_LINENO_LNNO(abfd, val, ext) \
      94    H_PUT_16 (abfd, val, ext->l_lnno);
      95  #endif
      96  
      97  /* The f_symptr field in the filehdr is sometimes 64 bits.  */
      98  #ifndef GET_FILEHDR_SYMPTR
      99  #define GET_FILEHDR_SYMPTR H_GET_32
     100  #endif
     101  #ifndef PUT_FILEHDR_SYMPTR
     102  #define PUT_FILEHDR_SYMPTR H_PUT_32
     103  #endif
     104  
     105  /* Some fields in the aouthdr are sometimes 64 bits.  */
     106  #ifndef GET_AOUTHDR_TSIZE
     107  #define GET_AOUTHDR_TSIZE H_GET_32
     108  #endif
     109  #ifndef PUT_AOUTHDR_TSIZE
     110  #define PUT_AOUTHDR_TSIZE H_PUT_32
     111  #endif
     112  #ifndef GET_AOUTHDR_DSIZE
     113  #define GET_AOUTHDR_DSIZE H_GET_32
     114  #endif
     115  #ifndef PUT_AOUTHDR_DSIZE
     116  #define PUT_AOUTHDR_DSIZE H_PUT_32
     117  #endif
     118  #ifndef GET_AOUTHDR_BSIZE
     119  #define GET_AOUTHDR_BSIZE H_GET_32
     120  #endif
     121  #ifndef PUT_AOUTHDR_BSIZE
     122  #define PUT_AOUTHDR_BSIZE H_PUT_32
     123  #endif
     124  #ifndef GET_AOUTHDR_ENTRY
     125  #define GET_AOUTHDR_ENTRY H_GET_32
     126  #endif
     127  #ifndef PUT_AOUTHDR_ENTRY
     128  #define PUT_AOUTHDR_ENTRY H_PUT_32
     129  #endif
     130  #ifndef GET_AOUTHDR_TEXT_START
     131  #define GET_AOUTHDR_TEXT_START H_GET_32
     132  #endif
     133  #ifndef PUT_AOUTHDR_TEXT_START
     134  #define PUT_AOUTHDR_TEXT_START H_PUT_32
     135  #endif
     136  #ifndef GET_AOUTHDR_DATA_START
     137  #define GET_AOUTHDR_DATA_START H_GET_32
     138  #endif
     139  #ifndef PUT_AOUTHDR_DATA_START
     140  #define PUT_AOUTHDR_DATA_START H_PUT_32
     141  #endif
     142  
     143  /* Some fields in the scnhdr are sometimes 64 bits.  */
     144  #ifndef GET_SCNHDR_PADDR
     145  #define GET_SCNHDR_PADDR H_GET_32
     146  #endif
     147  #ifndef PUT_SCNHDR_PADDR
     148  #define PUT_SCNHDR_PADDR H_PUT_32
     149  #endif
     150  #ifndef GET_SCNHDR_VADDR
     151  #define GET_SCNHDR_VADDR H_GET_32
     152  #endif
     153  #ifndef PUT_SCNHDR_VADDR
     154  #define PUT_SCNHDR_VADDR H_PUT_32
     155  #endif
     156  #ifndef GET_SCNHDR_SIZE
     157  #define GET_SCNHDR_SIZE H_GET_32
     158  #endif
     159  #ifndef PUT_SCNHDR_SIZE
     160  #define PUT_SCNHDR_SIZE H_PUT_32
     161  #endif
     162  #ifndef GET_SCNHDR_SCNPTR
     163  #define GET_SCNHDR_SCNPTR H_GET_32
     164  #endif
     165  #ifndef PUT_SCNHDR_SCNPTR
     166  #define PUT_SCNHDR_SCNPTR H_PUT_32
     167  #endif
     168  #ifndef GET_SCNHDR_RELPTR
     169  #define GET_SCNHDR_RELPTR H_GET_32
     170  #endif
     171  #ifndef PUT_SCNHDR_RELPTR
     172  #define PUT_SCNHDR_RELPTR H_PUT_32
     173  #endif
     174  #ifndef GET_SCNHDR_LNNOPTR
     175  #define GET_SCNHDR_LNNOPTR H_GET_32
     176  #endif
     177  #ifndef PUT_SCNHDR_LNNOPTR
     178  #define PUT_SCNHDR_LNNOPTR H_PUT_32
     179  #endif
     180  #ifndef GET_SCNHDR_NRELOC
     181  #define GET_SCNHDR_NRELOC H_GET_16
     182  #endif
     183  #ifndef MAX_SCNHDR_NRELOC
     184  #define MAX_SCNHDR_NRELOC 0xffff
     185  #endif
     186  #ifndef PUT_SCNHDR_NRELOC
     187  #define PUT_SCNHDR_NRELOC H_PUT_16
     188  #endif
     189  #ifndef GET_SCNHDR_NLNNO
     190  #define GET_SCNHDR_NLNNO H_GET_16
     191  #endif
     192  #ifndef MAX_SCNHDR_NLNNO
     193  #define MAX_SCNHDR_NLNNO 0xffff
     194  #endif
     195  #ifndef PUT_SCNHDR_NLNNO
     196  #define PUT_SCNHDR_NLNNO H_PUT_16
     197  #endif
     198  #ifndef GET_SCNHDR_FLAGS
     199  #define GET_SCNHDR_FLAGS H_GET_32
     200  #endif
     201  #ifndef PUT_SCNHDR_FLAGS
     202  #define PUT_SCNHDR_FLAGS H_PUT_32
     203  #endif
     204  
     205  #ifndef GET_RELOC_VADDR
     206  #define GET_RELOC_VADDR H_GET_32
     207  #endif
     208  #ifndef PUT_RELOC_VADDR
     209  #define PUT_RELOC_VADDR H_PUT_32
     210  #endif
     211  
     212  #ifndef NO_COFF_RELOCS
     213  
     214  static void
     215  coff_swap_reloc_in (bfd * abfd, void * src, void * dst)
     216  {
     217    RELOC *reloc_src = (RELOC *) src;
     218    struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
     219  
     220    reloc_dst->r_vaddr  = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr);
     221    reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
     222    reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
     223  
     224  #ifdef SWAP_IN_RELOC_OFFSET
     225    reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
     226  #endif
     227  }
     228  
     229  static unsigned int
     230  coff_swap_reloc_out (bfd * abfd, void * src, void * dst)
     231  {
     232    struct internal_reloc *reloc_src = (struct internal_reloc *) src;
     233    struct external_reloc *reloc_dst = (struct external_reloc *) dst;
     234  
     235    PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
     236    H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
     237    H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
     238  
     239  #ifdef SWAP_OUT_RELOC_OFFSET
     240    SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);
     241  #endif
     242  #ifdef SWAP_OUT_RELOC_EXTRA
     243    SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
     244  #endif
     245  
     246    return bfd_coff_relsz (abfd);
     247  }
     248  
     249  #ifdef TICOFF
     250  static void
     251  coff_swap_reloc_v0_in (bfd *abfd, void *src, void *dst)
     252  {
     253    struct external_reloc_v0 *reloc_src = (struct external_reloc_v0 *) src;
     254    struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
     255  
     256    reloc_dst->r_vaddr  = GET_RELOC_VADDR (abfd, reloc_src->r_vaddr);
     257    reloc_dst->r_symndx = H_GET_16 (abfd, reloc_src->r_symndx);
     258    reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
     259  }
     260  
     261  static unsigned int
     262  coff_swap_reloc_v0_out (bfd *abfd, void *src, void *dst)
     263  {
     264    struct internal_reloc *reloc_src = (struct internal_reloc *) src;
     265    struct external_reloc_v0 *reloc_dst = (struct external_reloc_v0 *) dst;
     266  
     267    PUT_RELOC_VADDR (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
     268    H_PUT_16 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
     269    H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
     270    SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
     271  
     272    return bfd_coff_relsz (abfd);
     273  }
     274  #endif
     275  
     276  #endif /* NO_COFF_RELOCS */
     277  
     278  static void
     279  coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
     280  {
     281    FILHDR *filehdr_src = (FILHDR *) src;
     282    struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
     283  
     284  #ifdef COFF_ADJUST_FILEHDR_IN_PRE
     285    COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
     286  #endif
     287    filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
     288    filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
     289    filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
     290    filehdr_dst->f_symptr = GET_FILEHDR_SYMPTR (abfd, filehdr_src->f_symptr);
     291    filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
     292    filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src->f_opthdr);
     293    filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
     294  
     295  #ifdef COFF_ADJUST_FILEHDR_IN_POST
     296    COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
     297  #endif
     298  }
     299  
     300  static  unsigned int
     301  coff_swap_filehdr_out (bfd *abfd, void * in, void * out)
     302  {
     303    struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
     304    FILHDR *filehdr_out = (FILHDR *) out;
     305  
     306  #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
     307    COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
     308  #endif
     309    H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
     310    H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
     311    H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
     312    PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
     313    H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
     314    H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
     315    H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
     316  
     317  #ifdef COFF_ADJUST_FILEHDR_OUT_POST
     318    COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
     319  #endif
     320    return bfd_coff_filhsz (abfd);
     321  }
     322  
     323  #ifndef NO_COFF_SYMBOLS
     324  
     325  static void
     326  coff_swap_sym_in (bfd * abfd, void * ext1, void * in1)
     327  {
     328    SYMENT *ext = (SYMENT *) ext1;
     329    struct internal_syment *in = (struct internal_syment *) in1;
     330  
     331    if (ext->e.e_name[0] == 0)
     332      {
     333        in->_n._n_n._n_zeroes = 0;
     334        in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
     335      }
     336    else
     337      {
     338  #if SYMNMLEN != E_SYMNMLEN
     339  #error we need to cope with truncating or extending SYMNMLEN
     340  #else
     341        memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
     342  #endif
     343      }
     344  
     345    in->n_value = H_GET_32 (abfd, ext->e_value);
     346    in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
     347    if (sizeof (ext->e_type) == 2)
     348      in->n_type = H_GET_16 (abfd, ext->e_type);
     349    else
     350      in->n_type = H_GET_32 (abfd, ext->e_type);
     351    in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
     352    in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
     353  #ifdef COFF_ADJUST_SYM_IN_POST
     354    COFF_ADJUST_SYM_IN_POST (abfd, ext1, in1);
     355  #endif
     356  }
     357  
     358  static unsigned int
     359  coff_swap_sym_out (bfd * abfd, void * inp, void * extp)
     360  {
     361    struct internal_syment *in = (struct internal_syment *) inp;
     362    SYMENT *ext =(SYMENT *) extp;
     363  
     364  #ifdef COFF_ADJUST_SYM_OUT_PRE
     365    COFF_ADJUST_SYM_OUT_PRE (abfd, inp, extp);
     366  #endif
     367  
     368    if (in->_n._n_name[0] == 0)
     369      {
     370        H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
     371        H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
     372      }
     373    else
     374      {
     375  #if SYMNMLEN != E_SYMNMLEN
     376  #error we need to cope with truncating or extending SYMNMLEN
     377  #else
     378        memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
     379  #endif
     380      }
     381  
     382    H_PUT_32 (abfd, in->n_value, ext->e_value);
     383    H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
     384  
     385    if (sizeof (ext->e_type) == 2)
     386      H_PUT_16 (abfd, in->n_type, ext->e_type);
     387    else
     388      H_PUT_32 (abfd, in->n_type, ext->e_type);
     389  
     390    H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
     391    H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
     392  
     393  #ifdef COFF_ADJUST_SYM_OUT_POST
     394    COFF_ADJUST_SYM_OUT_POST (abfd, inp, extp);
     395  #endif
     396  
     397    return SYMESZ;
     398  }
     399  
     400  static void
     401  coff_swap_aux_in (bfd *abfd,
     402  		  void * ext1,
     403  		  int type,
     404  		  int in_class,
     405  		  int indx,
     406  		  int numaux,
     407  		  void * in1)
     408  {
     409    AUXENT *ext = (AUXENT *) ext1;
     410    union internal_auxent *in = (union internal_auxent *) in1;
     411  
     412  #ifdef COFF_ADJUST_AUX_IN_PRE
     413    COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, in_class, indx, numaux, in1);
     414  #endif
     415  
     416    switch (in_class)
     417      {
     418      case C_FILE:
     419        if (ext->x_file.x_fname[0] == 0)
     420  	{
     421  	  in->x_file.x_n.x_n.x_zeroes = 0;
     422  	  in->x_file.x_n.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
     423  	}
     424        else
     425  	{
     426  #if FILNMLEN != E_FILNMLEN
     427  #error we need to cope with truncating or extending FILNMLEN
     428  #else
     429  	  if (numaux > 1 && obj_pe (abfd))
     430  	    {
     431  	      if (indx == 0)
     432  		memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname,
     433  			numaux * sizeof (AUXENT));
     434  	    }
     435  	  else
     436  	    memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname, FILNMLEN);
     437  #endif
     438  	}
     439        goto end;
     440  
     441      case C_STAT:
     442  #ifdef C_LEAFSTAT
     443      case C_LEAFSTAT:
     444  #endif
     445      case C_HIDDEN:
     446        if (type == T_NULL)
     447  	{
     448  	  in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
     449  	  in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
     450  	  in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
     451  
     452  	  /* PE defines some extra fields; we zero them out for
     453  	     safety.  */
     454  	  in->x_scn.x_checksum = 0;
     455  	  in->x_scn.x_associated = 0;
     456  	  in->x_scn.x_comdat = 0;
     457  
     458  	  goto end;
     459  	}
     460        break;
     461      }
     462  
     463    in->x_sym.x_tagndx.u32 = H_GET_32 (abfd, ext->x_sym.x_tagndx);
     464  #ifndef NO_TVNDX
     465    in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
     466  #endif
     467  
     468    if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
     469        || ISTAG (in_class))
     470      {
     471        in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
     472        in->x_sym.x_fcnary.x_fcn.x_endndx.u32 = GET_FCN_ENDNDX (abfd, ext);
     473      }
     474    else
     475      {
     476  #if DIMNUM != E_DIMNUM
     477  #error we need to cope with truncating or extending DIMNUM
     478  #endif
     479        in->x_sym.x_fcnary.x_ary.x_dimen[0] =
     480  	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
     481        in->x_sym.x_fcnary.x_ary.x_dimen[1] =
     482  	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
     483        in->x_sym.x_fcnary.x_ary.x_dimen[2] =
     484  	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
     485        in->x_sym.x_fcnary.x_ary.x_dimen[3] =
     486  	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
     487      }
     488  
     489    if (ISFCN (type))
     490      in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
     491    else
     492      {
     493        in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
     494        in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
     495      }
     496  
     497   end: ;
     498  
     499  #ifdef COFF_ADJUST_AUX_IN_POST
     500    COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, in_class, indx, numaux, in1);
     501  #endif
     502  }
     503  
     504  static unsigned int
     505  coff_swap_aux_out (bfd * abfd,
     506  		   void * inp,
     507  		   int type,
     508  		   int in_class,
     509  		   int indx ATTRIBUTE_UNUSED,
     510  		   int numaux ATTRIBUTE_UNUSED,
     511  		   void * extp)
     512  {
     513    union internal_auxent * in = (union internal_auxent *) inp;
     514    AUXENT *ext = (AUXENT *) extp;
     515  
     516  #ifdef COFF_ADJUST_AUX_OUT_PRE
     517    COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, in_class, indx, numaux, extp);
     518  #endif
     519  
     520    memset (ext, 0, AUXESZ);
     521  
     522    switch (in_class)
     523      {
     524      case C_FILE:
     525        if (in->x_file.x_n.x_fname[0] == 0)
     526  	{
     527  	  H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
     528  	  H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset, ext->x_file.x_n.x_offset);
     529  	}
     530        else
     531  	{
     532  #if FILNMLEN != E_FILNMLEN
     533  #error we need to cope with truncating or extending FILNMLEN
     534  #else
     535  	  memcpy (ext->x_file.x_fname, in->x_file.x_n.x_fname, FILNMLEN);
     536  #endif
     537  	}
     538        goto end;
     539  
     540      case C_STAT:
     541  #ifdef C_LEAFSTAT
     542      case C_LEAFSTAT:
     543  #endif
     544      case C_HIDDEN:
     545        if (type == T_NULL)
     546  	{
     547  	  PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
     548  	  PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
     549  	  PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
     550  	  goto end;
     551  	}
     552        break;
     553      }
     554  
     555    H_PUT_32 (abfd, in->x_sym.x_tagndx.u32, ext->x_sym.x_tagndx);
     556  #ifndef NO_TVNDX
     557    H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
     558  #endif
     559  
     560    if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
     561        || ISTAG (in_class))
     562      {
     563        PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
     564        PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.u32, ext);
     565      }
     566    else
     567      {
     568  #if DIMNUM != E_DIMNUM
     569  #error we need to cope with truncating or extending DIMNUM
     570  #endif
     571        H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
     572  	       ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
     573        H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
     574  	       ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
     575        H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
     576  	       ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
     577        H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
     578  	       ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
     579      }
     580  
     581    if (ISFCN (type))
     582      H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
     583    else
     584      {
     585        PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
     586        PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
     587      }
     588  
     589   end:
     590  #ifdef COFF_ADJUST_AUX_OUT_POST
     591    COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, in_class, indx, numaux, extp);
     592  #endif
     593    return AUXESZ;
     594  }
     595  
     596  #endif /* NO_COFF_SYMBOLS */
     597  
     598  #ifndef NO_COFF_LINENOS
     599  
     600  static void
     601  coff_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
     602  {
     603    LINENO *ext = (LINENO *) ext1;
     604    struct internal_lineno *in = (struct internal_lineno *) in1;
     605  
     606    in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
     607    in->l_lnno = GET_LINENO_LNNO (abfd, ext);
     608  }
     609  
     610  static unsigned int
     611  coff_swap_lineno_out (bfd * abfd, void * inp, void * outp)
     612  {
     613    struct internal_lineno *in = (struct internal_lineno *) inp;
     614    struct external_lineno *ext = (struct external_lineno *) outp;
     615    H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
     616  
     617    PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
     618    return LINESZ;
     619  }
     620  
     621  #endif /* NO_COFF_LINENOS */
     622  
     623  static void
     624  coff_swap_aouthdr_in (bfd * abfd, void * aouthdr_ext1, void * aouthdr_int1)
     625  {
     626    AOUTHDR *aouthdr_ext;
     627    struct internal_aouthdr *aouthdr_int;
     628  
     629    aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
     630    aouthdr_int = (struct internal_aouthdr *) aouthdr_int1;
     631    aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
     632    aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
     633    aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
     634    aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
     635    aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
     636    aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
     637    aouthdr_int->text_start =
     638      GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
     639    aouthdr_int->data_start =
     640      GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
     641  
     642  #ifdef RS6000COFF_C
     643  #ifdef XCOFF64
     644    aouthdr_int->o_toc = H_GET_64 (abfd, aouthdr_ext->o_toc);
     645  #else
     646    aouthdr_int->o_toc = H_GET_32 (abfd, aouthdr_ext->o_toc);
     647  #endif
     648    aouthdr_int->o_snentry  = H_GET_16 (abfd, aouthdr_ext->o_snentry);
     649    aouthdr_int->o_sntext   = H_GET_16 (abfd, aouthdr_ext->o_sntext);
     650    aouthdr_int->o_sndata   = H_GET_16 (abfd, aouthdr_ext->o_sndata);
     651    aouthdr_int->o_sntoc    = H_GET_16 (abfd, aouthdr_ext->o_sntoc);
     652    aouthdr_int->o_snloader = H_GET_16 (abfd, aouthdr_ext->o_snloader);
     653    aouthdr_int->o_snbss    = H_GET_16 (abfd, aouthdr_ext->o_snbss);
     654    aouthdr_int->o_algntext = H_GET_16 (abfd, aouthdr_ext->o_algntext);
     655    aouthdr_int->o_algndata = H_GET_16 (abfd, aouthdr_ext->o_algndata);
     656    aouthdr_int->o_modtype  = H_GET_16 (abfd, aouthdr_ext->o_modtype);
     657    aouthdr_int->o_cputype  = H_GET_16 (abfd, aouthdr_ext->o_cputype);
     658  #ifdef XCOFF64
     659    aouthdr_int->o_maxstack = H_GET_64 (abfd, aouthdr_ext->o_maxstack);
     660    aouthdr_int->o_maxdata  = H_GET_64 (abfd, aouthdr_ext->o_maxdata);
     661  #else
     662    aouthdr_int->o_maxstack = H_GET_32 (abfd, aouthdr_ext->o_maxstack);
     663    aouthdr_int->o_maxdata  = H_GET_32 (abfd, aouthdr_ext->o_maxdata);
     664  #endif
     665  #endif
     666  
     667  #ifdef MIPSECOFF
     668    aouthdr_int->bss_start  = H_GET_32 (abfd, aouthdr_ext->bss_start);
     669    aouthdr_int->gp_value   = H_GET_32 (abfd, aouthdr_ext->gp_value);
     670    aouthdr_int->gprmask    = H_GET_32 (abfd, aouthdr_ext->gprmask);
     671    aouthdr_int->cprmask[0] = H_GET_32 (abfd, aouthdr_ext->cprmask[0]);
     672    aouthdr_int->cprmask[1] = H_GET_32 (abfd, aouthdr_ext->cprmask[1]);
     673    aouthdr_int->cprmask[2] = H_GET_32 (abfd, aouthdr_ext->cprmask[2]);
     674    aouthdr_int->cprmask[3] = H_GET_32 (abfd, aouthdr_ext->cprmask[3]);
     675  #endif
     676  
     677  #ifdef ALPHAECOFF
     678    aouthdr_int->bss_start = H_GET_64 (abfd, aouthdr_ext->bss_start);
     679    aouthdr_int->gp_value  = H_GET_64 (abfd, aouthdr_ext->gp_value);
     680    aouthdr_int->gprmask   = H_GET_32 (abfd, aouthdr_ext->gprmask);
     681    aouthdr_int->fprmask   = H_GET_32 (abfd, aouthdr_ext->fprmask);
     682  #endif
     683  }
     684  
     685  static unsigned int
     686  coff_swap_aouthdr_out (bfd * abfd, void * in, void * out)
     687  {
     688    struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
     689    AOUTHDR *aouthdr_out = (AOUTHDR *) out;
     690  
     691    H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->magic);
     692    H_PUT_16 (abfd, aouthdr_in->vstamp, aouthdr_out->vstamp);
     693    PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->tsize);
     694    PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->dsize);
     695    PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->bsize);
     696    PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->entry);
     697    PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
     698  			  aouthdr_out->text_start);
     699    PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
     700  			  aouthdr_out->data_start);
     701  
     702  #ifdef RS6000COFF_C
     703  #ifdef XCOFF64
     704    H_PUT_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
     705  #else
     706    H_PUT_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
     707  #endif
     708    H_PUT_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
     709    H_PUT_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
     710    H_PUT_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
     711    H_PUT_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
     712    H_PUT_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
     713    H_PUT_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
     714    H_PUT_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
     715    H_PUT_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
     716    H_PUT_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
     717    H_PUT_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
     718  #ifdef XCOFF64
     719    H_PUT_64 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
     720    H_PUT_64 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
     721  #else
     722    H_PUT_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
     723    H_PUT_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
     724  #endif
     725    /* TODO: set o_*psize dynamically */
     726    H_PUT_8 (abfd, 0, aouthdr_out->o_textpsize);
     727    H_PUT_8 (abfd, 0, aouthdr_out->o_datapsize);
     728    H_PUT_8 (abfd, 0, aouthdr_out->o_stackpsize);
     729    H_PUT_8 (abfd, aouthdr_in->o_flags, aouthdr_out->o_flags);
     730    H_PUT_16 (abfd, aouthdr_in->o_sntdata, aouthdr_out->o_sntdata);
     731    H_PUT_16 (abfd, aouthdr_in->o_sntbss, aouthdr_out->o_sntbss);
     732    H_PUT_32 (abfd, 0, aouthdr_out->o_debugger);
     733  #ifdef XCOFF64
     734    H_PUT_16 (abfd, aouthdr_in->o_x64flags, aouthdr_out->o_x64flags);
     735    memset (aouthdr_out->o_resv3, 0, sizeof aouthdr_out->o_resv3);
     736  #endif
     737  #endif
     738  
     739  #ifdef MIPSECOFF
     740    H_PUT_32 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start);
     741    H_PUT_32 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value);
     742    H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask);
     743    H_PUT_32 (abfd, aouthdr_in->cprmask[0], aouthdr_out->cprmask[0]);
     744    H_PUT_32 (abfd, aouthdr_in->cprmask[1], aouthdr_out->cprmask[1]);
     745    H_PUT_32 (abfd, aouthdr_in->cprmask[2], aouthdr_out->cprmask[2]);
     746    H_PUT_32 (abfd, aouthdr_in->cprmask[3], aouthdr_out->cprmask[3]);
     747  #endif
     748  
     749  #ifdef ALPHAECOFF
     750    /* FIXME: What does bldrev mean?  */
     751    H_PUT_16 (abfd, 2, aouthdr_out->bldrev);
     752    H_PUT_16 (abfd, 0, aouthdr_out->padding);
     753    H_PUT_64 (abfd, aouthdr_in->bss_start, aouthdr_out->bss_start);
     754    H_PUT_64 (abfd, aouthdr_in->gp_value, aouthdr_out->gp_value);
     755    H_PUT_32 (abfd, aouthdr_in->gprmask, aouthdr_out->gprmask);
     756    H_PUT_32 (abfd, aouthdr_in->fprmask, aouthdr_out->fprmask);
     757  #endif
     758  
     759    return AOUTSZ;
     760  }
     761  
     762  ATTRIBUTE_UNUSED
     763  static void
     764  coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
     765  {
     766    SCNHDR *scnhdr_ext = (SCNHDR *) ext;
     767    struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
     768  
     769  #ifdef COFF_ADJUST_SCNHDR_IN_PRE
     770    COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
     771  #endif
     772    memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
     773  
     774    scnhdr_int->s_vaddr = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
     775    scnhdr_int->s_paddr = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
     776    scnhdr_int->s_size = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
     777  
     778    scnhdr_int->s_scnptr = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
     779    scnhdr_int->s_relptr = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
     780    scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
     781    scnhdr_int->s_flags = GET_SCNHDR_FLAGS (abfd, scnhdr_ext->s_flags);
     782    scnhdr_int->s_nreloc = GET_SCNHDR_NRELOC (abfd, scnhdr_ext->s_nreloc);
     783    scnhdr_int->s_nlnno = GET_SCNHDR_NLNNO (abfd, scnhdr_ext->s_nlnno);
     784  #ifdef COFF_ADJUST_SCNHDR_IN_POST
     785    COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
     786  #endif
     787  }
     788  
     789  ATTRIBUTE_UNUSED
     790  static unsigned int
     791  coff_swap_scnhdr_out (bfd * abfd, void * in, void * out)
     792  {
     793    struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
     794    SCNHDR *scnhdr_ext = (SCNHDR *) out;
     795    unsigned int ret = bfd_coff_scnhsz (abfd);
     796  
     797  #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
     798    COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
     799  #endif
     800    memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
     801  
     802    PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr, scnhdr_ext->s_vaddr);
     803    PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr, scnhdr_ext->s_paddr);
     804    PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size, scnhdr_ext->s_size);
     805    PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr, scnhdr_ext->s_scnptr);
     806    PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr, scnhdr_ext->s_relptr);
     807    PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr, scnhdr_ext->s_lnnoptr);
     808    PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
     809    if (scnhdr_int->s_nlnno <= MAX_SCNHDR_NLNNO)
     810      PUT_SCNHDR_NLNNO (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
     811    else
     812      {
     813        char buf[sizeof (scnhdr_int->s_name) + 1];
     814  
     815        memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
     816        buf[sizeof (scnhdr_int->s_name)] = '\0';
     817        _bfd_error_handler
     818  	/* xgettext:c-format */
     819  	(_("%pB: warning: %s: line number overflow: 0x%lx > 0xffff"),
     820  	 abfd, buf, scnhdr_int->s_nlnno);
     821        PUT_SCNHDR_NLNNO (abfd, 0xffff, scnhdr_ext->s_nlnno);
     822      }
     823  
     824    if (scnhdr_int->s_nreloc <= MAX_SCNHDR_NRELOC)
     825      PUT_SCNHDR_NRELOC (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
     826    else
     827      {
     828        char buf[sizeof (scnhdr_int->s_name) + 1];
     829  
     830        memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
     831        buf[sizeof (scnhdr_int->s_name)] = '\0';
     832        /* xgettext:c-format */
     833        _bfd_error_handler (_("%pB: %s: reloc overflow: 0x%lx > 0xffff"),
     834  			  abfd, buf, scnhdr_int->s_nreloc);
     835        bfd_set_error (bfd_error_file_truncated);
     836        PUT_SCNHDR_NRELOC (abfd, 0xffff, scnhdr_ext->s_nreloc);
     837        ret = 0;
     838      }
     839  
     840  #ifdef COFF_ADJUST_SCNHDR_OUT_POST
     841    COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);
     842  #endif
     843    return ret;
     844  }