1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 /* This file contains routines used to swap COFF data. It is a header
24 file because the details of swapping depend on the details of the
25 structures used by each COFF implementation. This is included by
26 coffcode.h, as well as by the ECOFF backend.
28 Any file which uses this must first include "coff/internal.h" and
29 "coff/CPU.h". The functions will then be correct for that CPU. */
31 #ifndef GET_FCN_LNNOPTR
32 #define GET_FCN_LNNOPTR(abfd, ext) \
33 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
36 #ifndef GET_FCN_ENDNDX
37 #define GET_FCN_ENDNDX(abfd, ext) \
38 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx)
41 #ifndef PUT_FCN_LNNOPTR
42 #define PUT_FCN_LNNOPTR(abfd, in, ext) \
43 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
45 #ifndef PUT_FCN_ENDNDX
46 #define PUT_FCN_ENDNDX(abfd, in, ext) \
47 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx)
50 #define GET_LNSZ_LNNO(abfd, ext) \
51 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno)
54 #define GET_LNSZ_SIZE(abfd, ext) \
55 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size)
58 #define PUT_LNSZ_LNNO(abfd, in, ext) \
59 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno)
62 #define PUT_LNSZ_SIZE(abfd, in, ext) \
63 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size)
65 #ifndef GET_SCN_SCNLEN
66 #define GET_SCN_SCNLEN(abfd, ext) \
67 H_GET_32 (abfd, ext->x_scn.x_scnlen)
69 #ifndef GET_SCN_NRELOC
70 #define GET_SCN_NRELOC(abfd, ext) \
71 H_GET_16 (abfd, ext->x_scn.x_nreloc)
73 #ifndef GET_SCN_NLINNO
74 #define GET_SCN_NLINNO(abfd, ext) \
75 H_GET_16 (abfd, ext->x_scn.x_nlinno)
77 #ifndef PUT_SCN_SCNLEN
78 #define PUT_SCN_SCNLEN(abfd, in, ext) \
79 H_PUT_32 (abfd, in, ext->x_scn.x_scnlen)
81 #ifndef PUT_SCN_NRELOC
82 #define PUT_SCN_NRELOC(abfd, in, ext) \
83 H_PUT_16 (abfd, in, ext->x_scn.x_nreloc)
85 #ifndef PUT_SCN_NLINNO
86 #define PUT_SCN_NLINNO(abfd, in, ext) \
87 H_PUT_16 (abfd, in, ext->x_scn.x_nlinno)
89 #ifndef GET_LINENO_LNNO
90 #define GET_LINENO_LNNO(abfd, ext) \
91 H_GET_16 (abfd, ext->l_lnno);
93 #ifndef PUT_LINENO_LNNO
94 #define PUT_LINENO_LNNO(abfd, val, ext) \
95 H_PUT_16 (abfd, val, ext->l_lnno);
98 /* The f_symptr field in the filehdr is sometimes 64 bits. */
99 #ifndef GET_FILEHDR_SYMPTR
100 #define GET_FILEHDR_SYMPTR H_GET_32
102 #ifndef PUT_FILEHDR_SYMPTR
103 #define PUT_FILEHDR_SYMPTR H_PUT_32
106 /* Some fields in the aouthdr are sometimes 64 bits. */
107 #ifndef GET_AOUTHDR_TSIZE
108 #define GET_AOUTHDR_TSIZE H_GET_32
110 #ifndef PUT_AOUTHDR_TSIZE
111 #define PUT_AOUTHDR_TSIZE H_PUT_32
113 #ifndef GET_AOUTHDR_DSIZE
114 #define GET_AOUTHDR_DSIZE H_GET_32
116 #ifndef PUT_AOUTHDR_DSIZE
117 #define PUT_AOUTHDR_DSIZE H_PUT_32
119 #ifndef GET_AOUTHDR_BSIZE
120 #define GET_AOUTHDR_BSIZE H_GET_32
122 #ifndef PUT_AOUTHDR_BSIZE
123 #define PUT_AOUTHDR_BSIZE H_PUT_32
125 #ifndef GET_AOUTHDR_ENTRY
126 #define GET_AOUTHDR_ENTRY H_GET_32
128 #ifndef PUT_AOUTHDR_ENTRY
129 #define PUT_AOUTHDR_ENTRY H_PUT_32
131 #ifndef GET_AOUTHDR_TEXT_START
132 #define GET_AOUTHDR_TEXT_START H_GET_32
134 #ifndef PUT_AOUTHDR_TEXT_START
135 #define PUT_AOUTHDR_TEXT_START H_PUT_32
137 #ifndef GET_AOUTHDR_DATA_START
138 #define GET_AOUTHDR_DATA_START H_GET_32
140 #ifndef PUT_AOUTHDR_DATA_START
141 #define PUT_AOUTHDR_DATA_START H_PUT_32
144 /* Some fields in the scnhdr are sometimes 64 bits. */
145 #ifndef GET_SCNHDR_PADDR
146 #define GET_SCNHDR_PADDR H_GET_32
148 #ifndef PUT_SCNHDR_PADDR
149 #define PUT_SCNHDR_PADDR H_PUT_32
151 #ifndef GET_SCNHDR_VADDR
152 #define GET_SCNHDR_VADDR H_GET_32
154 #ifndef PUT_SCNHDR_VADDR
155 #define PUT_SCNHDR_VADDR H_PUT_32
157 #ifndef GET_SCNHDR_SIZE
158 #define GET_SCNHDR_SIZE H_GET_32
160 #ifndef PUT_SCNHDR_SIZE
161 #define PUT_SCNHDR_SIZE H_PUT_32
163 #ifndef GET_SCNHDR_SCNPTR
164 #define GET_SCNHDR_SCNPTR H_GET_32
166 #ifndef PUT_SCNHDR_SCNPTR
167 #define PUT_SCNHDR_SCNPTR H_PUT_32
169 #ifndef GET_SCNHDR_RELPTR
170 #define GET_SCNHDR_RELPTR H_GET_32
172 #ifndef PUT_SCNHDR_RELPTR
173 #define PUT_SCNHDR_RELPTR H_PUT_32
175 #ifndef GET_SCNHDR_LNNOPTR
176 #define GET_SCNHDR_LNNOPTR H_GET_32
178 #ifndef PUT_SCNHDR_LNNOPTR
179 #define PUT_SCNHDR_LNNOPTR H_PUT_32
181 #ifndef GET_SCNHDR_NRELOC
182 #define GET_SCNHDR_NRELOC H_GET_16
184 #ifndef MAX_SCNHDR_NRELOC
185 #define MAX_SCNHDR_NRELOC 0xffff
187 #ifndef PUT_SCNHDR_NRELOC
188 #define PUT_SCNHDR_NRELOC H_PUT_16
190 #ifndef GET_SCNHDR_NLNNO
191 #define GET_SCNHDR_NLNNO H_GET_16
193 #ifndef MAX_SCNHDR_NLNNO
194 #define MAX_SCNHDR_NLNNO 0xffff
196 #ifndef PUT_SCNHDR_NLNNO
197 #define PUT_SCNHDR_NLNNO H_PUT_16
199 #ifndef GET_SCNHDR_FLAGS
200 #define GET_SCNHDR_FLAGS H_GET_32
202 #ifndef PUT_SCNHDR_FLAGS
203 #define PUT_SCNHDR_FLAGS H_PUT_32
206 #ifndef GET_RELOC_VADDR
207 #define GET_RELOC_VADDR H_GET_32
209 #ifndef PUT_RELOC_VADDR
210 #define PUT_RELOC_VADDR H_PUT_32
213 static void coff_swap_aouthdr_in
PARAMS ((bfd
*, PTR
, PTR
));
214 static unsigned int coff_swap_aouthdr_out
PARAMS ((bfd
*, PTR
, PTR
));
215 static void coff_swap_scnhdr_in
PARAMS ((bfd
*, PTR
, PTR
));
216 static unsigned int coff_swap_scnhdr_out
PARAMS ((bfd
*, PTR
, PTR
));
217 static void coff_swap_filehdr_in
PARAMS ((bfd
*, PTR
, PTR
));
218 static unsigned int coff_swap_filehdr_out
PARAMS ((bfd
*, PTR
, PTR
));
219 #ifndef NO_COFF_RELOCS
220 static void coff_swap_reloc_in
PARAMS ((bfd
*, PTR
, PTR
));
221 static unsigned int coff_swap_reloc_out
PARAMS ((bfd
*, PTR
, PTR
));
222 #endif /* NO_COFF_RELOCS */
223 #ifndef NO_COFF_SYMBOLS
224 static void coff_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
225 static unsigned int coff_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
226 static void coff_swap_aux_in
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
227 static unsigned int coff_swap_aux_out
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
228 #endif /* NO_COFF_SYMBOLS */
229 #ifndef NO_COFF_LINENOS
230 static void coff_swap_lineno_in
PARAMS ((bfd
*, PTR
, PTR
));
231 static unsigned int coff_swap_lineno_out
PARAMS ((bfd
*, PTR
, PTR
));
232 #endif /* NO_COFF_LINENOS */
234 #ifndef NO_COFF_RELOCS
237 coff_swap_reloc_in (abfd
, src
, dst
)
242 RELOC
*reloc_src
= (RELOC
*) src
;
243 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
245 reloc_dst
->r_vaddr
= GET_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
);
246 reloc_dst
->r_symndx
= H_GET_S32 (abfd
, reloc_src
->r_symndx
);
247 reloc_dst
->r_type
= H_GET_16 (abfd
, reloc_src
->r_type
);
249 #ifdef SWAP_IN_RELOC_OFFSET
250 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET (abfd
, reloc_src
->r_offset
);
255 coff_swap_reloc_out (abfd
, src
, dst
)
260 struct internal_reloc
*reloc_src
= (struct internal_reloc
*) src
;
261 struct external_reloc
*reloc_dst
= (struct external_reloc
*) dst
;
262 PUT_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
, reloc_dst
->r_vaddr
);
263 H_PUT_32 (abfd
, reloc_src
->r_symndx
, reloc_dst
->r_symndx
);
264 H_PUT_16 (abfd
, reloc_src
->r_type
, reloc_dst
->r_type
);
266 #ifdef SWAP_OUT_RELOC_OFFSET
267 SWAP_OUT_RELOC_OFFSET (abfd
, reloc_src
->r_offset
, reloc_dst
->r_offset
);
269 #ifdef SWAP_OUT_RELOC_EXTRA
270 SWAP_OUT_RELOC_EXTRA (abfd
, reloc_src
, reloc_dst
);
273 return bfd_coff_relsz (abfd
);
276 #endif /* NO_COFF_RELOCS */
279 coff_swap_filehdr_in (abfd
, src
, dst
)
284 FILHDR
*filehdr_src
= (FILHDR
*) src
;
285 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
287 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
288 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
290 filehdr_dst
->f_magic
= H_GET_16 (abfd
, filehdr_src
->f_magic
);
291 filehdr_dst
->f_nscns
= H_GET_16 (abfd
, filehdr_src
->f_nscns
);
292 filehdr_dst
->f_timdat
= H_GET_32 (abfd
, filehdr_src
->f_timdat
);
293 filehdr_dst
->f_symptr
= GET_FILEHDR_SYMPTR (abfd
, filehdr_src
->f_symptr
);
294 filehdr_dst
->f_nsyms
= H_GET_32 (abfd
, filehdr_src
->f_nsyms
);
295 filehdr_dst
->f_opthdr
= H_GET_16 (abfd
, filehdr_src
->f_opthdr
);
296 filehdr_dst
->f_flags
= H_GET_16 (abfd
, filehdr_src
->f_flags
);
297 #ifdef TIC80_TARGET_ID
298 filehdr_dst
->f_target_id
= H_GET_16 (abfd
, filehdr_src
->f_target_id
);
301 #ifdef COFF_ADJUST_FILEHDR_IN_POST
302 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
307 coff_swap_filehdr_out (abfd
, in
, out
)
312 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*) in
;
313 FILHDR
*filehdr_out
= (FILHDR
*) out
;
315 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
316 COFF_ADJUST_FILEHDR_OUT_PRE (abfd
, in
, out
);
318 H_PUT_16 (abfd
, filehdr_in
->f_magic
, filehdr_out
->f_magic
);
319 H_PUT_16 (abfd
, filehdr_in
->f_nscns
, filehdr_out
->f_nscns
);
320 H_PUT_32 (abfd
, filehdr_in
->f_timdat
, filehdr_out
->f_timdat
);
321 PUT_FILEHDR_SYMPTR (abfd
, filehdr_in
->f_symptr
, filehdr_out
->f_symptr
);
322 H_PUT_32 (abfd
, filehdr_in
->f_nsyms
, filehdr_out
->f_nsyms
);
323 H_PUT_16 (abfd
, filehdr_in
->f_opthdr
, filehdr_out
->f_opthdr
);
324 H_PUT_16 (abfd
, filehdr_in
->f_flags
, filehdr_out
->f_flags
);
325 #ifdef TIC80_TARGET_ID
326 H_PUT_16 (abfd
, filehdr_in
->f_target_id
, filehdr_out
->f_target_id
);
329 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
330 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
332 return bfd_coff_filhsz (abfd
);
335 #ifndef NO_COFF_SYMBOLS
338 coff_swap_sym_in (abfd
, ext1
, in1
)
343 SYMENT
*ext
= (SYMENT
*) ext1
;
344 struct internal_syment
*in
= (struct internal_syment
*) in1
;
346 if (ext
->e
.e_name
[0] == 0)
348 in
->_n
._n_n
._n_zeroes
= 0;
349 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e
.e
.e_offset
);
353 #if SYMNMLEN != E_SYMNMLEN
354 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
356 memcpy (in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
359 in
->n_value
= H_GET_32 (abfd
, ext
->e_value
);
360 in
->n_scnum
= H_GET_16 (abfd
, ext
->e_scnum
);
361 if (sizeof (ext
->e_type
) == 2)
363 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
367 in
->n_type
= H_GET_32 (abfd
, ext
->e_type
);
369 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
370 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
371 #ifdef COFF_ADJUST_SYM_IN_POST
372 COFF_ADJUST_SYM_IN_POST (abfd
, ext1
, in1
);
377 coff_swap_sym_out (abfd
, inp
, extp
)
382 struct internal_syment
*in
= (struct internal_syment
*) inp
;
383 SYMENT
*ext
=(SYMENT
*) extp
;
384 if(in
->_n
._n_name
[0] == 0)
386 H_PUT_32 (abfd
, 0, ext
->e
.e
.e_zeroes
);
387 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e
.e
.e_offset
);
391 #if SYMNMLEN != E_SYMNMLEN
392 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
394 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
397 H_PUT_32 (abfd
, in
->n_value
, ext
->e_value
);
398 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
399 if (sizeof (ext
->e_type
) == 2)
401 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
405 H_PUT_32 (abfd
, in
->n_type
, ext
->e_type
);
407 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
408 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
409 #ifdef COFF_ADJUST_SYM_OUT_POST
410 COFF_ADJUST_SYM_OUT_POST (abfd
, inp
, extp
);
416 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
425 AUXENT
*ext
= (AUXENT
*) ext1
;
426 union internal_auxent
*in
= (union internal_auxent
*) in1
;
428 #ifdef COFF_ADJUST_AUX_IN_PRE
429 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
434 if (ext
->x_file
.x_fname
[0] == 0)
436 in
->x_file
.x_n
.x_zeroes
= 0;
437 in
->x_file
.x_n
.x_offset
= H_GET_32 (abfd
, ext
->x_file
.x_n
.x_offset
);
441 #if FILNMLEN != E_FILNMLEN
442 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
447 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
448 numaux
* sizeof (AUXENT
));
452 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
465 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN (abfd
, ext
);
466 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC (abfd
, ext
);
467 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO (abfd
, ext
);
469 /* PE defines some extra fields; we zero them out for
471 in
->x_scn
.x_checksum
= 0;
472 in
->x_scn
.x_associated
= 0;
473 in
->x_scn
.x_comdat
= 0;
480 in
->x_sym
.x_tagndx
.l
= H_GET_32 (abfd
, ext
->x_sym
.x_tagndx
);
482 in
->x_sym
.x_tvndx
= H_GET_16 (abfd
, ext
->x_sym
.x_tvndx
);
485 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
487 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
488 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
492 #if DIMNUM != E_DIMNUM
493 #error we need to cope with truncating or extending DIMNUM
495 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
496 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
497 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
498 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
499 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
500 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
501 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
502 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
507 in
->x_sym
.x_misc
.x_fsize
= H_GET_32 (abfd
, ext
->x_sym
.x_misc
.x_fsize
);
511 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO (abfd
, ext
);
512 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE (abfd
, ext
);
517 #ifdef COFF_ADJUST_AUX_IN_POST
518 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
523 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
528 int indx ATTRIBUTE_UNUSED
;
529 int numaux ATTRIBUTE_UNUSED
;
532 union internal_auxent
*in
= (union internal_auxent
*) inp
;
533 AUXENT
*ext
= (AUXENT
*) extp
;
535 #ifdef COFF_ADJUST_AUX_OUT_PRE
536 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, class, indx
, numaux
, extp
);
538 memset((PTR
)ext
, 0, AUXESZ
);
542 if (in
->x_file
.x_fname
[0] == 0)
544 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_zeroes
);
545 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_offset
, ext
->x_file
.x_n
.x_offset
);
549 #if FILNMLEN != E_FILNMLEN
550 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
552 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
564 PUT_SCN_SCNLEN (abfd
, in
->x_scn
.x_scnlen
, ext
);
565 PUT_SCN_NRELOC (abfd
, in
->x_scn
.x_nreloc
, ext
);
566 PUT_SCN_NLINNO (abfd
, in
->x_scn
.x_nlinno
, ext
);
572 H_PUT_32 (abfd
, in
->x_sym
.x_tagndx
.l
, ext
->x_sym
.x_tagndx
);
574 H_PUT_16 (abfd
, in
->x_sym
.x_tvndx
, ext
->x_sym
.x_tvndx
);
577 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
579 PUT_FCN_LNNOPTR (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
580 PUT_FCN_ENDNDX (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
584 #if DIMNUM != E_DIMNUM
585 #error we need to cope with truncating or extending DIMNUM
587 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
588 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
589 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
590 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
591 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
592 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
593 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
594 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
598 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
, ext
->x_sym
.x_misc
.x_fsize
);
601 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
602 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
606 #ifdef COFF_ADJUST_AUX_OUT_POST
607 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, class, indx
, numaux
, extp
);
612 #endif /* NO_COFF_SYMBOLS */
614 #ifndef NO_COFF_LINENOS
617 coff_swap_lineno_in (abfd
, ext1
, in1
)
622 LINENO
*ext
= (LINENO
*) ext1
;
623 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
625 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
626 in
->l_lnno
= GET_LINENO_LNNO (abfd
, ext
);
630 coff_swap_lineno_out (abfd
, inp
, outp
)
635 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
636 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
637 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
639 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
643 #endif /* NO_COFF_LINENOS */
646 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
651 AOUTHDR
*aouthdr_ext
;
652 struct internal_aouthdr
*aouthdr_int
;
654 aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
655 aouthdr_int
= (struct internal_aouthdr
*) aouthdr_int1
;
656 aouthdr_int
->magic
= H_GET_16 (abfd
, aouthdr_ext
->magic
);
657 aouthdr_int
->vstamp
= H_GET_16 (abfd
, aouthdr_ext
->vstamp
);
658 aouthdr_int
->tsize
= GET_AOUTHDR_TSIZE (abfd
, aouthdr_ext
->tsize
);
659 aouthdr_int
->dsize
= GET_AOUTHDR_DSIZE (abfd
, aouthdr_ext
->dsize
);
660 aouthdr_int
->bsize
= GET_AOUTHDR_BSIZE (abfd
, aouthdr_ext
->bsize
);
661 aouthdr_int
->entry
= GET_AOUTHDR_ENTRY (abfd
, aouthdr_ext
->entry
);
662 aouthdr_int
->text_start
=
663 GET_AOUTHDR_TEXT_START (abfd
, aouthdr_ext
->text_start
);
664 aouthdr_int
->data_start
=
665 GET_AOUTHDR_DATA_START (abfd
, aouthdr_ext
->data_start
);
668 aouthdr_int
->tagentries
= H_GET_32 (abfd
, aouthdr_ext
->tagentries
);
672 H_PUT_32 (abfd
, aouthdr_int
->o_inlib
, aouthdr_ext
->o_inlib
);
673 H_PUT_32 (abfd
, aouthdr_int
->o_sri
, aouthdr_ext
->o_sri
);
674 H_PUT_32 (abfd
, aouthdr_int
->vid
[0], aouthdr_ext
->vid
);
675 H_PUT_32 (abfd
, aouthdr_int
->vid
[1], aouthdr_ext
->vid
+ 4);
680 aouthdr_int
->o_toc
= H_GET_64 (abfd
, aouthdr_ext
->o_toc
);
682 aouthdr_int
->o_toc
= H_GET_32 (abfd
, aouthdr_ext
->o_toc
);
684 aouthdr_int
->o_snentry
= H_GET_16 (abfd
, aouthdr_ext
->o_snentry
);
685 aouthdr_int
->o_sntext
= H_GET_16 (abfd
, aouthdr_ext
->o_sntext
);
686 aouthdr_int
->o_sndata
= H_GET_16 (abfd
, aouthdr_ext
->o_sndata
);
687 aouthdr_int
->o_sntoc
= H_GET_16 (abfd
, aouthdr_ext
->o_sntoc
);
688 aouthdr_int
->o_snloader
= H_GET_16 (abfd
, aouthdr_ext
->o_snloader
);
689 aouthdr_int
->o_snbss
= H_GET_16 (abfd
, aouthdr_ext
->o_snbss
);
690 aouthdr_int
->o_algntext
= H_GET_16 (abfd
, aouthdr_ext
->o_algntext
);
691 aouthdr_int
->o_algndata
= H_GET_16 (abfd
, aouthdr_ext
->o_algndata
);
692 aouthdr_int
->o_modtype
= H_GET_16 (abfd
, aouthdr_ext
->o_modtype
);
693 aouthdr_int
->o_cputype
= H_GET_16 (abfd
, aouthdr_ext
->o_cputype
);
695 aouthdr_int
->o_maxstack
= H_GET_64 (abfd
, aouthdr_ext
->o_maxstack
);
696 aouthdr_int
->o_maxdata
= H_GET_64 (abfd
, aouthdr_ext
->o_maxdata
);
698 aouthdr_int
->o_maxstack
= H_GET_32 (abfd
, aouthdr_ext
->o_maxstack
);
699 aouthdr_int
->o_maxdata
= H_GET_32 (abfd
, aouthdr_ext
->o_maxdata
);
704 aouthdr_int
->bss_start
= H_GET_32 (abfd
, aouthdr_ext
->bss_start
);
705 aouthdr_int
->gp_value
= H_GET_32 (abfd
, aouthdr_ext
->gp_value
);
706 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
707 aouthdr_int
->cprmask
[0] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[0]);
708 aouthdr_int
->cprmask
[1] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[1]);
709 aouthdr_int
->cprmask
[2] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[2]);
710 aouthdr_int
->cprmask
[3] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[3]);
714 aouthdr_int
->bss_start
= H_GET_64 (abfd
, aouthdr_ext
->bss_start
);
715 aouthdr_int
->gp_value
= H_GET_64 (abfd
, aouthdr_ext
->gp_value
);
716 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
717 aouthdr_int
->fprmask
= H_GET_32 (abfd
, aouthdr_ext
->fprmask
);
722 coff_swap_aouthdr_out (abfd
, in
, out
)
727 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*) in
;
728 AOUTHDR
*aouthdr_out
= (AOUTHDR
*) out
;
730 H_PUT_16 (abfd
, aouthdr_in
->magic
, aouthdr_out
->magic
);
731 H_PUT_16 (abfd
, aouthdr_in
->vstamp
, aouthdr_out
->vstamp
);
732 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, aouthdr_out
->tsize
);
733 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, aouthdr_out
->dsize
);
734 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, aouthdr_out
->bsize
);
735 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, aouthdr_out
->entry
);
736 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
737 aouthdr_out
->text_start
);
738 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
739 aouthdr_out
->data_start
);
742 H_PUT_32 (abfd
, aouthdr_in
->tagentries
, aouthdr_out
->tagentries
);
747 H_PUT_64 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
749 H_PUT_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
751 H_PUT_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
752 H_PUT_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
753 H_PUT_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
754 H_PUT_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
755 H_PUT_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
756 H_PUT_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
757 H_PUT_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
758 H_PUT_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
759 H_PUT_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
760 H_PUT_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
762 H_PUT_64 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
763 H_PUT_64 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
765 H_PUT_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
766 H_PUT_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
768 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
770 memset (aouthdr_out
->o_debugger
, 0, sizeof aouthdr_out
->o_debugger
);
771 memset (aouthdr_out
->o_resv3
, 0, sizeof aouthdr_out
->o_resv3
);
776 H_PUT_32 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
777 H_PUT_32 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
778 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
779 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[0], aouthdr_out
->cprmask
[0]);
780 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[1], aouthdr_out
->cprmask
[1]);
781 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[2], aouthdr_out
->cprmask
[2]);
782 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[3], aouthdr_out
->cprmask
[3]);
786 /* FIXME: What does bldrev mean? */
787 H_PUT_16 (abfd
, 2, aouthdr_out
->bldrev
);
788 H_PUT_16 (abfd
, 0, aouthdr_out
->padding
);
789 H_PUT_64 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
790 H_PUT_64 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
791 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
792 H_PUT_32 (abfd
, aouthdr_in
->fprmask
, aouthdr_out
->fprmask
);
799 coff_swap_scnhdr_in (abfd
, ext
, in
)
804 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
805 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
807 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
808 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
810 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof (scnhdr_int
->s_name
));
811 scnhdr_int
->s_vaddr
= GET_SCNHDR_VADDR (abfd
, scnhdr_ext
->s_vaddr
);
812 scnhdr_int
->s_paddr
= GET_SCNHDR_PADDR (abfd
, scnhdr_ext
->s_paddr
);
813 scnhdr_int
->s_size
= GET_SCNHDR_SIZE (abfd
, scnhdr_ext
->s_size
);
815 scnhdr_int
->s_scnptr
= GET_SCNHDR_SCNPTR (abfd
, scnhdr_ext
->s_scnptr
);
816 scnhdr_int
->s_relptr
= GET_SCNHDR_RELPTR (abfd
, scnhdr_ext
->s_relptr
);
817 scnhdr_int
->s_lnnoptr
= GET_SCNHDR_LNNOPTR (abfd
, scnhdr_ext
->s_lnnoptr
);
818 scnhdr_int
->s_flags
= GET_SCNHDR_FLAGS (abfd
, scnhdr_ext
->s_flags
);
819 scnhdr_int
->s_nreloc
= GET_SCNHDR_NRELOC (abfd
, scnhdr_ext
->s_nreloc
);
820 scnhdr_int
->s_nlnno
= GET_SCNHDR_NLNNO (abfd
, scnhdr_ext
->s_nlnno
);
822 scnhdr_int
->s_align
= GET_SCNHDR_ALIGN (abfd
, scnhdr_ext
->s_align
);
824 #ifdef COFF_ADJUST_SCNHDR_IN_POST
825 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
830 coff_swap_scnhdr_out (abfd
, in
, out
)
835 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
836 SCNHDR
*scnhdr_ext
= (SCNHDR
*) out
;
837 unsigned int ret
= bfd_coff_scnhsz (abfd
);
839 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
840 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
842 memcpy (scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
844 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
, scnhdr_ext
->s_vaddr
);
845 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
, scnhdr_ext
->s_paddr
);
846 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
, scnhdr_ext
->s_size
);
847 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
, scnhdr_ext
->s_scnptr
);
848 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
, scnhdr_ext
->s_relptr
);
849 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
, scnhdr_ext
->s_lnnoptr
);
850 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
, scnhdr_ext
->s_flags
);
852 H_PUT_32 (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
853 H_PUT_32 (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
855 if (scnhdr_int
->s_nlnno
<= MAX_SCNHDR_NLNNO
)
856 PUT_SCNHDR_NLNNO (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
859 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
861 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
862 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
863 (*_bfd_error_handler
)
864 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
865 bfd_get_filename (abfd
),
866 buf
, scnhdr_int
->s_nlnno
);
867 PUT_SCNHDR_NLNNO (abfd
, 0xffff, scnhdr_ext
->s_nlnno
);
869 if (scnhdr_int
->s_nreloc
<= MAX_SCNHDR_NRELOC
)
870 PUT_SCNHDR_NRELOC (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
873 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
875 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
876 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
877 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
878 bfd_get_filename (abfd
),
879 buf
, scnhdr_int
->s_nreloc
);
880 bfd_set_error (bfd_error_file_truncated
);
881 PUT_SCNHDR_NRELOC (abfd
, 0xffff, scnhdr_ext
->s_nreloc
);
887 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, scnhdr_ext
->s_align
);
889 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
890 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);