OSDN Git Service

2000-11-28 Kazu Hirata <kazu@hxi.com>
[pf3gnuchains/pf3gnuchains3x.git] / bfd / coffswap.h
1 /* Generic COFF swapping routines, for BFD.
2    Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3    Free Software Foundation, Inc.
4    Written by Cygnus Support.
5
6 This file is part of BFD, the Binary File Descriptor library.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, 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
200 static void coff_swap_aouthdr_in PARAMS ((bfd *, PTR, PTR));
201 static unsigned int coff_swap_aouthdr_out PARAMS ((bfd *, PTR, PTR));
202 static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
203 static unsigned int coff_swap_scnhdr_out PARAMS ((bfd *, PTR, PTR));
204 static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
205 static unsigned int coff_swap_filehdr_out PARAMS ((bfd *, PTR, PTR));
206 #ifndef NO_COFF_RELOCS
207 static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
208 static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
209 #endif /* NO_COFF_RELOCS */
210 #ifndef NO_COFF_SYMBOLS
211 static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR));
212 static unsigned int coff_swap_sym_out PARAMS ((bfd *, PTR, PTR));
213 static void coff_swap_aux_in PARAMS ((bfd *, PTR, int, int, int, int, PTR));
214 static unsigned int coff_swap_aux_out PARAMS ((bfd *, PTR, int, int, int, int, PTR));
215 #endif /* NO_COFF_SYMBOLS */
216 #ifndef NO_COFF_LINENOS
217 static void coff_swap_lineno_in PARAMS ((bfd *, PTR, PTR));
218 static unsigned int coff_swap_lineno_out PARAMS ((bfd *, PTR, PTR));
219 #endif /* NO_COFF_LINENOS */
220
221 #ifndef NO_COFF_RELOCS
222
223 static void
224 coff_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
248 static unsigned int
249 coff_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
281 static void
282 coff_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 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
290   COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
291 #endif
292   filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
293   filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
294   filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
295   filehdr_dst->f_symptr =
296     GET_FILEHDR_SYMPTR (abfd, (bfd_byte *) filehdr_src->f_symptr);
297   filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
298   filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
299   filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
300 #ifdef TIC80_TARGET_ID
301   filehdr_dst->f_target_id = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_target_id);
302 #endif
303
304 #ifdef COFF_ADJUST_FILEHDR_IN_POST
305   COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
306 #endif
307 }
308
309 static  unsigned int
310 coff_swap_filehdr_out (abfd, in, out)
311      bfd       *abfd;
312      PTR        in;
313      PTR        out;
314 {
315   struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
316   FILHDR *filehdr_out = (FILHDR *)out;
317
318 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
319   COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
320 #endif
321   bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
322   bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
323   bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
324   PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
325                       (bfd_byte *) filehdr_out->f_symptr);
326   bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
327   bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
328   bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
329 #ifdef TIC80_TARGET_ID
330   bfd_h_put_16(abfd, filehdr_in->f_target_id, (bfd_byte *) filehdr_out->f_target_id);
331 #endif
332
333 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
334   COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
335 #endif
336   return bfd_coff_filhsz (abfd);
337 }
338
339 #ifndef NO_COFF_SYMBOLS
340
341 static void
342 coff_swap_sym_in (abfd, ext1, in1)
343      bfd            *abfd;
344      PTR ext1;
345      PTR in1;
346 {
347   SYMENT *ext = (SYMENT *)ext1;
348   struct internal_syment      *in = (struct internal_syment *)in1;
349
350   if( ext->e.e_name[0] == 0) {
351     in->_n._n_n._n_zeroes = 0;
352     in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
353   }
354   else {
355 #if SYMNMLEN != E_SYMNMLEN
356    -> Error, we need to cope with truncating or extending SYMNMLEN!;
357 #else
358     memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
359 #endif
360   }
361   in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
362   in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
363   if (sizeof (ext->e_type) == 2){
364     in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
365   }
366   else {
367     in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
368   }
369   in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
370   in->n_numaux = bfd_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     bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
386     bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *)  ext->e.e.e_offset);
387   }
388   else {
389 #if SYMNMLEN != E_SYMNMLEN
390     -> Error, we need to cope with truncating or extending SYMNMLEN!;
391 #else
392     memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
393 #endif
394   }
395   bfd_h_put_32(abfd,  in->n_value , (bfd_byte *) ext->e_value);
396   bfd_h_put_16(abfd,  in->n_scnum , (bfd_byte *) ext->e_scnum);
397   if (sizeof (ext->e_type) == 2)
398       {
399         bfd_h_put_16(abfd,  in->n_type , (bfd_byte *) ext->e_type);
400       }
401   else
402       {
403         bfd_h_put_32(abfd,  in->n_type , (bfd_byte *) ext->e_type);
404       }
405   bfd_h_put_8(abfd,  in->n_sclass , ext->e_sclass);
406   bfd_h_put_8(abfd,  in->n_numaux , ext->e_numaux);
407 #ifdef COFF_ADJUST_SYM_OUT_POST
408   COFF_ADJUST_SYM_OUT_POST (abfd, inp, extp);
409 #endif
410   return SYMESZ;
411 }
412
413 static void
414 coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
415      bfd            *abfd;
416      PTR              ext1;
417      int             type;
418      int             class;
419      int              indx;
420      int              numaux;
421      PTR              in1;
422 {
423   AUXENT    *ext = (AUXENT *)ext1;
424   union internal_auxent *in = (union internal_auxent *)in1;
425
426 #ifdef COFF_ADJUST_AUX_IN_PRE
427   COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, class, indx, numaux, in1);
428 #endif
429   switch (class) {
430     case C_FILE:
431       if (ext->x_file.x_fname[0] == 0) {
432           in->x_file.x_n.x_zeroes = 0;
433           in->x_file.x_n.x_offset =
434            bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
435         } else {
436 #if FILNMLEN != E_FILNMLEN
437             -> Error, we need to cope with truncating or extending FILNMLEN!;
438 #else
439             if (numaux > 1)
440               {
441                 if (indx == 0)
442                   memcpy (in->x_file.x_fname, ext->x_file.x_fname,
443                           numaux * sizeof (AUXENT));
444               }
445             else
446               {
447                 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
448               }
449 #endif
450           }
451       goto end;
452
453     case C_STAT:
454 #ifdef C_LEAFSTAT
455     case C_LEAFSTAT:
456 #endif
457     case C_HIDDEN:
458       if (type == T_NULL) {
459           in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
460           in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
461           in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
462
463           /* PE defines some extra fields; we zero them out for
464              safety.  */
465           in->x_scn.x_checksum = 0;
466           in->x_scn.x_associated = 0;
467           in->x_scn.x_comdat = 0;
468
469           goto end;
470         }
471       break;
472     }
473
474   in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
475 #ifndef NO_TVNDX
476   in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
477 #endif
478
479   if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
480     {
481       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
482       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
483     }
484   else
485     {
486 #if DIMNUM != E_DIMNUM
487  #error we need to cope with truncating or extending DIMNUM
488 #endif
489       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
490         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
491       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
492         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
493       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
494         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
495       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
496         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
497     }
498
499   if (ISFCN(type)) {
500     in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
501   }
502   else {
503     in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
504     in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
505   }
506
507 end: ;
508   /* the semicolon is because MSVC doesn't like labels at
509      end of block.  */
510
511 #ifdef COFF_ADJUST_AUX_IN_POST
512   COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, class, indx, numaux, in1);
513 #endif
514 }
515
516 static unsigned int
517 coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
518      bfd   *abfd;
519      PTR        inp;
520      int   type;
521      int   class;
522      int   indx ATTRIBUTE_UNUSED;
523      int   numaux ATTRIBUTE_UNUSED;
524      PTR        extp;
525 {
526   union internal_auxent *in = (union internal_auxent *)inp;
527   AUXENT *ext = (AUXENT *)extp;
528
529 #ifdef COFF_ADJUST_AUX_OUT_PRE
530   COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, class, indx, numaux, extp);
531 #endif
532   memset((PTR)ext, 0, AUXESZ);
533   switch (class) {
534   case C_FILE:
535     if (in->x_file.x_fname[0] == 0) {
536       PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
537       PUTWORD(abfd,
538               in->x_file.x_n.x_offset,
539               (bfd_byte *) ext->x_file.x_n.x_offset);
540     }
541     else {
542 #if FILNMLEN != E_FILNMLEN
543       -> Error, we need to cope with truncating or extending FILNMLEN!;
544 #else
545       memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
546 #endif
547     }
548     goto end;
549
550   case C_STAT:
551 #ifdef C_LEAFSTAT
552   case C_LEAFSTAT:
553 #endif
554   case C_HIDDEN:
555     if (type == T_NULL) {
556       PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
557       PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
558       PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
559       goto end;
560     }
561     break;
562   }
563
564   PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
565 #ifndef NO_TVNDX
566   bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
567 #endif
568
569   if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
570     {
571       PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
572       PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
573     }
574   else
575     {
576 #if DIMNUM != E_DIMNUM
577  #error we need to cope with truncating or extending DIMNUM
578 #endif
579       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
580                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
581       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
582                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
583       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
584                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
585       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
586                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
587     }
588
589   if (ISFCN (type))
590     PUTWORD (abfd, in->x_sym.x_misc.x_fsize,
591              (bfd_byte *)  ext->x_sym.x_misc.x_fsize);
592   else
593     {
594       PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
595       PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
596     }
597
598 end:
599 #ifdef COFF_ADJUST_AUX_OUT_POST
600   COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, class, indx, numaux, extp);
601 #endif
602   return AUXESZ;
603 }
604
605 #endif /* NO_COFF_SYMBOLS */
606
607 #ifndef NO_COFF_LINENOS
608
609 static void
610 coff_swap_lineno_in (abfd, ext1, in1)
611      bfd            *abfd;
612      PTR ext1;
613      PTR in1;
614 {
615   LINENO *ext = (LINENO *)ext1;
616   struct internal_lineno      *in = (struct internal_lineno *)in1;
617
618   in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
619   in->l_lnno = GET_LINENO_LNNO(abfd, ext);
620 }
621
622 static unsigned int
623 coff_swap_lineno_out (abfd, inp, outp)
624      bfd       *abfd;
625      PTR        inp;
626      PTR        outp;
627 {
628   struct internal_lineno *in = (struct internal_lineno *)inp;
629   struct external_lineno *ext = (struct external_lineno *)outp;
630   PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *)
631           ext->l_addr.l_symndx);
632
633   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
634   return LINESZ;
635 }
636
637 #endif /* NO_COFF_LINENOS */
638
639 static void
640 coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
641      bfd            *abfd;
642      PTR aouthdr_ext1;
643      PTR aouthdr_int1;
644 {
645   AOUTHDR        *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
646   struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
647
648   aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
649   aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
650   aouthdr_int->tsize =
651     GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
652   aouthdr_int->dsize =
653     GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
654   aouthdr_int->bsize =
655     GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
656   aouthdr_int->entry =
657     GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
658   aouthdr_int->text_start =
659     GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
660   aouthdr_int->data_start =
661     GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
662
663 #ifdef I960
664   aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
665 #endif
666
667 #ifdef APOLLO_M68
668   bfd_h_put_32(abfd, aouthdr_int->o_inlib, (bfd_byte *) aouthdr_ext->o_inlib);
669   bfd_h_put_32(abfd, aouthdr_int->o_sri, (bfd_byte *) aouthdr_ext->o_sri);
670   bfd_h_put_32(abfd, aouthdr_int->vid[0], (bfd_byte *) aouthdr_ext->vid);
671   bfd_h_put_32(abfd, aouthdr_int->vid[1], (bfd_byte *) aouthdr_ext->vid + 4);
672 #endif
673
674 #ifdef RS6000COFF_C
675 #ifdef XCOFF64
676   aouthdr_int->o_toc = bfd_h_get_64(abfd, aouthdr_ext->o_toc);
677 #else
678   aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
679 #endif
680   aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
681   aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
682   aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
683   aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
684   aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
685   aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
686   aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
687   aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
688   aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
689   aouthdr_int->o_cputype = bfd_h_get_16(abfd, aouthdr_ext->o_cputype);
690 #ifdef XCOFF64
691   aouthdr_int->o_maxstack = bfd_h_get_64(abfd, aouthdr_ext->o_maxstack);
692   aouthdr_int->o_maxdata = bfd_h_get_64(abfd, aouthdr_ext->o_maxdata);
693 #else
694   aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
695   aouthdr_int->o_maxdata = bfd_h_get_32(abfd, aouthdr_ext->o_maxdata);
696 #endif
697 #endif
698
699 #ifdef MIPSECOFF
700   aouthdr_int->bss_start = bfd_h_get_32(abfd, aouthdr_ext->bss_start);
701   aouthdr_int->gp_value = bfd_h_get_32(abfd, aouthdr_ext->gp_value);
702   aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
703   aouthdr_int->cprmask[0] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[0]);
704   aouthdr_int->cprmask[1] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[1]);
705   aouthdr_int->cprmask[2] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[2]);
706   aouthdr_int->cprmask[3] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[3]);
707 #endif
708
709 #ifdef ALPHAECOFF
710   aouthdr_int->bss_start = bfd_h_get_64(abfd, aouthdr_ext->bss_start);
711   aouthdr_int->gp_value = bfd_h_get_64(abfd, aouthdr_ext->gp_value);
712   aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
713   aouthdr_int->fprmask = bfd_h_get_32(abfd, aouthdr_ext->fprmask);
714 #endif
715 }
716
717 static unsigned int
718 coff_swap_aouthdr_out (abfd, in, out)
719      bfd       *abfd;
720      PTR        in;
721      PTR        out;
722 {
723   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
724   AOUTHDR *aouthdr_out = (AOUTHDR *)out;
725
726   bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
727   bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
728   PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
729   PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
730   PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
731   PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
732   PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
733                           (bfd_byte *) aouthdr_out->text_start);
734   PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
735                           (bfd_byte *) aouthdr_out->data_start);
736
737 #ifdef I960
738   bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
739 #endif
740
741 #ifdef RS6000COFF_C
742 #ifdef XCOFF64
743   bfd_h_put_64 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
744 #else
745   bfd_h_put_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
746 #endif
747   bfd_h_put_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
748   bfd_h_put_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
749   bfd_h_put_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
750   bfd_h_put_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
751   bfd_h_put_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
752   bfd_h_put_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
753   bfd_h_put_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
754   bfd_h_put_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
755   bfd_h_put_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
756   bfd_h_put_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
757 #ifdef XCOFF64
758   bfd_h_put_64 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
759   bfd_h_put_64 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
760 #else
761   bfd_h_put_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
762   bfd_h_put_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
763 #endif
764   memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2);
765 #ifdef XCOFF64
766   memset (aouthdr_out->o_debugger, 0, sizeof aouthdr_out->o_debugger);
767   memset (aouthdr_out->o_resv3, 0, sizeof aouthdr_out->o_resv3);
768 #endif
769 #endif
770
771 #ifdef MIPSECOFF
772   bfd_h_put_32(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
773   bfd_h_put_32(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
774   bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
775   bfd_h_put_32(abfd, aouthdr_in->cprmask[0], (bfd_byte *) aouthdr_out->cprmask[0]);
776   bfd_h_put_32(abfd, aouthdr_in->cprmask[1], (bfd_byte *) aouthdr_out->cprmask[1]);
777   bfd_h_put_32(abfd, aouthdr_in->cprmask[2], (bfd_byte *) aouthdr_out->cprmask[2]);
778   bfd_h_put_32(abfd, aouthdr_in->cprmask[3], (bfd_byte *) aouthdr_out->cprmask[3]);
779 #endif
780
781 #ifdef ALPHAECOFF
782   /* FIXME: What does bldrev mean?  */
783   bfd_h_put_16(abfd, (bfd_vma) 2, (bfd_byte *) aouthdr_out->bldrev);
784   bfd_h_put_16(abfd, (bfd_vma) 0, (bfd_byte *) aouthdr_out->padding);
785   bfd_h_put_64(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
786   bfd_h_put_64(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
787   bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
788   bfd_h_put_32(abfd, aouthdr_in->fprmask, (bfd_byte *) aouthdr_out->fprmask);
789 #endif
790
791   return AOUTSZ;
792 }
793
794 static void
795 coff_swap_scnhdr_in (abfd, ext, in)
796      bfd            *abfd;
797      PTR             ext;
798      PTR             in;
799 {
800   SCNHDR *scnhdr_ext = (SCNHDR *) ext;
801   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
802
803 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
804   COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
805 #endif
806   memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
807   scnhdr_int->s_vaddr =
808     GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
809   scnhdr_int->s_paddr =
810     GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
811   scnhdr_int->s_size =
812     GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
813
814   scnhdr_int->s_scnptr =
815     GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
816   scnhdr_int->s_relptr =
817     GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr);
818   scnhdr_int->s_lnnoptr =
819     GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
820   scnhdr_int->s_flags =
821     GET_SCNHDR_FLAGS (abfd, (bfd_byte *) scnhdr_ext->s_flags);
822   scnhdr_int->s_nreloc =
823     GET_SCNHDR_NRELOC (abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
824   scnhdr_int->s_nlnno =
825     GET_SCNHDR_NLNNO (abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
826 #ifdef I960
827   scnhdr_int->s_align =
828     GET_SCNHDR_ALIGN (abfd, (bfd_byte *) scnhdr_ext->s_align);
829 #endif
830 #ifdef COFF_ADJUST_SCNHDR_IN_POST
831   COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
832 #endif
833 }
834
835 static unsigned int
836 coff_swap_scnhdr_out (abfd, in, out)
837      bfd       *abfd;
838      PTR        in;
839      PTR        out;
840 {
841   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
842   SCNHDR *scnhdr_ext = (SCNHDR *)out;
843   unsigned int ret = bfd_coff_scnhsz (abfd);
844
845 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
846   COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
847 #endif
848   memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
849
850   PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr,
851                     (bfd_byte *) scnhdr_ext->s_vaddr);
852
853   PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr,
854                     (bfd_byte *) scnhdr_ext->s_paddr);
855   PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size,
856                    (bfd_byte *) scnhdr_ext->s_size);
857
858   PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
859                      (bfd_byte *) scnhdr_ext->s_scnptr);
860   PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
861                      (bfd_byte *) scnhdr_ext->s_relptr);
862   PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
863                       (bfd_byte *) scnhdr_ext->s_lnnoptr);
864   PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags,
865                     (bfd_byte *) scnhdr_ext->s_flags);
866 #if defined(M88)
867   PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
868   PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
869 #else
870   if (scnhdr_int->s_nlnno <= MAX_SCNHDR_NLNNO)
871     PUT_SCNHDR_NLNNO(abfd, scnhdr_int->s_nlnno,
872             (bfd_byte *) scnhdr_ext->s_nlnno);
873   else
874     {
875       char buf[sizeof (scnhdr_int->s_name) + 1];
876
877       memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
878       buf[sizeof (scnhdr_int->s_name)] = '\0';
879       (*_bfd_error_handler)
880         (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
881          bfd_get_filename (abfd),
882          buf, scnhdr_int->s_nlnno);
883       PUT_SCNHDR_NLNNO(abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
884     }
885   if (scnhdr_int->s_nreloc <= MAX_SCNHDR_NRELOC)
886     PUT_SCNHDR_NRELOC(abfd, scnhdr_int->s_nreloc,
887             (bfd_byte *) scnhdr_ext->s_nreloc);
888   else
889     {
890       char buf[sizeof (scnhdr_int->s_name) + 1];
891
892       memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
893       buf[sizeof (scnhdr_int->s_name)] = '\0';
894       (*_bfd_error_handler) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
895                              bfd_get_filename (abfd),
896                              buf, scnhdr_int->s_nreloc);
897       bfd_set_error (bfd_error_file_truncated);
898       PUT_SCNHDR_NRELOC(abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
899       ret = 0;
900     }
901 #endif
902
903 #ifdef I960
904   PUT_SCNHDR_ALIGN (abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
905 #endif
906 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
907   COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);
908 #endif
909   return ret;
910 }