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
);
249 reloc_dst
->r_type
= H_GET_8 (abfd
, reloc_src
->r_type
);
250 reloc_dst
->r_size
= H_GET_8 (abfd
, reloc_src
->r_size
);
252 reloc_dst
->r_type
= H_GET_16 (abfd
, reloc_src
->r_type
);
255 #ifdef SWAP_IN_RELOC_OFFSET
256 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET (abfd
, reloc_src
->r_offset
);
261 coff_swap_reloc_out (abfd
, src
, dst
)
266 struct internal_reloc
*reloc_src
= (struct internal_reloc
*) src
;
267 struct external_reloc
*reloc_dst
= (struct external_reloc
*) dst
;
268 PUT_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
, reloc_dst
->r_vaddr
);
269 H_PUT_32 (abfd
, reloc_src
->r_symndx
, reloc_dst
->r_symndx
);
272 H_PUT_8 (abfd
, reloc_src
->r_type
, reloc_dst
->r_type
);
273 H_PUT_8 (abfd
, reloc_src
->r_size
, reloc_dst
->r_size
);
275 H_PUT_16 (abfd
, reloc_src
->r_type
, reloc_dst
->r_type
);
278 #ifdef SWAP_OUT_RELOC_OFFSET
279 SWAP_OUT_RELOC_OFFSET (abfd
, reloc_src
->r_offset
, reloc_dst
->r_offset
);
281 #ifdef SWAP_OUT_RELOC_EXTRA
282 SWAP_OUT_RELOC_EXTRA (abfd
, reloc_src
, reloc_dst
);
285 return bfd_coff_relsz (abfd
);
288 #endif /* NO_COFF_RELOCS */
291 coff_swap_filehdr_in (abfd
, src
, dst
)
296 FILHDR
*filehdr_src
= (FILHDR
*) src
;
297 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
299 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
300 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
302 filehdr_dst
->f_magic
= H_GET_16 (abfd
, filehdr_src
->f_magic
);
303 filehdr_dst
->f_nscns
= H_GET_16 (abfd
, filehdr_src
->f_nscns
);
304 filehdr_dst
->f_timdat
= H_GET_32 (abfd
, filehdr_src
->f_timdat
);
305 filehdr_dst
->f_symptr
= GET_FILEHDR_SYMPTR (abfd
, filehdr_src
->f_symptr
);
306 filehdr_dst
->f_nsyms
= H_GET_32 (abfd
, filehdr_src
->f_nsyms
);
307 filehdr_dst
->f_opthdr
= H_GET_16 (abfd
, filehdr_src
->f_opthdr
);
308 filehdr_dst
->f_flags
= H_GET_16 (abfd
, filehdr_src
->f_flags
);
309 #ifdef TIC80_TARGET_ID
310 filehdr_dst
->f_target_id
= H_GET_16 (abfd
, filehdr_src
->f_target_id
);
313 #ifdef COFF_ADJUST_FILEHDR_IN_POST
314 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
319 coff_swap_filehdr_out (abfd
, in
, out
)
324 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*) in
;
325 FILHDR
*filehdr_out
= (FILHDR
*) out
;
327 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
328 COFF_ADJUST_FILEHDR_OUT_PRE (abfd
, in
, out
);
330 H_PUT_16 (abfd
, filehdr_in
->f_magic
, filehdr_out
->f_magic
);
331 H_PUT_16 (abfd
, filehdr_in
->f_nscns
, filehdr_out
->f_nscns
);
332 H_PUT_32 (abfd
, filehdr_in
->f_timdat
, filehdr_out
->f_timdat
);
333 PUT_FILEHDR_SYMPTR (abfd
, filehdr_in
->f_symptr
, filehdr_out
->f_symptr
);
334 H_PUT_32 (abfd
, filehdr_in
->f_nsyms
, filehdr_out
->f_nsyms
);
335 H_PUT_16 (abfd
, filehdr_in
->f_opthdr
, filehdr_out
->f_opthdr
);
336 H_PUT_16 (abfd
, filehdr_in
->f_flags
, filehdr_out
->f_flags
);
337 #ifdef TIC80_TARGET_ID
338 H_PUT_16 (abfd
, filehdr_in
->f_target_id
, filehdr_out
->f_target_id
);
341 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
342 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
344 return bfd_coff_filhsz (abfd
);
347 #ifndef NO_COFF_SYMBOLS
350 coff_swap_sym_in (abfd
, ext1
, in1
)
355 SYMENT
*ext
= (SYMENT
*) ext1
;
356 struct internal_syment
*in
= (struct internal_syment
*) in1
;
358 if (ext
->e
.e_name
[0] == 0)
360 in
->_n
._n_n
._n_zeroes
= 0;
361 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e
.e
.e_offset
);
365 #if SYMNMLEN != E_SYMNMLEN
366 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
368 memcpy (in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
371 in
->n_value
= H_GET_32 (abfd
, ext
->e_value
);
372 in
->n_scnum
= H_GET_16 (abfd
, ext
->e_scnum
);
373 if (sizeof (ext
->e_type
) == 2)
375 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
379 in
->n_type
= H_GET_32 (abfd
, ext
->e_type
);
381 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
382 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
383 #ifdef COFF_ADJUST_SYM_IN_POST
384 COFF_ADJUST_SYM_IN_POST (abfd
, ext1
, in1
);
389 coff_swap_sym_out (abfd
, inp
, extp
)
394 struct internal_syment
*in
= (struct internal_syment
*) inp
;
395 SYMENT
*ext
=(SYMENT
*) extp
;
396 if(in
->_n
._n_name
[0] == 0)
398 H_PUT_32 (abfd
, 0, ext
->e
.e
.e_zeroes
);
399 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e
.e
.e_offset
);
403 #if SYMNMLEN != E_SYMNMLEN
404 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
406 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
409 H_PUT_32 (abfd
, in
->n_value
, ext
->e_value
);
410 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
411 if (sizeof (ext
->e_type
) == 2)
413 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
417 H_PUT_32 (abfd
, in
->n_type
, ext
->e_type
);
419 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
420 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
421 #ifdef COFF_ADJUST_SYM_OUT_POST
422 COFF_ADJUST_SYM_OUT_POST (abfd
, inp
, extp
);
428 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
437 AUXENT
*ext
= (AUXENT
*) ext1
;
438 union internal_auxent
*in
= (union internal_auxent
*) in1
;
440 #ifdef COFF_ADJUST_AUX_IN_PRE
441 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
446 if (ext
->x_file
.x_fname
[0] == 0)
448 in
->x_file
.x_n
.x_zeroes
= 0;
449 in
->x_file
.x_n
.x_offset
= H_GET_32 (abfd
, ext
->x_file
.x_n
.x_offset
);
453 #if FILNMLEN != E_FILNMLEN
454 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
459 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
460 numaux
* sizeof (AUXENT
));
464 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
477 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN (abfd
, ext
);
478 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC (abfd
, ext
);
479 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO (abfd
, ext
);
481 /* PE defines some extra fields; we zero them out for
483 in
->x_scn
.x_checksum
= 0;
484 in
->x_scn
.x_associated
= 0;
485 in
->x_scn
.x_comdat
= 0;
492 in
->x_sym
.x_tagndx
.l
= H_GET_32 (abfd
, ext
->x_sym
.x_tagndx
);
494 in
->x_sym
.x_tvndx
= H_GET_16 (abfd
, ext
->x_sym
.x_tvndx
);
497 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
499 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
500 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
504 #if DIMNUM != E_DIMNUM
505 #error we need to cope with truncating or extending DIMNUM
507 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
508 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
509 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
510 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
511 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
512 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
513 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
514 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
519 in
->x_sym
.x_misc
.x_fsize
= H_GET_32 (abfd
, ext
->x_sym
.x_misc
.x_fsize
);
523 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO (abfd
, ext
);
524 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE (abfd
, ext
);
529 #ifdef COFF_ADJUST_AUX_IN_POST
530 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
535 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
540 int indx ATTRIBUTE_UNUSED
;
541 int numaux ATTRIBUTE_UNUSED
;
544 union internal_auxent
*in
= (union internal_auxent
*) inp
;
545 AUXENT
*ext
= (AUXENT
*) extp
;
547 #ifdef COFF_ADJUST_AUX_OUT_PRE
548 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, class, indx
, numaux
, extp
);
550 memset((PTR
)ext
, 0, AUXESZ
);
554 if (in
->x_file
.x_fname
[0] == 0)
556 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_zeroes
);
557 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_offset
, ext
->x_file
.x_n
.x_offset
);
561 #if FILNMLEN != E_FILNMLEN
562 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
564 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
576 PUT_SCN_SCNLEN (abfd
, in
->x_scn
.x_scnlen
, ext
);
577 PUT_SCN_NRELOC (abfd
, in
->x_scn
.x_nreloc
, ext
);
578 PUT_SCN_NLINNO (abfd
, in
->x_scn
.x_nlinno
, ext
);
584 H_PUT_32 (abfd
, in
->x_sym
.x_tagndx
.l
, ext
->x_sym
.x_tagndx
);
586 H_PUT_16 (abfd
, in
->x_sym
.x_tvndx
, ext
->x_sym
.x_tvndx
);
589 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
591 PUT_FCN_LNNOPTR (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
592 PUT_FCN_ENDNDX (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
596 #if DIMNUM != E_DIMNUM
597 #error we need to cope with truncating or extending DIMNUM
599 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
600 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
601 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
602 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
603 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
604 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
605 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
606 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
610 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
, ext
->x_sym
.x_misc
.x_fsize
);
613 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
614 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
618 #ifdef COFF_ADJUST_AUX_OUT_POST
619 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, class, indx
, numaux
, extp
);
624 #endif /* NO_COFF_SYMBOLS */
626 #ifndef NO_COFF_LINENOS
629 coff_swap_lineno_in (abfd
, ext1
, in1
)
634 LINENO
*ext
= (LINENO
*) ext1
;
635 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
637 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
638 in
->l_lnno
= GET_LINENO_LNNO (abfd
, ext
);
642 coff_swap_lineno_out (abfd
, inp
, outp
)
647 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
648 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
649 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
651 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
655 #endif /* NO_COFF_LINENOS */
658 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
663 AOUTHDR
*aouthdr_ext
;
664 struct internal_aouthdr
*aouthdr_int
;
666 aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
667 aouthdr_int
= (struct internal_aouthdr
*) aouthdr_int1
;
668 aouthdr_int
->magic
= H_GET_16 (abfd
, aouthdr_ext
->magic
);
669 aouthdr_int
->vstamp
= H_GET_16 (abfd
, aouthdr_ext
->vstamp
);
670 aouthdr_int
->tsize
= GET_AOUTHDR_TSIZE (abfd
, aouthdr_ext
->tsize
);
671 aouthdr_int
->dsize
= GET_AOUTHDR_DSIZE (abfd
, aouthdr_ext
->dsize
);
672 aouthdr_int
->bsize
= GET_AOUTHDR_BSIZE (abfd
, aouthdr_ext
->bsize
);
673 aouthdr_int
->entry
= GET_AOUTHDR_ENTRY (abfd
, aouthdr_ext
->entry
);
674 aouthdr_int
->text_start
=
675 GET_AOUTHDR_TEXT_START (abfd
, aouthdr_ext
->text_start
);
676 aouthdr_int
->data_start
=
677 GET_AOUTHDR_DATA_START (abfd
, aouthdr_ext
->data_start
);
680 aouthdr_int
->tagentries
= H_GET_32 (abfd
, aouthdr_ext
->tagentries
);
684 H_PUT_32 (abfd
, aouthdr_int
->o_inlib
, aouthdr_ext
->o_inlib
);
685 H_PUT_32 (abfd
, aouthdr_int
->o_sri
, aouthdr_ext
->o_sri
);
686 H_PUT_32 (abfd
, aouthdr_int
->vid
[0], aouthdr_ext
->vid
);
687 H_PUT_32 (abfd
, aouthdr_int
->vid
[1], aouthdr_ext
->vid
+ 4);
692 aouthdr_int
->o_toc
= H_GET_64 (abfd
, aouthdr_ext
->o_toc
);
694 aouthdr_int
->o_toc
= H_GET_32 (abfd
, aouthdr_ext
->o_toc
);
696 aouthdr_int
->o_snentry
= H_GET_16 (abfd
, aouthdr_ext
->o_snentry
);
697 aouthdr_int
->o_sntext
= H_GET_16 (abfd
, aouthdr_ext
->o_sntext
);
698 aouthdr_int
->o_sndata
= H_GET_16 (abfd
, aouthdr_ext
->o_sndata
);
699 aouthdr_int
->o_sntoc
= H_GET_16 (abfd
, aouthdr_ext
->o_sntoc
);
700 aouthdr_int
->o_snloader
= H_GET_16 (abfd
, aouthdr_ext
->o_snloader
);
701 aouthdr_int
->o_snbss
= H_GET_16 (abfd
, aouthdr_ext
->o_snbss
);
702 aouthdr_int
->o_algntext
= H_GET_16 (abfd
, aouthdr_ext
->o_algntext
);
703 aouthdr_int
->o_algndata
= H_GET_16 (abfd
, aouthdr_ext
->o_algndata
);
704 aouthdr_int
->o_modtype
= H_GET_16 (abfd
, aouthdr_ext
->o_modtype
);
705 aouthdr_int
->o_cputype
= H_GET_16 (abfd
, aouthdr_ext
->o_cputype
);
707 aouthdr_int
->o_maxstack
= H_GET_64 (abfd
, aouthdr_ext
->o_maxstack
);
708 aouthdr_int
->o_maxdata
= H_GET_64 (abfd
, aouthdr_ext
->o_maxdata
);
710 aouthdr_int
->o_maxstack
= H_GET_32 (abfd
, aouthdr_ext
->o_maxstack
);
711 aouthdr_int
->o_maxdata
= H_GET_32 (abfd
, aouthdr_ext
->o_maxdata
);
716 aouthdr_int
->bss_start
= H_GET_32 (abfd
, aouthdr_ext
->bss_start
);
717 aouthdr_int
->gp_value
= H_GET_32 (abfd
, aouthdr_ext
->gp_value
);
718 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
719 aouthdr_int
->cprmask
[0] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[0]);
720 aouthdr_int
->cprmask
[1] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[1]);
721 aouthdr_int
->cprmask
[2] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[2]);
722 aouthdr_int
->cprmask
[3] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[3]);
726 aouthdr_int
->bss_start
= H_GET_64 (abfd
, aouthdr_ext
->bss_start
);
727 aouthdr_int
->gp_value
= H_GET_64 (abfd
, aouthdr_ext
->gp_value
);
728 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
729 aouthdr_int
->fprmask
= H_GET_32 (abfd
, aouthdr_ext
->fprmask
);
734 coff_swap_aouthdr_out (abfd
, in
, out
)
739 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*) in
;
740 AOUTHDR
*aouthdr_out
= (AOUTHDR
*) out
;
742 H_PUT_16 (abfd
, aouthdr_in
->magic
, aouthdr_out
->magic
);
743 H_PUT_16 (abfd
, aouthdr_in
->vstamp
, aouthdr_out
->vstamp
);
744 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, aouthdr_out
->tsize
);
745 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, aouthdr_out
->dsize
);
746 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, aouthdr_out
->bsize
);
747 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, aouthdr_out
->entry
);
748 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
749 aouthdr_out
->text_start
);
750 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
751 aouthdr_out
->data_start
);
754 H_PUT_32 (abfd
, aouthdr_in
->tagentries
, aouthdr_out
->tagentries
);
759 H_PUT_64 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
761 H_PUT_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
763 H_PUT_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
764 H_PUT_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
765 H_PUT_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
766 H_PUT_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
767 H_PUT_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
768 H_PUT_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
769 H_PUT_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
770 H_PUT_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
771 H_PUT_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
772 H_PUT_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
774 H_PUT_64 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
775 H_PUT_64 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
777 H_PUT_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
778 H_PUT_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
780 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
782 memset (aouthdr_out
->o_debugger
, 0, sizeof aouthdr_out
->o_debugger
);
783 memset (aouthdr_out
->o_resv3
, 0, sizeof aouthdr_out
->o_resv3
);
788 H_PUT_32 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
789 H_PUT_32 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
790 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
791 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[0], aouthdr_out
->cprmask
[0]);
792 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[1], aouthdr_out
->cprmask
[1]);
793 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[2], aouthdr_out
->cprmask
[2]);
794 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[3], aouthdr_out
->cprmask
[3]);
798 /* FIXME: What does bldrev mean? */
799 H_PUT_16 (abfd
, 2, aouthdr_out
->bldrev
);
800 H_PUT_16 (abfd
, 0, aouthdr_out
->padding
);
801 H_PUT_64 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
802 H_PUT_64 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
803 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
804 H_PUT_32 (abfd
, aouthdr_in
->fprmask
, aouthdr_out
->fprmask
);
811 coff_swap_scnhdr_in (abfd
, ext
, in
)
816 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
817 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
819 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
820 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
822 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof (scnhdr_int
->s_name
));
823 scnhdr_int
->s_vaddr
= GET_SCNHDR_VADDR (abfd
, scnhdr_ext
->s_vaddr
);
824 scnhdr_int
->s_paddr
= GET_SCNHDR_PADDR (abfd
, scnhdr_ext
->s_paddr
);
825 scnhdr_int
->s_size
= GET_SCNHDR_SIZE (abfd
, scnhdr_ext
->s_size
);
827 scnhdr_int
->s_scnptr
= GET_SCNHDR_SCNPTR (abfd
, scnhdr_ext
->s_scnptr
);
828 scnhdr_int
->s_relptr
= GET_SCNHDR_RELPTR (abfd
, scnhdr_ext
->s_relptr
);
829 scnhdr_int
->s_lnnoptr
= GET_SCNHDR_LNNOPTR (abfd
, scnhdr_ext
->s_lnnoptr
);
830 scnhdr_int
->s_flags
= GET_SCNHDR_FLAGS (abfd
, scnhdr_ext
->s_flags
);
831 scnhdr_int
->s_nreloc
= GET_SCNHDR_NRELOC (abfd
, scnhdr_ext
->s_nreloc
);
832 scnhdr_int
->s_nlnno
= GET_SCNHDR_NLNNO (abfd
, scnhdr_ext
->s_nlnno
);
834 scnhdr_int
->s_align
= GET_SCNHDR_ALIGN (abfd
, scnhdr_ext
->s_align
);
836 #ifdef COFF_ADJUST_SCNHDR_IN_POST
837 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
842 coff_swap_scnhdr_out (abfd
, in
, out
)
847 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
848 SCNHDR
*scnhdr_ext
= (SCNHDR
*) out
;
849 unsigned int ret
= bfd_coff_scnhsz (abfd
);
851 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
852 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
854 memcpy (scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
856 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
, scnhdr_ext
->s_vaddr
);
857 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
, scnhdr_ext
->s_paddr
);
858 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
, scnhdr_ext
->s_size
);
859 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
, scnhdr_ext
->s_scnptr
);
860 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
, scnhdr_ext
->s_relptr
);
861 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
, scnhdr_ext
->s_lnnoptr
);
862 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
, scnhdr_ext
->s_flags
);
864 H_PUT_32 (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
865 H_PUT_32 (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
867 if (scnhdr_int
->s_nlnno
<= MAX_SCNHDR_NLNNO
)
868 PUT_SCNHDR_NLNNO (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
871 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
873 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
874 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
875 (*_bfd_error_handler
)
876 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
877 bfd_get_filename (abfd
),
878 buf
, scnhdr_int
->s_nlnno
);
879 PUT_SCNHDR_NLNNO (abfd
, 0xffff, scnhdr_ext
->s_nlnno
);
881 if (scnhdr_int
->s_nreloc
<= MAX_SCNHDR_NRELOC
)
882 PUT_SCNHDR_NRELOC (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
885 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
887 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
888 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
889 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
890 bfd_get_filename (abfd
),
891 buf
, scnhdr_int
->s_nreloc
);
892 bfd_set_error (bfd_error_file_truncated
);
893 PUT_SCNHDR_NRELOC (abfd
, 0xffff, scnhdr_ext
->s_nreloc
);
899 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, scnhdr_ext
->s_align
);
901 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
902 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);