1 /* Support for the generic parts of most COFF variants, for BFD.
2 Copyright 1995, 1996 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. */
22 Most of this hacked by Steve Chamberlain,
28 #define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
29 #define coff_mkobject pe_mkobject
30 #define coff_mkobject_hook pe_mkobject_hook
32 #ifndef GET_FCN_LNNOPTR
33 #define GET_FCN_LNNOPTR(abfd, ext) \
34 bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
37 #ifndef GET_FCN_ENDNDX
38 #define GET_FCN_ENDNDX(abfd, ext) \
39 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) bfd_h_put_32(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) bfd_h_put_32(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
171 /**********************************************************************/
174 coff_swap_reloc_in (abfd
, src
, dst
)
179 RELOC
*reloc_src
= (RELOC
*) src
;
180 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
182 reloc_dst
->r_vaddr
= bfd_h_get_32(abfd
, (bfd_byte
*)reloc_src
->r_vaddr
);
183 reloc_dst
->r_symndx
= bfd_h_get_signed_32(abfd
, (bfd_byte
*) reloc_src
->r_symndx
);
185 reloc_dst
->r_type
= bfd_h_get_16(abfd
, (bfd_byte
*) reloc_src
->r_type
);
187 #ifdef SWAP_IN_RELOC_OFFSET
188 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET(abfd
,
189 (bfd_byte
*) reloc_src
->r_offset
);
195 coff_swap_reloc_out (abfd
, src
, dst
)
200 struct internal_reloc
*reloc_src
= (struct internal_reloc
*)src
;
201 struct external_reloc
*reloc_dst
= (struct external_reloc
*)dst
;
202 bfd_h_put_32(abfd
, reloc_src
->r_vaddr
, (bfd_byte
*) reloc_dst
->r_vaddr
);
203 bfd_h_put_32(abfd
, reloc_src
->r_symndx
, (bfd_byte
*) reloc_dst
->r_symndx
);
205 bfd_h_put_16(abfd
, reloc_src
->r_type
, (bfd_byte
*)
208 #ifdef SWAP_OUT_RELOC_OFFSET
209 SWAP_OUT_RELOC_OFFSET(abfd
,
211 (bfd_byte
*) reloc_dst
->r_offset
);
213 #ifdef SWAP_OUT_RELOC_EXTRA
214 SWAP_OUT_RELOC_EXTRA(abfd
,reloc_src
, reloc_dst
);
216 return sizeof(struct external_reloc
);
221 coff_swap_filehdr_in (abfd
, src
, dst
)
226 FILHDR
*filehdr_src
= (FILHDR
*) src
;
227 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
228 filehdr_dst
->f_magic
= bfd_h_get_16(abfd
, (bfd_byte
*) filehdr_src
->f_magic
);
229 filehdr_dst
->f_nscns
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_nscns
);
230 filehdr_dst
->f_timdat
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_timdat
);
232 filehdr_dst
->f_nsyms
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_nsyms
);
233 filehdr_dst
->f_flags
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_flags
);
234 filehdr_dst
->f_symptr
= bfd_h_get_32 (abfd
, (bfd_byte
*) filehdr_src
->f_symptr
);
236 /* Other people's tools sometimes generate headers
237 with an nsyms but a zero symptr. */
238 if (filehdr_dst
->f_nsyms
&& filehdr_dst
->f_symptr
)
240 filehdr_dst
->f_flags
|= HAS_SYMS
;
244 filehdr_dst
->f_nsyms
= 0;
245 filehdr_dst
->f_flags
&= ~HAS_SYMS
;
248 filehdr_dst
->f_opthdr
= bfd_h_get_16(abfd
,
249 (bfd_byte
*)filehdr_src
-> f_opthdr
);
252 #ifdef COFF_IMAGE_WITH_PE
255 coff_swap_filehdr_out (abfd
, in
, out
)
261 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
262 FILHDR
*filehdr_out
= (FILHDR
*)out
;
264 if (pe_data (abfd
)->has_reloc_section
)
265 filehdr_in
->f_flags
&= ~F_RELFLG
;
267 if (pe_data (abfd
)->dll
)
268 filehdr_in
->f_flags
|= F_DLL
;
270 filehdr_in
->pe
.e_magic
= DOSMAGIC
;
271 filehdr_in
->pe
.e_cblp
= 0x90;
272 filehdr_in
->pe
.e_cp
= 0x3;
273 filehdr_in
->pe
.e_crlc
= 0x0;
274 filehdr_in
->pe
.e_cparhdr
= 0x4;
275 filehdr_in
->pe
.e_minalloc
= 0x0;
276 filehdr_in
->pe
.e_maxalloc
= 0xffff;
277 filehdr_in
->pe
.e_ss
= 0x0;
278 filehdr_in
->pe
.e_sp
= 0xb8;
279 filehdr_in
->pe
.e_csum
= 0x0;
280 filehdr_in
->pe
.e_ip
= 0x0;
281 filehdr_in
->pe
.e_cs
= 0x0;
282 filehdr_in
->pe
.e_lfarlc
= 0x40;
283 filehdr_in
->pe
.e_ovno
= 0x0;
285 for (idx
=0; idx
< 4; idx
++)
286 filehdr_in
->pe
.e_res
[idx
] = 0x0;
288 filehdr_in
->pe
.e_oemid
= 0x0;
289 filehdr_in
->pe
.e_oeminfo
= 0x0;
291 for (idx
=0; idx
< 10; idx
++)
292 filehdr_in
->pe
.e_res2
[idx
] = 0x0;
294 filehdr_in
->pe
.e_lfanew
= 0x80;
296 /* this next collection of data are mostly just characters. It appears
297 to be constant within the headers put on NT exes */
298 filehdr_in
->pe
.dos_message
[0] = 0x0eba1f0e;
299 filehdr_in
->pe
.dos_message
[1] = 0xcd09b400;
300 filehdr_in
->pe
.dos_message
[2] = 0x4c01b821;
301 filehdr_in
->pe
.dos_message
[3] = 0x685421cd;
302 filehdr_in
->pe
.dos_message
[4] = 0x70207369;
303 filehdr_in
->pe
.dos_message
[5] = 0x72676f72;
304 filehdr_in
->pe
.dos_message
[6] = 0x63206d61;
305 filehdr_in
->pe
.dos_message
[7] = 0x6f6e6e61;
306 filehdr_in
->pe
.dos_message
[8] = 0x65622074;
307 filehdr_in
->pe
.dos_message
[9] = 0x6e757220;
308 filehdr_in
->pe
.dos_message
[10] = 0x206e6920;
309 filehdr_in
->pe
.dos_message
[11] = 0x20534f44;
310 filehdr_in
->pe
.dos_message
[12] = 0x65646f6d;
311 filehdr_in
->pe
.dos_message
[13] = 0x0a0d0d2e;
312 filehdr_in
->pe
.dos_message
[14] = 0x24;
313 filehdr_in
->pe
.dos_message
[15] = 0x0;
314 filehdr_in
->pe
.nt_signature
= NT_SIGNATURE
;
318 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
319 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
321 bfd_h_put_32(abfd
, time (0), (bfd_byte
*) filehdr_out
->f_timdat
);
322 PUT_FILEHDR_SYMPTR (abfd
, (bfd_vma
) filehdr_in
->f_symptr
,
323 (bfd_byte
*) filehdr_out
->f_symptr
);
324 bfd_h_put_32(abfd
, filehdr_in
->f_nsyms
, (bfd_byte
*) filehdr_out
->f_nsyms
);
325 bfd_h_put_16(abfd
, filehdr_in
->f_opthdr
, (bfd_byte
*) filehdr_out
->f_opthdr
);
326 bfd_h_put_16(abfd
, filehdr_in
->f_flags
, (bfd_byte
*) filehdr_out
->f_flags
);
328 /* put in extra dos header stuff. This data remains essentially
329 constant, it just has to be tacked on to the beginning of all exes
331 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_magic
, (bfd_byte
*) filehdr_out
->e_magic
);
332 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cblp
, (bfd_byte
*) filehdr_out
->e_cblp
);
333 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cp
, (bfd_byte
*) filehdr_out
->e_cp
);
334 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_crlc
, (bfd_byte
*) filehdr_out
->e_crlc
);
335 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cparhdr
,
336 (bfd_byte
*) filehdr_out
->e_cparhdr
);
337 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_minalloc
,
338 (bfd_byte
*) filehdr_out
->e_minalloc
);
339 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_maxalloc
,
340 (bfd_byte
*) filehdr_out
->e_maxalloc
);
341 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_ss
, (bfd_byte
*) filehdr_out
->e_ss
);
342 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_sp
, (bfd_byte
*) filehdr_out
->e_sp
);
343 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_csum
, (bfd_byte
*) filehdr_out
->e_csum
);
344 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_ip
, (bfd_byte
*) filehdr_out
->e_ip
);
345 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cs
, (bfd_byte
*) filehdr_out
->e_cs
);
346 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_lfarlc
, (bfd_byte
*) filehdr_out
->e_lfarlc
);
347 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_ovno
, (bfd_byte
*) filehdr_out
->e_ovno
);
350 for (idx
=0; idx
< 4; idx
++)
351 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_res
[idx
],
352 (bfd_byte
*) filehdr_out
->e_res
[idx
]);
354 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_oemid
, (bfd_byte
*) filehdr_out
->e_oemid
);
355 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_oeminfo
,
356 (bfd_byte
*) filehdr_out
->e_oeminfo
);
359 for (idx
=0; idx
< 10; idx
++)
360 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_res2
[idx
],
361 (bfd_byte
*) filehdr_out
->e_res2
[idx
]);
363 bfd_h_put_32(abfd
, filehdr_in
->pe
.e_lfanew
, (bfd_byte
*) filehdr_out
->e_lfanew
);
367 for (idx
=0; idx
< 16; idx
++)
368 bfd_h_put_32(abfd
, filehdr_in
->pe
.dos_message
[idx
],
369 (bfd_byte
*) filehdr_out
->dos_message
[idx
]);
372 /* also put in the NT signature */
373 bfd_h_put_32(abfd
, filehdr_in
->pe
.nt_signature
,
374 (bfd_byte
*) filehdr_out
->nt_signature
);
379 return sizeof(FILHDR
);
384 coff_swap_filehdr_out (abfd
, in
, out
)
389 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
390 FILHDR
*filehdr_out
= (FILHDR
*)out
;
392 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
393 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
394 bfd_h_put_32(abfd
, filehdr_in
->f_timdat
, (bfd_byte
*) filehdr_out
->f_timdat
);
395 PUT_FILEHDR_SYMPTR (abfd
, (bfd_vma
) filehdr_in
->f_symptr
,
396 (bfd_byte
*) filehdr_out
->f_symptr
);
397 bfd_h_put_32(abfd
, filehdr_in
->f_nsyms
, (bfd_byte
*) filehdr_out
->f_nsyms
);
398 bfd_h_put_16(abfd
, filehdr_in
->f_opthdr
, (bfd_byte
*) filehdr_out
->f_opthdr
);
399 bfd_h_put_16(abfd
, filehdr_in
->f_flags
, (bfd_byte
*) filehdr_out
->f_flags
);
401 return sizeof(FILHDR
);
408 coff_swap_sym_in (abfd
, ext1
, in1
)
413 SYMENT
*ext
= (SYMENT
*)ext1
;
414 struct internal_syment
*in
= (struct internal_syment
*)in1
;
416 if( ext
->e
.e_name
[0] == 0) {
417 in
->_n
._n_n
._n_zeroes
= 0;
418 in
->_n
._n_n
._n_offset
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
421 #if SYMNMLEN != E_SYMNMLEN
422 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
424 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
428 in
->n_value
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_value
);
429 in
->n_scnum
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_scnum
);
430 if (sizeof(ext
->e_type
) == 2){
431 in
->n_type
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_type
);
434 in
->n_type
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_type
);
436 in
->n_sclass
= bfd_h_get_8(abfd
, ext
->e_sclass
);
437 in
->n_numaux
= bfd_h_get_8(abfd
, ext
->e_numaux
);
439 /* The section symbols for the .idata$ sections have class 68, which MS
440 documentation indicates is a section symbol. The problem is that the
441 value field in the symbol is simply a copy of the .idata section's flags
442 rather than something useful. When these symbols are encountered, change
443 the value to 0 and the section number to 1 so that they will be handled
444 somewhat correctly in the bfd code. */
445 if (in
->n_sclass
== 0x68) {
448 /* I have tried setting the class to 3 and using the following to set
449 the section number. This will put the address of the pointer to the
450 string kernel32.dll at addresses 0 and 0x10 off start of idata section
451 which is not correct */
452 /* if (strcmp (in->_n._n_name, ".idata$4") == 0) */
453 /* in->n_scnum = 3; */
455 /* in->n_scnum = 2; */
458 #ifdef coff_swap_sym_in_hook
459 coff_swap_sym_in_hook(abfd
, ext1
, in1
);
464 coff_swap_sym_out (abfd
, inp
, extp
)
469 struct internal_syment
*in
= (struct internal_syment
*)inp
;
470 SYMENT
*ext
=(SYMENT
*)extp
;
471 if(in
->_n
._n_name
[0] == 0) {
472 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
473 bfd_h_put_32(abfd
, in
->_n
._n_n
._n_offset
, (bfd_byte
*) ext
->e
.e
.e_offset
);
476 #if SYMNMLEN != E_SYMNMLEN
477 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
479 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
483 bfd_h_put_32(abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
484 bfd_h_put_16(abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
485 if (sizeof(ext
->e_type
) == 2)
487 bfd_h_put_16(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
491 bfd_h_put_32(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
493 bfd_h_put_8(abfd
, in
->n_sclass
, ext
->e_sclass
);
494 bfd_h_put_8(abfd
, in
->n_numaux
, ext
->e_numaux
);
496 return sizeof(SYMENT
);
500 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
509 AUXENT
*ext
= (AUXENT
*)ext1
;
510 union internal_auxent
*in
= (union internal_auxent
*)in1
;
514 if (ext
->x_file
.x_fname
[0] == 0) {
515 in
->x_file
.x_n
.x_zeroes
= 0;
516 in
->x_file
.x_n
.x_offset
=
517 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
519 #if FILNMLEN != E_FILNMLEN
520 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
522 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
533 if (type
== T_NULL
) {
534 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN(abfd
, ext
);
535 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC(abfd
, ext
);
536 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO(abfd
, ext
);
537 in
->x_scn
.x_checksum
= bfd_h_get_32 (abfd
,
538 (bfd_byte
*) ext
->x_scn
.x_checksum
);
539 in
->x_scn
.x_associated
=
540 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_scn
.x_associated
);
541 in
->x_scn
.x_comdat
= bfd_h_get_8 (abfd
,
542 (bfd_byte
*) ext
->x_scn
.x_comdat
);
548 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
550 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
553 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
555 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
556 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
560 #if DIMNUM != E_DIMNUM
561 #error we need to cope with truncating or extending DIMNUM
563 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
564 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
565 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
566 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
567 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
568 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
569 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
570 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
574 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
577 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO(abfd
, ext
);
578 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE(abfd
, ext
);
583 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
592 union internal_auxent
*in
= (union internal_auxent
*)inp
;
593 AUXENT
*ext
= (AUXENT
*)extp
;
595 memset((PTR
)ext
, 0, AUXESZ
);
598 if (in
->x_file
.x_fname
[0] == 0) {
599 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
601 in
->x_file
.x_n
.x_offset
,
602 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
605 #if FILNMLEN != E_FILNMLEN
606 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
608 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
611 return sizeof (AUXENT
);
619 if (type
== T_NULL
) {
620 PUT_SCN_SCNLEN(abfd
, in
->x_scn
.x_scnlen
, ext
);
621 PUT_SCN_NRELOC(abfd
, in
->x_scn
.x_nreloc
, ext
);
622 PUT_SCN_NLINNO(abfd
, in
->x_scn
.x_nlinno
, ext
);
623 bfd_h_put_32 (abfd
, in
->x_scn
.x_checksum
,
624 (bfd_byte
*) ext
->x_scn
.x_checksum
);
625 bfd_h_put_16 (abfd
, in
->x_scn
.x_associated
,
626 (bfd_byte
*) ext
->x_scn
.x_associated
);
627 bfd_h_put_8 (abfd
, in
->x_scn
.x_comdat
,
628 (bfd_byte
*) ext
->x_scn
.x_comdat
);
629 return sizeof (AUXENT
);
634 bfd_h_put_32(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
636 bfd_h_put_16(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
639 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
641 PUT_FCN_LNNOPTR(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
642 PUT_FCN_ENDNDX(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
646 #if DIMNUM != E_DIMNUM
647 #error we need to cope with truncating or extending DIMNUM
649 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
650 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
651 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
652 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
653 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
654 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
655 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
656 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
660 bfd_h_put_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
,
661 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
664 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
665 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
668 return sizeof(AUXENT
);
673 coff_swap_lineno_in (abfd
, ext1
, in1
)
678 LINENO
*ext
= (LINENO
*)ext1
;
679 struct internal_lineno
*in
= (struct internal_lineno
*)in1
;
681 in
->l_addr
.l_symndx
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->l_addr
.l_symndx
);
682 in
->l_lnno
= GET_LINENO_LNNO(abfd
, ext
);
686 coff_swap_lineno_out (abfd
, inp
, outp
)
691 struct internal_lineno
*in
= (struct internal_lineno
*)inp
;
692 struct external_lineno
*ext
= (struct external_lineno
*)outp
;
693 bfd_h_put_32(abfd
, in
->l_addr
.l_symndx
, (bfd_byte
*)
694 ext
->l_addr
.l_symndx
);
696 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
697 return sizeof(struct external_lineno
);
703 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
708 struct internal_extra_pe_aouthdr
*a
;
709 PEAOUTHDR
*src
= (PEAOUTHDR
*)(aouthdr_ext1
);
710 AOUTHDR
*aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
711 struct internal_aouthdr
*aouthdr_int
= (struct internal_aouthdr
*)aouthdr_int1
;
713 aouthdr_int
->magic
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->magic
);
714 aouthdr_int
->vstamp
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->vstamp
);
716 GET_AOUTHDR_TSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->tsize
);
718 GET_AOUTHDR_DSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->dsize
);
720 GET_AOUTHDR_BSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->bsize
);
722 GET_AOUTHDR_ENTRY (abfd
, (bfd_byte
*) aouthdr_ext
->entry
);
723 aouthdr_int
->text_start
=
724 GET_AOUTHDR_TEXT_START (abfd
, (bfd_byte
*) aouthdr_ext
->text_start
);
725 aouthdr_int
->data_start
=
726 GET_AOUTHDR_DATA_START (abfd
, (bfd_byte
*) aouthdr_ext
->data_start
);
728 a
= &aouthdr_int
->pe
;
729 a
->ImageBase
= bfd_h_get_32 (abfd
, src
->ImageBase
);
730 a
->SectionAlignment
= bfd_h_get_32 (abfd
, src
->SectionAlignment
);
731 a
->FileAlignment
= bfd_h_get_32 (abfd
, src
->FileAlignment
);
732 a
->MajorOperatingSystemVersion
=
733 bfd_h_get_16 (abfd
, src
->MajorOperatingSystemVersion
);
734 a
->MinorOperatingSystemVersion
=
735 bfd_h_get_16 (abfd
, src
->MinorOperatingSystemVersion
);
736 a
->MajorImageVersion
= bfd_h_get_16 (abfd
, src
->MajorImageVersion
);
737 a
->MinorImageVersion
= bfd_h_get_16 (abfd
, src
->MinorImageVersion
);
738 a
->MajorSubsystemVersion
= bfd_h_get_16 (abfd
, src
->MajorSubsystemVersion
);
739 a
->MinorSubsystemVersion
= bfd_h_get_16 (abfd
, src
->MinorSubsystemVersion
);
740 a
->Reserved1
= bfd_h_get_32 (abfd
, src
->Reserved1
);
741 a
->SizeOfImage
= bfd_h_get_32 (abfd
, src
->SizeOfImage
);
742 a
->SizeOfHeaders
= bfd_h_get_32 (abfd
, src
->SizeOfHeaders
);
743 a
->CheckSum
= bfd_h_get_32 (abfd
, src
->CheckSum
);
744 a
->Subsystem
= bfd_h_get_16 (abfd
, src
->Subsystem
);
745 a
->DllCharacteristics
= bfd_h_get_16 (abfd
, src
->DllCharacteristics
);
746 a
->SizeOfStackReserve
= bfd_h_get_32 (abfd
, src
->SizeOfStackReserve
);
747 a
->SizeOfStackCommit
= bfd_h_get_32 (abfd
, src
->SizeOfStackCommit
);
748 a
->SizeOfHeapReserve
= bfd_h_get_32 (abfd
, src
->SizeOfHeapReserve
);
749 a
->SizeOfHeapCommit
= bfd_h_get_32 (abfd
, src
->SizeOfHeapCommit
);
750 a
->LoaderFlags
= bfd_h_get_32 (abfd
, src
->LoaderFlags
);
751 a
->NumberOfRvaAndSizes
= bfd_h_get_32 (abfd
, src
->NumberOfRvaAndSizes
);
755 for (idx
=0; idx
< 16; idx
++)
757 a
->DataDirectory
[idx
].VirtualAddress
=
758 bfd_h_get_32 (abfd
, src
->DataDirectory
[idx
][0]);
759 a
->DataDirectory
[idx
].Size
=
760 bfd_h_get_32 (abfd
, src
->DataDirectory
[idx
][1]);
764 if (aouthdr_int
->entry
)
765 aouthdr_int
->entry
+= a
->ImageBase
;
766 if (aouthdr_int
->tsize
)
767 aouthdr_int
->text_start
+= a
->ImageBase
;
768 if (aouthdr_int
->dsize
)
769 aouthdr_int
->data_start
+= a
->ImageBase
;
773 static void add_data_entry (abfd
, aout
, idx
, name
, base
)
775 struct internal_extra_pe_aouthdr
*aout
;
780 asection
*sec
= bfd_get_section_by_name (abfd
, name
);
782 /* add import directory information if it exists */
785 aout
->DataDirectory
[idx
].VirtualAddress
= sec
->vma
- base
;
786 aout
->DataDirectory
[idx
].Size
= pei_section_data (abfd
, sec
)->virt_size
;
787 sec
->flags
|= SEC_DATA
;
792 coff_swap_aouthdr_out (abfd
, in
, out
)
797 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
798 struct internal_extra_pe_aouthdr
*extra
= &pe_data (abfd
)->pe_opthdr
;
799 PEAOUTHDR
*aouthdr_out
= (PEAOUTHDR
*)out
;
801 bfd_vma sa
= extra
->SectionAlignment
;
802 bfd_vma fa
= extra
->FileAlignment
;
803 bfd_vma ib
= extra
->ImageBase
;
805 if (aouthdr_in
->tsize
)
806 aouthdr_in
->text_start
-= ib
;
807 if (aouthdr_in
->dsize
)
808 aouthdr_in
->data_start
-= ib
;
809 if (aouthdr_in
->entry
)
810 aouthdr_in
->entry
-= ib
;
812 #define FA(x) (((x) + fa -1 ) & (- fa))
813 #define SA(x) (((x) + sa -1 ) & (- sa))
815 /* We like to have the sizes aligned */
817 aouthdr_in
->bsize
= FA (aouthdr_in
->bsize
);
820 extra
->NumberOfRvaAndSizes
= IMAGE_NUMBEROF_DIRECTORY_ENTRIES
;
822 /* first null out all data directory entries .. */
823 memset (extra
->DataDirectory
, sizeof (extra
->DataDirectory
), 0);
825 add_data_entry (abfd
, extra
, 0, ".edata", ib
);
826 add_data_entry (abfd
, extra
, 1, ".idata", ib
);
827 add_data_entry (abfd
, extra
, 2, ".rsrc" ,ib
);
830 /* FIXME: do other PE platforms use this? */
831 add_data_entry (abfd
, extra
, 3, ".pdata" ,ib
);
834 add_data_entry (abfd
, extra
, 5, ".reloc", ib
);
837 /* On the PPC NT system, this field is set up as follows. It is
838 not an "officially" reserved field, so it currently has no title.
839 first_thunk_address is idata$5, and the thunk_size is the size
840 of the idata$5 chunk of the idata section.
842 extra
->DataDirectory
[12].VirtualAddress
= first_thunk_address
;
843 extra
->DataDirectory
[12].Size
= thunk_size
;
845 /* On the PPC NT system, the size of the directory entry is not the
846 size of the entire section. It's actually offset to the end of
847 the idata$3 component of the idata section. This is the size of
848 the entire import table. (also known as the start of idata$4)
850 extra
->DataDirectory
[1].Size
= import_table_size
;
856 bfd_vma isize
= SA(abfd
->sections
->filepos
);
859 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
861 int rounded
= FA(sec
->_raw_size
);
863 if (sec
->flags
& SEC_DATA
)
865 if (sec
->flags
& SEC_CODE
)
867 isize
+= SA(rounded
);
870 aouthdr_in
->dsize
= dsize
;
871 aouthdr_in
->tsize
= tsize
;
872 extra
->SizeOfImage
= isize
;
875 extra
->SizeOfHeaders
= abfd
->sections
->filepos
;
876 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->standard
.magic
);
879 /* this little piece of magic sets the "linker version" field to 2.60 */
880 bfd_h_put_16(abfd
, 2 + 60 * 256, (bfd_byte
*) aouthdr_out
->standard
.vstamp
);
882 /* this little piece of magic sets the "linker version" field to 2.55 */
883 bfd_h_put_16(abfd
, 2 + 55 * 256, (bfd_byte
*) aouthdr_out
->standard
.vstamp
);
886 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->standard
.tsize
);
887 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->standard
.dsize
);
888 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->standard
.bsize
);
889 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->standard
.entry
);
890 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
891 (bfd_byte
*) aouthdr_out
->standard
.text_start
);
893 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
894 (bfd_byte
*) aouthdr_out
->standard
.data_start
);
897 bfd_h_put_32 (abfd
, extra
->ImageBase
,
898 (bfd_byte
*) aouthdr_out
->ImageBase
);
899 bfd_h_put_32 (abfd
, extra
->SectionAlignment
,
900 (bfd_byte
*) aouthdr_out
->SectionAlignment
);
901 bfd_h_put_32 (abfd
, extra
->FileAlignment
,
902 (bfd_byte
*) aouthdr_out
->FileAlignment
);
903 bfd_h_put_16 (abfd
, extra
->MajorOperatingSystemVersion
,
904 (bfd_byte
*) aouthdr_out
->MajorOperatingSystemVersion
);
905 bfd_h_put_16 (abfd
, extra
->MinorOperatingSystemVersion
,
906 (bfd_byte
*) aouthdr_out
->MinorOperatingSystemVersion
);
907 bfd_h_put_16 (abfd
, extra
->MajorImageVersion
,
908 (bfd_byte
*) aouthdr_out
->MajorImageVersion
);
909 bfd_h_put_16 (abfd
, extra
->MinorImageVersion
,
910 (bfd_byte
*) aouthdr_out
->MinorImageVersion
);
911 bfd_h_put_16 (abfd
, extra
->MajorSubsystemVersion
,
912 (bfd_byte
*) aouthdr_out
->MajorSubsystemVersion
);
913 bfd_h_put_16 (abfd
, extra
->MinorSubsystemVersion
,
914 (bfd_byte
*) aouthdr_out
->MinorSubsystemVersion
);
915 bfd_h_put_32 (abfd
, extra
->Reserved1
,
916 (bfd_byte
*) aouthdr_out
->Reserved1
);
917 bfd_h_put_32 (abfd
, extra
->SizeOfImage
,
918 (bfd_byte
*) aouthdr_out
->SizeOfImage
);
919 bfd_h_put_32 (abfd
, extra
->SizeOfHeaders
,
920 (bfd_byte
*) aouthdr_out
->SizeOfHeaders
);
921 bfd_h_put_32 (abfd
, extra
->CheckSum
,
922 (bfd_byte
*) aouthdr_out
->CheckSum
);
923 bfd_h_put_16 (abfd
, extra
->Subsystem
,
924 (bfd_byte
*) aouthdr_out
->Subsystem
);
925 bfd_h_put_16 (abfd
, extra
->DllCharacteristics
,
926 (bfd_byte
*) aouthdr_out
->DllCharacteristics
);
927 bfd_h_put_32 (abfd
, extra
->SizeOfStackReserve
,
928 (bfd_byte
*) aouthdr_out
->SizeOfStackReserve
);
929 bfd_h_put_32 (abfd
, extra
->SizeOfStackCommit
,
930 (bfd_byte
*) aouthdr_out
->SizeOfStackCommit
);
931 bfd_h_put_32 (abfd
, extra
->SizeOfHeapReserve
,
932 (bfd_byte
*) aouthdr_out
->SizeOfHeapReserve
);
933 bfd_h_put_32 (abfd
, extra
->SizeOfHeapCommit
,
934 (bfd_byte
*) aouthdr_out
->SizeOfHeapCommit
);
935 bfd_h_put_32 (abfd
, extra
->LoaderFlags
,
936 (bfd_byte
*) aouthdr_out
->LoaderFlags
);
937 bfd_h_put_32 (abfd
, extra
->NumberOfRvaAndSizes
,
938 (bfd_byte
*) aouthdr_out
->NumberOfRvaAndSizes
);
941 for (idx
=0; idx
< 16; idx
++)
943 bfd_h_put_32 (abfd
, extra
->DataDirectory
[idx
].VirtualAddress
,
944 (bfd_byte
*) aouthdr_out
->DataDirectory
[idx
][0]);
945 bfd_h_put_32 (abfd
, extra
->DataDirectory
[idx
].Size
,
946 (bfd_byte
*) aouthdr_out
->DataDirectory
[idx
][1]);
950 return sizeof(AOUTHDR
);
954 coff_swap_scnhdr_in (abfd
, ext
, in
)
959 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
960 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
962 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof(scnhdr_int
->s_name
));
963 scnhdr_int
->s_vaddr
=
964 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
965 scnhdr_int
->s_paddr
=
966 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
968 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
969 scnhdr_int
->s_scnptr
=
970 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
971 scnhdr_int
->s_relptr
=
972 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
973 scnhdr_int
->s_lnnoptr
=
974 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
975 scnhdr_int
->s_flags
= bfd_h_get_32(abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
977 scnhdr_int
->s_nreloc
= bfd_h_get_16(abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
978 scnhdr_int
->s_nlnno
= bfd_h_get_16(abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
980 if (scnhdr_int
->s_vaddr
!= 0)
982 scnhdr_int
->s_vaddr
+= pe_data (abfd
)->pe_opthdr
.ImageBase
;
984 if (strcmp (scnhdr_int
->s_name
, _BSS
) == 0)
986 scnhdr_int
->s_size
= scnhdr_int
->s_paddr
;
987 scnhdr_int
->s_paddr
= 0;
992 coff_swap_scnhdr_out (abfd
, in
, out
)
997 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
998 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
999 unsigned int ret
= sizeof (SCNHDR
);
1003 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof(scnhdr_int
->s_name
));
1005 PUT_SCNHDR_VADDR (abfd
,
1006 (scnhdr_int
->s_vaddr
1007 - pe_data(abfd
)->pe_opthdr
.ImageBase
),
1008 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
1010 /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
1011 value except for the BSS section, its s_size should be 0 */
1014 if (strcmp (scnhdr_int
->s_name
, _BSS
) == 0)
1016 ps
= scnhdr_int
->s_size
;
1021 ps
= scnhdr_int
->s_paddr
;
1022 ss
= scnhdr_int
->s_size
;
1025 PUT_SCNHDR_SIZE (abfd
, ss
,
1026 (bfd_byte
*) scnhdr_ext
->s_size
);
1029 PUT_SCNHDR_PADDR (abfd
, ps
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
1031 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
1032 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
1033 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
1034 (bfd_byte
*) scnhdr_ext
->s_relptr
);
1035 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
1036 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
1038 /* Extra flags must be set when dealing with NT. All sections should also
1039 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
1040 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
1041 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
1042 (this is especially important when dealing with the .idata section since
1043 the addresses for routines from .dlls must be overwritten). If .reloc
1044 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
1045 (0x02000000). Also, the resource data should also be read and
1048 /* FIXME: alignment is also encoded in this field, at least on ppc (krk) */
1049 /* FIXME: even worse, I don't see how to get the original alignment field*/
1053 int flags
= scnhdr_int
->s_flags
;
1054 if (strcmp (scnhdr_int
->s_name
, ".data") == 0 ||
1055 strcmp (scnhdr_int
->s_name
, ".CRT") == 0 ||
1056 strcmp (scnhdr_int
->s_name
, ".rsrc") == 0 ||
1057 strcmp (scnhdr_int
->s_name
, ".bss") == 0)
1058 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
1059 else if (strcmp (scnhdr_int
->s_name
, ".text") == 0)
1060 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_EXECUTE
;
1061 else if (strcmp (scnhdr_int
->s_name
, ".reloc") == 0)
1062 flags
= SEC_DATA
| IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_DISCARDABLE
;
1063 else if (strcmp (scnhdr_int
->s_name
, ".idata") == 0)
1064 flags
= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
| SEC_DATA
;
1065 else if (strcmp (scnhdr_int
->s_name
, ".rdata") == 0
1066 || strcmp (scnhdr_int
->s_name
, ".edata") == 0)
1067 flags
= IMAGE_SCN_MEM_READ
| SEC_DATA
;
1068 else if (strcmp (scnhdr_int
->s_name
, ".pdata") == 0)
1069 flags
= IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_ALIGN_4BYTES
|
1070 IMAGE_SCN_MEM_READ
;
1071 /* Remember this field is a max of 8 chars, so the null is _not_ there
1072 for an 8 character name like ".reldata". (yep. Stupid bug) */
1073 else if (strncmp (scnhdr_int
->s_name
, ".reldata", strlen(".reldata")) == 0)
1074 flags
= IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_ALIGN_8BYTES
|
1075 IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
1076 else if (strcmp (scnhdr_int
->s_name
, ".ydata") == 0)
1077 flags
= IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_ALIGN_8BYTES
|
1078 IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
1079 else if (strncmp (scnhdr_int
->s_name
, ".drectve", strlen(".drectve")) == 0)
1080 flags
= IMAGE_SCN_LNK_INFO
| IMAGE_SCN_LNK_REMOVE
;
1081 #ifdef POWERPC_LE_PE
1082 else if (strncmp (scnhdr_int
->s_name
, ".stabstr", strlen(".stabstr")) == 0)
1084 flags
= IMAGE_SCN_LNK_INFO
;
1086 else if (strcmp (scnhdr_int
->s_name
, ".stab") == 0)
1088 flags
= IMAGE_SCN_LNK_INFO
;
1092 bfd_h_put_32(abfd
, flags
, (bfd_byte
*) scnhdr_ext
->s_flags
);
1095 if (scnhdr_int
->s_nlnno
<= 0xffff)
1096 bfd_h_put_16(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
1099 (*_bfd_error_handler
) ("%s: line number overflow: 0x%lx > 0xffff",
1100 bfd_get_filename (abfd
),
1101 scnhdr_int
->s_nlnno
);
1102 bfd_set_error (bfd_error_file_truncated
);
1103 bfd_h_put_16 (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
1106 if (scnhdr_int
->s_nreloc
<= 0xffff)
1107 bfd_h_put_16(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
1110 (*_bfd_error_handler
) ("%s: reloc overflow: 0x%lx > 0xffff",
1111 bfd_get_filename (abfd
),
1112 scnhdr_int
->s_nreloc
);
1113 bfd_set_error (bfd_error_file_truncated
);
1114 bfd_h_put_16 (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
1120 static char * dir_names
[IMAGE_NUMBEROF_DIRECTORY_ENTRIES
] =
1122 "Export Directory [.edata]",
1123 "Import Directory [parts of .idata]",
1124 "Resource Directory [.rsrc]",
1125 "Exception Directory [.pdata]",
1126 "Security Directory",
1127 "Base Relocation Directory [.reloc]",
1129 "Description Directory",
1130 "Special Directory",
1131 "Thread Storage Directory [.tls]",
1132 "Load Configuration Directory",
1133 "Bound Import Directory",
1134 "Import Address Table Directory",
1140 /**********************************************************************/
1142 pe_print_idata(abfd
, vfile
)
1148 asection
*section
= bfd_get_section_by_name (abfd
, ".idata");
1150 #ifdef POWERPC_LE_PE
1151 asection
*rel_section
= bfd_get_section_by_name (abfd
, ".reldata");
1154 bfd_size_type datasize
= 0;
1156 bfd_size_type start
, stop
;
1159 pe_data_type
*pe
= pe_data (abfd
);
1160 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
1165 #ifdef POWERPC_LE_PE
1166 if (rel_section
!= 0 && bfd_section_size (abfd
, rel_section
) != 0)
1168 /* The toc address can be found by taking the starting address,
1169 which on the PPC locates a function descriptor. The descriptor
1170 consists of the function code starting address followed by the
1171 address of the toc. The starting address we get from the bfd,
1172 and the descriptor is supposed to be in the .reldata section.
1175 bfd_vma loadable_toc_address
;
1176 bfd_vma toc_address
;
1177 bfd_vma start_address
;
1180 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
,
1182 if (data
== NULL
&& bfd_section_size (abfd
, rel_section
) != 0)
1185 datasize
= bfd_section_size (abfd
, rel_section
);
1187 bfd_get_section_contents (abfd
,
1190 bfd_section_size (abfd
, rel_section
));
1192 offset
= abfd
->start_address
- rel_section
->vma
;
1194 start_address
= bfd_get_32(abfd
, data
+offset
);
1195 loadable_toc_address
= bfd_get_32(abfd
, data
+offset
+4);
1196 toc_address
= loadable_toc_address
- 32768;
1199 "\nFunction descriptor located at the start address: %04lx\n",
1200 (unsigned long int) (abfd
->start_address
));
1202 "\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n",
1203 start_address
, loadable_toc_address
, toc_address
);
1208 "\nThe Import Tables (interpreted .idata section contents)\n");
1210 " vma: Hint Time Forward DLL First\n");
1212 " Table Stamp Chain Name Thunk\n");
1214 if (bfd_section_size (abfd
, section
) == 0)
1217 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
, section
));
1218 datasize
= bfd_section_size (abfd
, section
);
1219 if (data
== NULL
&& datasize
!= 0)
1222 bfd_get_section_contents (abfd
,
1225 bfd_section_size (abfd
, section
));
1229 stop
= bfd_section_size (abfd
, section
);
1231 for (i
= start
; i
< stop
; i
+= onaline
)
1235 bfd_vma forward_chain
;
1237 bfd_vma first_thunk
;
1241 int adj
= extra
->ImageBase
- section
->vma
;
1245 (unsigned long int) (i
+ section
->vma
));
1253 hint_addr
= bfd_get_32(abfd
, data
+i
);
1254 time_stamp
= bfd_get_32(abfd
, data
+i
+4);
1255 forward_chain
= bfd_get_32(abfd
, data
+i
+8);
1256 dll_name
= bfd_get_32(abfd
, data
+i
+12);
1257 first_thunk
= bfd_get_32(abfd
, data
+i
+16);
1259 fprintf(file
, "%08lx %08lx %08lx %08lx %08lx\n",
1271 /* the image base is present in the section->vma */
1272 dll
= (char *) data
+ dll_name
+ adj
;
1273 fprintf(file
, "\n\tDLL Name: %s\n", dll
);
1274 fprintf(file
, "\tvma: Ordinal Member-Name\n");
1276 idx
= hint_addr
+ adj
;
1278 for (j
=0;j
<stop
;j
+=4)
1282 bfd_vma member
= bfd_get_32(abfd
, data
+ idx
+ j
);
1285 ordinal
= bfd_get_16(abfd
,
1286 data
+ member
+ adj
);
1287 member_name
= (char *) data
+ member
+ adj
+ 2;
1288 fprintf(file
, "\t%04lx\t %4d %s\n",
1289 member
, ordinal
, member_name
);
1292 if (hint_addr
!= first_thunk
)
1297 idx2
= first_thunk
+ adj
;
1299 for (j
=0;j
<stop
;j
+=4)
1303 bfd_vma hint_member
= bfd_get_32(abfd
, data
+ idx
+ j
);
1304 bfd_vma iat_member
= bfd_get_32(abfd
, data
+ idx2
+ j
);
1305 if (hint_member
!= iat_member
)
1310 "\tThe Import Address Table (difference found)\n");
1311 fprintf(file
, "\tvma: Ordinal Member-Name\n");
1314 if (iat_member
== 0)
1317 "\t>>> Ran out of IAT members!\n");
1321 ordinal
= bfd_get_16(abfd
,
1322 data
+ iat_member
+ adj
);
1323 member_name
= (char *) data
+ iat_member
+ adj
+ 2;
1324 fprintf(file
, "\t%04lx\t %4d %s\n",
1325 iat_member
, ordinal
, member_name
);
1329 if (hint_member
== 0)
1335 "\tThe Import Address Table is identical\n");
1339 fprintf(file
, "\n");
1349 pe_print_edata(abfd
, vfile
)
1355 asection
*section
= bfd_get_section_by_name (abfd
, ".edata");
1357 bfd_size_type datasize
= 0;
1363 long export_flags
; /* reserved - should be zero */
1367 bfd_vma name
; /* rva - relative to image base */
1368 long base
; /* ordinal base */
1369 long num_functions
; /* Number in the export address table */
1370 long num_names
; /* Number in the name pointer table */
1371 bfd_vma eat_addr
; /* rva to the export address table */
1372 bfd_vma npt_addr
; /* rva to the Export Name Pointer Table */
1373 bfd_vma ot_addr
; /* rva to the Ordinal Table */
1376 pe_data_type
*pe
= pe_data (abfd
);
1377 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
1382 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
,
1384 datasize
= bfd_section_size (abfd
, section
);
1386 if (data
== NULL
&& datasize
!= 0)
1389 bfd_get_section_contents (abfd
,
1392 bfd_section_size (abfd
, section
));
1394 /* Go get Export Directory Table */
1395 edt
.export_flags
= bfd_get_32(abfd
, data
+0);
1396 edt
.time_stamp
= bfd_get_32(abfd
, data
+4);
1397 edt
.major_ver
= bfd_get_16(abfd
, data
+8);
1398 edt
.minor_ver
= bfd_get_16(abfd
, data
+10);
1399 edt
.name
= bfd_get_32(abfd
, data
+12);
1400 edt
.base
= bfd_get_32(abfd
, data
+16);
1401 edt
.num_functions
= bfd_get_32(abfd
, data
+20);
1402 edt
.num_names
= bfd_get_32(abfd
, data
+24);
1403 edt
.eat_addr
= bfd_get_32(abfd
, data
+28);
1404 edt
.npt_addr
= bfd_get_32(abfd
, data
+32);
1405 edt
.ot_addr
= bfd_get_32(abfd
, data
+36);
1407 adj
= extra
->ImageBase
- section
->vma
;
1410 /* Dump the EDT first first */
1412 "\nThe Export Tables (interpreted .edata section contents)\n\n");
1415 "Export Flags \t\t\t%lx\n", (unsigned long) edt
.export_flags
);
1418 "Time/Date stamp \t\t%lx\n", (unsigned long) edt
.time_stamp
);
1421 "Major/Minor \t\t\t%d/%d\n", edt
.major_ver
, edt
.minor_ver
);
1425 fprintf_vma (file
, edt
.name
);
1427 "%s\n", data
+ edt
.name
+ adj
);
1430 "Ordinal Base \t\t\t%ld\n", edt
.base
);
1436 "\tExport Address Table \t\t%lx\n",
1437 (unsigned long) edt
.num_functions
);
1440 "\t[Name Pointer/Ordinal] Table\t%ld\n", edt
.num_names
);
1443 "Table Addresses\n");
1446 "\tExport Address Table \t\t");
1447 fprintf_vma (file
, edt
.eat_addr
);
1448 fprintf (file
, "\n");
1451 "\tName Pointer Table \t\t");
1452 fprintf_vma (file
, edt
.npt_addr
);
1453 fprintf (file
, "\n");
1456 "\tOrdinal Table \t\t\t");
1457 fprintf_vma (file
, edt
.ot_addr
);
1458 fprintf (file
, "\n");
1461 /* The next table to find si the Export Address Table. It's basically
1462 a list of pointers that either locate a function in this dll, or
1463 forward the call to another dll. Something like:
1468 } export_address_table_entry;
1472 "\nExport Address Table -- Ordinal Base %ld\n",
1475 for (i
= 0; i
< edt
.num_functions
; ++i
)
1477 bfd_vma eat_member
= bfd_get_32(abfd
,
1478 data
+ edt
.eat_addr
+ (i
*4) + adj
);
1479 bfd_vma eat_actual
= extra
->ImageBase
+ eat_member
;
1480 bfd_vma edata_start
= bfd_get_section_vma(abfd
,section
);
1481 bfd_vma edata_end
= edata_start
+ bfd_section_size (abfd
, section
);
1484 if (eat_member
== 0)
1487 if (edata_start
< eat_actual
&& eat_actual
< edata_end
)
1489 /* this rva is to a name (forwarding function) in our section */
1490 /* Should locate a function descriptor */
1492 "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1493 (long) i
, (long) (i
+ edt
.base
), eat_member
,
1494 "Forwarder RVA", data
+ eat_member
+ adj
);
1498 /* Should locate a function descriptor in the reldata section */
1500 "\t[%4ld] +base[%4ld] %04lx %s\n",
1501 (long) i
, (long) (i
+ edt
.base
), eat_member
, "Export RVA");
1505 /* The Export Name Pointer Table is paired with the Export Ordinal Table */
1506 /* Dump them in parallel for clarity */
1508 "\n[Ordinal/Name Pointer] Table\n");
1510 for (i
= 0; i
< edt
.num_names
; ++i
)
1512 bfd_vma name_ptr
= bfd_get_32(abfd
,
1517 char *name
= (char *) data
+ name_ptr
+ adj
;
1519 bfd_vma ord
= bfd_get_16(abfd
,
1524 "\t[%4ld] %s\n", (long) ord
, name
);
1534 pe_print_pdata(abfd
, vfile
)
1540 asection
*section
= bfd_get_section_by_name (abfd
, ".pdata");
1541 bfd_size_type datasize
= 0;
1543 bfd_size_type start
, stop
;
1549 stop
= bfd_section_size (abfd
, section
);
1550 if ((stop
% onaline
) != 0)
1551 fprintf (file
, "Warning, .pdata section size (%ld) is not a multiple of %d\n",
1552 (long)stop
, onaline
);
1555 "\nThe Function Table (interpreted .pdata section contents)\n");
1557 " vma:\t\tBegin End EH EH PrologEnd\n");
1559 " \t\tAddress Address Handler Data Address\n");
1561 if (bfd_section_size (abfd
, section
) == 0)
1564 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
, section
));
1565 datasize
= bfd_section_size (abfd
, section
);
1566 if (data
== NULL
&& datasize
!= 0)
1569 bfd_get_section_contents (abfd
,
1572 bfd_section_size (abfd
, section
));
1576 for (i
= start
; i
< stop
; i
+= onaline
)
1582 bfd_vma prolog_end_addr
;
1587 begin_addr
= bfd_get_32(abfd
, data
+i
);
1588 end_addr
= bfd_get_32(abfd
, data
+i
+4);
1589 eh_handler
= bfd_get_32(abfd
, data
+i
+8);
1590 eh_data
= bfd_get_32(abfd
, data
+i
+12);
1591 prolog_end_addr
= bfd_get_32(abfd
, data
+i
+16);
1593 if (begin_addr
== 0 && end_addr
== 0 && eh_handler
== 0
1594 && eh_data
== 0 && prolog_end_addr
== 0)
1596 /* We are probably into the padding of the
1603 (unsigned long int) (i
+ section
->vma
));
1605 fprintf(file
, "%08lx %08lx %08lx %08lx %08lx",
1612 #ifdef POWERPC_LE_PE
1613 if (eh_handler
== 0 && eh_data
!= 0)
1615 /* Special bits here, although the meaning may */
1616 /* be a little mysterious. The only one I know */
1617 /* for sure is 0x03. */
1618 /* Code Significance */
1620 /* 0x01 Register Save Millicode */
1621 /* 0x02 Register Restore Millicode */
1622 /* 0x03 Glue Code Sequence */
1626 fprintf(file
, " Register save millicode");
1629 fprintf(file
, " Register restore millicode");
1632 fprintf(file
, " Glue code sequence");
1639 fprintf(file
, "\n");
1647 static const char *tbl
[6] =
1658 pe_print_reloc(abfd
, vfile
)
1664 asection
*section
= bfd_get_section_by_name (abfd
, ".reloc");
1665 bfd_size_type datasize
= 0;
1667 bfd_size_type start
, stop
;
1672 if (bfd_section_size (abfd
, section
) == 0)
1676 "\n\nPE File Base Relocations (interpreted .reloc section contents)\n");
1678 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
, section
));
1679 datasize
= bfd_section_size (abfd
, section
);
1680 if (data
== NULL
&& datasize
!= 0)
1683 bfd_get_section_contents (abfd
,
1686 bfd_section_size (abfd
, section
));
1690 stop
= bfd_section_size (abfd
, section
);
1692 for (i
= start
; i
< stop
;)
1695 bfd_vma virtual_address
;
1698 /* The .reloc section is a sequence of blocks, with a header consisting
1699 of two 32 bit quantities, followed by a number of 16 bit entries */
1701 virtual_address
= bfd_get_32(abfd
, data
+i
);
1702 size
= bfd_get_32(abfd
, data
+i
+4);
1703 number
= (size
- 8) / 2;
1711 "\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n",
1712 virtual_address
, size
, size
, number
);
1714 for (j
= 0; j
< number
; ++j
)
1716 unsigned short e
= bfd_get_16(abfd
, data
+ i
+ 8 + j
*2);
1717 int t
= (e
& 0xF000) >> 12;
1718 int off
= e
& 0x0FFF;
1724 "\treloc %4d offset %4x [%4lx] %s\n",
1725 j
, off
, (long) (off
+ virtual_address
), tbl
[t
]);
1737 pe_print_private_bfd_data (abfd
, vfile
)
1741 FILE *file
= (FILE *) vfile
;
1743 pe_data_type
*pe
= pe_data (abfd
);
1744 struct internal_extra_pe_aouthdr
*i
= &pe
->pe_opthdr
;
1746 fprintf (file
,"\nImageBase\t\t");
1747 fprintf_vma (file
, i
->ImageBase
);
1748 fprintf (file
,"\nSectionAlignment\t");
1749 fprintf_vma (file
, i
->SectionAlignment
);
1750 fprintf (file
,"\nFileAlignment\t\t");
1751 fprintf_vma (file
, i
->FileAlignment
);
1752 fprintf (file
,"\nMajorOSystemVersion\t%d\n", i
->MajorOperatingSystemVersion
);
1753 fprintf (file
,"MinorOSystemVersion\t%d\n", i
->MinorOperatingSystemVersion
);
1754 fprintf (file
,"MajorImageVersion\t%d\n", i
->MajorImageVersion
);
1755 fprintf (file
,"MinorImageVersion\t%d\n", i
->MinorImageVersion
);
1756 fprintf (file
,"MajorSubsystemVersion\t%d\n", i
->MajorSubsystemVersion
);
1757 fprintf (file
,"MinorSubsystemVersion\t%d\n", i
->MinorSubsystemVersion
);
1758 fprintf (file
,"Reserved1\t\t%08lx\n", i
->Reserved1
);
1759 fprintf (file
,"SizeOfImage\t\t%08lx\n", i
->SizeOfImage
);
1760 fprintf (file
,"SizeOfHeaders\t\t%08lx\n", i
->SizeOfHeaders
);
1761 fprintf (file
,"CheckSum\t\t%08lx\n", i
->CheckSum
);
1762 fprintf (file
,"Subsystem\t\t%08x\n", i
->Subsystem
);
1763 fprintf (file
,"DllCharacteristics\t%08x\n", i
->DllCharacteristics
);
1764 fprintf (file
,"SizeOfStackReserve\t");
1765 fprintf_vma (file
, i
->SizeOfStackReserve
);
1766 fprintf (file
,"\nSizeOfStackCommit\t");
1767 fprintf_vma (file
, i
->SizeOfStackCommit
);
1768 fprintf (file
,"\nSizeOfHeapReserve\t");
1769 fprintf_vma (file
, i
->SizeOfHeapReserve
);
1770 fprintf (file
,"\nSizeOfHeapCommit\t");
1771 fprintf_vma (file
, i
->SizeOfHeapCommit
);
1772 fprintf (file
,"\nLoaderFlags\t\t%08lx\n", i
->LoaderFlags
);
1773 fprintf (file
,"NumberOfRvaAndSizes\t%08lx\n", i
->NumberOfRvaAndSizes
);
1775 fprintf (file
,"\nThe Data Directory\n");
1776 for (j
= 0; j
< IMAGE_NUMBEROF_DIRECTORY_ENTRIES
; j
++)
1778 fprintf (file
, "Entry %1x ", j
);
1779 fprintf_vma (file
, i
->DataDirectory
[j
].VirtualAddress
);
1780 fprintf (file
, " %08lx ", i
->DataDirectory
[j
].Size
);
1781 fprintf (file
, "%s\n", dir_names
[j
]);
1784 pe_print_idata(abfd
, vfile
);
1785 pe_print_edata(abfd
, vfile
);
1786 pe_print_pdata(abfd
, vfile
);
1787 pe_print_reloc(abfd
, vfile
);
1797 abfd
->tdata
.pe_obj_data
=
1798 (struct pe_tdata
*) bfd_zalloc (abfd
, sizeof (pe_data_type
));
1800 if (abfd
->tdata
.pe_obj_data
== 0)
1803 pe
= pe_data (abfd
);
1806 pe
->in_reloc_p
= in_reloc_p
;
1810 /* Create the COFF backend specific information. */
1812 pe_mkobject_hook (abfd
, filehdr
, aouthdr
)
1817 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
1820 if (pe_mkobject (abfd
) == false)
1823 pe
= pe_data (abfd
);
1824 pe
->coff
.sym_filepos
= internal_f
->f_symptr
;
1825 /* These members communicate important constants about the symbol
1826 table to GDB's symbol-reading code. These `constants'
1827 unfortunately vary among coff implementations... */
1828 pe
->coff
.local_n_btmask
= N_BTMASK
;
1829 pe
->coff
.local_n_btshft
= N_BTSHFT
;
1830 pe
->coff
.local_n_tmask
= N_TMASK
;
1831 pe
->coff
.local_n_tshift
= N_TSHIFT
;
1832 pe
->coff
.local_symesz
= SYMESZ
;
1833 pe
->coff
.local_auxesz
= AUXESZ
;
1834 pe
->coff
.local_linesz
= LINESZ
;
1836 obj_raw_syment_count (abfd
) =
1837 obj_conv_table_size (abfd
) =
1838 internal_f
->f_nsyms
;
1840 pe
->real_flags
= internal_f
->f_flags
;
1842 #ifdef COFF_IMAGE_WITH_PE
1845 pe
->pe_opthdr
= ((struct internal_aouthdr
*)aouthdr
)->pe
;
1854 /* Copy any private info we understand from the input bfd
1855 to the output bfd. */
1857 #define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
1860 pe_bfd_copy_private_bfd_data (ibfd
, obfd
)
1863 /* One day we may try to grok other private data. */
1864 if (ibfd
->xvec
->flavour
!= bfd_target_coff_flavour
1865 || obfd
->xvec
->flavour
!= bfd_target_coff_flavour
)
1868 pe_data(obfd
)->pe_opthdr
= pe_data (ibfd
)->pe_opthdr
;
1873 #ifdef COFF_IMAGE_WITH_PE
1875 /* Copy private section data. */
1877 #define coff_bfd_copy_private_section_data pe_bfd_copy_private_section_data
1879 static boolean pe_bfd_copy_private_section_data
1880 PARAMS ((bfd
*, asection
*, bfd
*, asection
*));
1883 pe_bfd_copy_private_section_data (ibfd
, isec
, obfd
, osec
)
1889 if (coff_section_data (ibfd
, isec
) != NULL
1890 && pei_section_data (ibfd
, isec
) != NULL
)
1892 if (coff_section_data (obfd
, osec
) == NULL
)
1895 (PTR
) bfd_zalloc (obfd
, sizeof (struct coff_section_tdata
));
1896 if (osec
->used_by_bfd
== NULL
)
1899 if (pei_section_data (obfd
, osec
) == NULL
)
1901 coff_section_data (obfd
, osec
)->tdata
=
1902 (PTR
) bfd_zalloc (obfd
, sizeof (struct pei_section_tdata
));
1903 if (coff_section_data (obfd
, osec
)->tdata
== NULL
)
1906 pei_section_data (obfd
, osec
)->virt_size
=
1907 pei_section_data (ibfd
, isec
)->virt_size
;