xref: /openbsd/gnu/usr.bin/binutils/bfd/coffswap.h (revision db3296cf)
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 
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 
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 
310 static  unsigned int
311 coff_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 
342 static void
343 coff_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 
377 static unsigned int
378 coff_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 
414 static void
415 coff_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 
508 end: ;
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 
517 static unsigned int
518 coff_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 
599 end:
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 
610 static void
611 coff_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 
623 static unsigned int
624 coff_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 
640 static void
641 coff_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 
718 static unsigned int
719 coff_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 
795 static void
796 coff_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 
836 static unsigned int
837 coff_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