1 /* Generic COFF swapping routines, for BFD.
2 Copyright (C) 1990-2023 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
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.
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. */
30 #ifndef GET_FCN_LNNOPTR
31 #define GET_FCN_LNNOPTR(abfd, ext) \
32 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
35 #ifndef GET_FCN_ENDNDX
36 #define GET_FCN_ENDNDX(abfd, ext) \
37 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx)
40 #ifndef PUT_FCN_LNNOPTR
41 #define PUT_FCN_LNNOPTR(abfd, in, ext) \
42 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
44 #ifndef PUT_FCN_ENDNDX
45 #define PUT_FCN_ENDNDX(abfd, in, ext) \
46 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx)
49 #define GET_LNSZ_LNNO(abfd, ext) \
50 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno)
53 #define GET_LNSZ_SIZE(abfd, ext) \
54 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size)
57 #define PUT_LNSZ_LNNO(abfd, in, ext) \
58 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno)
61 #define PUT_LNSZ_SIZE(abfd, in, ext) \
62 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size)
64 #ifndef GET_SCN_SCNLEN
65 #define GET_SCN_SCNLEN(abfd, ext) \
66 H_GET_32 (abfd, ext->x_scn.x_scnlen)
68 #ifndef GET_SCN_NRELOC
69 #define GET_SCN_NRELOC(abfd, ext) \
70 H_GET_16 (abfd, ext->x_scn.x_nreloc)
72 #ifndef GET_SCN_NLINNO
73 #define GET_SCN_NLINNO(abfd, ext) \
74 H_GET_16 (abfd, ext->x_scn.x_nlinno)
76 #ifndef PUT_SCN_SCNLEN
77 #define PUT_SCN_SCNLEN(abfd, in, ext) \
78 H_PUT_32 (abfd, in, ext->x_scn.x_scnlen)
80 #ifndef PUT_SCN_NRELOC
81 #define PUT_SCN_NRELOC(abfd, in, ext) \
82 H_PUT_16 (abfd, in, ext->x_scn.x_nreloc)
84 #ifndef PUT_SCN_NLINNO
85 #define PUT_SCN_NLINNO(abfd, in, ext) \
86 H_PUT_16 (abfd, in, ext->x_scn.x_nlinno)
88 #ifndef GET_LINENO_LNNO
89 #define GET_LINENO_LNNO(abfd, ext) \
90 H_GET_16 (abfd, ext->l_lnno);
92 #ifndef PUT_LINENO_LNNO
93 #define PUT_LINENO_LNNO(abfd, val, ext) \
94 H_PUT_16 (abfd, val, ext->l_lnno);
97 /* The f_symptr field in the filehdr is sometimes 64 bits. */
98 #ifndef GET_FILEHDR_SYMPTR
99 #define GET_FILEHDR_SYMPTR H_GET_32
101 #ifndef PUT_FILEHDR_SYMPTR
102 #define PUT_FILEHDR_SYMPTR H_PUT_32
105 /* Some fields in the aouthdr are sometimes 64 bits. */
106 #ifndef GET_AOUTHDR_TSIZE
107 #define GET_AOUTHDR_TSIZE H_GET_32
109 #ifndef PUT_AOUTHDR_TSIZE
110 #define PUT_AOUTHDR_TSIZE H_PUT_32
112 #ifndef GET_AOUTHDR_DSIZE
113 #define GET_AOUTHDR_DSIZE H_GET_32
115 #ifndef PUT_AOUTHDR_DSIZE
116 #define PUT_AOUTHDR_DSIZE H_PUT_32
118 #ifndef GET_AOUTHDR_BSIZE
119 #define GET_AOUTHDR_BSIZE H_GET_32
121 #ifndef PUT_AOUTHDR_BSIZE
122 #define PUT_AOUTHDR_BSIZE H_PUT_32
124 #ifndef GET_AOUTHDR_ENTRY
125 #define GET_AOUTHDR_ENTRY H_GET_32
127 #ifndef PUT_AOUTHDR_ENTRY
128 #define PUT_AOUTHDR_ENTRY H_PUT_32
130 #ifndef GET_AOUTHDR_TEXT_START
131 #define GET_AOUTHDR_TEXT_START H_GET_32
133 #ifndef PUT_AOUTHDR_TEXT_START
134 #define PUT_AOUTHDR_TEXT_START H_PUT_32
136 #ifndef GET_AOUTHDR_DATA_START
137 #define GET_AOUTHDR_DATA_START H_GET_32
139 #ifndef PUT_AOUTHDR_DATA_START
140 #define PUT_AOUTHDR_DATA_START H_PUT_32
143 /* Some fields in the scnhdr are sometimes 64 bits. */
144 #ifndef GET_SCNHDR_PADDR
145 #define GET_SCNHDR_PADDR H_GET_32
147 #ifndef PUT_SCNHDR_PADDR
148 #define PUT_SCNHDR_PADDR H_PUT_32
150 #ifndef GET_SCNHDR_VADDR
151 #define GET_SCNHDR_VADDR H_GET_32
153 #ifndef PUT_SCNHDR_VADDR
154 #define PUT_SCNHDR_VADDR H_PUT_32
156 #ifndef GET_SCNHDR_SIZE
157 #define GET_SCNHDR_SIZE H_GET_32
159 #ifndef PUT_SCNHDR_SIZE
160 #define PUT_SCNHDR_SIZE H_PUT_32
162 #ifndef GET_SCNHDR_SCNPTR
163 #define GET_SCNHDR_SCNPTR H_GET_32
165 #ifndef PUT_SCNHDR_SCNPTR
166 #define PUT_SCNHDR_SCNPTR H_PUT_32
168 #ifndef GET_SCNHDR_RELPTR
169 #define GET_SCNHDR_RELPTR H_GET_32
171 #ifndef PUT_SCNHDR_RELPTR
172 #define PUT_SCNHDR_RELPTR H_PUT_32
174 #ifndef GET_SCNHDR_LNNOPTR
175 #define GET_SCNHDR_LNNOPTR H_GET_32
177 #ifndef PUT_SCNHDR_LNNOPTR
178 #define PUT_SCNHDR_LNNOPTR H_PUT_32
180 #ifndef GET_SCNHDR_NRELOC
181 #define GET_SCNHDR_NRELOC H_GET_16
183 #ifndef MAX_SCNHDR_NRELOC
184 #define MAX_SCNHDR_NRELOC 0xffff
186 #ifndef PUT_SCNHDR_NRELOC
187 #define PUT_SCNHDR_NRELOC H_PUT_16
189 #ifndef GET_SCNHDR_NLNNO
190 #define GET_SCNHDR_NLNNO H_GET_16
192 #ifndef MAX_SCNHDR_NLNNO
193 #define MAX_SCNHDR_NLNNO 0xffff
195 #ifndef PUT_SCNHDR_NLNNO
196 #define PUT_SCNHDR_NLNNO H_PUT_16
198 #ifndef GET_SCNHDR_FLAGS
199 #define GET_SCNHDR_FLAGS H_GET_32
201 #ifndef PUT_SCNHDR_FLAGS
202 #define PUT_SCNHDR_FLAGS H_PUT_32
205 #ifndef GET_RELOC_VADDR
206 #define GET_RELOC_VADDR H_GET_32
208 #ifndef PUT_RELOC_VADDR
209 #define PUT_RELOC_VADDR H_PUT_32
212 #ifndef NO_COFF_RELOCS
215 coff_swap_reloc_in (bfd
* abfd
, void * src
, void * dst
)
217 RELOC
*reloc_src
= (RELOC
*) src
;
218 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
220 reloc_dst
->r_vaddr
= GET_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
);
221 reloc_dst
->r_symndx
= H_GET_S32 (abfd
, reloc_src
->r_symndx
);
222 reloc_dst
->r_type
= H_GET_16 (abfd
, reloc_src
->r_type
);
224 #ifdef SWAP_IN_RELOC_OFFSET
225 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET (abfd
, reloc_src
->r_offset
);
230 coff_swap_reloc_out (bfd
* abfd
, void * src
, void * dst
)
232 struct internal_reloc
*reloc_src
= (struct internal_reloc
*) src
;
233 struct external_reloc
*reloc_dst
= (struct external_reloc
*) dst
;
235 PUT_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
, reloc_dst
->r_vaddr
);
236 H_PUT_32 (abfd
, reloc_src
->r_symndx
, reloc_dst
->r_symndx
);
237 H_PUT_16 (abfd
, reloc_src
->r_type
, reloc_dst
->r_type
);
239 #ifdef SWAP_OUT_RELOC_OFFSET
240 SWAP_OUT_RELOC_OFFSET (abfd
, reloc_src
->r_offset
, reloc_dst
->r_offset
);
242 #ifdef SWAP_OUT_RELOC_EXTRA
243 SWAP_OUT_RELOC_EXTRA (abfd
, reloc_src
, reloc_dst
);
246 return bfd_coff_relsz (abfd
);
251 coff_swap_reloc_v0_in (bfd
*abfd
, void *src
, void *dst
)
253 struct external_reloc_v0
*reloc_src
= (struct external_reloc_v0
*) src
;
254 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
256 reloc_dst
->r_vaddr
= GET_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
);
257 reloc_dst
->r_symndx
= H_GET_16 (abfd
, reloc_src
->r_symndx
);
258 reloc_dst
->r_type
= H_GET_16 (abfd
, reloc_src
->r_type
);
262 coff_swap_reloc_v0_out (bfd
*abfd
, void *src
, void *dst
)
264 struct internal_reloc
*reloc_src
= (struct internal_reloc
*) src
;
265 struct external_reloc_v0
*reloc_dst
= (struct external_reloc_v0
*) dst
;
267 PUT_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
, reloc_dst
->r_vaddr
);
268 H_PUT_16 (abfd
, reloc_src
->r_symndx
, reloc_dst
->r_symndx
);
269 H_PUT_16 (abfd
, reloc_src
->r_type
, reloc_dst
->r_type
);
270 SWAP_OUT_RELOC_EXTRA (abfd
, reloc_src
, reloc_dst
);
272 return bfd_coff_relsz (abfd
);
276 #endif /* NO_COFF_RELOCS */
279 coff_swap_filehdr_in (bfd
* abfd
, void * src
, void * dst
)
281 FILHDR
*filehdr_src
= (FILHDR
*) src
;
282 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
284 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
285 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
287 filehdr_dst
->f_magic
= H_GET_16 (abfd
, filehdr_src
->f_magic
);
288 filehdr_dst
->f_nscns
= H_GET_16 (abfd
, filehdr_src
->f_nscns
);
289 filehdr_dst
->f_timdat
= H_GET_32 (abfd
, filehdr_src
->f_timdat
);
290 filehdr_dst
->f_symptr
= GET_FILEHDR_SYMPTR (abfd
, filehdr_src
->f_symptr
);
291 filehdr_dst
->f_nsyms
= H_GET_32 (abfd
, filehdr_src
->f_nsyms
);
292 filehdr_dst
->f_opthdr
= H_GET_16 (abfd
, filehdr_src
->f_opthdr
);
293 filehdr_dst
->f_flags
= H_GET_16 (abfd
, filehdr_src
->f_flags
);
295 #ifdef COFF_ADJUST_FILEHDR_IN_POST
296 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
301 coff_swap_filehdr_out (bfd
*abfd
, void * in
, void * 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 H_PUT_16 (abfd
, filehdr_in
->f_magic
, filehdr_out
->f_magic
);
310 H_PUT_16 (abfd
, filehdr_in
->f_nscns
, filehdr_out
->f_nscns
);
311 H_PUT_32 (abfd
, filehdr_in
->f_timdat
, filehdr_out
->f_timdat
);
312 PUT_FILEHDR_SYMPTR (abfd
, filehdr_in
->f_symptr
, filehdr_out
->f_symptr
);
313 H_PUT_32 (abfd
, filehdr_in
->f_nsyms
, filehdr_out
->f_nsyms
);
314 H_PUT_16 (abfd
, filehdr_in
->f_opthdr
, filehdr_out
->f_opthdr
);
315 H_PUT_16 (abfd
, filehdr_in
->f_flags
, filehdr_out
->f_flags
);
317 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
318 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
320 return bfd_coff_filhsz (abfd
);
323 #ifndef NO_COFF_SYMBOLS
326 coff_swap_sym_in (bfd
* abfd
, void * ext1
, void * in1
)
328 SYMENT
*ext
= (SYMENT
*) ext1
;
329 struct internal_syment
*in
= (struct internal_syment
*) in1
;
331 if (ext
->e
.e_name
[0] == 0)
333 in
->_n
._n_n
._n_zeroes
= 0;
334 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e
.e
.e_offset
);
338 #if SYMNMLEN != E_SYMNMLEN
339 #error we need to cope with truncating or extending SYMNMLEN
341 memcpy (in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
345 in
->n_value
= H_GET_32 (abfd
, ext
->e_value
);
346 in
->n_scnum
= (short) H_GET_16 (abfd
, ext
->e_scnum
);
347 if (sizeof (ext
->e_type
) == 2)
348 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
350 in
->n_type
= H_GET_32 (abfd
, ext
->e_type
);
351 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
352 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
353 #ifdef COFF_ADJUST_SYM_IN_POST
354 COFF_ADJUST_SYM_IN_POST (abfd
, ext1
, in1
);
359 coff_swap_sym_out (bfd
* abfd
, void * inp
, void * extp
)
361 struct internal_syment
*in
= (struct internal_syment
*) inp
;
362 SYMENT
*ext
=(SYMENT
*) extp
;
364 #ifdef COFF_ADJUST_SYM_OUT_PRE
365 COFF_ADJUST_SYM_OUT_PRE (abfd
, inp
, extp
);
368 if (in
->_n
._n_name
[0] == 0)
370 H_PUT_32 (abfd
, 0, ext
->e
.e
.e_zeroes
);
371 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e
.e
.e_offset
);
375 #if SYMNMLEN != E_SYMNMLEN
376 #error we need to cope with truncating or extending SYMNMLEN
378 memcpy (ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
382 H_PUT_32 (abfd
, in
->n_value
, ext
->e_value
);
383 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
385 if (sizeof (ext
->e_type
) == 2)
386 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
388 H_PUT_32 (abfd
, in
->n_type
, ext
->e_type
);
390 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
391 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
393 #ifdef COFF_ADJUST_SYM_OUT_POST
394 COFF_ADJUST_SYM_OUT_POST (abfd
, inp
, extp
);
401 coff_swap_aux_in (bfd
*abfd
,
409 AUXENT
*ext
= (AUXENT
*) ext1
;
410 union internal_auxent
*in
= (union internal_auxent
*) in1
;
412 #ifdef COFF_ADJUST_AUX_IN_PRE
413 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, in_class
, indx
, numaux
, in1
);
419 if (ext
->x_file
.x_fname
[0] == 0)
421 in
->x_file
.x_n
.x_n
.x_zeroes
= 0;
422 in
->x_file
.x_n
.x_n
.x_offset
= H_GET_32 (abfd
, ext
->x_file
.x_n
.x_offset
);
426 #if FILNMLEN != E_FILNMLEN
427 #error we need to cope with truncating or extending FILNMLEN
429 if (numaux
> 1 && obj_pe (abfd
))
432 memcpy (in
->x_file
.x_n
.x_fname
, ext
->x_file
.x_fname
,
433 numaux
* sizeof (AUXENT
));
436 memcpy (in
->x_file
.x_n
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
448 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN (abfd
, ext
);
449 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC (abfd
, ext
);
450 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO (abfd
, ext
);
452 /* PE defines some extra fields; we zero them out for
454 in
->x_scn
.x_checksum
= 0;
455 in
->x_scn
.x_associated
= 0;
456 in
->x_scn
.x_comdat
= 0;
463 in
->x_sym
.x_tagndx
.l
= H_GET_32 (abfd
, ext
->x_sym
.x_tagndx
);
465 in
->x_sym
.x_tvndx
= H_GET_16 (abfd
, ext
->x_sym
.x_tvndx
);
468 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
471 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
472 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
476 #if DIMNUM != E_DIMNUM
477 #error we need to cope with truncating or extending DIMNUM
479 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
480 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
481 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
482 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
483 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
484 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
485 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
486 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
490 in
->x_sym
.x_misc
.x_fsize
= H_GET_32 (abfd
, ext
->x_sym
.x_misc
.x_fsize
);
493 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO (abfd
, ext
);
494 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE (abfd
, ext
);
499 #ifdef COFF_ADJUST_AUX_IN_POST
500 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, in_class
, indx
, numaux
, in1
);
505 coff_swap_aux_out (bfd
* abfd
,
509 int indx ATTRIBUTE_UNUSED
,
510 int numaux ATTRIBUTE_UNUSED
,
513 union internal_auxent
* in
= (union internal_auxent
*) inp
;
514 AUXENT
*ext
= (AUXENT
*) extp
;
516 #ifdef COFF_ADJUST_AUX_OUT_PRE
517 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, in_class
, indx
, numaux
, extp
);
520 memset (ext
, 0, AUXESZ
);
525 if (in
->x_file
.x_n
.x_fname
[0] == 0)
527 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_zeroes
);
528 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_n
.x_offset
, ext
->x_file
.x_n
.x_offset
);
532 #if FILNMLEN != E_FILNMLEN
533 #error we need to cope with truncating or extending FILNMLEN
535 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_n
.x_fname
, FILNMLEN
);
547 PUT_SCN_SCNLEN (abfd
, in
->x_scn
.x_scnlen
, ext
);
548 PUT_SCN_NRELOC (abfd
, in
->x_scn
.x_nreloc
, ext
);
549 PUT_SCN_NLINNO (abfd
, in
->x_scn
.x_nlinno
, ext
);
555 H_PUT_32 (abfd
, in
->x_sym
.x_tagndx
.l
, ext
->x_sym
.x_tagndx
);
557 H_PUT_16 (abfd
, in
->x_sym
.x_tvndx
, ext
->x_sym
.x_tvndx
);
560 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
563 PUT_FCN_LNNOPTR (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
564 PUT_FCN_ENDNDX (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
568 #if DIMNUM != E_DIMNUM
569 #error we need to cope with truncating or extending DIMNUM
571 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
572 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
573 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
574 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
575 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
576 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
577 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
578 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
582 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
, ext
->x_sym
.x_misc
.x_fsize
);
585 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
586 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
590 #ifdef COFF_ADJUST_AUX_OUT_POST
591 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, in_class
, indx
, numaux
, extp
);
596 #endif /* NO_COFF_SYMBOLS */
598 #ifndef NO_COFF_LINENOS
601 coff_swap_lineno_in (bfd
* abfd
, void * ext1
, void * in1
)
603 LINENO
*ext
= (LINENO
*) ext1
;
604 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
606 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
607 in
->l_lnno
= GET_LINENO_LNNO (abfd
, ext
);
611 coff_swap_lineno_out (bfd
* abfd
, void * inp
, void * outp
)
613 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
614 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
615 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
617 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
621 #endif /* NO_COFF_LINENOS */
624 coff_swap_aouthdr_in (bfd
* abfd
, void * aouthdr_ext1
, void * aouthdr_int1
)
626 AOUTHDR
*aouthdr_ext
;
627 struct internal_aouthdr
*aouthdr_int
;
629 aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
630 aouthdr_int
= (struct internal_aouthdr
*) aouthdr_int1
;
631 aouthdr_int
->magic
= H_GET_16 (abfd
, aouthdr_ext
->magic
);
632 aouthdr_int
->vstamp
= H_GET_16 (abfd
, aouthdr_ext
->vstamp
);
633 aouthdr_int
->tsize
= GET_AOUTHDR_TSIZE (abfd
, aouthdr_ext
->tsize
);
634 aouthdr_int
->dsize
= GET_AOUTHDR_DSIZE (abfd
, aouthdr_ext
->dsize
);
635 aouthdr_int
->bsize
= GET_AOUTHDR_BSIZE (abfd
, aouthdr_ext
->bsize
);
636 aouthdr_int
->entry
= GET_AOUTHDR_ENTRY (abfd
, aouthdr_ext
->entry
);
637 aouthdr_int
->text_start
=
638 GET_AOUTHDR_TEXT_START (abfd
, aouthdr_ext
->text_start
);
639 aouthdr_int
->data_start
=
640 GET_AOUTHDR_DATA_START (abfd
, aouthdr_ext
->data_start
);
644 aouthdr_int
->o_toc
= H_GET_64 (abfd
, aouthdr_ext
->o_toc
);
646 aouthdr_int
->o_toc
= H_GET_32 (abfd
, aouthdr_ext
->o_toc
);
648 aouthdr_int
->o_snentry
= H_GET_16 (abfd
, aouthdr_ext
->o_snentry
);
649 aouthdr_int
->o_sntext
= H_GET_16 (abfd
, aouthdr_ext
->o_sntext
);
650 aouthdr_int
->o_sndata
= H_GET_16 (abfd
, aouthdr_ext
->o_sndata
);
651 aouthdr_int
->o_sntoc
= H_GET_16 (abfd
, aouthdr_ext
->o_sntoc
);
652 aouthdr_int
->o_snloader
= H_GET_16 (abfd
, aouthdr_ext
->o_snloader
);
653 aouthdr_int
->o_snbss
= H_GET_16 (abfd
, aouthdr_ext
->o_snbss
);
654 aouthdr_int
->o_algntext
= H_GET_16 (abfd
, aouthdr_ext
->o_algntext
);
655 aouthdr_int
->o_algndata
= H_GET_16 (abfd
, aouthdr_ext
->o_algndata
);
656 aouthdr_int
->o_modtype
= H_GET_16 (abfd
, aouthdr_ext
->o_modtype
);
657 aouthdr_int
->o_cputype
= H_GET_16 (abfd
, aouthdr_ext
->o_cputype
);
659 aouthdr_int
->o_maxstack
= H_GET_64 (abfd
, aouthdr_ext
->o_maxstack
);
660 aouthdr_int
->o_maxdata
= H_GET_64 (abfd
, aouthdr_ext
->o_maxdata
);
662 aouthdr_int
->o_maxstack
= H_GET_32 (abfd
, aouthdr_ext
->o_maxstack
);
663 aouthdr_int
->o_maxdata
= H_GET_32 (abfd
, aouthdr_ext
->o_maxdata
);
668 aouthdr_int
->bss_start
= H_GET_32 (abfd
, aouthdr_ext
->bss_start
);
669 aouthdr_int
->gp_value
= H_GET_32 (abfd
, aouthdr_ext
->gp_value
);
670 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
671 aouthdr_int
->cprmask
[0] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[0]);
672 aouthdr_int
->cprmask
[1] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[1]);
673 aouthdr_int
->cprmask
[2] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[2]);
674 aouthdr_int
->cprmask
[3] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[3]);
678 aouthdr_int
->bss_start
= H_GET_64 (abfd
, aouthdr_ext
->bss_start
);
679 aouthdr_int
->gp_value
= H_GET_64 (abfd
, aouthdr_ext
->gp_value
);
680 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
681 aouthdr_int
->fprmask
= H_GET_32 (abfd
, aouthdr_ext
->fprmask
);
686 coff_swap_aouthdr_out (bfd
* abfd
, void * in
, void * out
)
688 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*) in
;
689 AOUTHDR
*aouthdr_out
= (AOUTHDR
*) out
;
691 H_PUT_16 (abfd
, aouthdr_in
->magic
, aouthdr_out
->magic
);
692 H_PUT_16 (abfd
, aouthdr_in
->vstamp
, aouthdr_out
->vstamp
);
693 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, aouthdr_out
->tsize
);
694 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, aouthdr_out
->dsize
);
695 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, aouthdr_out
->bsize
);
696 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, aouthdr_out
->entry
);
697 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
698 aouthdr_out
->text_start
);
699 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
700 aouthdr_out
->data_start
);
704 H_PUT_64 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
706 H_PUT_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
708 H_PUT_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
709 H_PUT_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
710 H_PUT_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
711 H_PUT_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
712 H_PUT_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
713 H_PUT_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
714 H_PUT_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
715 H_PUT_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
716 H_PUT_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
717 H_PUT_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
719 H_PUT_64 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
720 H_PUT_64 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
722 H_PUT_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
723 H_PUT_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
725 /* TODO: set o_*psize dynamically */
726 H_PUT_8 (abfd
, 0, aouthdr_out
->o_textpsize
);
727 H_PUT_8 (abfd
, 0, aouthdr_out
->o_datapsize
);
728 H_PUT_8 (abfd
, 0, aouthdr_out
->o_stackpsize
);
729 H_PUT_8 (abfd
, aouthdr_in
->o_flags
, aouthdr_out
->o_flags
);
730 H_PUT_16 (abfd
, aouthdr_in
->o_sntdata
, aouthdr_out
->o_sntdata
);
731 H_PUT_16 (abfd
, aouthdr_in
->o_sntbss
, aouthdr_out
->o_sntbss
);
732 H_PUT_32 (abfd
, 0, aouthdr_out
->o_debugger
);
734 H_PUT_16 (abfd
, aouthdr_in
->o_x64flags
, aouthdr_out
->o_x64flags
);
735 memset (aouthdr_out
->o_resv3
, 0, sizeof aouthdr_out
->o_resv3
);
740 H_PUT_32 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
741 H_PUT_32 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
742 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
743 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[0], aouthdr_out
->cprmask
[0]);
744 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[1], aouthdr_out
->cprmask
[1]);
745 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[2], aouthdr_out
->cprmask
[2]);
746 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[3], aouthdr_out
->cprmask
[3]);
750 /* FIXME: What does bldrev mean? */
751 H_PUT_16 (abfd
, 2, aouthdr_out
->bldrev
);
752 H_PUT_16 (abfd
, 0, aouthdr_out
->padding
);
753 H_PUT_64 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
754 H_PUT_64 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
755 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
756 H_PUT_32 (abfd
, aouthdr_in
->fprmask
, aouthdr_out
->fprmask
);
764 coff_swap_scnhdr_in (bfd
* abfd
, void * ext
, void * in
)
766 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
767 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
769 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
770 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
772 memcpy (scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof (scnhdr_int
->s_name
));
774 scnhdr_int
->s_vaddr
= GET_SCNHDR_VADDR (abfd
, scnhdr_ext
->s_vaddr
);
775 scnhdr_int
->s_paddr
= GET_SCNHDR_PADDR (abfd
, scnhdr_ext
->s_paddr
);
776 scnhdr_int
->s_size
= GET_SCNHDR_SIZE (abfd
, scnhdr_ext
->s_size
);
778 scnhdr_int
->s_scnptr
= GET_SCNHDR_SCNPTR (abfd
, scnhdr_ext
->s_scnptr
);
779 scnhdr_int
->s_relptr
= GET_SCNHDR_RELPTR (abfd
, scnhdr_ext
->s_relptr
);
780 scnhdr_int
->s_lnnoptr
= GET_SCNHDR_LNNOPTR (abfd
, scnhdr_ext
->s_lnnoptr
);
781 scnhdr_int
->s_flags
= GET_SCNHDR_FLAGS (abfd
, scnhdr_ext
->s_flags
);
782 scnhdr_int
->s_nreloc
= GET_SCNHDR_NRELOC (abfd
, scnhdr_ext
->s_nreloc
);
783 scnhdr_int
->s_nlnno
= GET_SCNHDR_NLNNO (abfd
, scnhdr_ext
->s_nlnno
);
784 #ifdef COFF_ADJUST_SCNHDR_IN_POST
785 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
791 coff_swap_scnhdr_out (bfd
* abfd
, void * in
, void * out
)
793 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
794 SCNHDR
*scnhdr_ext
= (SCNHDR
*) out
;
795 unsigned int ret
= bfd_coff_scnhsz (abfd
);
797 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
798 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
800 memcpy (scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
802 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
, scnhdr_ext
->s_vaddr
);
803 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
, scnhdr_ext
->s_paddr
);
804 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
, scnhdr_ext
->s_size
);
805 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
, scnhdr_ext
->s_scnptr
);
806 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
, scnhdr_ext
->s_relptr
);
807 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
, scnhdr_ext
->s_lnnoptr
);
808 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
, scnhdr_ext
->s_flags
);
809 if (scnhdr_int
->s_nlnno
<= MAX_SCNHDR_NLNNO
)
810 PUT_SCNHDR_NLNNO (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
813 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
815 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
816 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
818 /* xgettext:c-format */
819 (_("%pB: warning: %s: line number overflow: 0x%lx > 0xffff"),
820 abfd
, buf
, scnhdr_int
->s_nlnno
);
821 PUT_SCNHDR_NLNNO (abfd
, 0xffff, scnhdr_ext
->s_nlnno
);
824 if (scnhdr_int
->s_nreloc
<= MAX_SCNHDR_NRELOC
)
825 PUT_SCNHDR_NRELOC (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
828 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
830 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
831 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
832 /* xgettext:c-format */
833 _bfd_error_handler (_("%pB: %s: reloc overflow: 0x%lx > 0xffff"),
834 abfd
, buf
, scnhdr_int
->s_nreloc
);
835 bfd_set_error (bfd_error_file_truncated
);
836 PUT_SCNHDR_NRELOC (abfd
, 0xffff, scnhdr_ext
->s_nreloc
);
840 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
841 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);