1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 /* This file contains routines used to swap COFF data. It is a header
22 file because the details of swapping depend on the details of the
23 structures used by each COFF implementation. This is included by
24 coffcode.h, as well as by the ECOFF backend.
26 Any file which uses this must first include "coff/internal.h" and
27 "coff/CPU.h". The functions will then be correct for that CPU. */
33 #define PUTWORD bfd_h_put_32
34 #define PUTHALF bfd_h_put_16
35 #define PUTBYTE bfd_h_put_8
37 #ifndef GET_FCN_LNNOPTR
38 #define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
41 #ifndef GET_FCN_ENDNDX
42 #define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
45 #ifndef PUT_FCN_LNNOPTR
46 #define PUT_FCN_LNNOPTR(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
48 #ifndef PUT_FCN_ENDNDX
49 #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
52 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
55 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
58 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
61 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
63 #ifndef GET_SCN_SCNLEN
64 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
66 #ifndef GET_SCN_NRELOC
67 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
69 #ifndef GET_SCN_NLINNO
70 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
72 #ifndef PUT_SCN_SCNLEN
73 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
75 #ifndef PUT_SCN_NRELOC
76 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
78 #ifndef PUT_SCN_NLINNO
79 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
81 #ifndef GET_LINENO_LNNO
82 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
84 #ifndef PUT_LINENO_LNNO
85 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno));
88 /* The f_symptr field in the filehdr is sometimes 64 bits. */
89 #ifndef GET_FILEHDR_SYMPTR
90 #define GET_FILEHDR_SYMPTR bfd_h_get_32
92 #ifndef PUT_FILEHDR_SYMPTR
93 #define PUT_FILEHDR_SYMPTR bfd_h_put_32
96 /* Some fields in the aouthdr are sometimes 64 bits. */
97 #ifndef GET_AOUTHDR_TSIZE
98 #define GET_AOUTHDR_TSIZE bfd_h_get_32
100 #ifndef PUT_AOUTHDR_TSIZE
101 #define PUT_AOUTHDR_TSIZE bfd_h_put_32
103 #ifndef GET_AOUTHDR_DSIZE
104 #define GET_AOUTHDR_DSIZE bfd_h_get_32
106 #ifndef PUT_AOUTHDR_DSIZE
107 #define PUT_AOUTHDR_DSIZE bfd_h_put_32
109 #ifndef GET_AOUTHDR_BSIZE
110 #define GET_AOUTHDR_BSIZE bfd_h_get_32
112 #ifndef PUT_AOUTHDR_BSIZE
113 #define PUT_AOUTHDR_BSIZE bfd_h_put_32
115 #ifndef GET_AOUTHDR_ENTRY
116 #define GET_AOUTHDR_ENTRY bfd_h_get_32
118 #ifndef PUT_AOUTHDR_ENTRY
119 #define PUT_AOUTHDR_ENTRY bfd_h_put_32
121 #ifndef GET_AOUTHDR_TEXT_START
122 #define GET_AOUTHDR_TEXT_START bfd_h_get_32
124 #ifndef PUT_AOUTHDR_TEXT_START
125 #define PUT_AOUTHDR_TEXT_START bfd_h_put_32
127 #ifndef GET_AOUTHDR_DATA_START
128 #define GET_AOUTHDR_DATA_START bfd_h_get_32
130 #ifndef PUT_AOUTHDR_DATA_START
131 #define PUT_AOUTHDR_DATA_START bfd_h_put_32
134 /* Some fields in the scnhdr are sometimes 64 bits. */
135 #ifndef GET_SCNHDR_PADDR
136 #define GET_SCNHDR_PADDR bfd_h_get_32
138 #ifndef PUT_SCNHDR_PADDR
139 #define PUT_SCNHDR_PADDR bfd_h_put_32
141 #ifndef GET_SCNHDR_VADDR
142 #define GET_SCNHDR_VADDR bfd_h_get_32
144 #ifndef PUT_SCNHDR_VADDR
145 #define PUT_SCNHDR_VADDR bfd_h_put_32
147 #ifndef GET_SCNHDR_SIZE
148 #define GET_SCNHDR_SIZE bfd_h_get_32
150 #ifndef PUT_SCNHDR_SIZE
151 #define PUT_SCNHDR_SIZE bfd_h_put_32
153 #ifndef GET_SCNHDR_SCNPTR
154 #define GET_SCNHDR_SCNPTR bfd_h_get_32
156 #ifndef PUT_SCNHDR_SCNPTR
157 #define PUT_SCNHDR_SCNPTR bfd_h_put_32
159 #ifndef GET_SCNHDR_RELPTR
160 #define GET_SCNHDR_RELPTR bfd_h_get_32
162 #ifndef PUT_SCNHDR_RELPTR
163 #define PUT_SCNHDR_RELPTR bfd_h_put_32
165 #ifndef GET_SCNHDR_LNNOPTR
166 #define GET_SCNHDR_LNNOPTR bfd_h_get_32
168 #ifndef PUT_SCNHDR_LNNOPTR
169 #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
171 #ifndef GET_SCNHDR_NRELOC
172 #define GET_SCNHDR_NRELOC bfd_h_get_16
174 #ifndef PUT_SCNHDR_NRELOC
175 #define PUT_SCNHDR_NRELOC bfd_h_put_16
177 #ifndef GET_SCNHDR_NLNNO
178 #define GET_SCNHDR_NLNNO bfd_h_get_16
180 #ifndef PUT_SCNHDR_NLNNO
181 #define PUT_SCNHDR_NLNNO bfd_h_put_16
183 #ifndef GET_SCNHDR_FLAGS
184 #define GET_SCNHDR_FLAGS bfd_h_get_32
186 #ifndef PUT_SCNHDR_FLAGS
187 #define PUT_SCNHDR_FLAGS bfd_h_put_32
191 static void coff_swap_aouthdr_in PARAMS ((bfd *, PTR, PTR));
192 static unsigned int coff_swap_aouthdr_out PARAMS ((bfd *, PTR, PTR));
193 static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
194 static unsigned int coff_swap_scnhdr_out PARAMS ((bfd *, PTR, PTR));
195 static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
196 static unsigned int coff_swap_filehdr_out PARAMS ((bfd *, PTR, PTR));
197 #ifndef NO_COFF_RELOCS
198 static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
199 static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
200 #endif /* NO_COFF_RELOCS */
201 #ifndef NO_COFF_SYMBOLS
202 static void coff_swap_sym_in PARAMS ((bfd *, PTR, PTR));
203 static unsigned int coff_swap_sym_out PARAMS ((bfd *, PTR, PTR));
204 static void coff_swap_aux_in PARAMS ((bfd *, PTR, int, int, int, int, PTR));
205 static unsigned int coff_swap_aux_out PARAMS ((bfd *, PTR, int, int, int, int, PTR));
206 #endif /* NO_COFF_SYMBOLS */
207 #ifndef NO_COFF_LINENOS
208 static void coff_swap_lineno_in PARAMS ((bfd *, PTR, PTR));
209 static unsigned int coff_swap_lineno_out PARAMS ((bfd *, PTR, PTR));
210 #endif /* NO_COFF_LINENOS */
212 #ifndef NO_COFF_RELOCS
215 coff_swap_reloc_in (abfd, src, dst)
220 RELOC *reloc_src = (RELOC *) src;
221 struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
223 reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
224 reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx);
227 reloc_dst->r_type = bfd_h_get_8(abfd, reloc_src->r_type);
228 reloc_dst->r_size = bfd_h_get_8(abfd, reloc_src->r_size);
230 reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
233 #ifdef SWAP_IN_RELOC_OFFSET
234 reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
235 (bfd_byte *) reloc_src->r_offset);
240 coff_swap_reloc_out (abfd, src, dst)
245 struct internal_reloc *reloc_src = (struct internal_reloc *)src;
246 struct external_reloc *reloc_dst = (struct external_reloc *)dst;
247 bfd_h_put_32(abfd, reloc_src->r_vaddr, (bfd_byte *) reloc_dst->r_vaddr);
248 bfd_h_put_32(abfd, reloc_src->r_symndx, (bfd_byte *) reloc_dst->r_symndx);
251 bfd_h_put_8 (abfd, reloc_src->r_type, (bfd_byte *) reloc_dst->r_type);
252 bfd_h_put_8 (abfd, reloc_src->r_size, (bfd_byte *) reloc_dst->r_size);
254 bfd_h_put_16(abfd, reloc_src->r_type, (bfd_byte *)
258 #ifdef SWAP_OUT_RELOC_OFFSET
259 SWAP_OUT_RELOC_OFFSET(abfd,
261 (bfd_byte *) reloc_dst->r_offset);
263 #ifdef SWAP_OUT_RELOC_EXTRA
264 SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
270 #endif /* NO_COFF_RELOCS */
273 coff_swap_filehdr_in (abfd, src, dst)
278 FILHDR *filehdr_src = (FILHDR *) src;
279 struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
280 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
281 COFF_ADJUST_FILEHDR_IN_PRE (abfd, src, dst);
283 filehdr_dst->f_magic = bfd_h_get_16(abfd, (bfd_byte *) filehdr_src->f_magic);
284 filehdr_dst->f_nscns = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_nscns);
285 filehdr_dst->f_timdat = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_timdat);
286 filehdr_dst->f_symptr =
287 GET_FILEHDR_SYMPTR (abfd, (bfd_byte *) filehdr_src->f_symptr);
288 filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
289 filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
290 filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
292 #ifdef COFF_ADJUST_FILEHDR_IN_POST
293 COFF_ADJUST_FILEHDR_IN_POST (abfd, src, dst);
298 coff_swap_filehdr_out (abfd, in, out)
303 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
304 FILHDR *filehdr_out = (FILHDR *)out;
306 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
307 COFF_ADJUST_FILEHDR_OUT_PRE (abfd, in, out);
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);
318 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
319 COFF_ADJUST_FILEHDR_OUT_POST (abfd, in, out);
325 #ifndef NO_COFF_SYMBOLS
328 coff_swap_sym_in (abfd, ext1, in1)
333 SYMENT *ext = (SYMENT *)ext1;
334 struct internal_syment *in = (struct internal_syment *)in1;
336 if( ext->e.e_name[0] == 0) {
337 in->_n._n_n._n_zeroes = 0;
338 in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
341 #if SYMNMLEN != E_SYMNMLEN
342 -> Error, we need to cope with truncating or extending SYMNMLEN!;
344 memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
347 in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
348 in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
349 if (sizeof(ext->e_type) == 2){
350 in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
353 in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
355 in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
356 in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
360 coff_swap_sym_out (abfd, inp, extp)
365 struct internal_syment *in = (struct internal_syment *)inp;
366 SYMENT *ext =(SYMENT *)extp;
367 if(in->_n._n_name[0] == 0) {
368 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
369 bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset);
372 #if SYMNMLEN != E_SYMNMLEN
373 -> Error, we need to cope with truncating or extending SYMNMLEN!;
375 memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
378 bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
379 bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
380 if (sizeof(ext->e_type) == 2)
382 bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
386 bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type);
388 bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
389 bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
394 coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
403 AUXENT *ext = (AUXENT *)ext1;
404 union internal_auxent *in = (union internal_auxent *)in1;
406 #ifdef COFF_ADJUST_AUX_IN_PRE
407 COFF_ADJUST_AUX_IN_PRE (abfd, ext1, type, class, indx, numaux, in1);
411 if (ext->x_file.x_fname[0] == 0) {
412 in->x_file.x_n.x_zeroes = 0;
413 in->x_file.x_n.x_offset =
414 bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
416 #if FILNMLEN != E_FILNMLEN
417 -> Error, we need to cope with truncating or extending FILNMLEN!;
419 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
424 /* RS/6000 "csect" auxents */
428 if (indx + 1 == numaux)
430 in->x_csect.x_scnlen.l = bfd_h_get_32 (abfd, ext->x_csect.x_scnlen);
431 in->x_csect.x_parmhash = bfd_h_get_32 (abfd,
432 ext->x_csect.x_parmhash);
433 in->x_csect.x_snhash = bfd_h_get_16 (abfd, ext->x_csect.x_snhash);
434 /* We don't have to hack bitfields in x_smtyp because it's
435 defined by shifts-and-ands, which are equivalent on all
437 in->x_csect.x_smtyp = bfd_h_get_8 (abfd, ext->x_csect.x_smtyp);
438 in->x_csect.x_smclas = bfd_h_get_8 (abfd, ext->x_csect.x_smclas);
439 in->x_csect.x_stab = bfd_h_get_32 (abfd, ext->x_csect.x_stab);
440 in->x_csect.x_snstab = bfd_h_get_16 (abfd, ext->x_csect.x_snstab);
451 if (type == T_NULL) {
452 in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
453 in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
454 in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
456 /* PE defines some extra fields; we zero them out for
458 in->x_scn.x_checksum = 0;
459 in->x_scn.x_associated = 0;
460 in->x_scn.x_comdat = 0;
467 in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
469 in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
472 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
474 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
475 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
479 #if DIMNUM != E_DIMNUM
480 #error we need to cope with truncating or extending DIMNUM
482 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
483 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
484 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
485 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
486 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
487 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
488 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
489 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
493 in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
496 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
497 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
501 /* the semicolon is because MSVC doesn't like labels at
504 #ifdef COFF_ADJUST_AUX_IN_POST
505 COFF_ADJUST_AUX_IN_POST (abfd, ext1, type, class, indx, numaux, in1);
510 coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
519 union internal_auxent *in = (union internal_auxent *)inp;
520 AUXENT *ext = (AUXENT *)extp;
522 #ifdef COFF_ADJUST_AUX_OUT_PRE
523 COFF_ADJUST_AUX_OUT_PRE (abfd, inp, type, class, indx, numaux, extp);
525 memset((PTR)ext, 0, AUXESZ);
528 if (in->x_file.x_fname[0] == 0) {
529 PUTWORD(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
531 in->x_file.x_n.x_offset,
532 (bfd_byte *) ext->x_file.x_n.x_offset);
535 #if FILNMLEN != E_FILNMLEN
536 -> Error, we need to cope with truncating or extending FILNMLEN!;
538 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
544 /* RS/6000 "csect" auxents */
547 if (indx + 1 == numaux)
549 PUTWORD (abfd, in->x_csect.x_scnlen.l, ext->x_csect.x_scnlen);
550 PUTWORD (abfd, in->x_csect.x_parmhash, ext->x_csect.x_parmhash);
551 PUTHALF (abfd, in->x_csect.x_snhash, ext->x_csect.x_snhash);
552 /* We don't have to hack bitfields in x_smtyp because it's
553 defined by shifts-and-ands, which are equivalent on all
555 PUTBYTE (abfd, in->x_csect.x_smtyp, ext->x_csect.x_smtyp);
556 PUTBYTE (abfd, in->x_csect.x_smclas, ext->x_csect.x_smclas);
557 PUTWORD (abfd, in->x_csect.x_stab, ext->x_csect.x_stab);
558 PUTHALF (abfd, in->x_csect.x_snstab, ext->x_csect.x_snstab);
569 if (type == T_NULL) {
570 PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
571 PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
572 PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
578 PUTWORD(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
580 bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
583 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
585 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
586 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
590 #if DIMNUM != E_DIMNUM
591 #error we need to cope with truncating or extending DIMNUM
593 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
594 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
595 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
596 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
597 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
598 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
599 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
600 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
604 PUTWORD (abfd, in->x_sym.x_misc.x_fsize,
605 (bfd_byte *) ext->x_sym.x_misc.x_fsize);
608 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
609 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
613 #ifdef COFF_ADJUST_AUX_OUT_POST
614 COFF_ADJUST_AUX_OUT_POST (abfd, inp, type, class, indx, numaux, extp);
619 #endif /* NO_COFF_SYMBOLS */
621 #ifndef NO_COFF_LINENOS
624 coff_swap_lineno_in (abfd, ext1, in1)
629 LINENO *ext = (LINENO *)ext1;
630 struct internal_lineno *in = (struct internal_lineno *)in1;
632 in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
633 in->l_lnno = GET_LINENO_LNNO(abfd, ext);
637 coff_swap_lineno_out (abfd, inp, outp)
642 struct internal_lineno *in = (struct internal_lineno *)inp;
643 struct external_lineno *ext = (struct external_lineno *)outp;
644 PUTWORD(abfd, in->l_addr.l_symndx, (bfd_byte *)
645 ext->l_addr.l_symndx);
647 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
651 #endif /* NO_COFF_LINENOS */
654 coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
659 AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
660 struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
662 aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
663 aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
665 GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
667 GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
669 GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
671 GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
672 aouthdr_int->text_start =
673 GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
674 aouthdr_int->data_start =
675 GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
678 aouthdr_int->tagentries = bfd_h_get_32(abfd, (bfd_byte *) aouthdr_ext->tagentries);
682 bfd_h_put_32(abfd, aouthdr_int->o_inlib, (bfd_byte *) aouthdr_ext->o_inlib);
683 bfd_h_put_32(abfd, aouthdr_int->o_sri, (bfd_byte *) aouthdr_ext->o_sri);
684 bfd_h_put_32(abfd, aouthdr_int->vid[0], (bfd_byte *) aouthdr_ext->vid);
685 bfd_h_put_32(abfd, aouthdr_int->vid[1], (bfd_byte *) aouthdr_ext->vid + 4);
690 aouthdr_int->o_toc = bfd_h_get_32(abfd, aouthdr_ext->o_toc);
691 aouthdr_int->o_snentry = bfd_h_get_16(abfd, aouthdr_ext->o_snentry);
692 aouthdr_int->o_sntext = bfd_h_get_16(abfd, aouthdr_ext->o_sntext);
693 aouthdr_int->o_sndata = bfd_h_get_16(abfd, aouthdr_ext->o_sndata);
694 aouthdr_int->o_sntoc = bfd_h_get_16(abfd, aouthdr_ext->o_sntoc);
695 aouthdr_int->o_snloader = bfd_h_get_16(abfd, aouthdr_ext->o_snloader);
696 aouthdr_int->o_snbss = bfd_h_get_16(abfd, aouthdr_ext->o_snbss);
697 aouthdr_int->o_algntext = bfd_h_get_16(abfd, aouthdr_ext->o_algntext);
698 aouthdr_int->o_algndata = bfd_h_get_16(abfd, aouthdr_ext->o_algndata);
699 aouthdr_int->o_modtype = bfd_h_get_16(abfd, aouthdr_ext->o_modtype);
700 aouthdr_int->o_cputype = bfd_h_get_16(abfd, aouthdr_ext->o_cputype);
701 aouthdr_int->o_maxstack = bfd_h_get_32(abfd, aouthdr_ext->o_maxstack);
702 aouthdr_int->o_maxdata = bfd_h_get_32(abfd, aouthdr_ext->o_maxdata);
706 aouthdr_int->bss_start = bfd_h_get_32(abfd, aouthdr_ext->bss_start);
707 aouthdr_int->gp_value = bfd_h_get_32(abfd, aouthdr_ext->gp_value);
708 aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
709 aouthdr_int->cprmask[0] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[0]);
710 aouthdr_int->cprmask[1] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[1]);
711 aouthdr_int->cprmask[2] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[2]);
712 aouthdr_int->cprmask[3] = bfd_h_get_32(abfd, aouthdr_ext->cprmask[3]);
716 aouthdr_int->bss_start = bfd_h_get_64(abfd, aouthdr_ext->bss_start);
717 aouthdr_int->gp_value = bfd_h_get_64(abfd, aouthdr_ext->gp_value);
718 aouthdr_int->gprmask = bfd_h_get_32(abfd, aouthdr_ext->gprmask);
719 aouthdr_int->fprmask = bfd_h_get_32(abfd, aouthdr_ext->fprmask);
724 coff_swap_aouthdr_out (abfd, in, out)
729 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
730 AOUTHDR *aouthdr_out = (AOUTHDR *)out;
732 bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->magic);
733 bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->vstamp);
734 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->tsize);
735 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->dsize);
736 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->bsize);
737 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->entry);
738 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
739 (bfd_byte *) aouthdr_out->text_start);
740 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
741 (bfd_byte *) aouthdr_out->data_start);
744 bfd_h_put_32(abfd, aouthdr_in->tagentries, (bfd_byte *) aouthdr_out->tagentries);
748 bfd_h_put_32 (abfd, aouthdr_in->o_toc, aouthdr_out->o_toc);
749 bfd_h_put_16 (abfd, aouthdr_in->o_snentry, aouthdr_out->o_snentry);
750 bfd_h_put_16 (abfd, aouthdr_in->o_sntext, aouthdr_out->o_sntext);
751 bfd_h_put_16 (abfd, aouthdr_in->o_sndata, aouthdr_out->o_sndata);
752 bfd_h_put_16 (abfd, aouthdr_in->o_sntoc, aouthdr_out->o_sntoc);
753 bfd_h_put_16 (abfd, aouthdr_in->o_snloader, aouthdr_out->o_snloader);
754 bfd_h_put_16 (abfd, aouthdr_in->o_snbss, aouthdr_out->o_snbss);
755 bfd_h_put_16 (abfd, aouthdr_in->o_algntext, aouthdr_out->o_algntext);
756 bfd_h_put_16 (abfd, aouthdr_in->o_algndata, aouthdr_out->o_algndata);
757 bfd_h_put_16 (abfd, aouthdr_in->o_modtype, aouthdr_out->o_modtype);
758 bfd_h_put_16 (abfd, aouthdr_in->o_cputype, aouthdr_out->o_cputype);
759 bfd_h_put_32 (abfd, aouthdr_in->o_maxstack, aouthdr_out->o_maxstack);
760 bfd_h_put_32 (abfd, aouthdr_in->o_maxdata, aouthdr_out->o_maxdata);
761 memset (aouthdr_out->o_resv2, 0, sizeof aouthdr_out->o_resv2);
765 bfd_h_put_32(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
766 bfd_h_put_32(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
767 bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
768 bfd_h_put_32(abfd, aouthdr_in->cprmask[0], (bfd_byte *) aouthdr_out->cprmask[0]);
769 bfd_h_put_32(abfd, aouthdr_in->cprmask[1], (bfd_byte *) aouthdr_out->cprmask[1]);
770 bfd_h_put_32(abfd, aouthdr_in->cprmask[2], (bfd_byte *) aouthdr_out->cprmask[2]);
771 bfd_h_put_32(abfd, aouthdr_in->cprmask[3], (bfd_byte *) aouthdr_out->cprmask[3]);
775 /* FIXME: What does bldrev mean? */
776 bfd_h_put_16(abfd, (bfd_vma) 2, (bfd_byte *) aouthdr_out->bldrev);
777 bfd_h_put_16(abfd, (bfd_vma) 0, (bfd_byte *) aouthdr_out->padding);
778 bfd_h_put_64(abfd, aouthdr_in->bss_start, (bfd_byte *) aouthdr_out->bss_start);
779 bfd_h_put_64(abfd, aouthdr_in->gp_value, (bfd_byte *) aouthdr_out->gp_value);
780 bfd_h_put_32(abfd, aouthdr_in->gprmask, (bfd_byte *) aouthdr_out->gprmask);
781 bfd_h_put_32(abfd, aouthdr_in->fprmask, (bfd_byte *) aouthdr_out->fprmask);
788 coff_swap_scnhdr_in (abfd, ext, in)
793 SCNHDR *scnhdr_ext = (SCNHDR *) ext;
794 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
796 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
797 COFF_ADJUST_SCNHDR_IN_PRE (abfd, ext, in);
799 memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
800 scnhdr_int->s_vaddr =
801 GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
802 scnhdr_int->s_paddr =
803 GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
805 GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
807 scnhdr_int->s_scnptr =
808 GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
809 scnhdr_int->s_relptr =
810 GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr);
811 scnhdr_int->s_lnnoptr =
812 GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
813 scnhdr_int->s_flags =
814 GET_SCNHDR_FLAGS (abfd, (bfd_byte *) scnhdr_ext->s_flags);
815 scnhdr_int->s_nreloc =
816 GET_SCNHDR_NRELOC (abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
817 scnhdr_int->s_nlnno =
818 GET_SCNHDR_NLNNO (abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
820 scnhdr_int->s_align =
821 GET_SCNHDR_ALIGN (abfd, (bfd_byte *) scnhdr_ext->s_align);
823 #ifdef COFF_ADJUST_SCNHDR_IN_POST
824 COFF_ADJUST_SCNHDR_IN_POST (abfd, ext, in);
829 coff_swap_scnhdr_out (abfd, in, out)
834 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
835 SCNHDR *scnhdr_ext = (SCNHDR *)out;
836 unsigned int ret = SCNHSZ;
838 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
839 COFF_ADJUST_SCNHDR_OUT_PRE (abfd, in, out);
841 memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
843 PUT_SCNHDR_VADDR (abfd, scnhdr_int->s_vaddr,
844 (bfd_byte *) scnhdr_ext->s_vaddr);
847 PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_paddr,
848 (bfd_byte *) scnhdr_ext->s_paddr);
849 PUT_SCNHDR_SIZE (abfd, scnhdr_int->s_size,
850 (bfd_byte *) scnhdr_ext->s_size);
852 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
853 (bfd_byte *) scnhdr_ext->s_scnptr);
854 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
855 (bfd_byte *) scnhdr_ext->s_relptr);
856 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
857 (bfd_byte *) scnhdr_ext->s_lnnoptr);
858 PUT_SCNHDR_FLAGS (abfd, scnhdr_int->s_flags,
859 (bfd_byte *) scnhdr_ext->s_flags);
861 PUTWORD(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
862 PUTWORD(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
864 if (scnhdr_int->s_nlnno <= 0xffff)
865 PUTHALF(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
868 char buf[sizeof (scnhdr_int->s_name) + 1];
870 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
871 buf[sizeof (scnhdr_int->s_name)] = '\0';
872 (*_bfd_error_handler)
873 ("%s: warning: %s: line number overflow: 0x%lx > 0xffff",
874 bfd_get_filename (abfd),
875 buf, scnhdr_int->s_nlnno);
876 PUTHALF (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
878 if (scnhdr_int->s_nreloc <= 0xffff)
879 PUTHALF(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
882 char buf[sizeof (scnhdr_int->s_name) + 1];
884 memcpy (buf, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
885 buf[sizeof (scnhdr_int->s_name)] = '\0';
886 (*_bfd_error_handler) ("%s: %s: reloc overflow: 0x%lx > 0xffff",
887 bfd_get_filename (abfd),
888 buf, scnhdr_int->s_nreloc);
889 bfd_set_error (bfd_error_file_truncated);
890 PUTHALF (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
896 PUT_SCNHDR_ALIGN (abfd, scnhdr_int->s_align, (bfd_byte *) scnhdr_ext->s_align);
898 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
899 COFF_ADJUST_SCNHDR_OUT_POST (abfd, in, out);