1 /* Generic COFF swapping routines, for BFD.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21 /* This file contains routines used to swap COFF data. It is a header
22 file because the details of swapping depend on the details of the
23 structures used by each COFF implementation. This is included by
24 coffcode.h, as well as by the ECOFF backend.
26 Any file which uses this must first include "coff/internal.h" and
27 "coff/CPU.h". The functions will then be correct for that CPU. */
33 #define PUTWORD bfd_h_put_32
34 #define PUTHALF bfd_h_put_16
35 #define PUTBYTE bfd_h_put_8
37 #ifndef GET_FCN_LNNOPTR
38 #define GET_FCN_LNNOPTR(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
41 #ifndef GET_FCN_ENDNDX
42 #define GET_FCN_ENDNDX(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
45 #ifndef PUT_FCN_LNNOPTR
46 #define PUT_FCN_LNNOPTR(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
48 #ifndef PUT_FCN_ENDNDX
49 #define PUT_FCN_ENDNDX(abfd, in, ext) PUTWORD(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
52 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
55 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
58 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
61 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
63 #ifndef GET_SCN_SCNLEN
64 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
66 #ifndef GET_SCN_NRELOC
67 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
69 #ifndef GET_SCN_NLINNO
70 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
72 #ifndef PUT_SCN_SCNLEN
73 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
75 #ifndef PUT_SCN_NRELOC
76 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
78 #ifndef PUT_SCN_NLINNO
79 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
81 #ifndef GET_LINENO_LNNO
82 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
84 #ifndef PUT_LINENO_LNNO
85 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno));
88 /* The f_symptr field in the filehdr is sometimes 64 bits. */
89 #ifndef GET_FILEHDR_SYMPTR
90 #define GET_FILEHDR_SYMPTR bfd_h_get_32
92 #ifndef PUT_FILEHDR_SYMPTR
93 #define PUT_FILEHDR_SYMPTR bfd_h_put_32
96 /* Some fields in the aouthdr are sometimes 64 bits. */
97 #ifndef GET_AOUTHDR_TSIZE
98 #define GET_AOUTHDR_TSIZE bfd_h_get_32
100 #ifndef PUT_AOUTHDR_TSIZE
101 #define PUT_AOUTHDR_TSIZE bfd_h_put_32
103 #ifndef GET_AOUTHDR_DSIZE
104 #define GET_AOUTHDR_DSIZE bfd_h_get_32
106 #ifndef PUT_AOUTHDR_DSIZE
107 #define PUT_AOUTHDR_DSIZE bfd_h_put_32
109 #ifndef GET_AOUTHDR_BSIZE
110 #define GET_AOUTHDR_BSIZE bfd_h_get_32
112 #ifndef PUT_AOUTHDR_BSIZE
113 #define PUT_AOUTHDR_BSIZE bfd_h_put_32
115 #ifndef GET_AOUTHDR_ENTRY
116 #define GET_AOUTHDR_ENTRY bfd_h_get_32
118 #ifndef PUT_AOUTHDR_ENTRY
119 #define PUT_AOUTHDR_ENTRY bfd_h_put_32
121 #ifndef GET_AOUTHDR_TEXT_START
122 #define GET_AOUTHDR_TEXT_START bfd_h_get_32
124 #ifndef PUT_AOUTHDR_TEXT_START
125 #define PUT_AOUTHDR_TEXT_START bfd_h_put_32
127 #ifndef GET_AOUTHDR_DATA_START
128 #define GET_AOUTHDR_DATA_START bfd_h_get_32
130 #ifndef PUT_AOUTHDR_DATA_START
131 #define PUT_AOUTHDR_DATA_START bfd_h_put_32
134 /* Some fields in the scnhdr are sometimes 64 bits. */
135 #ifndef GET_SCNHDR_PADDR
136 #define GET_SCNHDR_PADDR bfd_h_get_32
138 #ifndef PUT_SCNHDR_PADDR
139 #define PUT_SCNHDR_PADDR bfd_h_put_32
141 #ifndef GET_SCNHDR_VADDR
142 #define GET_SCNHDR_VADDR bfd_h_get_32
144 #ifndef PUT_SCNHDR_VADDR
145 #define PUT_SCNHDR_VADDR bfd_h_put_32
147 #ifndef GET_SCNHDR_SIZE
148 #define GET_SCNHDR_SIZE bfd_h_get_32
150 #ifndef PUT_SCNHDR_SIZE
151 #define PUT_SCNHDR_SIZE bfd_h_put_32
153 #ifndef GET_SCNHDR_SCNPTR
154 #define GET_SCNHDR_SCNPTR bfd_h_get_32
156 #ifndef PUT_SCNHDR_SCNPTR
157 #define PUT_SCNHDR_SCNPTR bfd_h_put_32
159 #ifndef GET_SCNHDR_RELPTR
160 #define GET_SCNHDR_RELPTR bfd_h_get_32
162 #ifndef PUT_SCNHDR_RELPTR
163 #define PUT_SCNHDR_RELPTR bfd_h_put_32
165 #ifndef GET_SCNHDR_LNNOPTR
166 #define GET_SCNHDR_LNNOPTR bfd_h_get_32
168 #ifndef PUT_SCNHDR_LNNOPTR
169 #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
171 #ifndef GET_SCNHDR_NRELOC
172 #define GET_SCNHDR_NRELOC bfd_h_get_16
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 PUT_SCNHDR_NLNNO
181 #define PUT_SCNHDR_NLNNO bfd_h_put_16
183 #ifndef GET_SCNHDR_FLAGS
184 #define GET_SCNHDR_FLAGS bfd_h_get_32
186 #ifndef PUT_SCNHDR_FLAGS
187 #define PUT_SCNHDR_FLAGS bfd_h_put_32
191 static void coff_swap_aouthdr_in
PARAMS ((bfd
*, PTR
, PTR
));
192 static unsigned int coff_swap_aouthdr_out
PARAMS ((bfd
*, PTR
, PTR
));
193 static void coff_swap_scnhdr_in
PARAMS ((bfd
*, PTR
, PTR
));
194 static unsigned int coff_swap_scnhdr_out
PARAMS ((bfd
*, PTR
, PTR
));
195 static void coff_swap_filehdr_in
PARAMS ((bfd
*, PTR
, PTR
));
196 static unsigned int coff_swap_filehdr_out
PARAMS ((bfd
*, PTR
, PTR
));
197 #ifndef NO_COFF_RELOCS
198 static void coff_swap_reloc_in
PARAMS ((bfd
*, PTR
, PTR
));
199 static unsigned int coff_swap_reloc_out
PARAMS ((bfd
*, PTR
, PTR
));
200 #endif /* NO_COFF_RELOCS */
201 #ifndef NO_COFF_SYMBOLS
202 static void coff_swap_sym_in
PARAMS ((bfd
*, PTR
, PTR
));
203 static unsigned int coff_swap_sym_out
PARAMS ((bfd
*, PTR
, PTR
));
204 static void coff_swap_aux_in
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
205 static unsigned int coff_swap_aux_out
PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
206 #endif /* NO_COFF_SYMBOLS */
207 #ifndef NO_COFF_LINENOS
208 static void coff_swap_lineno_in
PARAMS ((bfd
*, PTR
, PTR
));
209 static unsigned int coff_swap_lineno_out
PARAMS ((bfd
*, PTR
, PTR
));
210 #endif /* NO_COFF_LINENOS */
212 #ifndef NO_COFF_RELOCS
215 coff_swap_reloc_in (abfd
, src
, dst
)
220 RELOC
*reloc_src
= (RELOC
*) src
;
221 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
223 reloc_dst
->r_vaddr
= bfd_h_get_32(abfd
, (bfd_byte
*)reloc_src
->r_vaddr
);
224 reloc_dst
->r_symndx
= bfd_h_get_signed_32(abfd
, (bfd_byte
*) reloc_src
->r_symndx
);
227 reloc_dst
->r_type
= bfd_h_get_8(abfd
, reloc_src
->r_type
);
228 reloc_dst
->r_size
= bfd_h_get_8(abfd
, reloc_src
->r_size
);
230 reloc_dst
->r_type
= bfd_h_get_16(abfd
, (bfd_byte
*) reloc_src
->r_type
);
233 #ifdef SWAP_IN_RELOC_OFFSET
234 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET(abfd
,
235 (bfd_byte
*) reloc_src
->r_offset
);
240 coff_swap_reloc_out (abfd
, src
, dst
)
245 struct internal_reloc
*reloc_src
= (struct internal_reloc
*)src
;
246 struct external_reloc
*reloc_dst
= (struct external_reloc
*)dst
;
247 bfd_h_put_32(abfd
, reloc_src
->r_vaddr
, (bfd_byte
*) reloc_dst
->r_vaddr
);
248 bfd_h_put_32(abfd
, reloc_src
->r_symndx
, (bfd_byte
*) reloc_dst
->r_symndx
);
251 bfd_h_put_8 (abfd
, reloc_src
->r_type
, (bfd_byte
*) reloc_dst
->r_type
);
252 bfd_h_put_8 (abfd
, reloc_src
->r_size
, (bfd_byte
*) reloc_dst
->r_size
);
254 bfd_h_put_16(abfd
, reloc_src
->r_type
, (bfd_byte
*)
258 #ifdef SWAP_OUT_RELOC_OFFSET
259 SWAP_OUT_RELOC_OFFSET(abfd
,
261 (bfd_byte
*) reloc_dst
->r_offset
);
263 #ifdef SWAP_OUT_RELOC_EXTRA
264 SWAP_OUT_RELOC_EXTRA(abfd
,reloc_src
, reloc_dst
);
270 #endif /* NO_COFF_RELOCS */
273 coff_swap_filehdr_in (abfd
, src
, dst
)
278 FILHDR
*filehdr_src
= (FILHDR
*) src
;
279 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
280 #ifdef COFF_ADJUST_FILEHDR_IN_PRE
281 COFF_ADJUST_FILEHDR_IN_PRE (abfd
, src
, dst
);
283 filehdr_dst
->f_magic
= bfd_h_get_16(abfd
, (bfd_byte
*) filehdr_src
->f_magic
);
284 filehdr_dst
->f_nscns
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_nscns
);
285 filehdr_dst
->f_timdat
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_timdat
);
286 filehdr_dst
->f_symptr
=
287 GET_FILEHDR_SYMPTR (abfd
, (bfd_byte
*) filehdr_src
->f_symptr
);
288 filehdr_dst
->f_nsyms
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_nsyms
);
289 filehdr_dst
->f_opthdr
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_opthdr
);
290 filehdr_dst
->f_flags
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_flags
);
291 #ifdef TIC80_TARGET_ID
292 filehdr_dst
->f_target_id
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_target_id
);
295 #ifdef COFF_ADJUST_FILEHDR_IN_POST
296 COFF_ADJUST_FILEHDR_IN_POST (abfd
, src
, dst
);
301 coff_swap_filehdr_out (abfd
, in
, out
)
306 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
307 FILHDR
*filehdr_out
= (FILHDR
*)out
;
309 #ifdef COFF_ADJUST_FILEHDR_OUT_PRE
310 COFF_ADJUST_FILEHDR_OUT_PRE (abfd
, in
, out
);
312 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
313 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
314 bfd_h_put_32(abfd
, filehdr_in
->f_timdat
, (bfd_byte
*) filehdr_out
->f_timdat
);
315 PUT_FILEHDR_SYMPTR (abfd
, (bfd_vma
) filehdr_in
->f_symptr
,
316 (bfd_byte
*) filehdr_out
->f_symptr
);
317 bfd_h_put_32(abfd
, filehdr_in
->f_nsyms
, (bfd_byte
*) filehdr_out
->f_nsyms
);
318 bfd_h_put_16(abfd
, filehdr_in
->f_opthdr
, (bfd_byte
*) filehdr_out
->f_opthdr
);
319 bfd_h_put_16(abfd
, filehdr_in
->f_flags
, (bfd_byte
*) filehdr_out
->f_flags
);
320 #ifdef TIC80_TARGET_ID
321 bfd_h_put_16(abfd
, filehdr_in
->f_target_id
, (bfd_byte
*) filehdr_out
->f_target_id
);
324 #ifdef COFF_ADJUST_FILEHDR_OUT_POST
325 COFF_ADJUST_FILEHDR_OUT_POST (abfd
, in
, out
);
331 #ifndef NO_COFF_SYMBOLS
334 coff_swap_sym_in (abfd
, ext1
, in1
)
339 SYMENT
*ext
= (SYMENT
*)ext1
;
340 struct internal_syment
*in
= (struct internal_syment
*)in1
;
342 if( ext
->e
.e_name
[0] == 0) {
343 in
->_n
._n_n
._n_zeroes
= 0;
344 in
->_n
._n_n
._n_offset
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
347 #if SYMNMLEN != E_SYMNMLEN
348 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
350 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
353 in
->n_value
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_value
);
354 in
->n_scnum
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_scnum
);
355 if (sizeof(ext
->e_type
) == 2){
356 in
->n_type
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_type
);
359 in
->n_type
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_type
);
361 in
->n_sclass
= bfd_h_get_8(abfd
, ext
->e_sclass
);
362 in
->n_numaux
= bfd_h_get_8(abfd
, ext
->e_numaux
);
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
);
400 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
409 AUXENT
*ext
= (AUXENT
*)ext1
;
410 union internal_auxent
*in
= (union internal_auxent
*)in1
;
412 #ifdef COFF_ADJUST_AUX_IN_PRE
413 COFF_ADJUST_AUX_IN_PRE (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
417 if (ext
->x_file
.x_fname
[0] == 0) {
418 in
->x_file
.x_n
.x_zeroes
= 0;
419 in
->x_file
.x_n
.x_offset
=
420 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
422 #if FILNMLEN != E_FILNMLEN
423 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
425 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
430 /* RS/6000 "csect" auxents */
434 if (indx
+ 1 == numaux
)
436 in
->x_csect
.x_scnlen
.l
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_scnlen
);
437 in
->x_csect
.x_parmhash
= bfd_h_get_32 (abfd
,
438 ext
->x_csect
.x_parmhash
);
439 in
->x_csect
.x_snhash
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snhash
);
440 /* We don't have to hack bitfields in x_smtyp because it's
441 defined by shifts-and-ands, which are equivalent on all
443 in
->x_csect
.x_smtyp
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smtyp
);
444 in
->x_csect
.x_smclas
= bfd_h_get_8 (abfd
, ext
->x_csect
.x_smclas
);
445 in
->x_csect
.x_stab
= bfd_h_get_32 (abfd
, ext
->x_csect
.x_stab
);
446 in
->x_csect
.x_snstab
= bfd_h_get_16 (abfd
, ext
->x_csect
.x_snstab
);
457 if (type
== T_NULL
) {
458 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN(abfd
, ext
);
459 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC(abfd
, ext
);
460 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO(abfd
, ext
);
462 /* PE defines some extra fields; we zero them out for
464 in
->x_scn
.x_checksum
= 0;
465 in
->x_scn
.x_associated
= 0;
466 in
->x_scn
.x_comdat
= 0;
473 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
475 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
478 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
480 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
481 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
485 #if DIMNUM != E_DIMNUM
486 #error we need to cope with truncating or extending DIMNUM
488 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
489 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
490 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
491 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
492 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
493 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
494 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
495 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
499 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
502 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO(abfd
, ext
);
503 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE(abfd
, ext
);
507 /* the semicolon is because MSVC doesn't like labels at
510 #ifdef COFF_ADJUST_AUX_IN_POST
511 COFF_ADJUST_AUX_IN_POST (abfd
, ext1
, type
, class, indx
, numaux
, in1
);
516 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
525 union internal_auxent
*in
= (union internal_auxent
*)inp
;
526 AUXENT
*ext
= (AUXENT
*)extp
;
528 #ifdef COFF_ADJUST_AUX_OUT_PRE
529 COFF_ADJUST_AUX_OUT_PRE (abfd
, inp
, type
, class, indx
, numaux
, extp
);
531 memset((PTR
)ext
, 0, AUXESZ
);
534 if (in
->x_file
.x_fname
[0] == 0) {
535 PUTWORD(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
537 in
->x_file
.x_n
.x_offset
,
538 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
541 #if FILNMLEN != E_FILNMLEN
542 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
544 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
550 /* RS/6000 "csect" auxents */
553 if (indx
+ 1 == numaux
)
555 PUTWORD (abfd
, in
->x_csect
.x_scnlen
.l
, ext
->x_csect
.x_scnlen
);
556 PUTWORD (abfd
, in
->x_csect
.x_parmhash
, ext
->x_csect
.x_parmhash
);
557 PUTHALF (abfd
, in
->x_csect
.x_snhash
, ext
->x_csect
.x_snhash
);
558 /* We don't have to hack bitfields in x_smtyp because it's
559 defined by shifts-and-ands, which are equivalent on all
561 PUTBYTE (abfd
, in
->x_csect
.x_smtyp
, ext
->x_csect
.x_smtyp
);
562 PUTBYTE (abfd
, in
->x_csect
.x_smclas
, ext
->x_csect
.x_smclas
);
563 PUTWORD (abfd
, in
->x_csect
.x_stab
, ext
->x_csect
.x_stab
);
564 PUTHALF (abfd
, in
->x_csect
.x_snstab
, ext
->x_csect
.x_snstab
);
575 if (type
== T_NULL
) {
576 PUT_SCN_SCNLEN(abfd
, in
->x_scn
.x_scnlen
, ext
);
577 PUT_SCN_NRELOC(abfd
, in
->x_scn
.x_nreloc
, ext
);
578 PUT_SCN_NLINNO(abfd
, in
->x_scn
.x_nlinno
, ext
);
584 PUTWORD(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
586 bfd_h_put_16(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
589 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
591 PUT_FCN_LNNOPTR(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
592 PUT_FCN_ENDNDX(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
596 #if DIMNUM != E_DIMNUM
597 #error we need to cope with truncating or extending DIMNUM
599 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
600 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
601 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
602 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
603 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
604 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
605 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
606 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
610 PUTWORD (abfd
, in
->x_sym
.x_misc
.x_fsize
,
611 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
614 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
615 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
619 #ifdef COFF_ADJUST_AUX_OUT_POST
620 COFF_ADJUST_AUX_OUT_POST (abfd
, inp
, type
, class, indx
, numaux
, extp
);
625 #endif /* NO_COFF_SYMBOLS */
627 #ifndef NO_COFF_LINENOS
630 coff_swap_lineno_in (abfd
, ext1
, in1
)
635 LINENO
*ext
= (LINENO
*)ext1
;
636 struct internal_lineno
*in
= (struct internal_lineno
*)in1
;
638 in
->l_addr
.l_symndx
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->l_addr
.l_symndx
);
639 in
->l_lnno
= GET_LINENO_LNNO(abfd
, ext
);
643 coff_swap_lineno_out (abfd
, inp
, outp
)
648 struct internal_lineno
*in
= (struct internal_lineno
*)inp
;
649 struct external_lineno
*ext
= (struct external_lineno
*)outp
;
650 PUTWORD(abfd
, in
->l_addr
.l_symndx
, (bfd_byte
*)
651 ext
->l_addr
.l_symndx
);
653 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
657 #endif /* NO_COFF_LINENOS */
660 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
665 AOUTHDR
*aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
666 struct internal_aouthdr
*aouthdr_int
= (struct internal_aouthdr
*)aouthdr_int1
;
668 aouthdr_int
->magic
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->magic
);
669 aouthdr_int
->vstamp
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->vstamp
);
671 GET_AOUTHDR_TSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->tsize
);
673 GET_AOUTHDR_DSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->dsize
);
675 GET_AOUTHDR_BSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->bsize
);
677 GET_AOUTHDR_ENTRY (abfd
, (bfd_byte
*) aouthdr_ext
->entry
);
678 aouthdr_int
->text_start
=
679 GET_AOUTHDR_TEXT_START (abfd
, (bfd_byte
*) aouthdr_ext
->text_start
);
680 aouthdr_int
->data_start
=
681 GET_AOUTHDR_DATA_START (abfd
, (bfd_byte
*) aouthdr_ext
->data_start
);
684 aouthdr_int
->tagentries
= bfd_h_get_32(abfd
, (bfd_byte
*) aouthdr_ext
->tagentries
);
688 bfd_h_put_32(abfd
, aouthdr_int
->o_inlib
, (bfd_byte
*) aouthdr_ext
->o_inlib
);
689 bfd_h_put_32(abfd
, aouthdr_int
->o_sri
, (bfd_byte
*) aouthdr_ext
->o_sri
);
690 bfd_h_put_32(abfd
, aouthdr_int
->vid
[0], (bfd_byte
*) aouthdr_ext
->vid
);
691 bfd_h_put_32(abfd
, aouthdr_int
->vid
[1], (bfd_byte
*) aouthdr_ext
->vid
+ 4);
696 aouthdr_int
->o_toc
= bfd_h_get_32(abfd
, aouthdr_ext
->o_toc
);
697 aouthdr_int
->o_snentry
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snentry
);
698 aouthdr_int
->o_sntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntext
);
699 aouthdr_int
->o_sndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sndata
);
700 aouthdr_int
->o_sntoc
= bfd_h_get_16(abfd
, aouthdr_ext
->o_sntoc
);
701 aouthdr_int
->o_snloader
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snloader
);
702 aouthdr_int
->o_snbss
= bfd_h_get_16(abfd
, aouthdr_ext
->o_snbss
);
703 aouthdr_int
->o_algntext
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algntext
);
704 aouthdr_int
->o_algndata
= bfd_h_get_16(abfd
, aouthdr_ext
->o_algndata
);
705 aouthdr_int
->o_modtype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_modtype
);
706 aouthdr_int
->o_cputype
= bfd_h_get_16(abfd
, aouthdr_ext
->o_cputype
);
707 aouthdr_int
->o_maxstack
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxstack
);
708 aouthdr_int
->o_maxdata
= bfd_h_get_32(abfd
, aouthdr_ext
->o_maxdata
);
712 aouthdr_int
->bss_start
= bfd_h_get_32(abfd
, aouthdr_ext
->bss_start
);
713 aouthdr_int
->gp_value
= bfd_h_get_32(abfd
, aouthdr_ext
->gp_value
);
714 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
715 aouthdr_int
->cprmask
[0] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[0]);
716 aouthdr_int
->cprmask
[1] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[1]);
717 aouthdr_int
->cprmask
[2] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[2]);
718 aouthdr_int
->cprmask
[3] = bfd_h_get_32(abfd
, aouthdr_ext
->cprmask
[3]);
722 aouthdr_int
->bss_start
= bfd_h_get_64(abfd
, aouthdr_ext
->bss_start
);
723 aouthdr_int
->gp_value
= bfd_h_get_64(abfd
, aouthdr_ext
->gp_value
);
724 aouthdr_int
->gprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->gprmask
);
725 aouthdr_int
->fprmask
= bfd_h_get_32(abfd
, aouthdr_ext
->fprmask
);
730 coff_swap_aouthdr_out (abfd
, in
, out
)
735 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
736 AOUTHDR
*aouthdr_out
= (AOUTHDR
*)out
;
738 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->magic
);
739 bfd_h_put_16(abfd
, aouthdr_in
->vstamp
, (bfd_byte
*) aouthdr_out
->vstamp
);
740 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->tsize
);
741 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->dsize
);
742 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->bsize
);
743 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->entry
);
744 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
745 (bfd_byte
*) aouthdr_out
->text_start
);
746 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
747 (bfd_byte
*) aouthdr_out
->data_start
);
750 bfd_h_put_32(abfd
, aouthdr_in
->tagentries
, (bfd_byte
*) aouthdr_out
->tagentries
);
754 bfd_h_put_32 (abfd
, aouthdr_in
->o_toc
, aouthdr_out
->o_toc
);
755 bfd_h_put_16 (abfd
, aouthdr_in
->o_snentry
, aouthdr_out
->o_snentry
);
756 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntext
, aouthdr_out
->o_sntext
);
757 bfd_h_put_16 (abfd
, aouthdr_in
->o_sndata
, aouthdr_out
->o_sndata
);
758 bfd_h_put_16 (abfd
, aouthdr_in
->o_sntoc
, aouthdr_out
->o_sntoc
);
759 bfd_h_put_16 (abfd
, aouthdr_in
->o_snloader
, aouthdr_out
->o_snloader
);
760 bfd_h_put_16 (abfd
, aouthdr_in
->o_snbss
, aouthdr_out
->o_snbss
);
761 bfd_h_put_16 (abfd
, aouthdr_in
->o_algntext
, aouthdr_out
->o_algntext
);
762 bfd_h_put_16 (abfd
, aouthdr_in
->o_algndata
, aouthdr_out
->o_algndata
);
763 bfd_h_put_16 (abfd
, aouthdr_in
->o_modtype
, aouthdr_out
->o_modtype
);
764 bfd_h_put_16 (abfd
, aouthdr_in
->o_cputype
, aouthdr_out
->o_cputype
);
765 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxstack
, aouthdr_out
->o_maxstack
);
766 bfd_h_put_32 (abfd
, aouthdr_in
->o_maxdata
, aouthdr_out
->o_maxdata
);
767 memset (aouthdr_out
->o_resv2
, 0, sizeof aouthdr_out
->o_resv2
);
771 bfd_h_put_32(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
772 bfd_h_put_32(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
773 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
774 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[0], (bfd_byte
*) aouthdr_out
->cprmask
[0]);
775 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[1], (bfd_byte
*) aouthdr_out
->cprmask
[1]);
776 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[2], (bfd_byte
*) aouthdr_out
->cprmask
[2]);
777 bfd_h_put_32(abfd
, aouthdr_in
->cprmask
[3], (bfd_byte
*) aouthdr_out
->cprmask
[3]);
781 /* FIXME: What does bldrev mean? */
782 bfd_h_put_16(abfd
, (bfd_vma
) 2, (bfd_byte
*) aouthdr_out
->bldrev
);
783 bfd_h_put_16(abfd
, (bfd_vma
) 0, (bfd_byte
*) aouthdr_out
->padding
);
784 bfd_h_put_64(abfd
, aouthdr_in
->bss_start
, (bfd_byte
*) aouthdr_out
->bss_start
);
785 bfd_h_put_64(abfd
, aouthdr_in
->gp_value
, (bfd_byte
*) aouthdr_out
->gp_value
);
786 bfd_h_put_32(abfd
, aouthdr_in
->gprmask
, (bfd_byte
*) aouthdr_out
->gprmask
);
787 bfd_h_put_32(abfd
, aouthdr_in
->fprmask
, (bfd_byte
*) aouthdr_out
->fprmask
);
794 coff_swap_scnhdr_in (abfd
, ext
, in
)
799 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
800 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
802 #ifdef COFF_ADJUST_SCNHDR_IN_PRE
803 COFF_ADJUST_SCNHDR_IN_PRE (abfd
, ext
, in
);
805 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof(scnhdr_int
->s_name
));
806 scnhdr_int
->s_vaddr
=
807 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
808 scnhdr_int
->s_paddr
=
809 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
811 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
813 scnhdr_int
->s_scnptr
=
814 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
815 scnhdr_int
->s_relptr
=
816 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
817 scnhdr_int
->s_lnnoptr
=
818 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
819 scnhdr_int
->s_flags
=
820 GET_SCNHDR_FLAGS (abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
821 scnhdr_int
->s_nreloc
=
822 GET_SCNHDR_NRELOC (abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
823 scnhdr_int
->s_nlnno
=
824 GET_SCNHDR_NLNNO (abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
826 scnhdr_int
->s_align
=
827 GET_SCNHDR_ALIGN (abfd
, (bfd_byte
*) scnhdr_ext
->s_align
);
829 #ifdef COFF_ADJUST_SCNHDR_IN_POST
830 COFF_ADJUST_SCNHDR_IN_POST (abfd
, ext
, in
);
835 coff_swap_scnhdr_out (abfd
, in
, out
)
840 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
841 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
842 unsigned int ret
= SCNHSZ
;
844 #ifdef COFF_ADJUST_SCNHDR_OUT_PRE
845 COFF_ADJUST_SCNHDR_OUT_PRE (abfd
, in
, out
);
847 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof(scnhdr_int
->s_name
));
849 PUT_SCNHDR_VADDR (abfd
, scnhdr_int
->s_vaddr
,
850 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
853 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_paddr
,
854 (bfd_byte
*) scnhdr_ext
->s_paddr
);
855 PUT_SCNHDR_SIZE (abfd
, scnhdr_int
->s_size
,
856 (bfd_byte
*) scnhdr_ext
->s_size
);
858 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
859 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
860 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
861 (bfd_byte
*) scnhdr_ext
->s_relptr
);
862 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
863 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
864 PUT_SCNHDR_FLAGS (abfd
, scnhdr_int
->s_flags
,
865 (bfd_byte
*) scnhdr_ext
->s_flags
);
867 PUTWORD(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
868 PUTWORD(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
870 if (scnhdr_int
->s_nlnno
<= 0xffff)
871 PUTHALF(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
874 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
876 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
877 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
878 (*_bfd_error_handler
)
879 (_("%s: warning: %s: line number overflow: 0x%lx > 0xffff"),
880 bfd_get_filename (abfd
),
881 buf
, scnhdr_int
->s_nlnno
);
882 PUTHALF (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
884 if (scnhdr_int
->s_nreloc
<= 0xffff)
885 PUTHALF(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
888 char buf
[sizeof (scnhdr_int
->s_name
) + 1];
890 memcpy (buf
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
891 buf
[sizeof (scnhdr_int
->s_name
)] = '\0';
892 (*_bfd_error_handler
) (_("%s: %s: reloc overflow: 0x%lx > 0xffff"),
893 bfd_get_filename (abfd
),
894 buf
, scnhdr_int
->s_nreloc
);
895 bfd_set_error (bfd_error_file_truncated
);
896 PUTHALF (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
902 PUT_SCNHDR_ALIGN (abfd
, scnhdr_int
->s_align
, (bfd_byte
*) scnhdr_ext
->s_align
);
904 #ifdef COFF_ADJUST_SCNHDR_OUT_POST
905 COFF_ADJUST_SCNHDR_OUT_POST (abfd
, in
, out
);