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
);
264 return bfd_coff_relsz (abfd
);
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
);
324 return bfd_coff_filhsz (abfd
);
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
);
360 #ifdef COFF_ADJUST_SYM_IN_POST
361 COFF_ADJUST_SYM_IN_POST (abfd
, ext1
, in1
);
366 coff_swap_sym_out (abfd
, inp
, extp
)
371 struct internal_syment
*in
= (struct internal_syment
*)inp
;
372 SYMENT
*ext
=(SYMENT
*)extp
;
373 if(in
->_n
._n_name
[0] == 0) {
374 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
375 bfd_h_put_32(abfd
, in
->_n
._n_n
._n_offset
, (bfd_byte
*) ext
->e
.e
.e_offset
);
378 #if SYMNMLEN != E_SYMNMLEN
379 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
381 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
384 bfd_h_put_32(abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
385 bfd_h_put_16(abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
386 if (sizeof(ext
->e_type
) == 2)
388 bfd_h_put_16(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
392 bfd_h_put_32(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
394 bfd_h_put_8(abfd
, in
->n_sclass
, ext
->e_sclass
);
395 bfd_h_put_8(abfd
, in
->n_numaux
, ext
->e_numaux
);
396 #ifdef COFF_ADJUST_SYM_OUT_POST
397 COFF_ADJUST_SYM_OUT_POST (abfd
, inp
, extp
);
403 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
412 AUXENT
*ext
= (AUXENT
*)ext1
;
413 union internal_auxent
*in
= (union internal_auxent
*)in1
;
415 #ifdef COFF_ADJUST_AUX_IN_PRE
416 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
420 if (ext
->x_file
.x_fname
[0] == 0) {
421 in
->x_file
.x_n
.x_zeroes
= 0;
422 in
->x_file
.x_n
.x_offset
=
423 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
425 #if FILNMLEN != E_FILNMLEN
426 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
431 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
432 numaux
* sizeof (AUXENT
));
436 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
442 /* RS/6000 "csect" auxents */
446 if (indx
+ 1 == numaux
)
448 in
->x_csect
.x_scnlen
.l
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_scnlen
);
449 in
->x_csect
.x_parmhash
= bfd_h_get_32 (abfd
,
450 ext
->x_csect
.x_parmhash
);
451 in
->x_csect
.x_snhash
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snhash
);
452 /* We don't have to hack bitfields in x_smtyp because it's
453 defined by shifts-and-ands, which are equivalent on all
455 in
->x_csect
.x_smtyp
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smtyp
);
456 in
->x_csect
.x_smclas
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smclas
);
457 in
->x_csect
.x_stab
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_stab
);
458 in
->x_csect
.x_snstab
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snstab
);
469 if (type
== T_NULL
) {
470 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN(abfd
, ext
);
471 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC(abfd
, ext
);
472 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO(abfd
, ext
);
474 /* PE defines some extra fields; we zero them out for
476 in
->x_scn
.x_checksum
= 0;
477 in
->x_scn
.x_associated
= 0;
478 in
->x_scn
.x_comdat
= 0;
485 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
487 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
490 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
492 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
493 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
497 #if DIMNUM != E_DIMNUM
498 #error we need to cope with truncating or extending DIMNUM
500 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
501 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
502 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
503 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
504 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
505 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
506 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
507 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
511 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
514 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO(abfd
, ext
);
515 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE(abfd
, ext
);
519 /* the semicolon is because MSVC doesn't like labels at
522 #ifdef COFF_ADJUST_AUX_IN_POST
523 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
528 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
533 int indx ATTRIBUTE_UNUSED
;
534 int numaux ATTRIBUTE_UNUSED
;
537 union internal_auxent
*in
= (union internal_auxent
*)inp
;
538 AUXENT
*ext
= (AUXENT
*)extp
;
540 #ifdef COFF_ADJUST_AUX_OUT_PRE
541 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, class, indx
, numaux
, extp
);
543 memset((PTR
)ext
, 0, AUXESZ
);
546 if (in
->x_file
.x_fname
[0] == 0) {
547 PUTWORD(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
549 in
->x_file
.x_n
.x_offset
,
550 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
553 #if FILNMLEN != E_FILNMLEN
554 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
556 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
562 /* RS/6000 "csect" auxents */
565 if (indx
+ 1 == numaux
)
567 PUTWORD (abfd
, in
->x_csect
.x_scnlen
.l
, ext
->x_csect
.x_scnlen
);
568 PUTWORD (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
569 PUTHALF (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
570 /* We don't have to hack bitfields in x_smtyp because it's
571 defined by shifts-and-ands, which are equivalent on all
573 PUTBYTE (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
574 PUTBYTE (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
575 PUTWORD (abfd
, in
->x_csect
.x_stab
, ext
->x_csect
.x_stab
);
576 PUTHALF (abfd
, in
->x_csect
.x_snstab
, ext
->x_csect
.x_snstab
);
587 if (type
== T_NULL
) {
588 PUT_SCN_SCNLEN(abfd
, in
->x_scn
.x_scnlen
, ext
);
589 PUT_SCN_NRELOC(abfd
, in
->x_scn
.x_nreloc
, ext
);
590 PUT_SCN_NLINNO(abfd
, in
->x_scn
.x_nlinno
, ext
);
596 PUTWORD(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
598 bfd_h_put_16(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
601 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
603 PUT_FCN_LNNOPTR(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
604 PUT_FCN_ENDNDX(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
608 #if DIMNUM != E_DIMNUM
609 #error we need to cope with truncating or extending DIMNUM
611 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
612 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
613 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
614 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
615 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
616 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
617 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
618 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
622 PUTWORD (abfd
, in
->x_sym
.x_misc
.x_fsize
,
623 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
626 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
627 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
631 #ifdef COFF_ADJUST_AUX_OUT_POST
632 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, class, indx
, numaux
, extp
);
637 #endif /* NO_COFF_SYMBOLS */
639 #ifndef NO_COFF_LINENOS
642 coff_swap_lineno_in (abfd
, ext1
, in1
)
647 LINENO
*ext
= (LINENO
*)ext1
;
648 struct internal_lineno
*in
= (struct internal_lineno
*)in1
;
650 in
->l_addr
.l_symndx
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->l_addr
.l_symndx
);
651 in
->l_lnno
= GET_LINENO_LNNO(abfd
, ext
);
655 coff_swap_lineno_out (abfd
, inp
, outp
)
660 struct internal_lineno
*in
= (struct internal_lineno
*)inp
;
661 struct external_lineno
*ext
= (struct external_lineno
*)outp
;
662 PUTWORD(abfd
, in
->l_addr
.l_symndx
, (bfd_byte
*)
663 ext
->l_addr
.l_symndx
);
665 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
669 #endif /* NO_COFF_LINENOS */
672 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
677 AOUTHDR
*aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
678 struct internal_aouthdr
*aouthdr_int
= (struct internal_aouthdr
*)aouthdr_int1
;
680 aouthdr_int
->magic
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->magic
);
681 aouthdr_int
->vstamp
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->vstamp
);
683 GET_AOUTHDR_TSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->tsize
);
685 GET_AOUTHDR_DSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->dsize
);
687 GET_AOUTHDR_BSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->bsize
);
689 GET_AOUTHDR_ENTRY (abfd
, (bfd_byte
*) aouthdr_ext
->entry
);
690 aouthdr_int
->text_start
=
691 GET_AOUTHDR_TEXT_START (abfd
, (bfd_byte
*) aouthdr_ext
->text_start
);
692 aouthdr_int
->data_start
=
693 GET_AOUTHDR_DATA_START (abfd
, (bfd_byte
*) aouthdr_ext
->data_start
);
696 aouthdr_int
->tagentries
= bfd_h_get_32(abfd
, (bfd_byte
*) aouthdr_ext
->tagentries
);
700 bfd_h_put_32(abfd
, aouthdr_int
->o_inlib
, (bfd_byte
*) aouthdr_ext
->o_inlib
);
701 bfd_h_put_32(abfd
, aouthdr_int
->o_sri
, (bfd_byte
*) aouthdr_ext
->o_sri
);
702 bfd_h_put_32(abfd
, aouthdr_int
->vid
[0], (bfd_byte
*) aouthdr_ext
->vid
);
703 bfd_h_put_32(abfd
, aouthdr_int
->vid
[1], (bfd_byte
*) aouthdr_ext
->vid
+ 4);
708 aouthdr_int
->o_toc
= bfd_h_get_32(abfd
, aouthdr_ext
->o_toc
);
709 aouthdr_int
->o_snentry
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snentry
);
710 aouthdr_int
->o_sntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntext
);
711 aouthdr_int
->o_sndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sndata
);
712 aouthdr_int
->o_sntoc
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntoc
);
713 aouthdr_int
->o_snloader
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snloader
);
714 aouthdr_int
->o_snbss
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snbss
);
715 aouthdr_int
->o_algntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algntext
);
716 aouthdr_int
->o_algndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algndata
);
717 aouthdr_int
->o_modtype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_modtype
);
718 aouthdr_int
->o_cputype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_cputype
);
719 aouthdr_int
->o_maxstack
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxstack
);
720 aouthdr_int
->o_maxdata
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxdata
);
724 aouthdr_int
->bss_start
= bfd_h_get_32(abfd
, aouthdr_ext
->bss_start
);
725 aouthdr_int
->gp_value
= bfd_h_get_32(abfd
, aouthdr_ext
->gp_value
);
726 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
727 aouthdr_int
->cprmask
[0] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[0]);
728 aouthdr_int
->cprmask
[1] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[1]);
729 aouthdr_int
->cprmask
[2] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[2]);
730 aouthdr_int
->cprmask
[3] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[3]);
734 aouthdr_int
->bss_start
= bfd_h_get_64(abfd
, aouthdr_ext
->bss_start
);
735 aouthdr_int
->gp_value
= bfd_h_get_64(abfd
, aouthdr_ext
->gp_value
);
736 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
737 aouthdr_int
->fprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->fprmask
);
742 coff_swap_aouthdr_out (abfd
, in
, out
)
747 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
748 AOUTHDR
*aouthdr_out
= (AOUTHDR
*)out
;
750 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->magic
);
751 bfd_h_put_16(abfd
, aouthdr_in
->vstamp
, (bfd_byte
*) aouthdr_out
->vstamp
);
752 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->tsize
);
753 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->dsize
);
754 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->bsize
);
755 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->entry
);
756 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
757 (bfd_byte
*) aouthdr_out
->text_start
);
758 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
759 (bfd_byte
*) aouthdr_out
->data_start
);
762 bfd_h_put_32(abfd
, aouthdr_in
->tagentries
, (bfd_byte
*) aouthdr_out
->tagentries
);
766 bfd_h_put_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
767 bfd_h_put_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
768 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
769 bfd_h_put_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
770 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
771 bfd_h_put_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
772 bfd_h_put_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
773 bfd_h_put_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
774 bfd_h_put_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
775 bfd_h_put_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
776 bfd_h_put_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
777 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
778 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
779 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
783 bfd_h_put_32(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
784 bfd_h_put_32(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
785 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
786 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[0], (bfd_byte
*) aouthdr_out
->cprmask
[0]);
787 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[1], (bfd_byte
*) aouthdr_out
->cprmask
[1]);
788 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[2], (bfd_byte
*) aouthdr_out
->cprmask
[2]);
789 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[3], (bfd_byte
*) aouthdr_out
->cprmask
[3]);
793 /* FIXME: What does bldrev mean? */
794 bfd_h_put_16(abfd
, (bfd_vma
) 2, (bfd_byte
*) aouthdr_out
->bldrev
);
795 bfd_h_put_16(abfd
, (bfd_vma
) 0, (bfd_byte
*) aouthdr_out
->padding
);
796 bfd_h_put_64(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
797 bfd_h_put_64(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
798 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
799 bfd_h_put_32(abfd
, aouthdr_in
->fprmask
, (bfd_byte
*) aouthdr_out
->fprmask
);
806 coff_swap_scnhdr_in (abfd
, ext
, in
)
811 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
812 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
814 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
815 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
817 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof(scnhdr_int
->s_name
));
818 scnhdr_int
->s_vaddr
=
819 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
820 scnhdr_int
->s_paddr
=
821 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
823 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
825 scnhdr_int
->s_scnptr
=
826 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
827 scnhdr_int
->s_relptr
=
828 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
829 scnhdr_int
->s_lnnoptr
=
830 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
831 scnhdr_int
->s_flags
=
832 GET_SCNHDR_FLAGS (abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
833 scnhdr_int
->s_nreloc
=
834 GET_SCNHDR_NRELOC (abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
835 scnhdr_int
->s_nlnno
=
836 GET_SCNHDR_NLNNO (abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
838 scnhdr_int
->s_align
=
839 GET_SCNHDR_ALIGN (abfd
, (bfd_byte
*) scnhdr_ext
->s_align
);
841 #ifdef COFF_ADJUST_SCNHDR_IN_POST
842 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
847 coff_swap_scnhdr_out (abfd
, in
, out
)
852 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
853 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
854 unsigned int ret
= bfd_coff_scnhsz (abfd
);
856 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
857 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
859 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof(scnhdr_int
->s_name
));
861 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
,
862 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
865 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
,
866 (bfd_byte
*) scnhdr_ext
->s_paddr
);
867 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
,
868 (bfd_byte
*) scnhdr_ext
->s_size
);
870 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
871 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
872 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
873 (bfd_byte
*) scnhdr_ext
->s_relptr
);
874 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
875 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
876 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
,
877 (bfd_byte
*) scnhdr_ext
->s_flags
);
879 PUTWORD(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
880 PUTWORD(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
882 if (scnhdr_int
->s_nlnno
<= 0xffff)
883 PUTHALF(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
886 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
888 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
889 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
890 (*_bfd_error_handler
)
891 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
892 bfd_get_filename (abfd
),
893 buf
, scnhdr_int
->s_nlnno
);
894 PUTHALF (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
896 if (scnhdr_int
->s_nreloc
<= 0xffff)
897 PUTHALF(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
900 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
902 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
903 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
904 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
905 bfd_get_filename (abfd
),
906 buf
, scnhdr_int
->s_nreloc
);
907 bfd_set_error (bfd_error_file_truncated
);
908 PUTHALF (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
914 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, (bfd_byte
*) scnhdr_ext
->s_align
);
916 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
917 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);