1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1999, 2000
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 MAX_SCNHDR_NRELOC
172 #define MAX_SCNHDR_NRELOC 0xffff
174 #ifndef PUT_SCNHDR_NRELOC
175 #define PUT_SCNHDR_NRELOC bfd_h_put_16
177 #ifndef GET_SCNHDR_NLNNO
178 #define GET_SCNHDR_NLNNO bfd_h_get_16
180 #ifndef MAX_SCNHDR_NLNNO
181 #define MAX_SCNHDR_NLNNO 0xffff
183 #ifndef PUT_SCNHDR_NLNNO
184 #define PUT_SCNHDR_NLNNO bfd_h_put_16
186 #ifndef GET_SCNHDR_FLAGS
187 #define GET_SCNHDR_FLAGS bfd_h_get_32
189 #ifndef PUT_SCNHDR_FLAGS
190 #define PUT_SCNHDR_FLAGS bfd_h_put_32
193 #ifndef GET_RELOC_VADDR
194 #define GET_RELOC_VADDR bfd_h_get_32
196 #ifndef PUT_RELOC_VADDR
197 #define PUT_RELOC_VADDR bfd_h_put_32
200 static void coff_swap_aouthdr_in
PARAMS ((bfd
*, PTR
, PTR
));
201 static unsigned int coff_swap_aouthdr_out
PARAMS ((bfd
*, PTR
, PTR
));
202 static void coff_swap_scnhdr_in
PARAMS ((bfd
*, PTR
, PTR
));
203 static unsigned int coff_swap_scnhdr_out
PARAMS ((bfd
*, PTR
, PTR
));
204 static void coff_swap_filehdr_in
PARAMS ((bfd
*, PTR
, PTR
));
205 static unsigned int coff_swap_filehdr_out
PARAMS ((bfd
*, PTR
, PTR
));
206 #ifndef NO_COFF_RELOCS
207 static void coff_swap_reloc_in
PARAMS ((bfd
*, PTR
, PTR
));
208 static unsigned int coff_swap_reloc_out
PARAMS ((bfd
*, PTR
, PTR
));
209 #endif /* NO_COFF_RELOCS */
210 #ifndef NO_COFF_SYMBOLS
211 static void coff_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
212 static unsigned int coff_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
213 static void coff_swap_aux_in
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
214 static unsigned int coff_swap_aux_out
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
215 #endif /* NO_COFF_SYMBOLS */
216 #ifndef NO_COFF_LINENOS
217 static void coff_swap_lineno_in
PARAMS ((bfd
*, PTR
, PTR
));
218 static unsigned int coff_swap_lineno_out
PARAMS ((bfd
*, PTR
, PTR
));
219 #endif /* NO_COFF_LINENOS */
221 #ifndef NO_COFF_RELOCS
224 coff_swap_reloc_in (abfd
, src
, dst
)
229 RELOC
*reloc_src
= (RELOC
*) src
;
230 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
232 reloc_dst
->r_vaddr
= GET_RELOC_VADDR (abfd
, (bfd_byte
*)reloc_src
->r_vaddr
);
233 reloc_dst
->r_symndx
= bfd_h_get_signed_32(abfd
, (bfd_byte
*) reloc_src
->r_symndx
);
236 reloc_dst
->r_type
= bfd_h_get_8(abfd
, reloc_src
->r_type
);
237 reloc_dst
->r_size
= bfd_h_get_8(abfd
, reloc_src
->r_size
);
239 reloc_dst
->r_type
= bfd_h_get_16(abfd
, (bfd_byte
*) reloc_src
->r_type
);
242 #ifdef SWAP_IN_RELOC_OFFSET
243 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET(abfd
,
244 (bfd_byte
*) reloc_src
->r_offset
);
249 coff_swap_reloc_out (abfd
, src
, dst
)
254 struct internal_reloc
*reloc_src
= (struct internal_reloc
*)src
;
255 struct external_reloc
*reloc_dst
= (struct external_reloc
*)dst
;
256 PUT_RELOC_VADDR (abfd
, reloc_src
->r_vaddr
, (bfd_byte
*) reloc_dst
->r_vaddr
);
257 bfd_h_put_32(abfd
, reloc_src
->r_symndx
, (bfd_byte
*) reloc_dst
->r_symndx
);
260 bfd_h_put_8 (abfd
, reloc_src
->r_type
, (bfd_byte
*) reloc_dst
->r_type
);
261 bfd_h_put_8 (abfd
, reloc_src
->r_size
, (bfd_byte
*) reloc_dst
->r_size
);
263 bfd_h_put_16(abfd
, reloc_src
->r_type
, (bfd_byte
*)
267 #ifdef SWAP_OUT_RELOC_OFFSET
268 SWAP_OUT_RELOC_OFFSET(abfd
,
270 (bfd_byte
*) reloc_dst
->r_offset
);
272 #ifdef SWAP_OUT_RELOC_EXTRA
273 SWAP_OUT_RELOC_EXTRA(abfd
,reloc_src
, reloc_dst
);
276 return bfd_coff_relsz (abfd
);
279 #endif /* NO_COFF_RELOCS */
282 coff_swap_filehdr_in (abfd
, src
, dst
)
287 FILHDR
*filehdr_src
= (FILHDR
*) src
;
288 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
290 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
291 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
293 filehdr_dst
->f_magic
= bfd_h_get_16(abfd
, (bfd_byte
*) filehdr_src
->f_magic
);
294 filehdr_dst
->f_nscns
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_nscns
);
295 filehdr_dst
->f_timdat
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_timdat
);
296 filehdr_dst
->f_symptr
=
297 GET_FILEHDR_SYMPTR (abfd
, (bfd_byte
*) filehdr_src
->f_symptr
);
298 filehdr_dst
->f_nsyms
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_nsyms
);
299 filehdr_dst
->f_opthdr
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_opthdr
);
300 filehdr_dst
->f_flags
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_flags
);
301 #ifdef TIC80_TARGET_ID
302 filehdr_dst
->f_target_id
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_target_id
);
305 #ifdef COFF_ADJUST_FILEHDR_IN_POST
306 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
311 coff_swap_filehdr_out (abfd
, in
, out
)
316 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
317 FILHDR
*filehdr_out
= (FILHDR
*)out
;
319 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
320 COFF_ADJUST_FILEHDR_OUT_PRE (abfd
, in
, out
);
322 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
323 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
324 bfd_h_put_32(abfd
, filehdr_in
->f_timdat
, (bfd_byte
*) filehdr_out
->f_timdat
);
325 PUT_FILEHDR_SYMPTR (abfd
, (bfd_vma
) filehdr_in
->f_symptr
,
326 (bfd_byte
*) filehdr_out
->f_symptr
);
327 bfd_h_put_32(abfd
, filehdr_in
->f_nsyms
, (bfd_byte
*) filehdr_out
->f_nsyms
);
328 bfd_h_put_16(abfd
, filehdr_in
->f_opthdr
, (bfd_byte
*) filehdr_out
->f_opthdr
);
329 bfd_h_put_16(abfd
, filehdr_in
->f_flags
, (bfd_byte
*) filehdr_out
->f_flags
);
330 #ifdef TIC80_TARGET_ID
331 bfd_h_put_16(abfd
, filehdr_in
->f_target_id
, (bfd_byte
*) filehdr_out
->f_target_id
);
334 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
335 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
337 return bfd_coff_filhsz (abfd
);
340 #ifndef NO_COFF_SYMBOLS
343 coff_swap_sym_in (abfd
, ext1
, in1
)
348 SYMENT
*ext
= (SYMENT
*)ext1
;
349 struct internal_syment
*in
= (struct internal_syment
*)in1
;
351 if( ext
->e
.e_name
[0] == 0) {
352 in
->_n
._n_n
._n_zeroes
= 0;
353 in
->_n
._n_n
._n_offset
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
356 #if SYMNMLEN != E_SYMNMLEN
357 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
359 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
362 in
->n_value
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_value
);
363 in
->n_scnum
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_scnum
);
364 if (sizeof (ext
->e_type
) == 2){
365 in
->n_type
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_type
);
368 in
->n_type
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_type
);
370 in
->n_sclass
= bfd_h_get_8(abfd
, ext
->e_sclass
);
371 in
->n_numaux
= bfd_h_get_8(abfd
, ext
->e_numaux
);
372 #ifdef COFF_ADJUST_SYM_IN_POST
373 COFF_ADJUST_SYM_IN_POST (abfd
, ext1
, in1
);
378 coff_swap_sym_out (abfd
, inp
, extp
)
383 struct internal_syment
*in
= (struct internal_syment
*)inp
;
384 SYMENT
*ext
=(SYMENT
*)extp
;
385 if(in
->_n
._n_name
[0] == 0) {
386 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
387 bfd_h_put_32(abfd
, in
->_n
._n_n
._n_offset
, (bfd_byte
*) ext
->e
.e
.e_offset
);
390 #if SYMNMLEN != E_SYMNMLEN
391 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
393 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
396 bfd_h_put_32(abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
397 bfd_h_put_16(abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
398 if (sizeof (ext
->e_type
) == 2)
400 bfd_h_put_16(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
404 bfd_h_put_32(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
406 bfd_h_put_8(abfd
, in
->n_sclass
, ext
->e_sclass
);
407 bfd_h_put_8(abfd
, in
->n_numaux
, ext
->e_numaux
);
408 #ifdef COFF_ADJUST_SYM_OUT_POST
409 COFF_ADJUST_SYM_OUT_POST (abfd
, inp
, extp
);
415 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
424 AUXENT
*ext
= (AUXENT
*)ext1
;
425 union internal_auxent
*in
= (union internal_auxent
*)in1
;
427 #ifdef COFF_ADJUST_AUX_IN_PRE
428 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
432 if (ext
->x_file
.x_fname
[0] == 0) {
433 in
->x_file
.x_n
.x_zeroes
= 0;
434 in
->x_file
.x_n
.x_offset
=
435 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
437 #if FILNMLEN != E_FILNMLEN
438 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
443 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
,
444 numaux
* sizeof (AUXENT
));
448 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
459 if (type
== T_NULL
) {
460 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN(abfd
, ext
);
461 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC(abfd
, ext
);
462 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO(abfd
, ext
);
464 /* PE defines some extra fields; we zero them out for
466 in
->x_scn
.x_checksum
= 0;
467 in
->x_scn
.x_associated
= 0;
468 in
->x_scn
.x_comdat
= 0;
475 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
477 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
480 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
482 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
483 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
487 #if DIMNUM != E_DIMNUM
488 #error we need to cope with truncating or extending DIMNUM
490 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
491 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
492 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
493 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
494 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
495 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
496 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
497 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
501 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
504 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO(abfd
, ext
);
505 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE(abfd
, ext
);
509 /* the semicolon is because MSVC doesn't like labels at
512 #ifdef COFF_ADJUST_AUX_IN_POST
513 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
518 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
523 int indx ATTRIBUTE_UNUSED
;
524 int numaux ATTRIBUTE_UNUSED
;
527 union internal_auxent
*in
= (union internal_auxent
*)inp
;
528 AUXENT
*ext
= (AUXENT
*)extp
;
530 #ifdef COFF_ADJUST_AUX_OUT_PRE
531 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, class, indx
, numaux
, extp
);
533 memset((PTR
)ext
, 0, AUXESZ
);
536 if (in
->x_file
.x_fname
[0] == 0) {
537 PUTWORD(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
539 in
->x_file
.x_n
.x_offset
,
540 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
543 #if FILNMLEN != E_FILNMLEN
544 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
546 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
556 if (type
== T_NULL
) {
557 PUT_SCN_SCNLEN(abfd
, in
->x_scn
.x_scnlen
, ext
);
558 PUT_SCN_NRELOC(abfd
, in
->x_scn
.x_nreloc
, ext
);
559 PUT_SCN_NLINNO(abfd
, in
->x_scn
.x_nlinno
, ext
);
565 PUTWORD(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
567 bfd_h_put_16(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
570 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
572 PUT_FCN_LNNOPTR(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
573 PUT_FCN_ENDNDX(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
577 #if DIMNUM != E_DIMNUM
578 #error we need to cope with truncating or extending DIMNUM
580 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
581 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
582 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
583 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
584 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
585 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
586 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
587 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
591 PUTWORD (abfd
, in
->x_sym
.x_misc
.x_fsize
,
592 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
595 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
596 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
600 #ifdef COFF_ADJUST_AUX_OUT_POST
601 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, class, indx
, numaux
, extp
);
606 #endif /* NO_COFF_SYMBOLS */
608 #ifndef NO_COFF_LINENOS
611 coff_swap_lineno_in (abfd
, ext1
, in1
)
616 LINENO
*ext
= (LINENO
*)ext1
;
617 struct internal_lineno
*in
= (struct internal_lineno
*)in1
;
619 in
->l_addr
.l_symndx
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->l_addr
.l_symndx
);
620 in
->l_lnno
= GET_LINENO_LNNO(abfd
, ext
);
624 coff_swap_lineno_out (abfd
, inp
, outp
)
629 struct internal_lineno
*in
= (struct internal_lineno
*)inp
;
630 struct external_lineno
*ext
= (struct external_lineno
*)outp
;
631 PUTWORD(abfd
, in
->l_addr
.l_symndx
, (bfd_byte
*)
632 ext
->l_addr
.l_symndx
);
634 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
638 #endif /* NO_COFF_LINENOS */
641 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
646 AOUTHDR
*aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
647 struct internal_aouthdr
*aouthdr_int
= (struct internal_aouthdr
*)aouthdr_int1
;
649 aouthdr_int
->magic
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->magic
);
650 aouthdr_int
->vstamp
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->vstamp
);
652 GET_AOUTHDR_TSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->tsize
);
654 GET_AOUTHDR_DSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->dsize
);
656 GET_AOUTHDR_BSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->bsize
);
658 GET_AOUTHDR_ENTRY (abfd
, (bfd_byte
*) aouthdr_ext
->entry
);
659 aouthdr_int
->text_start
=
660 GET_AOUTHDR_TEXT_START (abfd
, (bfd_byte
*) aouthdr_ext
->text_start
);
661 aouthdr_int
->data_start
=
662 GET_AOUTHDR_DATA_START (abfd
, (bfd_byte
*) aouthdr_ext
->data_start
);
665 aouthdr_int
->tagentries
= bfd_h_get_32(abfd
, (bfd_byte
*) aouthdr_ext
->tagentries
);
669 bfd_h_put_32(abfd
, aouthdr_int
->o_inlib
, (bfd_byte
*) aouthdr_ext
->o_inlib
);
670 bfd_h_put_32(abfd
, aouthdr_int
->o_sri
, (bfd_byte
*) aouthdr_ext
->o_sri
);
671 bfd_h_put_32(abfd
, aouthdr_int
->vid
[0], (bfd_byte
*) aouthdr_ext
->vid
);
672 bfd_h_put_32(abfd
, aouthdr_int
->vid
[1], (bfd_byte
*) aouthdr_ext
->vid
+ 4);
677 aouthdr_int
->o_toc
= bfd_h_get_64(abfd
, aouthdr_ext
->o_toc
);
679 aouthdr_int
->o_toc
= bfd_h_get_32(abfd
, aouthdr_ext
->o_toc
);
681 aouthdr_int
->o_snentry
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snentry
);
682 aouthdr_int
->o_sntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntext
);
683 aouthdr_int
->o_sndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sndata
);
684 aouthdr_int
->o_sntoc
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntoc
);
685 aouthdr_int
->o_snloader
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snloader
);
686 aouthdr_int
->o_snbss
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snbss
);
687 aouthdr_int
->o_algntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algntext
);
688 aouthdr_int
->o_algndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algndata
);
689 aouthdr_int
->o_modtype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_modtype
);
690 aouthdr_int
->o_cputype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_cputype
);
692 aouthdr_int
->o_maxstack
= bfd_h_get_64(abfd
, aouthdr_ext
->o_maxstack
);
693 aouthdr_int
->o_maxdata
= bfd_h_get_64(abfd
, aouthdr_ext
->o_maxdata
);
695 aouthdr_int
->o_maxstack
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxstack
);
696 aouthdr_int
->o_maxdata
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxdata
);
701 aouthdr_int
->bss_start
= bfd_h_get_32(abfd
, aouthdr_ext
->bss_start
);
702 aouthdr_int
->gp_value
= bfd_h_get_32(abfd
, aouthdr_ext
->gp_value
);
703 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
704 aouthdr_int
->cprmask
[0] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[0]);
705 aouthdr_int
->cprmask
[1] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[1]);
706 aouthdr_int
->cprmask
[2] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[2]);
707 aouthdr_int
->cprmask
[3] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[3]);
711 aouthdr_int
->bss_start
= bfd_h_get_64(abfd
, aouthdr_ext
->bss_start
);
712 aouthdr_int
->gp_value
= bfd_h_get_64(abfd
, aouthdr_ext
->gp_value
);
713 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
714 aouthdr_int
->fprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->fprmask
);
719 coff_swap_aouthdr_out (abfd
, in
, out
)
724 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
725 AOUTHDR
*aouthdr_out
= (AOUTHDR
*)out
;
727 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->magic
);
728 bfd_h_put_16(abfd
, aouthdr_in
->vstamp
, (bfd_byte
*) aouthdr_out
->vstamp
);
729 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->tsize
);
730 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->dsize
);
731 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->bsize
);
732 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->entry
);
733 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
734 (bfd_byte
*) aouthdr_out
->text_start
);
735 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
736 (bfd_byte
*) aouthdr_out
->data_start
);
739 bfd_h_put_32(abfd
, aouthdr_in
->tagentries
, (bfd_byte
*) aouthdr_out
->tagentries
);
744 bfd_h_put_64 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
746 bfd_h_put_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
748 bfd_h_put_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
749 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
750 bfd_h_put_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
751 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
752 bfd_h_put_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
753 bfd_h_put_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
754 bfd_h_put_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
755 bfd_h_put_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
756 bfd_h_put_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
757 bfd_h_put_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
759 bfd_h_put_64 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
760 bfd_h_put_64 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
762 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
763 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
765 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
767 memset (aouthdr_out
->o_debugger
, 0, sizeof aouthdr_out
->o_debugger
);
768 memset (aouthdr_out
->o_resv3
, 0, sizeof aouthdr_out
->o_resv3
);
773 bfd_h_put_32(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
774 bfd_h_put_32(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
775 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
776 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[0], (bfd_byte
*) aouthdr_out
->cprmask
[0]);
777 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[1], (bfd_byte
*) aouthdr_out
->cprmask
[1]);
778 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[2], (bfd_byte
*) aouthdr_out
->cprmask
[2]);
779 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[3], (bfd_byte
*) aouthdr_out
->cprmask
[3]);
783 /* FIXME: What does bldrev mean? */
784 bfd_h_put_16(abfd
, (bfd_vma
) 2, (bfd_byte
*) aouthdr_out
->bldrev
);
785 bfd_h_put_16(abfd
, (bfd_vma
) 0, (bfd_byte
*) aouthdr_out
->padding
);
786 bfd_h_put_64(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
787 bfd_h_put_64(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
788 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
789 bfd_h_put_32(abfd
, aouthdr_in
->fprmask
, (bfd_byte
*) aouthdr_out
->fprmask
);
796 coff_swap_scnhdr_in (abfd
, ext
, in
)
801 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
802 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
804 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
805 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
807 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof (scnhdr_int
->s_name
));
808 scnhdr_int
->s_vaddr
=
809 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
810 scnhdr_int
->s_paddr
=
811 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
813 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
815 scnhdr_int
->s_scnptr
=
816 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
817 scnhdr_int
->s_relptr
=
818 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
819 scnhdr_int
->s_lnnoptr
=
820 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
821 scnhdr_int
->s_flags
=
822 GET_SCNHDR_FLAGS (abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
823 scnhdr_int
->s_nreloc
=
824 GET_SCNHDR_NRELOC (abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
825 scnhdr_int
->s_nlnno
=
826 GET_SCNHDR_NLNNO (abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
828 scnhdr_int
->s_align
=
829 GET_SCNHDR_ALIGN (abfd
, (bfd_byte
*) scnhdr_ext
->s_align
);
831 #ifdef COFF_ADJUST_SCNHDR_IN_POST
832 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
837 coff_swap_scnhdr_out (abfd
, in
, out
)
842 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
843 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
844 unsigned int ret
= bfd_coff_scnhsz (abfd
);
846 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
847 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
849 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
851 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
,
852 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
854 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
,
855 (bfd_byte
*) scnhdr_ext
->s_paddr
);
856 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
,
857 (bfd_byte
*) scnhdr_ext
->s_size
);
859 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
860 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
861 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
862 (bfd_byte
*) scnhdr_ext
->s_relptr
);
863 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
864 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
865 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
,
866 (bfd_byte
*) scnhdr_ext
->s_flags
);
868 PUTWORD(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
869 PUTWORD(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
871 if (scnhdr_int
->s_nlnno
<= MAX_SCNHDR_NLNNO
)
872 PUT_SCNHDR_NLNNO(abfd
, scnhdr_int
->s_nlnno
,
873 (bfd_byte
*) scnhdr_ext
->s_nlnno
);
876 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
878 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
879 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
880 (*_bfd_error_handler
)
881 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
882 bfd_get_filename (abfd
),
883 buf
, scnhdr_int
->s_nlnno
);
884 PUT_SCNHDR_NLNNO(abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
886 if (scnhdr_int
->s_nreloc
<= MAX_SCNHDR_NRELOC
)
887 PUT_SCNHDR_NRELOC(abfd
, scnhdr_int
->s_nreloc
,
888 (bfd_byte
*) scnhdr_ext
->s_nreloc
);
891 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
893 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
894 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
895 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
896 bfd_get_filename (abfd
),
897 buf
, scnhdr_int
->s_nreloc
);
898 bfd_set_error (bfd_error_file_truncated
);
899 PUT_SCNHDR_NRELOC(abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
905 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, (bfd_byte
*) scnhdr_ext
->s_align
);
907 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
908 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);