1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000,
3 2001, 2002, 2004, 2005, 2007
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 3 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., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
24 /* This file contains routines used to swap COFF data. It is a header
25 file because the details of swapping depend on the details of the
26 structures used by each COFF implementation. This is included by
27 coffcode.h, as well as by the ECOFF backend.
29 Any file which uses this must first include "coff/internal.h" and
30 "coff/CPU.h". The functions will then be correct for that CPU. */
32 #ifndef GET_FCN_LNNOPTR
33 #define GET_FCN_LNNOPTR(abfd, ext) \
34 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
37 #ifndef GET_FCN_ENDNDX
38 #define GET_FCN_ENDNDX(abfd, ext) \
39 H_GET_32 (abfd, ext->x_sym.x_fcnary.x_fcn.x_endndx)
42 #ifndef PUT_FCN_LNNOPTR
43 #define PUT_FCN_LNNOPTR(abfd, in, ext) \
44 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
46 #ifndef PUT_FCN_ENDNDX
47 #define PUT_FCN_ENDNDX(abfd, in, ext) \
48 H_PUT_32 (abfd, in, ext->x_sym.x_fcnary.x_fcn.x_endndx)
51 #define GET_LNSZ_LNNO(abfd, ext) \
52 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_lnno)
55 #define GET_LNSZ_SIZE(abfd, ext) \
56 H_GET_16 (abfd, ext->x_sym.x_misc.x_lnsz.x_size)
59 #define PUT_LNSZ_LNNO(abfd, in, ext) \
60 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_lnno)
63 #define PUT_LNSZ_SIZE(abfd, in, ext) \
64 H_PUT_16 (abfd, in, ext->x_sym.x_misc.x_lnsz.x_size)
66 #ifndef GET_SCN_SCNLEN
67 #define GET_SCN_SCNLEN(abfd, ext) \
68 H_GET_32 (abfd, ext->x_scn.x_scnlen)
70 #ifndef GET_SCN_NRELOC
71 #define GET_SCN_NRELOC(abfd, ext) \
72 H_GET_16 (abfd, ext->x_scn.x_nreloc)
74 #ifndef GET_SCN_NLINNO
75 #define GET_SCN_NLINNO(abfd, ext) \
76 H_GET_16 (abfd, ext->x_scn.x_nlinno)
78 #ifndef PUT_SCN_SCNLEN
79 #define PUT_SCN_SCNLEN(abfd, in, ext) \
80 H_PUT_32 (abfd, in, ext->x_scn.x_scnlen)
82 #ifndef PUT_SCN_NRELOC
83 #define PUT_SCN_NRELOC(abfd, in, ext) \
84 H_PUT_16 (abfd, in, ext->x_scn.x_nreloc)
86 #ifndef PUT_SCN_NLINNO
87 #define PUT_SCN_NLINNO(abfd, in, ext) \
88 H_PUT_16 (abfd, in, ext->x_scn.x_nlinno)
90 #ifndef GET_LINENO_LNNO
91 #define GET_LINENO_LNNO(abfd, ext) \
92 H_GET_16 (abfd, ext->l_lnno);
94 #ifndef PUT_LINENO_LNNO
95 #define PUT_LINENO_LNNO(abfd, val, ext) \
96 H_PUT_16 (abfd, val, ext->l_lnno);
99 /* The f_symptr field in the filehdr is sometimes 64 bits. */
100 #ifndef GET_FILEHDR_SYMPTR
101 #define GET_FILEHDR_SYMPTR H_GET_32
103 #ifndef PUT_FILEHDR_SYMPTR
104 #define PUT_FILEHDR_SYMPTR H_PUT_32
107 /* Some fields in the aouthdr are sometimes 64 bits. */
108 #ifndef GET_AOUTHDR_TSIZE
109 #define GET_AOUTHDR_TSIZE H_GET_32
111 #ifndef PUT_AOUTHDR_TSIZE
112 #define PUT_AOUTHDR_TSIZE H_PUT_32
114 #ifndef GET_AOUTHDR_DSIZE
115 #define GET_AOUTHDR_DSIZE H_GET_32
117 #ifndef PUT_AOUTHDR_DSIZE
118 #define PUT_AOUTHDR_DSIZE H_PUT_32
120 #ifndef GET_AOUTHDR_BSIZE
121 #define GET_AOUTHDR_BSIZE H_GET_32
123 #ifndef PUT_AOUTHDR_BSIZE
124 #define PUT_AOUTHDR_BSIZE H_PUT_32
126 #ifndef GET_AOUTHDR_ENTRY
127 #define GET_AOUTHDR_ENTRY H_GET_32
129 #ifndef PUT_AOUTHDR_ENTRY
130 #define PUT_AOUTHDR_ENTRY H_PUT_32
132 #ifndef GET_AOUTHDR_TEXT_START
133 #define GET_AOUTHDR_TEXT_START H_GET_32
135 #ifndef PUT_AOUTHDR_TEXT_START
136 #define PUT_AOUTHDR_TEXT_START H_PUT_32
138 #ifndef GET_AOUTHDR_DATA_START
139 #define GET_AOUTHDR_DATA_START H_GET_32
141 #ifndef PUT_AOUTHDR_DATA_START
142 #define PUT_AOUTHDR_DATA_START H_PUT_32
145 /* Some fields in the scnhdr are sometimes 64 bits. */
146 #ifndef GET_SCNHDR_PADDR
147 #define GET_SCNHDR_PADDR H_GET_32
149 #ifndef PUT_SCNHDR_PADDR
150 #define PUT_SCNHDR_PADDR H_PUT_32
152 #ifndef GET_SCNHDR_VADDR
153 #define GET_SCNHDR_VADDR H_GET_32
155 #ifndef PUT_SCNHDR_VADDR
156 #define PUT_SCNHDR_VADDR H_PUT_32
158 #ifndef GET_SCNHDR_SIZE
159 #define GET_SCNHDR_SIZE H_GET_32
161 #ifndef PUT_SCNHDR_SIZE
162 #define PUT_SCNHDR_SIZE H_PUT_32
164 #ifndef GET_SCNHDR_SCNPTR
165 #define GET_SCNHDR_SCNPTR H_GET_32
167 #ifndef PUT_SCNHDR_SCNPTR
168 #define PUT_SCNHDR_SCNPTR H_PUT_32
170 #ifndef GET_SCNHDR_RELPTR
171 #define GET_SCNHDR_RELPTR H_GET_32
173 #ifndef PUT_SCNHDR_RELPTR
174 #define PUT_SCNHDR_RELPTR H_PUT_32
176 #ifndef GET_SCNHDR_LNNOPTR
177 #define GET_SCNHDR_LNNOPTR H_GET_32
179 #ifndef PUT_SCNHDR_LNNOPTR
180 #define PUT_SCNHDR_LNNOPTR H_PUT_32
182 #ifndef GET_SCNHDR_NRELOC
183 #define GET_SCNHDR_NRELOC H_GET_16
185 #ifndef MAX_SCNHDR_NRELOC
186 #define MAX_SCNHDR_NRELOC 0xffff
188 #ifndef PUT_SCNHDR_NRELOC
189 #define PUT_SCNHDR_NRELOC H_PUT_16
191 #ifndef GET_SCNHDR_NLNNO
192 #define GET_SCNHDR_NLNNO H_GET_16
194 #ifndef MAX_SCNHDR_NLNNO
195 #define MAX_SCNHDR_NLNNO 0xffff
197 #ifndef PUT_SCNHDR_NLNNO
198 #define PUT_SCNHDR_NLNNO H_PUT_16
200 #ifndef GET_SCNHDR_FLAGS
201 #define GET_SCNHDR_FLAGS H_GET_32
203 #ifndef PUT_SCNHDR_FLAGS
204 #define PUT_SCNHDR_FLAGS H_PUT_32
207 #ifndef GET_RELOC_VADDR
208 #define GET_RELOC_VADDR H_GET_32
210 #ifndef PUT_RELOC_VADDR
211 #define PUT_RELOC_VADDR H_PUT_32
214 #ifndef NO_COFF_RELOCS
217 coff_swap_reloc_in (bfd
* abfd
, void * src
, void * dst
)
219 RELOC
*reloc_src
= (RELOC
*) src
;
220 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
222 reloc_dst
->r_vaddr
= GET_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
);
223 reloc_dst
->r_symndx
= H_GET_S32 (abfd
, reloc_src
->r_symndx
);
224 reloc_dst
->r_type
= H_GET_16 (abfd
, reloc_src
->r_type
);
226 #ifdef SWAP_IN_RELOC_OFFSET
227 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET (abfd
, reloc_src
->r_offset
);
232 coff_swap_reloc_out (bfd
* abfd
, void * src
, void * dst
)
234 struct internal_reloc
*reloc_src
= (struct internal_reloc
*) src
;
235 struct external_reloc
*reloc_dst
= (struct external_reloc
*) dst
;
237 PUT_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
, reloc_dst
->r_vaddr
);
238 H_PUT_32 (abfd
, reloc_src
->r_symndx
, reloc_dst
->r_symndx
);
239 H_PUT_16 (abfd
, reloc_src
->r_type
, reloc_dst
->r_type
);
241 #ifdef SWAP_OUT_RELOC_OFFSET
242 SWAP_OUT_RELOC_OFFSET (abfd
, reloc_src
->r_offset
, reloc_dst
->r_offset
);
244 #ifdef SWAP_OUT_RELOC_EXTRA
245 SWAP_OUT_RELOC_EXTRA (abfd
, reloc_src
, reloc_dst
);
248 return bfd_coff_relsz (abfd
);
251 #endif /* NO_COFF_RELOCS */
254 coff_swap_filehdr_in (bfd
* abfd
, void * src
, void * dst
)
256 FILHDR
*filehdr_src
= (FILHDR
*) src
;
257 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
259 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
260 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
262 filehdr_dst
->f_magic
= H_GET_16 (abfd
, filehdr_src
->f_magic
);
263 filehdr_dst
->f_nscns
= H_GET_16 (abfd
, filehdr_src
->f_nscns
);
264 filehdr_dst
->f_timdat
= H_GET_32 (abfd
, filehdr_src
->f_timdat
);
265 filehdr_dst
->f_symptr
= GET_FILEHDR_SYMPTR (abfd
, filehdr_src
->f_symptr
);
266 filehdr_dst
->f_nsyms
= H_GET_32 (abfd
, filehdr_src
->f_nsyms
);
267 filehdr_dst
->f_opthdr
= H_GET_16 (abfd
, filehdr_src
->f_opthdr
);
268 filehdr_dst
->f_flags
= H_GET_16 (abfd
, filehdr_src
->f_flags
);
269 #ifdef TIC80_TARGET_ID
270 filehdr_dst
->f_target_id
= H_GET_16 (abfd
, filehdr_src
->f_target_id
);
273 #ifdef COFF_ADJUST_FILEHDR_IN_POST
274 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
279 coff_swap_filehdr_out (bfd
*abfd
, void * in
, void * out
)
281 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*) in
;
282 FILHDR
*filehdr_out
= (FILHDR
*) out
;
284 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
285 COFF_ADJUST_FILEHDR_OUT_PRE (abfd
, in
, out
);
287 H_PUT_16 (abfd
, filehdr_in
->f_magic
, filehdr_out
->f_magic
);
288 H_PUT_16 (abfd
, filehdr_in
->f_nscns
, filehdr_out
->f_nscns
);
289 H_PUT_32 (abfd
, filehdr_in
->f_timdat
, filehdr_out
->f_timdat
);
290 PUT_FILEHDR_SYMPTR (abfd
, filehdr_in
->f_symptr
, filehdr_out
->f_symptr
);
291 H_PUT_32 (abfd
, filehdr_in
->f_nsyms
, filehdr_out
->f_nsyms
);
292 H_PUT_16 (abfd
, filehdr_in
->f_opthdr
, filehdr_out
->f_opthdr
);
293 H_PUT_16 (abfd
, filehdr_in
->f_flags
, filehdr_out
->f_flags
);
294 #ifdef TIC80_TARGET_ID
295 H_PUT_16 (abfd
, filehdr_in
->f_target_id
, filehdr_out
->f_target_id
);
298 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
299 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
301 return bfd_coff_filhsz (abfd
);
304 #ifndef NO_COFF_SYMBOLS
307 coff_swap_sym_in (bfd
* abfd
, void * ext1
, void * in1
)
309 SYMENT
*ext
= (SYMENT
*) ext1
;
310 struct internal_syment
*in
= (struct internal_syment
*) in1
;
312 if (ext
->e
.e_name
[0] == 0)
314 in
->_n
._n_n
._n_zeroes
= 0;
315 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e
.e
.e_offset
);
319 #if SYMNMLEN != E_SYMNMLEN
320 #error we need to cope with truncating or extending SYMNMLEN
322 memcpy (in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
326 in
->n_value
= H_GET_32 (abfd
, ext
->e_value
);
327 in
->n_scnum
= H_GET_16 (abfd
, ext
->e_scnum
);
328 if (sizeof (ext
->e_type
) == 2)
329 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
331 in
->n_type
= H_GET_32 (abfd
, ext
->e_type
);
332 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
333 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
334 #ifdef COFF_ADJUST_SYM_IN_POST
335 COFF_ADJUST_SYM_IN_POST (abfd
, ext1
, in1
);
340 coff_swap_sym_out (bfd
* abfd
, void * inp
, void * extp
)
342 struct internal_syment
*in
= (struct internal_syment
*) inp
;
343 SYMENT
*ext
=(SYMENT
*) extp
;
345 #ifdef COFF_ADJUST_SYM_OUT_PRE
346 COFF_ADJUST_SYM_OUT_PRE (abfd
, inp
, extp
);
349 if (in
->_n
._n_name
[0] == 0)
351 H_PUT_32 (abfd
, 0, ext
->e
.e
.e_zeroes
);
352 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e
.e
.e_offset
);
356 #if SYMNMLEN != E_SYMNMLEN
357 #error we need to cope with truncating or extending SYMNMLEN
359 memcpy (ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
363 H_PUT_32 (abfd
, in
->n_value
, ext
->e_value
);
364 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
366 if (sizeof (ext
->e_type
) == 2)
367 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
369 H_PUT_32 (abfd
, in
->n_type
, ext
->e_type
);
371 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
372 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
374 #ifdef COFF_ADJUST_SYM_OUT_POST
375 COFF_ADJUST_SYM_OUT_POST (abfd
, inp
, extp
);
382 coff_swap_aux_in (bfd
*abfd
,
390 AUXENT
*ext
= (AUXENT
*) ext1
;
391 union internal_auxent
*in
= (union internal_auxent
*) in1
;
393 #ifdef COFF_ADJUST_AUX_IN_PRE
394 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, in_class
, indx
, numaux
, in1
);
400 if (ext
->x_file
.x_fname
[0] == 0)
402 in
->x_file
.x_n
.x_zeroes
= 0;
403 in
->x_file
.x_n
.x_offset
= H_GET_32 (abfd
, ext
->x_file
.x_n
.x_offset
);
407 #if FILNMLEN != E_FILNMLEN
408 #error we need to cope with truncating or extending FILNMLEN
413 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
414 numaux
* sizeof (AUXENT
));
417 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
429 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN (abfd
, ext
);
430 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC (abfd
, ext
);
431 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO (abfd
, ext
);
433 /* PE defines some extra fields; we zero them out for
435 in
->x_scn
.x_checksum
= 0;
436 in
->x_scn
.x_associated
= 0;
437 in
->x_scn
.x_comdat
= 0;
444 in
->x_sym
.x_tagndx
.l
= H_GET_32 (abfd
, ext
->x_sym
.x_tagndx
);
446 in
->x_sym
.x_tvndx
= H_GET_16 (abfd
, ext
->x_sym
.x_tvndx
);
449 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
452 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
453 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
457 #if DIMNUM != E_DIMNUM
458 #error we need to cope with truncating or extending DIMNUM
460 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
461 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
462 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
463 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
464 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
465 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
466 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
467 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
471 in
->x_sym
.x_misc
.x_fsize
= H_GET_32 (abfd
, ext
->x_sym
.x_misc
.x_fsize
);
474 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO (abfd
, ext
);
475 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE (abfd
, ext
);
480 #ifdef COFF_ADJUST_AUX_IN_POST
481 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, in_class
, indx
, numaux
, in1
);
486 coff_swap_aux_out (bfd
* abfd
,
490 int indx ATTRIBUTE_UNUSED
,
491 int numaux ATTRIBUTE_UNUSED
,
494 union internal_auxent
* in
= (union internal_auxent
*) inp
;
495 AUXENT
*ext
= (AUXENT
*) extp
;
497 #ifdef COFF_ADJUST_AUX_OUT_PRE
498 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, in_class
, indx
, numaux
, extp
);
501 memset (ext
, 0, AUXESZ
);
506 if (in
->x_file
.x_fname
[0] == 0)
508 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_zeroes
);
509 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_offset
, ext
->x_file
.x_n
.x_offset
);
513 #if FILNMLEN != E_FILNMLEN
514 #error we need to cope with truncating or extending FILNMLEN
516 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
528 PUT_SCN_SCNLEN (abfd
, in
->x_scn
.x_scnlen
, ext
);
529 PUT_SCN_NRELOC (abfd
, in
->x_scn
.x_nreloc
, ext
);
530 PUT_SCN_NLINNO (abfd
, in
->x_scn
.x_nlinno
, ext
);
536 H_PUT_32 (abfd
, in
->x_sym
.x_tagndx
.l
, ext
->x_sym
.x_tagndx
);
538 H_PUT_16 (abfd
, in
->x_sym
.x_tvndx
, ext
->x_sym
.x_tvndx
);
541 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
544 PUT_FCN_LNNOPTR (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
545 PUT_FCN_ENDNDX (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
549 #if DIMNUM != E_DIMNUM
550 #error we need to cope with truncating or extending DIMNUM
552 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
553 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
554 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
555 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
556 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
557 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
558 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
559 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
563 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
, ext
->x_sym
.x_misc
.x_fsize
);
566 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
567 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
571 #ifdef COFF_ADJUST_AUX_OUT_POST
572 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, in_class
, indx
, numaux
, extp
);
577 #endif /* NO_COFF_SYMBOLS */
579 #ifndef NO_COFF_LINENOS
582 coff_swap_lineno_in (bfd
* abfd
, void * ext1
, void * in1
)
584 LINENO
*ext
= (LINENO
*) ext1
;
585 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
587 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
588 in
->l_lnno
= GET_LINENO_LNNO (abfd
, ext
);
592 coff_swap_lineno_out (bfd
* abfd
, void * inp
, void * outp
)
594 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
595 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
596 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
598 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
602 #endif /* NO_COFF_LINENOS */
605 coff_swap_aouthdr_in (bfd
* abfd
, void * aouthdr_ext1
, void * aouthdr_int1
)
607 AOUTHDR
*aouthdr_ext
;
608 struct internal_aouthdr
*aouthdr_int
;
610 aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
611 aouthdr_int
= (struct internal_aouthdr
*) aouthdr_int1
;
612 aouthdr_int
->magic
= H_GET_16 (abfd
, aouthdr_ext
->magic
);
613 aouthdr_int
->vstamp
= H_GET_16 (abfd
, aouthdr_ext
->vstamp
);
614 aouthdr_int
->tsize
= GET_AOUTHDR_TSIZE (abfd
, aouthdr_ext
->tsize
);
615 aouthdr_int
->dsize
= GET_AOUTHDR_DSIZE (abfd
, aouthdr_ext
->dsize
);
616 aouthdr_int
->bsize
= GET_AOUTHDR_BSIZE (abfd
, aouthdr_ext
->bsize
);
617 aouthdr_int
->entry
= GET_AOUTHDR_ENTRY (abfd
, aouthdr_ext
->entry
);
618 aouthdr_int
->text_start
=
619 GET_AOUTHDR_TEXT_START (abfd
, aouthdr_ext
->text_start
);
620 aouthdr_int
->data_start
=
621 GET_AOUTHDR_DATA_START (abfd
, aouthdr_ext
->data_start
);
624 aouthdr_int
->tagentries
= H_GET_32 (abfd
, aouthdr_ext
->tagentries
);
628 H_PUT_32 (abfd
, aouthdr_int
->o_inlib
, aouthdr_ext
->o_inlib
);
629 H_PUT_32 (abfd
, aouthdr_int
->o_sri
, aouthdr_ext
->o_sri
);
630 H_PUT_32 (abfd
, aouthdr_int
->vid
[0], aouthdr_ext
->vid
);
631 H_PUT_32 (abfd
, aouthdr_int
->vid
[1], aouthdr_ext
->vid
+ 4);
636 aouthdr_int
->o_toc
= H_GET_64 (abfd
, aouthdr_ext
->o_toc
);
638 aouthdr_int
->o_toc
= H_GET_32 (abfd
, aouthdr_ext
->o_toc
);
640 aouthdr_int
->o_snentry
= H_GET_16 (abfd
, aouthdr_ext
->o_snentry
);
641 aouthdr_int
->o_sntext
= H_GET_16 (abfd
, aouthdr_ext
->o_sntext
);
642 aouthdr_int
->o_sndata
= H_GET_16 (abfd
, aouthdr_ext
->o_sndata
);
643 aouthdr_int
->o_sntoc
= H_GET_16 (abfd
, aouthdr_ext
->o_sntoc
);
644 aouthdr_int
->o_snloader
= H_GET_16 (abfd
, aouthdr_ext
->o_snloader
);
645 aouthdr_int
->o_snbss
= H_GET_16 (abfd
, aouthdr_ext
->o_snbss
);
646 aouthdr_int
->o_algntext
= H_GET_16 (abfd
, aouthdr_ext
->o_algntext
);
647 aouthdr_int
->o_algndata
= H_GET_16 (abfd
, aouthdr_ext
->o_algndata
);
648 aouthdr_int
->o_modtype
= H_GET_16 (abfd
, aouthdr_ext
->o_modtype
);
649 aouthdr_int
->o_cputype
= H_GET_16 (abfd
, aouthdr_ext
->o_cputype
);
651 aouthdr_int
->o_maxstack
= H_GET_64 (abfd
, aouthdr_ext
->o_maxstack
);
652 aouthdr_int
->o_maxdata
= H_GET_64 (abfd
, aouthdr_ext
->o_maxdata
);
654 aouthdr_int
->o_maxstack
= H_GET_32 (abfd
, aouthdr_ext
->o_maxstack
);
655 aouthdr_int
->o_maxdata
= H_GET_32 (abfd
, aouthdr_ext
->o_maxdata
);
660 aouthdr_int
->bss_start
= H_GET_32 (abfd
, aouthdr_ext
->bss_start
);
661 aouthdr_int
->gp_value
= H_GET_32 (abfd
, aouthdr_ext
->gp_value
);
662 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
663 aouthdr_int
->cprmask
[0] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[0]);
664 aouthdr_int
->cprmask
[1] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[1]);
665 aouthdr_int
->cprmask
[2] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[2]);
666 aouthdr_int
->cprmask
[3] = H_GET_32 (abfd
, aouthdr_ext
->cprmask
[3]);
670 aouthdr_int
->bss_start
= H_GET_64 (abfd
, aouthdr_ext
->bss_start
);
671 aouthdr_int
->gp_value
= H_GET_64 (abfd
, aouthdr_ext
->gp_value
);
672 aouthdr_int
->gprmask
= H_GET_32 (abfd
, aouthdr_ext
->gprmask
);
673 aouthdr_int
->fprmask
= H_GET_32 (abfd
, aouthdr_ext
->fprmask
);
678 coff_swap_aouthdr_out (bfd
* abfd
, void * in
, void * out
)
680 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*) in
;
681 AOUTHDR
*aouthdr_out
= (AOUTHDR
*) out
;
683 H_PUT_16 (abfd
, aouthdr_in
->magic
, aouthdr_out
->magic
);
684 H_PUT_16 (abfd
, aouthdr_in
->vstamp
, aouthdr_out
->vstamp
);
685 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, aouthdr_out
->tsize
);
686 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, aouthdr_out
->dsize
);
687 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, aouthdr_out
->bsize
);
688 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, aouthdr_out
->entry
);
689 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
690 aouthdr_out
->text_start
);
691 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
692 aouthdr_out
->data_start
);
695 H_PUT_32 (abfd
, aouthdr_in
->tagentries
, aouthdr_out
->tagentries
);
700 H_PUT_64 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
702 H_PUT_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
704 H_PUT_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
705 H_PUT_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
706 H_PUT_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
707 H_PUT_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
708 H_PUT_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
709 H_PUT_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
710 H_PUT_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
711 H_PUT_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
712 H_PUT_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
713 H_PUT_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
715 H_PUT_64 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
716 H_PUT_64 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
718 H_PUT_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
719 H_PUT_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
721 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
723 memset (aouthdr_out
->o_debugger
, 0, sizeof aouthdr_out
->o_debugger
);
724 memset (aouthdr_out
->o_resv3
, 0, sizeof aouthdr_out
->o_resv3
);
729 H_PUT_32 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
730 H_PUT_32 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
731 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
732 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[0], aouthdr_out
->cprmask
[0]);
733 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[1], aouthdr_out
->cprmask
[1]);
734 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[2], aouthdr_out
->cprmask
[2]);
735 H_PUT_32 (abfd
, aouthdr_in
->cprmask
[3], aouthdr_out
->cprmask
[3]);
739 /* FIXME: What does bldrev mean? */
740 H_PUT_16 (abfd
, 2, aouthdr_out
->bldrev
);
741 H_PUT_16 (abfd
, 0, aouthdr_out
->padding
);
742 H_PUT_64 (abfd
, aouthdr_in
->bss_start
, aouthdr_out
->bss_start
);
743 H_PUT_64 (abfd
, aouthdr_in
->gp_value
, aouthdr_out
->gp_value
);
744 H_PUT_32 (abfd
, aouthdr_in
->gprmask
, aouthdr_out
->gprmask
);
745 H_PUT_32 (abfd
, aouthdr_in
->fprmask
, aouthdr_out
->fprmask
);
752 coff_swap_scnhdr_in (bfd
* abfd
, void * ext
, void * in
)
754 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
755 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
757 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
758 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
760 memcpy (scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof (scnhdr_int
->s_name
));
762 scnhdr_int
->s_vaddr
= GET_SCNHDR_VADDR (abfd
, scnhdr_ext
->s_vaddr
);
763 scnhdr_int
->s_paddr
= GET_SCNHDR_PADDR (abfd
, scnhdr_ext
->s_paddr
);
764 scnhdr_int
->s_size
= GET_SCNHDR_SIZE (abfd
, scnhdr_ext
->s_size
);
766 scnhdr_int
->s_scnptr
= GET_SCNHDR_SCNPTR (abfd
, scnhdr_ext
->s_scnptr
);
767 scnhdr_int
->s_relptr
= GET_SCNHDR_RELPTR (abfd
, scnhdr_ext
->s_relptr
);
768 scnhdr_int
->s_lnnoptr
= GET_SCNHDR_LNNOPTR (abfd
, scnhdr_ext
->s_lnnoptr
);
769 scnhdr_int
->s_flags
= GET_SCNHDR_FLAGS (abfd
, scnhdr_ext
->s_flags
);
770 scnhdr_int
->s_nreloc
= GET_SCNHDR_NRELOC (abfd
, scnhdr_ext
->s_nreloc
);
771 scnhdr_int
->s_nlnno
= GET_SCNHDR_NLNNO (abfd
, scnhdr_ext
->s_nlnno
);
773 scnhdr_int
->s_align
= GET_SCNHDR_ALIGN (abfd
, scnhdr_ext
->s_align
);
775 #ifdef COFF_ADJUST_SCNHDR_IN_POST
776 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
781 coff_swap_scnhdr_out (bfd
* abfd
, void * in
, void * out
)
783 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
784 SCNHDR
*scnhdr_ext
= (SCNHDR
*) out
;
785 unsigned int ret
= bfd_coff_scnhsz (abfd
);
787 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
788 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
790 memcpy (scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
792 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
, scnhdr_ext
->s_vaddr
);
793 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
, scnhdr_ext
->s_paddr
);
794 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
, scnhdr_ext
->s_size
);
795 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
, scnhdr_ext
->s_scnptr
);
796 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
, scnhdr_ext
->s_relptr
);
797 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
, scnhdr_ext
->s_lnnoptr
);
798 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
, scnhdr_ext
->s_flags
);
800 H_PUT_32 (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
801 H_PUT_32 (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
803 if (scnhdr_int
->s_nlnno
<= MAX_SCNHDR_NLNNO
)
804 PUT_SCNHDR_NLNNO (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
807 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
809 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
810 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
811 (*_bfd_error_handler
)
812 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
813 bfd_get_filename (abfd
),
814 buf
, scnhdr_int
->s_nlnno
);
815 PUT_SCNHDR_NLNNO (abfd
, 0xffff, scnhdr_ext
->s_nlnno
);
818 if (scnhdr_int
->s_nreloc
<= MAX_SCNHDR_NRELOC
)
819 PUT_SCNHDR_NRELOC (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
822 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
824 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
825 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
826 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
827 bfd_get_filename (abfd
),
828 buf
, scnhdr_int
->s_nreloc
);
829 bfd_set_error (bfd_error_file_truncated
);
830 PUT_SCNHDR_NRELOC (abfd
, 0xffff, scnhdr_ext
->s_nreloc
);
836 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, scnhdr_ext
->s_align
);
838 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
839 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);