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