1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
4 Written by Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 #define PUTWORD bfd_h_put_32
31 #define PUTHALF bfd_h_put_16
32 #define PUTBYTE bfd_h_put_8
34 #ifndef GET_FCN_LNNOPTR
35 #define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
38 #ifndef GET_FCN_ENDNDX
39 #define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
42 #ifndef PUT_FCN_LNNOPTR
43 #define PUT_FCN_LNNOPTR(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
45 #ifndef PUT_FCN_ENDNDX
46 #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
49 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
52 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
55 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
58 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
60 #ifndef GET_SCN_SCNLEN
61 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
63 #ifndef GET_SCN_NRELOC
64 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
66 #ifndef GET_SCN_NLINNO
67 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
69 #ifndef PUT_SCN_SCNLEN
70 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
72 #ifndef PUT_SCN_NRELOC
73 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
75 #ifndef PUT_SCN_NLINNO
76 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
78 #ifndef GET_LINENO_LNNO
79 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
81 #ifndef PUT_LINENO_LNNO
82 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno));
85 /* The f_symptr field in the filehdr is sometimes 64 bits. */
86 #ifndef GET_FILEHDR_SYMPTR
87 #define GET_FILEHDR_SYMPTR bfd_h_get_32
89 #ifndef PUT_FILEHDR_SYMPTR
90 #define PUT_FILEHDR_SYMPTR bfd_h_put_32
93 /* Some fields in the aouthdr are sometimes 64 bits. */
94 #ifndef GET_AOUTHDR_TSIZE
95 #define GET_AOUTHDR_TSIZE bfd_h_get_32
97 #ifndef PUT_AOUTHDR_TSIZE
98 #define PUT_AOUTHDR_TSIZE bfd_h_put_32
100 #ifndef GET_AOUTHDR_DSIZE
101 #define GET_AOUTHDR_DSIZE bfd_h_get_32
103 #ifndef PUT_AOUTHDR_DSIZE
104 #define PUT_AOUTHDR_DSIZE bfd_h_put_32
106 #ifndef GET_AOUTHDR_BSIZE
107 #define GET_AOUTHDR_BSIZE bfd_h_get_32
109 #ifndef PUT_AOUTHDR_BSIZE
110 #define PUT_AOUTHDR_BSIZE bfd_h_put_32
112 #ifndef GET_AOUTHDR_ENTRY
113 #define GET_AOUTHDR_ENTRY bfd_h_get_32
115 #ifndef PUT_AOUTHDR_ENTRY
116 #define PUT_AOUTHDR_ENTRY bfd_h_put_32
118 #ifndef GET_AOUTHDR_TEXT_START
119 #define GET_AOUTHDR_TEXT_START bfd_h_get_32
121 #ifndef PUT_AOUTHDR_TEXT_START
122 #define PUT_AOUTHDR_TEXT_START bfd_h_put_32
124 #ifndef GET_AOUTHDR_DATA_START
125 #define GET_AOUTHDR_DATA_START bfd_h_get_32
127 #ifndef PUT_AOUTHDR_DATA_START
128 #define PUT_AOUTHDR_DATA_START bfd_h_put_32
131 /* Some fields in the scnhdr are sometimes 64 bits. */
132 #ifndef GET_SCNHDR_PADDR
133 #define GET_SCNHDR_PADDR bfd_h_get_32
135 #ifndef PUT_SCNHDR_PADDR
136 #define PUT_SCNHDR_PADDR bfd_h_put_32
138 #ifndef GET_SCNHDR_VADDR
139 #define GET_SCNHDR_VADDR bfd_h_get_32
141 #ifndef PUT_SCNHDR_VADDR
142 #define PUT_SCNHDR_VADDR bfd_h_put_32
144 #ifndef GET_SCNHDR_SIZE
145 #define GET_SCNHDR_SIZE bfd_h_get_32
147 #ifndef PUT_SCNHDR_SIZE
148 #define PUT_SCNHDR_SIZE bfd_h_put_32
150 #ifndef GET_SCNHDR_SCNPTR
151 #define GET_SCNHDR_SCNPTR bfd_h_get_32
153 #ifndef PUT_SCNHDR_SCNPTR
154 #define PUT_SCNHDR_SCNPTR bfd_h_put_32
156 #ifndef GET_SCNHDR_RELPTR
157 #define GET_SCNHDR_RELPTR bfd_h_get_32
159 #ifndef PUT_SCNHDR_RELPTR
160 #define PUT_SCNHDR_RELPTR bfd_h_put_32
162 #ifndef GET_SCNHDR_LNNOPTR
163 #define GET_SCNHDR_LNNOPTR bfd_h_get_32
165 #ifndef PUT_SCNHDR_LNNOPTR
166 #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
168 #ifndef GET_SCNHDR_NRELOC
169 #define GET_SCNHDR_NRELOC bfd_h_get_16
171 #ifndef PUT_SCNHDR_NRELOC
172 #define PUT_SCNHDR_NRELOC bfd_h_put_16
174 #ifndef GET_SCNHDR_NLNNO
175 #define GET_SCNHDR_NLNNO bfd_h_get_16
177 #ifndef PUT_SCNHDR_NLNNO
178 #define PUT_SCNHDR_NLNNO bfd_h_put_16
180 #ifndef GET_SCNHDR_FLAGS
181 #define GET_SCNHDR_FLAGS bfd_h_get_32
183 #ifndef PUT_SCNHDR_FLAGS
184 #define PUT_SCNHDR_FLAGS bfd_h_put_32
188 static void coff_swap_aouthdr_in
PARAMS ((bfd
*, PTR
, PTR
));
189 static unsigned int coff_swap_aouthdr_out
PARAMS ((bfd
*, PTR
, PTR
));
190 static void coff_swap_scnhdr_in
PARAMS ((bfd
*, PTR
, PTR
));
191 static unsigned int coff_swap_scnhdr_out
PARAMS ((bfd
*, PTR
, PTR
));
192 static void coff_swap_filehdr_in
PARAMS ((bfd
*, PTR
, PTR
));
193 static unsigned int coff_swap_filehdr_out
PARAMS ((bfd
*, PTR
, PTR
));
194 #ifndef NO_COFF_RELOCS
195 static void coff_swap_reloc_in
PARAMS ((bfd
*, PTR
, PTR
));
196 static unsigned int coff_swap_reloc_out
PARAMS ((bfd
*, PTR
, PTR
));
197 #endif /* NO_COFF_RELOCS */
198 #ifndef NO_COFF_SYMBOLS
199 static void coff_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
200 static unsigned int coff_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
201 static void coff_swap_aux_in
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
202 static unsigned int coff_swap_aux_out
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
203 #endif /* NO_COFF_SYMBOLS */
204 #ifndef NO_COFF_LINENOS
205 static void coff_swap_lineno_in
PARAMS ((bfd
*, PTR
, PTR
));
206 static unsigned int coff_swap_lineno_out
PARAMS ((bfd
*, PTR
, PTR
));
207 #endif /* NO_COFF_LINENOS */
209 #ifndef NO_COFF_RELOCS
212 coff_swap_reloc_in (abfd
, src
, dst
)
217 RELOC
*reloc_src
= (RELOC
*) src
;
218 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
220 reloc_dst
->r_vaddr
= bfd_h_get_32(abfd
, (bfd_byte
*)reloc_src
->r_vaddr
);
221 reloc_dst
->r_symndx
= bfd_h_get_signed_32(abfd
, (bfd_byte
*) reloc_src
->r_symndx
);
224 reloc_dst
->r_type
= bfd_h_get_8(abfd
, reloc_src
->r_type
);
225 reloc_dst
->r_size
= bfd_h_get_8(abfd
, reloc_src
->r_size
);
227 reloc_dst
->r_type
= bfd_h_get_16(abfd
, (bfd_byte
*) reloc_src
->r_type
);
230 #ifdef SWAP_IN_RELOC_OFFSET
231 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET(abfd
,
232 (bfd_byte
*) reloc_src
->r_offset
);
237 coff_swap_reloc_out (abfd
, src
, dst
)
242 struct internal_reloc
*reloc_src
= (struct internal_reloc
*)src
;
243 struct external_reloc
*reloc_dst
= (struct external_reloc
*)dst
;
244 bfd_h_put_32(abfd
, reloc_src
->r_vaddr
, (bfd_byte
*) reloc_dst
->r_vaddr
);
245 bfd_h_put_32(abfd
, reloc_src
->r_symndx
, (bfd_byte
*) reloc_dst
->r_symndx
);
248 bfd_h_put_8 (abfd
, reloc_src
->r_type
, (bfd_byte
*) reloc_dst
->r_type
);
249 bfd_h_put_8 (abfd
, reloc_src
->r_size
, (bfd_byte
*) reloc_dst
->r_size
);
251 bfd_h_put_16(abfd
, reloc_src
->r_type
, (bfd_byte
*)
255 #ifdef SWAP_OUT_RELOC_OFFSET
256 SWAP_OUT_RELOC_OFFSET(abfd
,
258 (bfd_byte
*) reloc_dst
->r_offset
);
260 #ifdef SWAP_OUT_RELOC_EXTRA
261 SWAP_OUT_RELOC_EXTRA(abfd
,reloc_src
, reloc_dst
);
267 #endif /* NO_COFF_RELOCS */
270 coff_swap_filehdr_in (abfd
, src
, dst
)
275 FILHDR
*filehdr_src
= (FILHDR
*) src
;
276 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
277 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
278 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
280 filehdr_dst
->f_magic
= bfd_h_get_16(abfd
, (bfd_byte
*) filehdr_src
->f_magic
);
281 filehdr_dst
->f_nscns
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_nscns
);
282 filehdr_dst
->f_timdat
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_timdat
);
283 filehdr_dst
->f_symptr
=
284 GET_FILEHDR_SYMPTR (abfd
, (bfd_byte
*) filehdr_src
->f_symptr
);
285 filehdr_dst
->f_nsyms
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_nsyms
);
286 filehdr_dst
->f_opthdr
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_opthdr
);
287 filehdr_dst
->f_flags
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_flags
);
288 #ifdef TIC80_TARGET_ID
289 filehdr_dst
->f_target_id
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_target_id
);
292 #ifdef COFF_ADJUST_FILEHDR_IN_POST
293 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
298 coff_swap_filehdr_out (abfd
, in
, out
)
303 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
304 FILHDR
*filehdr_out
= (FILHDR
*)out
;
306 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
307 COFF_ADJUST_FILEHDR_OUT_PRE (abfd
, in
, out
);
309 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
310 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
311 bfd_h_put_32(abfd
, filehdr_in
->f_timdat
, (bfd_byte
*) filehdr_out
->f_timdat
);
312 PUT_FILEHDR_SYMPTR (abfd
, (bfd_vma
) filehdr_in
->f_symptr
,
313 (bfd_byte
*) filehdr_out
->f_symptr
);
314 bfd_h_put_32(abfd
, filehdr_in
->f_nsyms
, (bfd_byte
*) filehdr_out
->f_nsyms
);
315 bfd_h_put_16(abfd
, filehdr_in
->f_opthdr
, (bfd_byte
*) filehdr_out
->f_opthdr
);
316 bfd_h_put_16(abfd
, filehdr_in
->f_flags
, (bfd_byte
*) filehdr_out
->f_flags
);
317 #ifdef TIC80_TARGET_ID
318 bfd_h_put_16(abfd
, filehdr_in
->f_target_id
, (bfd_byte
*) filehdr_out
->f_target_id
);
321 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
322 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
328 #ifndef NO_COFF_SYMBOLS
331 coff_swap_sym_in (abfd
, ext1
, in1
)
336 SYMENT
*ext
= (SYMENT
*)ext1
;
337 struct internal_syment
*in
= (struct internal_syment
*)in1
;
339 if( ext
->e
.e_name
[0] == 0) {
340 in
->_n
._n_n
._n_zeroes
= 0;
341 in
->_n
._n_n
._n_offset
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
344 #if SYMNMLEN != E_SYMNMLEN
345 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
347 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
350 in
->n_value
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_value
);
351 in
->n_scnum
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_scnum
);
352 if (sizeof(ext
->e_type
) == 2){
353 in
->n_type
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_type
);
356 in
->n_type
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_type
);
358 in
->n_sclass
= bfd_h_get_8(abfd
, ext
->e_sclass
);
359 in
->n_numaux
= bfd_h_get_8(abfd
, ext
->e_numaux
);
363 coff_swap_sym_out (abfd
, inp
, extp
)
368 struct internal_syment
*in
= (struct internal_syment
*)inp
;
369 SYMENT
*ext
=(SYMENT
*)extp
;
370 if(in
->_n
._n_name
[0] == 0) {
371 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
372 bfd_h_put_32(abfd
, in
->_n
._n_n
._n_offset
, (bfd_byte
*) 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
);
381 bfd_h_put_32(abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
382 bfd_h_put_16(abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
383 if (sizeof(ext
->e_type
) == 2)
385 bfd_h_put_16(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
389 bfd_h_put_32(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
391 bfd_h_put_8(abfd
, in
->n_sclass
, ext
->e_sclass
);
392 bfd_h_put_8(abfd
, in
->n_numaux
, ext
->e_numaux
);
397 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
406 AUXENT
*ext
= (AUXENT
*)ext1
;
407 union internal_auxent
*in
= (union internal_auxent
*)in1
;
409 #ifdef COFF_ADJUST_AUX_IN_PRE
410 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
414 if (ext
->x_file
.x_fname
[0] == 0) {
415 in
->x_file
.x_n
.x_zeroes
= 0;
416 in
->x_file
.x_n
.x_offset
=
417 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
419 #if FILNMLEN != E_FILNMLEN
420 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
425 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
426 numaux
* sizeof (AUXENT
));
430 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
436 /* RS/6000 "csect" auxents */
440 if (indx
+ 1 == numaux
)
442 in
->x_csect
.x_scnlen
.l
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_scnlen
);
443 in
->x_csect
.x_parmhash
= bfd_h_get_32 (abfd
,
444 ext
->x_csect
.x_parmhash
);
445 in
->x_csect
.x_snhash
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snhash
);
446 /* We don't have to hack bitfields in x_smtyp because it's
447 defined by shifts-and-ands, which are equivalent on all
449 in
->x_csect
.x_smtyp
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smtyp
);
450 in
->x_csect
.x_smclas
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smclas
);
451 in
->x_csect
.x_stab
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_stab
);
452 in
->x_csect
.x_snstab
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snstab
);
463 if (type
== T_NULL
) {
464 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN(abfd
, ext
);
465 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC(abfd
, ext
);
466 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO(abfd
, ext
);
468 /* PE defines some extra fields; we zero them out for
470 in
->x_scn
.x_checksum
= 0;
471 in
->x_scn
.x_associated
= 0;
472 in
->x_scn
.x_comdat
= 0;
479 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
481 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
484 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
486 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
487 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
491 #if DIMNUM != E_DIMNUM
492 #error we need to cope with truncating or extending DIMNUM
494 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
495 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
496 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
497 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
498 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
499 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
500 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
501 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
505 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
508 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO(abfd
, ext
);
509 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE(abfd
, ext
);
513 /* the semicolon is because MSVC doesn't like labels at
516 #ifdef COFF_ADJUST_AUX_IN_POST
517 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
522 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
527 int indx ATTRIBUTE_UNUSED
;
528 int numaux ATTRIBUTE_UNUSED
;
531 union internal_auxent
*in
= (union internal_auxent
*)inp
;
532 AUXENT
*ext
= (AUXENT
*)extp
;
534 #ifdef COFF_ADJUST_AUX_OUT_PRE
535 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, class, indx
, numaux
, extp
);
537 memset((PTR
)ext
, 0, AUXESZ
);
540 if (in
->x_file
.x_fname
[0] == 0) {
541 PUTWORD(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
543 in
->x_file
.x_n
.x_offset
,
544 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
547 #if FILNMLEN != E_FILNMLEN
548 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
550 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
556 /* RS/6000 "csect" auxents */
559 if (indx
+ 1 == numaux
)
561 PUTWORD (abfd
, in
->x_csect
.x_scnlen
.l
, ext
->x_csect
.x_scnlen
);
562 PUTWORD (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
563 PUTHALF (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
564 /* We don't have to hack bitfields in x_smtyp because it's
565 defined by shifts-and-ands, which are equivalent on all
567 PUTBYTE (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
568 PUTBYTE (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
569 PUTWORD (abfd
, in
->x_csect
.x_stab
, ext
->x_csect
.x_stab
);
570 PUTHALF (abfd
, in
->x_csect
.x_snstab
, ext
->x_csect
.x_snstab
);
581 if (type
== T_NULL
) {
582 PUT_SCN_SCNLEN(abfd
, in
->x_scn
.x_scnlen
, ext
);
583 PUT_SCN_NRELOC(abfd
, in
->x_scn
.x_nreloc
, ext
);
584 PUT_SCN_NLINNO(abfd
, in
->x_scn
.x_nlinno
, ext
);
590 PUTWORD(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
592 bfd_h_put_16(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
595 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
597 PUT_FCN_LNNOPTR(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
598 PUT_FCN_ENDNDX(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
602 #if DIMNUM != E_DIMNUM
603 #error we need to cope with truncating or extending DIMNUM
605 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
606 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
607 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
608 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
609 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
610 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
611 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
612 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
616 PUTWORD (abfd
, in
->x_sym
.x_misc
.x_fsize
,
617 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
620 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
621 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
625 #ifdef COFF_ADJUST_AUX_OUT_POST
626 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, class, indx
, numaux
, extp
);
631 #endif /* NO_COFF_SYMBOLS */
633 #ifndef NO_COFF_LINENOS
636 coff_swap_lineno_in (abfd
, ext1
, in1
)
641 LINENO
*ext
= (LINENO
*)ext1
;
642 struct internal_lineno
*in
= (struct internal_lineno
*)in1
;
644 in
->l_addr
.l_symndx
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->l_addr
.l_symndx
);
645 in
->l_lnno
= GET_LINENO_LNNO(abfd
, ext
);
649 coff_swap_lineno_out (abfd
, inp
, outp
)
654 struct internal_lineno
*in
= (struct internal_lineno
*)inp
;
655 struct external_lineno
*ext
= (struct external_lineno
*)outp
;
656 PUTWORD(abfd
, in
->l_addr
.l_symndx
, (bfd_byte
*)
657 ext
->l_addr
.l_symndx
);
659 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
663 #endif /* NO_COFF_LINENOS */
666 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
671 AOUTHDR
*aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
672 struct internal_aouthdr
*aouthdr_int
= (struct internal_aouthdr
*)aouthdr_int1
;
674 aouthdr_int
->magic
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->magic
);
675 aouthdr_int
->vstamp
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->vstamp
);
677 GET_AOUTHDR_TSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->tsize
);
679 GET_AOUTHDR_DSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->dsize
);
681 GET_AOUTHDR_BSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->bsize
);
683 GET_AOUTHDR_ENTRY (abfd
, (bfd_byte
*) aouthdr_ext
->entry
);
684 aouthdr_int
->text_start
=
685 GET_AOUTHDR_TEXT_START (abfd
, (bfd_byte
*) aouthdr_ext
->text_start
);
686 aouthdr_int
->data_start
=
687 GET_AOUTHDR_DATA_START (abfd
, (bfd_byte
*) aouthdr_ext
->data_start
);
690 aouthdr_int
->tagentries
= bfd_h_get_32(abfd
, (bfd_byte
*) aouthdr_ext
->tagentries
);
694 bfd_h_put_32(abfd
, aouthdr_int
->o_inlib
, (bfd_byte
*) aouthdr_ext
->o_inlib
);
695 bfd_h_put_32(abfd
, aouthdr_int
->o_sri
, (bfd_byte
*) aouthdr_ext
->o_sri
);
696 bfd_h_put_32(abfd
, aouthdr_int
->vid
[0], (bfd_byte
*) aouthdr_ext
->vid
);
697 bfd_h_put_32(abfd
, aouthdr_int
->vid
[1], (bfd_byte
*) aouthdr_ext
->vid
+ 4);
702 aouthdr_int
->o_toc
= bfd_h_get_32(abfd
, aouthdr_ext
->o_toc
);
703 aouthdr_int
->o_snentry
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snentry
);
704 aouthdr_int
->o_sntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntext
);
705 aouthdr_int
->o_sndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sndata
);
706 aouthdr_int
->o_sntoc
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntoc
);
707 aouthdr_int
->o_snloader
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snloader
);
708 aouthdr_int
->o_snbss
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snbss
);
709 aouthdr_int
->o_algntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algntext
);
710 aouthdr_int
->o_algndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algndata
);
711 aouthdr_int
->o_modtype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_modtype
);
712 aouthdr_int
->o_cputype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_cputype
);
713 aouthdr_int
->o_maxstack
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxstack
);
714 aouthdr_int
->o_maxdata
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxdata
);
718 aouthdr_int
->bss_start
= bfd_h_get_32(abfd
, aouthdr_ext
->bss_start
);
719 aouthdr_int
->gp_value
= bfd_h_get_32(abfd
, aouthdr_ext
->gp_value
);
720 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
721 aouthdr_int
->cprmask
[0] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[0]);
722 aouthdr_int
->cprmask
[1] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[1]);
723 aouthdr_int
->cprmask
[2] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[2]);
724 aouthdr_int
->cprmask
[3] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[3]);
728 aouthdr_int
->bss_start
= bfd_h_get_64(abfd
, aouthdr_ext
->bss_start
);
729 aouthdr_int
->gp_value
= bfd_h_get_64(abfd
, aouthdr_ext
->gp_value
);
730 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
731 aouthdr_int
->fprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->fprmask
);
736 coff_swap_aouthdr_out (abfd
, in
, out
)
741 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
742 AOUTHDR
*aouthdr_out
= (AOUTHDR
*)out
;
744 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->magic
);
745 bfd_h_put_16(abfd
, aouthdr_in
->vstamp
, (bfd_byte
*) aouthdr_out
->vstamp
);
746 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->tsize
);
747 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->dsize
);
748 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->bsize
);
749 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->entry
);
750 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
751 (bfd_byte
*) aouthdr_out
->text_start
);
752 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
753 (bfd_byte
*) aouthdr_out
->data_start
);
756 bfd_h_put_32(abfd
, aouthdr_in
->tagentries
, (bfd_byte
*) aouthdr_out
->tagentries
);
760 bfd_h_put_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
761 bfd_h_put_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
762 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
763 bfd_h_put_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
764 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
765 bfd_h_put_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
766 bfd_h_put_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
767 bfd_h_put_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
768 bfd_h_put_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
769 bfd_h_put_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
770 bfd_h_put_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
771 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
772 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
773 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
777 bfd_h_put_32(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
778 bfd_h_put_32(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
779 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
780 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[0], (bfd_byte
*) aouthdr_out
->cprmask
[0]);
781 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[1], (bfd_byte
*) aouthdr_out
->cprmask
[1]);
782 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[2], (bfd_byte
*) aouthdr_out
->cprmask
[2]);
783 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[3], (bfd_byte
*) aouthdr_out
->cprmask
[3]);
787 /* FIXME: What does bldrev mean? */
788 bfd_h_put_16(abfd
, (bfd_vma
) 2, (bfd_byte
*) aouthdr_out
->bldrev
);
789 bfd_h_put_16(abfd
, (bfd_vma
) 0, (bfd_byte
*) aouthdr_out
->padding
);
790 bfd_h_put_64(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
791 bfd_h_put_64(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
792 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
793 bfd_h_put_32(abfd
, aouthdr_in
->fprmask
, (bfd_byte
*) aouthdr_out
->fprmask
);
800 coff_swap_scnhdr_in (abfd
, ext
, in
)
805 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
806 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
808 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
809 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
811 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof(scnhdr_int
->s_name
));
812 scnhdr_int
->s_vaddr
=
813 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
814 scnhdr_int
->s_paddr
=
815 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
817 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
819 scnhdr_int
->s_scnptr
=
820 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
821 scnhdr_int
->s_relptr
=
822 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
823 scnhdr_int
->s_lnnoptr
=
824 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
825 scnhdr_int
->s_flags
=
826 GET_SCNHDR_FLAGS (abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
827 scnhdr_int
->s_nreloc
=
828 GET_SCNHDR_NRELOC (abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
829 scnhdr_int
->s_nlnno
=
830 GET_SCNHDR_NLNNO (abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
832 scnhdr_int
->s_align
=
833 GET_SCNHDR_ALIGN (abfd
, (bfd_byte
*) scnhdr_ext
->s_align
);
835 #ifdef COFF_ADJUST_SCNHDR_IN_POST
836 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
841 coff_swap_scnhdr_out (abfd
, in
, out
)
846 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
847 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
848 unsigned int ret
= SCNHSZ
;
850 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
851 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
853 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof(scnhdr_int
->s_name
));
855 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
,
856 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
859 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
,
860 (bfd_byte
*) scnhdr_ext
->s_paddr
);
861 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
,
862 (bfd_byte
*) scnhdr_ext
->s_size
);
864 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
865 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
866 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
867 (bfd_byte
*) scnhdr_ext
->s_relptr
);
868 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
869 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
870 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
,
871 (bfd_byte
*) scnhdr_ext
->s_flags
);
873 PUTWORD(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
874 PUTWORD(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
876 if (scnhdr_int
->s_nlnno
<= 0xffff)
877 PUTHALF(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
880 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
882 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
883 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
884 (*_bfd_error_handler
)
885 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
886 bfd_get_filename (abfd
),
887 buf
, scnhdr_int
->s_nlnno
);
888 PUTHALF (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
890 if (scnhdr_int
->s_nreloc
<= 0xffff)
891 PUTHALF(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
894 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
896 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
897 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
898 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
899 bfd_get_filename (abfd
),
900 buf
, scnhdr_int
->s_nreloc
);
901 bfd_set_error (bfd_error_file_truncated
);
902 PUTHALF (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
908 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, (bfd_byte
*) scnhdr_ext
->s_align
);
910 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
911 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);