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