OSDN Git Service

Applied Tim Wall's patch to replace RELSZ and friends with bfd_coff_relsz and
[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 PUT_SCNHDR_NRELOC
172 #define PUT_SCNHDR_NRELOC bfd_h_put_16
173 #endif
174 #ifndef GET_SCNHDR_NLNNO
175 #define GET_SCNHDR_NLNNO bfd_h_get_16
176 #endif
177 #ifndef PUT_SCNHDR_NLNNO
178 #define PUT_SCNHDR_NLNNO bfd_h_put_16
179 #endif
180 #ifndef GET_SCNHDR_FLAGS
181 #define GET_SCNHDR_FLAGS bfd_h_get_32
182 #endif
183 #ifndef PUT_SCNHDR_FLAGS
184 #define PUT_SCNHDR_FLAGS bfd_h_put_32
185 #endif
186
187
188 static void coff_swap_aouthdr_in PARAMS ((bfd *, PTR, PTR));
189 static unsigned int coff_swap_aouthdr_out PARAMS ((bfd *, PTR, PTR));
190 static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
191 static unsigned int coff_swap_scnhdr_out PARAMS ((bfd *, PTR, PTR));
192 static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
193 static unsigned int coff_swap_filehdr_out PARAMS ((bfd *, PTR, PTR));
194 #ifndef NO_COFF_RELOCS
195 static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
196 static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
197 #endif /* NO_COFF_RELOCS */
198 #ifndef NO_COFF_SYMBOLS
199 static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR));
200 static unsigned int coff_swap_sym_out PARAMS ((bfd *, PTR, PTR));
201 static void coff_swap_aux_in PARAMS ((bfd *, PTR, int, int, int, int, PTR));
202 static unsigned int coff_swap_aux_out PARAMS ((bfd *, PTR, int, int, int, int, PTR));
203 #endif /* NO_COFF_SYMBOLS */
204 #ifndef NO_COFF_LINENOS
205 static void coff_swap_lineno_in PARAMS ((bfd *, PTR, PTR));
206 static unsigned int coff_swap_lineno_out PARAMS ((bfd *, PTR, PTR));
207 #endif /* NO_COFF_LINENOS */
208
209 #ifndef NO_COFF_RELOCS
210
211 static void
212 coff_swap_reloc_in (abfd, src, dst)
213      bfd *abfd;
214      PTR src;
215      PTR dst;
216 {
217   RELOC *reloc_src = (RELOC *) src;
218   struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
219
220   reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
221   reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx);
222
223 #ifdef RS6000COFF_C
224   reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
225   reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
226 #else
227   reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
228 #endif
229
230 #ifdef SWAP_IN_RELOC_OFFSET
231   reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
232                                              (bfd_byte *) reloc_src->r_offset);
233 #endif
234 }
235
236 static unsigned int
237 coff_swap_reloc_out (abfd, src, dst)
238      bfd       *abfd;
239      PTR        src;
240      PTR        dst;
241 {
242   struct internal_reloc *reloc_src = (struct internal_reloc *)src;
243   struct external_reloc *reloc_dst = (struct external_reloc *)dst;
244   bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
245   bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
246
247 #ifdef RS6000COFF_C
248   bfd_h_put_8 (abfd, reloc_src->r_type, (bfd_byte *) reloc_dst->r_type);
249   bfd_h_put_8 (abfd, reloc_src->r_size, (bfd_byte *) reloc_dst->r_size);
250 #else
251   bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
252                reloc_dst->r_type);
253 #endif
254
255 #ifdef SWAP_OUT_RELOC_OFFSET
256   SWAP_OUT_RELOC_OFFSET(abfd,
257                         reloc_src->r_offset,
258                         (bfd_byte *) reloc_dst->r_offset);
259 #endif
260 #ifdef SWAP_OUT_RELOC_EXTRA
261   SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
262 #endif
263
264   return bfd_coff_relsz (abfd);
265 }
266
267 #endif /* NO_COFF_RELOCS */
268
269 static void
270 coff_swap_filehdr_in (abfd, src, dst)
271      bfd            *abfd;
272      PTR             src;
273      PTR             dst;
274 {
275   FILHDR *filehdr_src = (FILHDR *) src;
276   struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
277 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
278   COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
279 #endif
280   filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
281   filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
282   filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
283   filehdr_dst->f_symptr =
284     GET_FILEHDR_SYMPTR (abfd, (bfd_byte *) filehdr_src->f_symptr);
285   filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
286   filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
287   filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
288 #ifdef TIC80_TARGET_ID
289   filehdr_dst->f_target_id = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_target_id);
290 #endif
291
292 #ifdef COFF_ADJUST_FILEHDR_IN_POST
293   COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
294 #endif
295 }
296
297 static  unsigned int
298 coff_swap_filehdr_out (abfd, in, out)
299      bfd       *abfd;
300      PTR        in;
301      PTR        out;
302 {
303   struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
304   FILHDR *filehdr_out = (FILHDR *)out;
305
306 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
307   COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
308 #endif
309   bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
310   bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
311   bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
312   PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
313                       (bfd_byte *) filehdr_out->f_symptr);
314   bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
315   bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
316   bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
317 #ifdef TIC80_TARGET_ID
318   bfd_h_put_16(abfd, filehdr_in->f_target_id, (bfd_byte *) filehdr_out->f_target_id);
319 #endif
320
321 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
322   COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
323 #endif
324   return bfd_coff_filhsz (abfd);
325 }
326
327
328 #ifndef NO_COFF_SYMBOLS
329
330 static void
331 coff_swap_sym_in (abfd, ext1, in1)
332      bfd            *abfd;
333      PTR ext1;
334      PTR in1;
335 {
336   SYMENT *ext = (SYMENT *)ext1;
337   struct internal_syment      *in = (struct internal_syment *)in1;
338
339   if( ext->e.e_name[0] == 0) {
340     in->_n._n_n._n_zeroes = 0;
341     in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
342   }
343   else {
344 #if SYMNMLEN != E_SYMNMLEN
345    -> Error, we need to cope with truncating or extending SYMNMLEN!;
346 #else
347     memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
348 #endif
349   }
350   in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value); 
351   in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
352   if (sizeof(ext->e_type) == 2){
353     in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
354   }
355   else {
356     in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
357   }
358   in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
359   in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
360 }
361
362 static unsigned int
363 coff_swap_sym_out (abfd, inp, extp)
364      bfd       *abfd;
365      PTR        inp;
366      PTR        extp;
367 {
368   struct internal_syment *in = (struct internal_syment *)inp;
369   SYMENT *ext =(SYMENT *)extp;
370   if(in->_n._n_name[0] == 0) {
371     bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
372     bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *)  ext->e.e.e_offset);
373   }
374   else {
375 #if SYMNMLEN != E_SYMNMLEN
376     -> Error, we need to cope with truncating or extending SYMNMLEN!;
377 #else
378     memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
379 #endif
380   }
381   bfd_h_put_32(abfd,  in->n_value , (bfd_byte *) ext->e_value);
382   bfd_h_put_16(abfd,  in->n_scnum , (bfd_byte *) ext->e_scnum);
383   if (sizeof(ext->e_type) == 2)
384       {
385         bfd_h_put_16(abfd,  in->n_type , (bfd_byte *) ext->e_type);
386       }
387   else
388       {
389         bfd_h_put_32(abfd,  in->n_type , (bfd_byte *) ext->e_type);
390       }
391   bfd_h_put_8(abfd,  in->n_sclass , ext->e_sclass);
392   bfd_h_put_8(abfd,  in->n_numaux , ext->e_numaux);
393   return SYMESZ;
394 }
395
396 static void
397 coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
398      bfd            *abfd;
399      PTR              ext1;
400      int             type;
401      int             class;
402      int              indx;
403      int              numaux;
404      PTR              in1;
405 {
406   AUXENT    *ext = (AUXENT *)ext1;
407   union internal_auxent *in = (union internal_auxent *)in1;
408
409 #ifdef COFF_ADJUST_AUX_IN_PRE
410   COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, class, indx, numaux, in1);
411 #endif
412   switch (class) {
413     case C_FILE:
414       if (ext->x_file.x_fname[0] == 0) {
415           in->x_file.x_n.x_zeroes = 0;
416           in->x_file.x_n.x_offset = 
417            bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
418         } else {
419 #if FILNMLEN != E_FILNMLEN
420             -> Error, we need to cope with truncating or extending FILNMLEN!;
421 #else
422             if (numaux > 1)
423               {
424                 if (indx == 0)
425                   memcpy (in->x_file.x_fname, ext->x_file.x_fname,
426                           numaux * sizeof (AUXENT));
427               }
428             else
429               {
430                 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
431               }
432 #endif
433           }
434       goto end;
435
436       /* RS/6000 "csect" auxents */
437 #ifdef RS6000COFF_C
438     case C_EXT:
439     case C_HIDEXT:
440       if (indx + 1 == numaux)
441         {
442           in->x_csect.x_scnlen.l = bfd_h_get_32 (abfd, ext->x_csect.x_scnlen);
443           in->x_csect.x_parmhash = bfd_h_get_32 (abfd,
444                                                  ext->x_csect.x_parmhash);
445           in->x_csect.x_snhash   = bfd_h_get_16 (abfd, ext->x_csect.x_snhash);
446           /* We don't have to hack bitfields in x_smtyp because it's
447              defined by shifts-and-ands, which are equivalent on all
448              byte orders.  */
449           in->x_csect.x_smtyp    = bfd_h_get_8  (abfd, ext->x_csect.x_smtyp);
450           in->x_csect.x_smclas   = bfd_h_get_8  (abfd, ext->x_csect.x_smclas);
451           in->x_csect.x_stab     = bfd_h_get_32 (abfd, ext->x_csect.x_stab);
452           in->x_csect.x_snstab   = bfd_h_get_16 (abfd, ext->x_csect.x_snstab);
453           goto end;
454         }
455       break;
456 #endif
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           in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
465           in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
466           in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
467
468           /* PE defines some extra fields; we zero them out for
469              safety.  */
470           in->x_scn.x_checksum = 0;
471           in->x_scn.x_associated = 0;
472           in->x_scn.x_comdat = 0;
473
474           goto end;
475         }
476       break;
477     }
478
479   in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
480 #ifndef NO_TVNDX
481   in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
482 #endif
483
484   if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
485     {
486       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
487       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
488     }
489   else
490     {
491 #if DIMNUM != E_DIMNUM
492  #error we need to cope with truncating or extending DIMNUM
493 #endif
494       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
495         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
496       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
497         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
498       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
499         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
500       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
501         bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
502     }
503
504   if (ISFCN(type)) {
505     in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
506   }
507   else {
508     in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
509     in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
510   }
511
512 end: ;
513   /* the semicolon is because MSVC doesn't like labels at
514      end of block. */
515
516 #ifdef COFF_ADJUST_AUX_IN_POST
517   COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, class, indx, numaux, in1);
518 #endif
519 }
520
521 static unsigned int
522 coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
523      bfd   *abfd;
524      PTR        inp;
525      int   type;
526      int   class;
527      int   indx ATTRIBUTE_UNUSED;
528      int   numaux ATTRIBUTE_UNUSED;
529      PTR        extp;
530 {
531   union internal_auxent *in = (union internal_auxent *)inp;
532   AUXENT *ext = (AUXENT *)extp;
533
534 #ifdef COFF_ADJUST_AUX_OUT_PRE
535   COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, class, indx, numaux, extp);
536 #endif
537   memset((PTR)ext, 0, AUXESZ);
538   switch (class) {
539   case C_FILE:
540     if (in->x_file.x_fname[0] == 0) {
541       PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
542       PUTWORD(abfd,
543               in->x_file.x_n.x_offset,
544               (bfd_byte *) ext->x_file.x_n.x_offset);
545     }
546     else {
547 #if FILNMLEN != E_FILNMLEN
548       -> Error, we need to cope with truncating or extending FILNMLEN!;
549 #else
550       memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
551 #endif
552     }
553     goto end;
554
555 #ifdef RS6000COFF_C
556   /* RS/6000 "csect" auxents */
557   case C_EXT:
558   case C_HIDEXT:
559     if (indx + 1 == numaux)
560       {
561         PUTWORD (abfd, in->x_csect.x_scnlen.l,  ext->x_csect.x_scnlen);
562         PUTWORD (abfd, in->x_csect.x_parmhash,  ext->x_csect.x_parmhash);
563         PUTHALF (abfd, in->x_csect.x_snhash,    ext->x_csect.x_snhash);
564         /* We don't have to hack bitfields in x_smtyp because it's
565            defined by shifts-and-ands, which are equivalent on all
566            byte orders.  */
567         PUTBYTE (abfd, in->x_csect.x_smtyp,     ext->x_csect.x_smtyp);
568         PUTBYTE (abfd, in->x_csect.x_smclas,    ext->x_csect.x_smclas);
569         PUTWORD (abfd, in->x_csect.x_stab,      ext->x_csect.x_stab);
570         PUTHALF (abfd, in->x_csect.x_snstab,    ext->x_csect.x_snstab);
571         goto end;
572       }
573     break;
574 #endif
575
576   case C_STAT:
577 #ifdef C_LEAFSTAT
578   case C_LEAFSTAT:
579 #endif
580   case C_HIDDEN:
581     if (type == T_NULL) {
582       PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
583       PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
584       PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
585       goto end;
586     }
587     break;
588   }
589
590   PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
591 #ifndef NO_TVNDX
592   bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
593 #endif
594
595   if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
596     {
597       PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
598       PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
599     }
600   else
601     {
602 #if DIMNUM != E_DIMNUM
603  #error we need to cope with truncating or extending DIMNUM
604 #endif
605       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
606                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
607       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
608                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
609       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
610                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
611       bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
612                     (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
613     }
614
615   if (ISFCN (type))
616     PUTWORD (abfd, in->x_sym.x_misc.x_fsize,
617              (bfd_byte *)  ext->x_sym.x_misc.x_fsize);
618   else
619     {
620       PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
621       PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
622     }
623
624 end:
625 #ifdef COFF_ADJUST_AUX_OUT_POST
626   COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, class, indx, numaux, extp);
627 #endif
628   return AUXESZ;
629 }
630
631 #endif /* NO_COFF_SYMBOLS */
632
633 #ifndef NO_COFF_LINENOS
634
635 static void
636 coff_swap_lineno_in (abfd, ext1, in1)
637      bfd            *abfd;
638      PTR ext1;
639      PTR in1;
640 {
641   LINENO *ext = (LINENO *)ext1;
642   struct internal_lineno      *in = (struct internal_lineno *)in1;
643
644   in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
645   in->l_lnno = GET_LINENO_LNNO(abfd, ext);
646 }
647
648 static unsigned int
649 coff_swap_lineno_out (abfd, inp, outp)
650      bfd       *abfd;
651      PTR        inp;
652      PTR        outp;
653 {
654   struct internal_lineno *in = (struct internal_lineno *)inp;
655   struct external_lineno *ext = (struct external_lineno *)outp;
656   PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *)
657           ext->l_addr.l_symndx);
658
659   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
660   return LINESZ;
661 }
662
663 #endif /* NO_COFF_LINENOS */
664
665 static void
666 coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
667      bfd            *abfd;
668      PTR aouthdr_ext1;
669      PTR aouthdr_int1;
670 {
671   AOUTHDR        *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
672   struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
673
674   aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
675   aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
676   aouthdr_int->tsize =
677     GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
678   aouthdr_int->dsize =
679     GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
680   aouthdr_int->bsize =
681     GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
682   aouthdr_int->entry =
683     GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
684   aouthdr_int->text_start =
685     GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
686   aouthdr_int->data_start =
687     GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
688
689 #ifdef I960
690   aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
691 #endif
692
693 #ifdef APOLLO_M68
694   bfd_h_put_32(abfd, aouthdr_int->o_inlib, (bfd_byte *) aouthdr_ext->o_inlib);
695   bfd_h_put_32(abfd, aouthdr_int->o_sri, (bfd_byte *) aouthdr_ext->o_sri);
696   bfd_h_put_32(abfd, aouthdr_int->vid[0], (bfd_byte *) aouthdr_ext->vid);
697   bfd_h_put_32(abfd, aouthdr_int->vid[1], (bfd_byte *) aouthdr_ext->vid + 4);
698 #endif
699
700
701 #ifdef RS6000COFF_C
702   aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
703   aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
704   aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
705   aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
706   aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
707   aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
708   aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
709   aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
710   aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
711   aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
712   aouthdr_int->o_cputype = bfd_h_get_16(abfd, aouthdr_ext->o_cputype);
713   aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
714   aouthdr_int->o_maxdata = bfd_h_get_32(abfd, aouthdr_ext->o_maxdata);
715 #endif
716
717 #ifdef MIPSECOFF
718   aouthdr_int->bss_start = bfd_h_get_32(abfd, aouthdr_ext->bss_start);
719   aouthdr_int->gp_value = bfd_h_get_32(abfd, aouthdr_ext->gp_value);
720   aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
721   aouthdr_int->cprmask[0] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[0]);
722   aouthdr_int->cprmask[1] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[1]);
723   aouthdr_int->cprmask[2] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[2]);
724   aouthdr_int->cprmask[3] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[3]);
725 #endif
726
727 #ifdef ALPHAECOFF
728   aouthdr_int->bss_start = bfd_h_get_64(abfd, aouthdr_ext->bss_start);
729   aouthdr_int->gp_value = bfd_h_get_64(abfd, aouthdr_ext->gp_value);
730   aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
731   aouthdr_int->fprmask = bfd_h_get_32(abfd, aouthdr_ext->fprmask);
732 #endif
733 }
734
735 static unsigned int
736 coff_swap_aouthdr_out (abfd, in, out)
737      bfd       *abfd;
738      PTR        in;
739      PTR        out;
740 {
741   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
742   AOUTHDR *aouthdr_out = (AOUTHDR *)out;
743
744   bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
745   bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
746   PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
747   PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
748   PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
749   PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
750   PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
751                           (bfd_byte *) aouthdr_out->text_start);
752   PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
753                           (bfd_byte *) aouthdr_out->data_start);
754
755 #ifdef I960
756   bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
757 #endif
758
759 #ifdef RS6000COFF_C
760   bfd_h_put_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
761   bfd_h_put_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
762   bfd_h_put_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
763   bfd_h_put_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
764   bfd_h_put_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
765   bfd_h_put_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
766   bfd_h_put_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
767   bfd_h_put_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
768   bfd_h_put_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
769   bfd_h_put_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
770   bfd_h_put_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
771   bfd_h_put_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
772   bfd_h_put_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
773   memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2);
774 #endif
775
776 #ifdef MIPSECOFF
777   bfd_h_put_32(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
778   bfd_h_put_32(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
779   bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
780   bfd_h_put_32(abfd, aouthdr_in->cprmask[0], (bfd_byte *) aouthdr_out->cprmask[0]);
781   bfd_h_put_32(abfd, aouthdr_in->cprmask[1], (bfd_byte *) aouthdr_out->cprmask[1]);
782   bfd_h_put_32(abfd, aouthdr_in->cprmask[2], (bfd_byte *) aouthdr_out->cprmask[2]);
783   bfd_h_put_32(abfd, aouthdr_in->cprmask[3], (bfd_byte *) aouthdr_out->cprmask[3]);
784 #endif
785
786 #ifdef ALPHAECOFF
787   /* FIXME: What does bldrev mean?  */
788   bfd_h_put_16(abfd, (bfd_vma) 2, (bfd_byte *) aouthdr_out->bldrev);
789   bfd_h_put_16(abfd, (bfd_vma) 0, (bfd_byte *) aouthdr_out->padding);
790   bfd_h_put_64(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
791   bfd_h_put_64(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
792   bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
793   bfd_h_put_32(abfd, aouthdr_in->fprmask, (bfd_byte *) aouthdr_out->fprmask);
794 #endif
795
796   return AOUTSZ;
797 }
798
799 static void
800 coff_swap_scnhdr_in (abfd, ext, in)
801      bfd            *abfd;
802      PTR             ext;
803      PTR             in;
804 {
805   SCNHDR *scnhdr_ext = (SCNHDR *) ext;
806   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
807
808 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
809   COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
810 #endif
811   memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
812   scnhdr_int->s_vaddr =
813     GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
814   scnhdr_int->s_paddr =
815     GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
816   scnhdr_int->s_size =
817     GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
818
819   scnhdr_int->s_scnptr =
820     GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
821   scnhdr_int->s_relptr =
822     GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr);
823   scnhdr_int->s_lnnoptr =
824     GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
825   scnhdr_int->s_flags =
826     GET_SCNHDR_FLAGS (abfd, (bfd_byte *) scnhdr_ext->s_flags);
827   scnhdr_int->s_nreloc =
828     GET_SCNHDR_NRELOC (abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
829   scnhdr_int->s_nlnno =
830     GET_SCNHDR_NLNNO (abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
831 #ifdef I960
832   scnhdr_int->s_align =
833     GET_SCNHDR_ALIGN (abfd, (bfd_byte *) scnhdr_ext->s_align);
834 #endif
835 #ifdef COFF_ADJUST_SCNHDR_IN_POST
836   COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
837 #endif
838 }
839
840 static unsigned int
841 coff_swap_scnhdr_out (abfd, in, out)
842      bfd       *abfd;
843      PTR        in;
844      PTR        out;
845 {
846   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
847   SCNHDR *scnhdr_ext = (SCNHDR *)out;
848   unsigned int ret = bfd_coff_scnhsz (abfd);
849
850 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
851   COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
852 #endif
853   memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
854
855   PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr,
856                     (bfd_byte *) scnhdr_ext->s_vaddr);
857
858
859   PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr,
860                     (bfd_byte *) scnhdr_ext->s_paddr);
861   PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size,
862                    (bfd_byte *) scnhdr_ext->s_size);
863
864   PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
865                      (bfd_byte *) scnhdr_ext->s_scnptr);
866   PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
867                      (bfd_byte *) scnhdr_ext->s_relptr);
868   PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
869                       (bfd_byte *) scnhdr_ext->s_lnnoptr);
870   PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags,
871                     (bfd_byte *) scnhdr_ext->s_flags);
872 #if defined(M88)
873   PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
874   PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
875 #else
876   if (scnhdr_int->s_nlnno <= 0xffff)
877     PUTHALF(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
878   else
879     {
880       char buf[sizeof (scnhdr_int->s_name) + 1];
881
882       memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
883       buf[sizeof (scnhdr_int->s_name)] = '\0';
884       (*_bfd_error_handler)
885         (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
886          bfd_get_filename (abfd),
887          buf, scnhdr_int->s_nlnno);
888       PUTHALF (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
889     }
890   if (scnhdr_int->s_nreloc <= 0xffff)
891     PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
892   else
893     {
894       char buf[sizeof (scnhdr_int->s_name) + 1];
895
896       memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
897       buf[sizeof (scnhdr_int->s_name)] = '\0';
898       (*_bfd_error_handler) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
899                              bfd_get_filename (abfd),
900                              buf, scnhdr_int->s_nreloc);
901       bfd_set_error (bfd_error_file_truncated);
902       PUTHALF (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
903       ret = 0;
904     }
905 #endif
906
907 #ifdef I960
908   PUT_SCNHDR_ALIGN (abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
909 #endif
910 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
911   COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);
912 #endif
913   return ret;
914 }