1 /* Support for the generic parts of most COFF variants, for BFD.
2 Copyright 1995, 1996, 1997, 1998, 1999 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,
26 /* Hey look, some documentation [and in a place you expect to find it]!
28 The main reference for the pei format is "Microsoft Portable Executable
29 and Common Object File Format Specification 4.1". Get it if you need to
30 do some serious hacking on this code.
33 "Peering Inside the PE: A Tour of the Win32 Portable Executable
34 File Format", MSJ 1994, Volume 9.
36 The *sole* difference between the pe format and the pei format is that the
37 latter has an MSDOS 2.0 .exe header on the front that prints the message
38 "This app must be run under Windows." (or some such).
39 (FIXME: Whether that statement is *really* true or not is unknown.
40 Are there more subtle differences between pe and pei formats?
41 For now assume there aren't. If you find one, then for God sakes
44 The Microsoft docs use the word "image" instead of "executable" because
45 the former can also refer to a DLL (shared library). Confusion can arise
46 because the `i' in `pei' also refers to "image". The `pe' format can
47 also create images (i.e. executables), it's just that to run on a win32
48 system you need to use the pei format.
50 FIXME: Please add more docs here so the next poor fool that has to hack
51 on this code has a chance of getting something accomplished without
52 wasting too much time.
55 #ifdef coff_bfd_print_private_bfd_data
56 static boolean (*pe_saved_coff_bfd_print_private_bfd_data
)
58 = coff_bfd_print_private_bfd_data
;
59 #undef coff_bfd_print_private_bfd_data
61 static boolean (*pe_saved_coff_bfd_print_private_bfd_data
)
65 #define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
67 #define coff_mkobject pe_mkobject
68 #define coff_mkobject_hook pe_mkobject_hook
70 #ifndef GET_FCN_LNNOPTR
71 #define GET_FCN_LNNOPTR(abfd, ext) \
72 bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
75 #ifndef GET_FCN_ENDNDX
76 #define GET_FCN_ENDNDX(abfd, ext) \
77 bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
80 #ifndef PUT_FCN_LNNOPTR
81 #define PUT_FCN_LNNOPTR(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
83 #ifndef PUT_FCN_ENDNDX
84 #define PUT_FCN_ENDNDX(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
87 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
90 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
93 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
96 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
98 #ifndef GET_SCN_SCNLEN
99 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
101 #ifndef GET_SCN_NRELOC
102 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
104 #ifndef GET_SCN_NLINNO
105 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
107 #ifndef PUT_SCN_SCNLEN
108 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
110 #ifndef PUT_SCN_NRELOC
111 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
113 #ifndef PUT_SCN_NLINNO
114 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
116 #ifndef GET_LINENO_LNNO
117 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
119 #ifndef PUT_LINENO_LNNO
120 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno));
123 /* The f_symptr field in the filehdr is sometimes 64 bits. */
124 #ifndef GET_FILEHDR_SYMPTR
125 #define GET_FILEHDR_SYMPTR bfd_h_get_32
127 #ifndef PUT_FILEHDR_SYMPTR
128 #define PUT_FILEHDR_SYMPTR bfd_h_put_32
131 /* Some fields in the aouthdr are sometimes 64 bits. */
132 #ifndef GET_AOUTHDR_TSIZE
133 #define GET_AOUTHDR_TSIZE bfd_h_get_32
135 #ifndef PUT_AOUTHDR_TSIZE
136 #define PUT_AOUTHDR_TSIZE bfd_h_put_32
138 #ifndef GET_AOUTHDR_DSIZE
139 #define GET_AOUTHDR_DSIZE bfd_h_get_32
141 #ifndef PUT_AOUTHDR_DSIZE
142 #define PUT_AOUTHDR_DSIZE bfd_h_put_32
144 #ifndef GET_AOUTHDR_BSIZE
145 #define GET_AOUTHDR_BSIZE bfd_h_get_32
147 #ifndef PUT_AOUTHDR_BSIZE
148 #define PUT_AOUTHDR_BSIZE bfd_h_put_32
150 #ifndef GET_AOUTHDR_ENTRY
151 #define GET_AOUTHDR_ENTRY bfd_h_get_32
153 #ifndef PUT_AOUTHDR_ENTRY
154 #define PUT_AOUTHDR_ENTRY bfd_h_put_32
156 #ifndef GET_AOUTHDR_TEXT_START
157 #define GET_AOUTHDR_TEXT_START bfd_h_get_32
159 #ifndef PUT_AOUTHDR_TEXT_START
160 #define PUT_AOUTHDR_TEXT_START bfd_h_put_32
162 #ifndef GET_AOUTHDR_DATA_START
163 #define GET_AOUTHDR_DATA_START bfd_h_get_32
165 #ifndef PUT_AOUTHDR_DATA_START
166 #define PUT_AOUTHDR_DATA_START bfd_h_put_32
169 /* Some fields in the scnhdr are sometimes 64 bits. */
170 #ifndef GET_SCNHDR_PADDR
171 #define GET_SCNHDR_PADDR bfd_h_get_32
173 #ifndef PUT_SCNHDR_PADDR
174 #define PUT_SCNHDR_PADDR bfd_h_put_32
176 #ifndef GET_SCNHDR_VADDR
177 #define GET_SCNHDR_VADDR bfd_h_get_32
179 #ifndef PUT_SCNHDR_VADDR
180 #define PUT_SCNHDR_VADDR bfd_h_put_32
182 #ifndef GET_SCNHDR_SIZE
183 #define GET_SCNHDR_SIZE bfd_h_get_32
185 #ifndef PUT_SCNHDR_SIZE
186 #define PUT_SCNHDR_SIZE bfd_h_put_32
188 #ifndef GET_SCNHDR_SCNPTR
189 #define GET_SCNHDR_SCNPTR bfd_h_get_32
191 #ifndef PUT_SCNHDR_SCNPTR
192 #define PUT_SCNHDR_SCNPTR bfd_h_put_32
194 #ifndef GET_SCNHDR_RELPTR
195 #define GET_SCNHDR_RELPTR bfd_h_get_32
197 #ifndef PUT_SCNHDR_RELPTR
198 #define PUT_SCNHDR_RELPTR bfd_h_put_32
200 #ifndef GET_SCNHDR_LNNOPTR
201 #define GET_SCNHDR_LNNOPTR bfd_h_get_32
203 #ifndef PUT_SCNHDR_LNNOPTR
204 #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
207 static void coff_swap_reloc_in
PARAMS ((bfd
*, PTR
, PTR
));
208 static unsigned int coff_swap_reloc_out
PARAMS ((bfd
*, PTR
, PTR
));
209 static void coff_swap_filehdr_in
PARAMS ((bfd
*, PTR
, PTR
));
210 static unsigned int coff_swap_filehdr_out
PARAMS ((bfd
*, PTR
, PTR
));
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
215 PARAMS ((bfd
*, PTR
, int, int, int, int, PTR
));
216 static void coff_swap_lineno_in
PARAMS ((bfd
*, PTR
, PTR
));
217 static unsigned int coff_swap_lineno_out
PARAMS ((bfd
*, PTR
, PTR
));
218 static void coff_swap_aouthdr_in
PARAMS ((bfd
*, PTR
, PTR
));
219 static void add_data_entry
220 PARAMS ((bfd
*, struct internal_extra_pe_aouthdr
*, int, char *, bfd_vma
));
221 static unsigned int coff_swap_aouthdr_out
PARAMS ((bfd
*, PTR
, PTR
));
222 static void coff_swap_scnhdr_in
PARAMS ((bfd
*, PTR
, PTR
));
223 static unsigned int coff_swap_scnhdr_out
PARAMS ((bfd
*, PTR
, PTR
));
224 static boolean pe_print_idata
PARAMS ((bfd
*, PTR
));
225 static boolean pe_print_edata
PARAMS ((bfd
*, PTR
));
226 static boolean pe_print_pdata
PARAMS ((bfd
*, PTR
));
227 static boolean pe_print_reloc
PARAMS ((bfd
*, PTR
));
228 static boolean pe_print_private_bfd_data
PARAMS ((bfd
*, PTR
));
229 static boolean pe_mkobject
PARAMS ((bfd
*));
230 static PTR pe_mkobject_hook
PARAMS ((bfd
*, PTR
, PTR
));
231 static boolean pe_bfd_copy_private_bfd_data
PARAMS ((bfd
*, bfd
*));
233 /**********************************************************************/
236 coff_swap_reloc_in (abfd
, src
, dst
)
241 RELOC
*reloc_src
= (RELOC
*) src
;
242 struct internal_reloc
*reloc_dst
= (struct internal_reloc
*) dst
;
244 reloc_dst
->r_vaddr
= bfd_h_get_32(abfd
, (bfd_byte
*)reloc_src
->r_vaddr
);
245 reloc_dst
->r_symndx
= bfd_h_get_signed_32(abfd
, (bfd_byte
*) reloc_src
->r_symndx
);
247 reloc_dst
->r_type
= bfd_h_get_16(abfd
, (bfd_byte
*) reloc_src
->r_type
);
249 #ifdef SWAP_IN_RELOC_OFFSET
250 reloc_dst
->r_offset
= SWAP_IN_RELOC_OFFSET(abfd
,
251 (bfd_byte
*) reloc_src
->r_offset
);
257 coff_swap_reloc_out (abfd
, src
, dst
)
262 struct internal_reloc
*reloc_src
= (struct internal_reloc
*)src
;
263 struct external_reloc
*reloc_dst
= (struct external_reloc
*)dst
;
264 bfd_h_put_32(abfd
, reloc_src
->r_vaddr
, (bfd_byte
*) reloc_dst
->r_vaddr
);
265 bfd_h_put_32(abfd
, reloc_src
->r_symndx
, (bfd_byte
*) reloc_dst
->r_symndx
);
267 bfd_h_put_16(abfd
, reloc_src
->r_type
, (bfd_byte
*)
270 #ifdef SWAP_OUT_RELOC_OFFSET
271 SWAP_OUT_RELOC_OFFSET(abfd
,
273 (bfd_byte
*) reloc_dst
->r_offset
);
275 #ifdef SWAP_OUT_RELOC_EXTRA
276 SWAP_OUT_RELOC_EXTRA(abfd
,reloc_src
, reloc_dst
);
283 coff_swap_filehdr_in (abfd
, src
, dst
)
288 FILHDR
*filehdr_src
= (FILHDR
*) src
;
289 struct internal_filehdr
*filehdr_dst
= (struct internal_filehdr
*) dst
;
290 filehdr_dst
->f_magic
= bfd_h_get_16(abfd
, (bfd_byte
*) filehdr_src
->f_magic
);
291 filehdr_dst
->f_nscns
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_nscns
);
292 filehdr_dst
->f_timdat
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_timdat
);
294 filehdr_dst
->f_nsyms
= bfd_h_get_32(abfd
, (bfd_byte
*)filehdr_src
-> f_nsyms
);
295 filehdr_dst
->f_flags
= bfd_h_get_16(abfd
, (bfd_byte
*)filehdr_src
-> f_flags
);
296 filehdr_dst
->f_symptr
= bfd_h_get_32 (abfd
, (bfd_byte
*) filehdr_src
->f_symptr
);
298 #ifdef COFF_IMAGE_WITH_PE
299 /* There are really two magic numbers involved; the magic number
300 that says this is a NT executable (PEI) and the magic number that
301 determines the architecture. The former is DOSMAGIC, stored in
302 the e_magic field. The latter is stored in the f_magic field.
303 If the NT magic number isn't valid, the architecture magic number
304 could be mimicked by some other field (specifically, the number
305 of relocs in section 3). Since this routine can only be called
306 correctly for a PEI file, check the e_magic number here, and, if
307 it doesn't match, clobber the f_magic number so that we don't get
309 if (bfd_h_get_16 (abfd
, (bfd_byte
*) filehdr_src
->e_magic
) != DOSMAGIC
)
310 filehdr_dst
->f_magic
= -1;
313 /* Other people's tools sometimes generate headers with an nsyms but
315 if (filehdr_dst
->f_nsyms
!= 0 && filehdr_dst
->f_symptr
== 0)
317 filehdr_dst
->f_nsyms
= 0;
318 filehdr_dst
->f_flags
|= F_LSYMS
;
321 filehdr_dst
->f_opthdr
= bfd_h_get_16(abfd
,
322 (bfd_byte
*)filehdr_src
-> f_opthdr
);
325 #ifdef COFF_IMAGE_WITH_PE
328 coff_swap_filehdr_out (abfd
, in
, out
)
334 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
335 FILHDR
*filehdr_out
= (FILHDR
*)out
;
337 if (pe_data (abfd
)->has_reloc_section
)
338 filehdr_in
->f_flags
&= ~F_RELFLG
;
340 if (pe_data (abfd
)->dll
)
341 filehdr_in
->f_flags
|= F_DLL
;
343 filehdr_in
->pe
.e_magic
= DOSMAGIC
;
344 filehdr_in
->pe
.e_cblp
= 0x90;
345 filehdr_in
->pe
.e_cp
= 0x3;
346 filehdr_in
->pe
.e_crlc
= 0x0;
347 filehdr_in
->pe
.e_cparhdr
= 0x4;
348 filehdr_in
->pe
.e_minalloc
= 0x0;
349 filehdr_in
->pe
.e_maxalloc
= 0xffff;
350 filehdr_in
->pe
.e_ss
= 0x0;
351 filehdr_in
->pe
.e_sp
= 0xb8;
352 filehdr_in
->pe
.e_csum
= 0x0;
353 filehdr_in
->pe
.e_ip
= 0x0;
354 filehdr_in
->pe
.e_cs
= 0x0;
355 filehdr_in
->pe
.e_lfarlc
= 0x40;
356 filehdr_in
->pe
.e_ovno
= 0x0;
358 for (idx
=0; idx
< 4; idx
++)
359 filehdr_in
->pe
.e_res
[idx
] = 0x0;
361 filehdr_in
->pe
.e_oemid
= 0x0;
362 filehdr_in
->pe
.e_oeminfo
= 0x0;
364 for (idx
=0; idx
< 10; idx
++)
365 filehdr_in
->pe
.e_res2
[idx
] = 0x0;
367 filehdr_in
->pe
.e_lfanew
= 0x80;
369 /* this next collection of data are mostly just characters. It appears
370 to be constant within the headers put on NT exes */
371 filehdr_in
->pe
.dos_message
[0] = 0x0eba1f0e;
372 filehdr_in
->pe
.dos_message
[1] = 0xcd09b400;
373 filehdr_in
->pe
.dos_message
[2] = 0x4c01b821;
374 filehdr_in
->pe
.dos_message
[3] = 0x685421cd;
375 filehdr_in
->pe
.dos_message
[4] = 0x70207369;
376 filehdr_in
->pe
.dos_message
[5] = 0x72676f72;
377 filehdr_in
->pe
.dos_message
[6] = 0x63206d61;
378 filehdr_in
->pe
.dos_message
[7] = 0x6f6e6e61;
379 filehdr_in
->pe
.dos_message
[8] = 0x65622074;
380 filehdr_in
->pe
.dos_message
[9] = 0x6e757220;
381 filehdr_in
->pe
.dos_message
[10] = 0x206e6920;
382 filehdr_in
->pe
.dos_message
[11] = 0x20534f44;
383 filehdr_in
->pe
.dos_message
[12] = 0x65646f6d;
384 filehdr_in
->pe
.dos_message
[13] = 0x0a0d0d2e;
385 filehdr_in
->pe
.dos_message
[14] = 0x24;
386 filehdr_in
->pe
.dos_message
[15] = 0x0;
387 filehdr_in
->pe
.nt_signature
= NT_SIGNATURE
;
391 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
392 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
394 bfd_h_put_32(abfd
, time (0), (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 /* put in extra dos header stuff. This data remains essentially
402 constant, it just has to be tacked on to the beginning of all exes
404 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_magic
, (bfd_byte
*) filehdr_out
->e_magic
);
405 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cblp
, (bfd_byte
*) filehdr_out
->e_cblp
);
406 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cp
, (bfd_byte
*) filehdr_out
->e_cp
);
407 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_crlc
, (bfd_byte
*) filehdr_out
->e_crlc
);
408 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cparhdr
,
409 (bfd_byte
*) filehdr_out
->e_cparhdr
);
410 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_minalloc
,
411 (bfd_byte
*) filehdr_out
->e_minalloc
);
412 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_maxalloc
,
413 (bfd_byte
*) filehdr_out
->e_maxalloc
);
414 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_ss
, (bfd_byte
*) filehdr_out
->e_ss
);
415 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_sp
, (bfd_byte
*) filehdr_out
->e_sp
);
416 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_csum
, (bfd_byte
*) filehdr_out
->e_csum
);
417 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_ip
, (bfd_byte
*) filehdr_out
->e_ip
);
418 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_cs
, (bfd_byte
*) filehdr_out
->e_cs
);
419 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_lfarlc
, (bfd_byte
*) filehdr_out
->e_lfarlc
);
420 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_ovno
, (bfd_byte
*) filehdr_out
->e_ovno
);
423 for (idx
=0; idx
< 4; idx
++)
424 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_res
[idx
],
425 (bfd_byte
*) filehdr_out
->e_res
[idx
]);
427 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_oemid
, (bfd_byte
*) filehdr_out
->e_oemid
);
428 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_oeminfo
,
429 (bfd_byte
*) filehdr_out
->e_oeminfo
);
432 for (idx
=0; idx
< 10; idx
++)
433 bfd_h_put_16(abfd
, filehdr_in
->pe
.e_res2
[idx
],
434 (bfd_byte
*) filehdr_out
->e_res2
[idx
]);
436 bfd_h_put_32(abfd
, filehdr_in
->pe
.e_lfanew
, (bfd_byte
*) filehdr_out
->e_lfanew
);
440 for (idx
=0; idx
< 16; idx
++)
441 bfd_h_put_32(abfd
, filehdr_in
->pe
.dos_message
[idx
],
442 (bfd_byte
*) filehdr_out
->dos_message
[idx
]);
445 /* also put in the NT signature */
446 bfd_h_put_32(abfd
, filehdr_in
->pe
.nt_signature
,
447 (bfd_byte
*) filehdr_out
->nt_signature
);
457 coff_swap_filehdr_out (abfd
, in
, out
)
462 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*)in
;
463 FILHDR
*filehdr_out
= (FILHDR
*)out
;
465 bfd_h_put_16(abfd
, filehdr_in
->f_magic
, (bfd_byte
*) filehdr_out
->f_magic
);
466 bfd_h_put_16(abfd
, filehdr_in
->f_nscns
, (bfd_byte
*) filehdr_out
->f_nscns
);
467 bfd_h_put_32(abfd
, filehdr_in
->f_timdat
, (bfd_byte
*) filehdr_out
->f_timdat
);
468 PUT_FILEHDR_SYMPTR (abfd
, (bfd_vma
) filehdr_in
->f_symptr
,
469 (bfd_byte
*) filehdr_out
->f_symptr
);
470 bfd_h_put_32(abfd
, filehdr_in
->f_nsyms
, (bfd_byte
*) filehdr_out
->f_nsyms
);
471 bfd_h_put_16(abfd
, filehdr_in
->f_opthdr
, (bfd_byte
*) filehdr_out
->f_opthdr
);
472 bfd_h_put_16(abfd
, filehdr_in
->f_flags
, (bfd_byte
*) filehdr_out
->f_flags
);
481 coff_swap_sym_in (abfd
, ext1
, in1
)
486 SYMENT
*ext
= (SYMENT
*)ext1
;
487 struct internal_syment
*in
= (struct internal_syment
*)in1
;
489 if( ext
->e
.e_name
[0] == 0) {
490 in
->_n
._n_n
._n_zeroes
= 0;
491 in
->_n
._n_n
._n_offset
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e
.e
.e_offset
);
494 #if SYMNMLEN != E_SYMNMLEN
495 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
497 memcpy(in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
501 in
->n_value
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_value
);
502 in
->n_scnum
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_scnum
);
503 if (sizeof(ext
->e_type
) == 2){
504 in
->n_type
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->e_type
);
507 in
->n_type
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->e_type
);
509 in
->n_sclass
= bfd_h_get_8(abfd
, ext
->e_sclass
);
510 in
->n_numaux
= bfd_h_get_8(abfd
, ext
->e_numaux
);
512 /* The section symbols for the .idata$ sections have class 0x68
513 (C_SECTION), which MS documentation indicates is a section
514 symbol. Unfortunately, the value field in the symbol is simply a
515 copy of the .idata section's flags rather than something useful.
516 When these symbols are encountered, change the value to 0 so that
517 they will be handled somewhat correctly in the bfd code. */
518 if (in
->n_sclass
== C_SECTION
)
523 /* FIXME: This is clearly wrong. The problem seems to be that
524 undefined C_SECTION symbols appear in the first object of a
525 MS generated .lib file, and the symbols are not defined
529 /* I have tried setting the class to 3 and using the following
530 to set the section number. This will put the address of the
531 pointer to the string kernel32.dll at addresses 0 and 0x10
532 off start of idata section which is not correct */
533 /* if (strcmp (in->_n._n_name, ".idata$4") == 0) */
534 /* in->n_scnum = 3; */
536 /* in->n_scnum = 2; */
538 /* Create synthetic empty sections as needed. DJ */
539 if (in
->n_scnum
== 0)
542 for (sec
=abfd
->sections
; sec
; sec
=sec
->next
)
544 if (strcmp (sec
->name
, in
->n_name
) == 0)
546 in
->n_scnum
= sec
->target_index
;
551 if (in
->n_scnum
== 0)
553 int unused_section_number
= 0;
556 for (sec
=abfd
->sections
; sec
; sec
=sec
->next
)
557 if (unused_section_number
<= sec
->target_index
)
558 unused_section_number
= sec
->target_index
+1;
560 name
= bfd_alloc (abfd
, strlen (in
->n_name
) + 10);
563 strcpy (name
, in
->n_name
);
564 sec
= bfd_make_section_anyway (abfd
, name
);
568 sec
->_cooked_size
= 0;
571 sec
->rel_filepos
= 0;
572 sec
->reloc_count
= 0;
573 sec
->line_filepos
= 0;
574 sec
->lineno_count
= 0;
575 sec
->userdata
= NULL
;
576 sec
->next
= (asection
*) NULL
;
578 sec
->alignment_power
= 2;
579 sec
->flags
= SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_DATA
| SEC_LOAD
;
581 sec
->target_index
= unused_section_number
;
583 in
->n_scnum
= unused_section_number
;
585 in
->n_sclass
= C_STAT
;
589 #ifdef coff_swap_sym_in_hook
590 coff_swap_sym_in_hook(abfd
, ext1
, in1
);
595 coff_swap_sym_out (abfd
, inp
, extp
)
600 struct internal_syment
*in
= (struct internal_syment
*)inp
;
601 SYMENT
*ext
=(SYMENT
*)extp
;
602 if(in
->_n
._n_name
[0] == 0) {
603 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->e
.e
.e_zeroes
);
604 bfd_h_put_32(abfd
, in
->_n
._n_n
._n_offset
, (bfd_byte
*) ext
->e
.e
.e_offset
);
607 #if SYMNMLEN != E_SYMNMLEN
608 -> Error
, we need to cope with truncating
or extending SYMNMLEN
!;
610 memcpy(ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
614 bfd_h_put_32(abfd
, in
->n_value
, (bfd_byte
*) ext
->e_value
);
615 bfd_h_put_16(abfd
, in
->n_scnum
, (bfd_byte
*) ext
->e_scnum
);
616 if (sizeof(ext
->e_type
) == 2)
618 bfd_h_put_16(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
622 bfd_h_put_32(abfd
, in
->n_type
, (bfd_byte
*) ext
->e_type
);
624 bfd_h_put_8(abfd
, in
->n_sclass
, ext
->e_sclass
);
625 bfd_h_put_8(abfd
, in
->n_numaux
, ext
->e_numaux
);
631 coff_swap_aux_in (abfd
, ext1
, type
, class, indx
, numaux
, in1
)
636 int indx ATTRIBUTE_UNUSED
;
637 int numaux ATTRIBUTE_UNUSED
;
640 AUXENT
*ext
= (AUXENT
*)ext1
;
641 union internal_auxent
*in
= (union internal_auxent
*)in1
;
645 if (ext
->x_file
.x_fname
[0] == 0) {
646 in
->x_file
.x_n
.x_zeroes
= 0;
647 in
->x_file
.x_n
.x_offset
=
648 bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
650 #if FILNMLEN != E_FILNMLEN
651 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
653 memcpy (in
->x_file
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
664 if (type
== T_NULL
) {
665 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN(abfd
, ext
);
666 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC(abfd
, ext
);
667 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO(abfd
, ext
);
668 in
->x_scn
.x_checksum
= bfd_h_get_32 (abfd
,
669 (bfd_byte
*) ext
->x_scn
.x_checksum
);
670 in
->x_scn
.x_associated
=
671 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_scn
.x_associated
);
672 in
->x_scn
.x_comdat
= bfd_h_get_8 (abfd
,
673 (bfd_byte
*) ext
->x_scn
.x_comdat
);
679 in
->x_sym
.x_tagndx
.l
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
681 in
->x_sym
.x_tvndx
= bfd_h_get_16(abfd
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
684 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
686 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
687 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
691 #if DIMNUM != E_DIMNUM
692 #error we need to cope with truncating or extending DIMNUM
694 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
695 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
696 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
697 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
698 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
699 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
700 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
701 bfd_h_get_16 (abfd
, (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
705 in
->x_sym
.x_misc
.x_fsize
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
708 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO(abfd
, ext
);
709 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE(abfd
, ext
);
714 coff_swap_aux_out (abfd
, inp
, type
, class, indx
, numaux
, extp
)
719 int indx ATTRIBUTE_UNUSED
;
720 int numaux ATTRIBUTE_UNUSED
;
723 union internal_auxent
*in
= (union internal_auxent
*)inp
;
724 AUXENT
*ext
= (AUXENT
*)extp
;
726 memset((PTR
)ext
, 0, AUXESZ
);
729 if (in
->x_file
.x_fname
[0] == 0) {
730 bfd_h_put_32(abfd
, 0, (bfd_byte
*) ext
->x_file
.x_n
.x_zeroes
);
732 in
->x_file
.x_n
.x_offset
,
733 (bfd_byte
*) ext
->x_file
.x_n
.x_offset
);
736 #if FILNMLEN != E_FILNMLEN
737 -> Error
, we need to cope with truncating
or extending FILNMLEN
!;
739 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_fname
, FILNMLEN
);
750 if (type
== T_NULL
) {
751 PUT_SCN_SCNLEN(abfd
, in
->x_scn
.x_scnlen
, ext
);
752 PUT_SCN_NRELOC(abfd
, in
->x_scn
.x_nreloc
, ext
);
753 PUT_SCN_NLINNO(abfd
, in
->x_scn
.x_nlinno
, ext
);
754 bfd_h_put_32 (abfd
, in
->x_scn
.x_checksum
,
755 (bfd_byte
*) ext
->x_scn
.x_checksum
);
756 bfd_h_put_16 (abfd
, in
->x_scn
.x_associated
,
757 (bfd_byte
*) ext
->x_scn
.x_associated
);
758 bfd_h_put_8 (abfd
, in
->x_scn
.x_comdat
,
759 (bfd_byte
*) ext
->x_scn
.x_comdat
);
765 bfd_h_put_32(abfd
, in
->x_sym
.x_tagndx
.l
, (bfd_byte
*) ext
->x_sym
.x_tagndx
);
767 bfd_h_put_16(abfd
, in
->x_sym
.x_tvndx
, (bfd_byte
*) ext
->x_sym
.x_tvndx
);
770 if (class == C_BLOCK
|| class == C_FCN
|| ISFCN (type
) || ISTAG (class))
772 PUT_FCN_LNNOPTR(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
773 PUT_FCN_ENDNDX(abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
777 #if DIMNUM != E_DIMNUM
778 #error we need to cope with truncating or extending DIMNUM
780 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
781 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
782 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
783 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
784 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
785 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
786 bfd_h_put_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
787 (bfd_byte
*) ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
791 bfd_h_put_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
,
792 (bfd_byte
*) ext
->x_sym
.x_misc
.x_fsize
);
795 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
796 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
804 coff_swap_lineno_in (abfd
, ext1
, in1
)
809 LINENO
*ext
= (LINENO
*)ext1
;
810 struct internal_lineno
*in
= (struct internal_lineno
*)in1
;
812 in
->l_addr
.l_symndx
= bfd_h_get_32(abfd
, (bfd_byte
*) ext
->l_addr
.l_symndx
);
813 in
->l_lnno
= GET_LINENO_LNNO(abfd
, ext
);
817 coff_swap_lineno_out (abfd
, inp
, outp
)
822 struct internal_lineno
*in
= (struct internal_lineno
*)inp
;
823 struct external_lineno
*ext
= (struct external_lineno
*)outp
;
824 bfd_h_put_32(abfd
, in
->l_addr
.l_symndx
, (bfd_byte
*)
825 ext
->l_addr
.l_symndx
);
827 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
834 coff_swap_aouthdr_in (abfd
, aouthdr_ext1
, aouthdr_int1
)
839 struct internal_extra_pe_aouthdr
*a
;
840 PEAOUTHDR
*src
= (PEAOUTHDR
*)(aouthdr_ext1
);
841 AOUTHDR
*aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
842 struct internal_aouthdr
*aouthdr_int
= (struct internal_aouthdr
*)aouthdr_int1
;
844 aouthdr_int
->magic
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->magic
);
845 aouthdr_int
->vstamp
= bfd_h_get_16(abfd
, (bfd_byte
*) aouthdr_ext
->vstamp
);
847 GET_AOUTHDR_TSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->tsize
);
849 GET_AOUTHDR_DSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->dsize
);
851 GET_AOUTHDR_BSIZE (abfd
, (bfd_byte
*) aouthdr_ext
->bsize
);
853 GET_AOUTHDR_ENTRY (abfd
, (bfd_byte
*) aouthdr_ext
->entry
);
854 aouthdr_int
->text_start
=
855 GET_AOUTHDR_TEXT_START (abfd
, (bfd_byte
*) aouthdr_ext
->text_start
);
856 aouthdr_int
->data_start
=
857 GET_AOUTHDR_DATA_START (abfd
, (bfd_byte
*) aouthdr_ext
->data_start
);
859 a
= &aouthdr_int
->pe
;
860 a
->ImageBase
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->ImageBase
);
861 a
->SectionAlignment
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SectionAlignment
);
862 a
->FileAlignment
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->FileAlignment
);
863 a
->MajorOperatingSystemVersion
=
864 bfd_h_get_16 (abfd
, (bfd_byte
*) src
->MajorOperatingSystemVersion
);
865 a
->MinorOperatingSystemVersion
=
866 bfd_h_get_16 (abfd
, (bfd_byte
*) src
->MinorOperatingSystemVersion
);
867 a
->MajorImageVersion
= bfd_h_get_16 (abfd
, (bfd_byte
*) src
->MajorImageVersion
);
868 a
->MinorImageVersion
= bfd_h_get_16 (abfd
, (bfd_byte
*) src
->MinorImageVersion
);
869 a
->MajorSubsystemVersion
= bfd_h_get_16 (abfd
, (bfd_byte
*) src
->MajorSubsystemVersion
);
870 a
->MinorSubsystemVersion
= bfd_h_get_16 (abfd
, (bfd_byte
*) src
->MinorSubsystemVersion
);
871 a
->Reserved1
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->Reserved1
);
872 a
->SizeOfImage
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SizeOfImage
);
873 a
->SizeOfHeaders
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SizeOfHeaders
);
874 a
->CheckSum
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->CheckSum
);
875 a
->Subsystem
= bfd_h_get_16 (abfd
, (bfd_byte
*) src
->Subsystem
);
876 a
->DllCharacteristics
= bfd_h_get_16 (abfd
, (bfd_byte
*) src
->DllCharacteristics
);
877 a
->SizeOfStackReserve
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SizeOfStackReserve
);
878 a
->SizeOfStackCommit
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SizeOfStackCommit
);
879 a
->SizeOfHeapReserve
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SizeOfHeapReserve
);
880 a
->SizeOfHeapCommit
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->SizeOfHeapCommit
);
881 a
->LoaderFlags
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->LoaderFlags
);
882 a
->NumberOfRvaAndSizes
= bfd_h_get_32 (abfd
, (bfd_byte
*) src
->NumberOfRvaAndSizes
);
886 for (idx
=0; idx
< 16; idx
++)
888 a
->DataDirectory
[idx
].VirtualAddress
=
889 bfd_h_get_32 (abfd
, (bfd_byte
*) src
->DataDirectory
[idx
][0]);
890 a
->DataDirectory
[idx
].Size
=
891 bfd_h_get_32 (abfd
, (bfd_byte
*) src
->DataDirectory
[idx
][1]);
895 if (aouthdr_int
->entry
)
897 aouthdr_int
->entry
+= a
->ImageBase
;
898 aouthdr_int
->entry
&= 0xffffffff;
900 if (aouthdr_int
->tsize
)
902 aouthdr_int
->text_start
+= a
->ImageBase
;
903 aouthdr_int
->text_start
&= 0xffffffff;
905 if (aouthdr_int
->dsize
)
907 aouthdr_int
->data_start
+= a
->ImageBase
;
908 aouthdr_int
->data_start
&= 0xffffffff;
912 /* These three fields are normally set up by ppc_relocate_section.
913 In the case of reading a file in, we can pick them up from
916 first_thunk_address
= a
->DataDirectory
[12].VirtualAddress
;
917 thunk_size
= a
->DataDirectory
[12].Size
;
918 import_table_size
= a
->DataDirectory
[1].Size
;
923 static void add_data_entry (abfd
, aout
, idx
, name
, base
)
925 struct internal_extra_pe_aouthdr
*aout
;
930 asection
*sec
= bfd_get_section_by_name (abfd
, name
);
932 /* add import directory information if it exists */
934 && (coff_section_data (abfd
, sec
) != NULL
)
935 && (pei_section_data (abfd
, sec
) != NULL
))
937 aout
->DataDirectory
[idx
].VirtualAddress
= (sec
->vma
- base
) & 0xffffffff;
938 aout
->DataDirectory
[idx
].Size
= pei_section_data (abfd
, sec
)->virt_size
;
939 sec
->flags
|= SEC_DATA
;
944 coff_swap_aouthdr_out (abfd
, in
, out
)
949 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
950 struct internal_extra_pe_aouthdr
*extra
= &pe_data (abfd
)->pe_opthdr
;
951 PEAOUTHDR
*aouthdr_out
= (PEAOUTHDR
*)out
;
953 bfd_vma sa
= extra
->SectionAlignment
;
954 bfd_vma fa
= extra
->FileAlignment
;
955 bfd_vma ib
= extra
->ImageBase
;
957 if (aouthdr_in
->tsize
)
959 aouthdr_in
->text_start
-= ib
;
960 aouthdr_in
->text_start
&= 0xffffffff;
962 if (aouthdr_in
->dsize
)
964 aouthdr_in
->data_start
-= ib
;
965 aouthdr_in
->data_start
&= 0xffffffff;
967 if (aouthdr_in
->entry
)
969 aouthdr_in
->entry
-= ib
;
970 aouthdr_in
->entry
&= 0xffffffff;
973 #define FA(x) (((x) + fa -1 ) & (- fa))
974 #define SA(x) (((x) + sa -1 ) & (- sa))
976 /* We like to have the sizes aligned */
978 aouthdr_in
->bsize
= FA (aouthdr_in
->bsize
);
981 extra
->NumberOfRvaAndSizes
= IMAGE_NUMBEROF_DIRECTORY_ENTRIES
;
983 /* first null out all data directory entries .. */
984 memset (extra
->DataDirectory
, sizeof (extra
->DataDirectory
), 0);
986 add_data_entry (abfd
, extra
, 0, ".edata", ib
);
987 add_data_entry (abfd
, extra
, 1, ".idata", ib
);
988 add_data_entry (abfd
, extra
, 2, ".rsrc" ,ib
);
991 /* FIXME: do other PE platforms use this? */
992 add_data_entry (abfd
, extra
, 3, ".pdata" ,ib
);
995 add_data_entry (abfd
, extra
, 5, ".reloc", ib
);
998 /* On the PPC NT system, this field is set up as follows. It is
999 not an "officially" reserved field, so it currently has no title.
1000 first_thunk_address is idata$5, and the thunk_size is the size
1001 of the idata$5 chunk of the idata section.
1003 extra
->DataDirectory
[12].VirtualAddress
= first_thunk_address
;
1004 extra
->DataDirectory
[12].Size
= thunk_size
;
1006 /* On the PPC NT system, the size of the directory entry is not the
1007 size of the entire section. It's actually offset to the end of
1008 the idata$3 component of the idata section. This is the size of
1009 the entire import table. (also known as the start of idata$4)
1011 extra
->DataDirectory
[1].Size
= import_table_size
;
1017 bfd_vma isize
= SA(abfd
->sections
->filepos
);
1020 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
1022 int rounded
= FA(sec
->_raw_size
);
1024 if (sec
->flags
& SEC_DATA
)
1026 if (sec
->flags
& SEC_CODE
)
1028 isize
+= SA(rounded
);
1031 aouthdr_in
->dsize
= dsize
;
1032 aouthdr_in
->tsize
= tsize
;
1033 extra
->SizeOfImage
= isize
;
1036 extra
->SizeOfHeaders
= abfd
->sections
->filepos
;
1037 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->standard
.magic
);
1039 #ifdef POWERPC_LE_PE
1040 /* this little piece of magic sets the "linker version" field to 2.60 */
1041 bfd_h_put_16(abfd
, 2 + 60 * 256, (bfd_byte
*) aouthdr_out
->standard
.vstamp
);
1043 /* this little piece of magic sets the "linker version" field to 2.55 */
1044 bfd_h_put_16(abfd
, 2 + 55 * 256, (bfd_byte
*) aouthdr_out
->standard
.vstamp
);
1047 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->standard
.tsize
);
1048 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->standard
.dsize
);
1049 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->standard
.bsize
);
1050 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->standard
.entry
);
1051 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
1052 (bfd_byte
*) aouthdr_out
->standard
.text_start
);
1054 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
1055 (bfd_byte
*) aouthdr_out
->standard
.data_start
);
1058 bfd_h_put_32 (abfd
, extra
->ImageBase
,
1059 (bfd_byte
*) aouthdr_out
->ImageBase
);
1060 bfd_h_put_32 (abfd
, extra
->SectionAlignment
,
1061 (bfd_byte
*) aouthdr_out
->SectionAlignment
);
1062 bfd_h_put_32 (abfd
, extra
->FileAlignment
,
1063 (bfd_byte
*) aouthdr_out
->FileAlignment
);
1064 bfd_h_put_16 (abfd
, extra
->MajorOperatingSystemVersion
,
1065 (bfd_byte
*) aouthdr_out
->MajorOperatingSystemVersion
);
1066 bfd_h_put_16 (abfd
, extra
->MinorOperatingSystemVersion
,
1067 (bfd_byte
*) aouthdr_out
->MinorOperatingSystemVersion
);
1068 bfd_h_put_16 (abfd
, extra
->MajorImageVersion
,
1069 (bfd_byte
*) aouthdr_out
->MajorImageVersion
);
1070 bfd_h_put_16 (abfd
, extra
->MinorImageVersion
,
1071 (bfd_byte
*) aouthdr_out
->MinorImageVersion
);
1072 bfd_h_put_16 (abfd
, extra
->MajorSubsystemVersion
,
1073 (bfd_byte
*) aouthdr_out
->MajorSubsystemVersion
);
1074 bfd_h_put_16 (abfd
, extra
->MinorSubsystemVersion
,
1075 (bfd_byte
*) aouthdr_out
->MinorSubsystemVersion
);
1076 bfd_h_put_32 (abfd
, extra
->Reserved1
,
1077 (bfd_byte
*) aouthdr_out
->Reserved1
);
1078 bfd_h_put_32 (abfd
, extra
->SizeOfImage
,
1079 (bfd_byte
*) aouthdr_out
->SizeOfImage
);
1080 bfd_h_put_32 (abfd
, extra
->SizeOfHeaders
,
1081 (bfd_byte
*) aouthdr_out
->SizeOfHeaders
);
1082 bfd_h_put_32 (abfd
, extra
->CheckSum
,
1083 (bfd_byte
*) aouthdr_out
->CheckSum
);
1084 bfd_h_put_16 (abfd
, extra
->Subsystem
,
1085 (bfd_byte
*) aouthdr_out
->Subsystem
);
1086 bfd_h_put_16 (abfd
, extra
->DllCharacteristics
,
1087 (bfd_byte
*) aouthdr_out
->DllCharacteristics
);
1088 bfd_h_put_32 (abfd
, extra
->SizeOfStackReserve
,
1089 (bfd_byte
*) aouthdr_out
->SizeOfStackReserve
);
1090 bfd_h_put_32 (abfd
, extra
->SizeOfStackCommit
,
1091 (bfd_byte
*) aouthdr_out
->SizeOfStackCommit
);
1092 bfd_h_put_32 (abfd
, extra
->SizeOfHeapReserve
,
1093 (bfd_byte
*) aouthdr_out
->SizeOfHeapReserve
);
1094 bfd_h_put_32 (abfd
, extra
->SizeOfHeapCommit
,
1095 (bfd_byte
*) aouthdr_out
->SizeOfHeapCommit
);
1096 bfd_h_put_32 (abfd
, extra
->LoaderFlags
,
1097 (bfd_byte
*) aouthdr_out
->LoaderFlags
);
1098 bfd_h_put_32 (abfd
, extra
->NumberOfRvaAndSizes
,
1099 (bfd_byte
*) aouthdr_out
->NumberOfRvaAndSizes
);
1102 for (idx
=0; idx
< 16; idx
++)
1104 bfd_h_put_32 (abfd
, extra
->DataDirectory
[idx
].VirtualAddress
,
1105 (bfd_byte
*) aouthdr_out
->DataDirectory
[idx
][0]);
1106 bfd_h_put_32 (abfd
, extra
->DataDirectory
[idx
].Size
,
1107 (bfd_byte
*) aouthdr_out
->DataDirectory
[idx
][1]);
1115 coff_swap_scnhdr_in (abfd
, ext
, in
)
1120 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
1121 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
1123 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof(scnhdr_int
->s_name
));
1124 scnhdr_int
->s_vaddr
=
1125 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
1126 scnhdr_int
->s_paddr
=
1127 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
1128 scnhdr_int
->s_size
=
1129 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
1130 scnhdr_int
->s_scnptr
=
1131 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
1132 scnhdr_int
->s_relptr
=
1133 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
1134 scnhdr_int
->s_lnnoptr
=
1135 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
1136 scnhdr_int
->s_flags
= bfd_h_get_32(abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
1138 scnhdr_int
->s_nreloc
= bfd_h_get_16(abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
1139 scnhdr_int
->s_nlnno
= bfd_h_get_16(abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
1141 if (scnhdr_int
->s_vaddr
!= 0)
1143 scnhdr_int
->s_vaddr
+= pe_data (abfd
)->pe_opthdr
.ImageBase
;
1144 scnhdr_int
->s_vaddr
&= 0xffffffff;
1146 if (strcmp (scnhdr_int
->s_name
, _BSS
) == 0)
1148 scnhdr_int
->s_size
= scnhdr_int
->s_paddr
;
1149 scnhdr_int
->s_paddr
= 0;
1154 coff_swap_scnhdr_out (abfd
, in
, out
)
1159 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
1160 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
1161 unsigned int ret
= SCNHSZ
;
1165 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof(scnhdr_int
->s_name
));
1167 PUT_SCNHDR_VADDR (abfd
,
1168 ((scnhdr_int
->s_vaddr
1169 - pe_data(abfd
)->pe_opthdr
.ImageBase
)
1171 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
1173 /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
1174 value except for the BSS section, its s_size should be 0 */
1177 if (strcmp (scnhdr_int
->s_name
, _BSS
) == 0)
1179 ps
= scnhdr_int
->s_size
;
1184 ps
= scnhdr_int
->s_paddr
;
1185 ss
= scnhdr_int
->s_size
;
1188 PUT_SCNHDR_SIZE (abfd
, ss
,
1189 (bfd_byte
*) scnhdr_ext
->s_size
);
1192 PUT_SCNHDR_PADDR (abfd
, ps
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
1194 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
1195 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
1196 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
1197 (bfd_byte
*) scnhdr_ext
->s_relptr
);
1198 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
1199 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
1201 /* Extra flags must be set when dealing with NT. All sections should also
1202 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
1203 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
1204 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
1205 (this is especially important when dealing with the .idata section since
1206 the addresses for routines from .dlls must be overwritten). If .reloc
1207 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
1208 (0x02000000). Also, the resource data should also be read and
1211 /* FIXME: alignment is also encoded in this field, at least on ppc (krk) */
1212 /* FIXME: even worse, I don't see how to get the original alignment field*/
1215 /* FIXME: Basing this on section names is bogus. Also, this should
1216 be in sec_to_styp_flags. */
1219 int flags
= scnhdr_int
->s_flags
;
1220 if (strcmp (scnhdr_int
->s_name
, ".data") == 0 ||
1221 strcmp (scnhdr_int
->s_name
, ".CRT") == 0 ||
1222 strcmp (scnhdr_int
->s_name
, ".bss") == 0)
1223 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
1224 else if (strcmp (scnhdr_int
->s_name
, ".text") == 0)
1225 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_EXECUTE
;
1226 else if (strcmp (scnhdr_int
->s_name
, ".reloc") == 0)
1227 flags
= (SEC_DATA
| IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_DISCARDABLE
1228 | IMAGE_SCN_MEM_SHARED
);
1229 else if (strcmp (scnhdr_int
->s_name
, ".idata") == 0)
1230 flags
= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
| SEC_DATA
;
1231 else if (strcmp (scnhdr_int
->s_name
, ".rdata") == 0
1232 || strcmp (scnhdr_int
->s_name
, ".edata") == 0)
1233 flags
= IMAGE_SCN_MEM_READ
| SEC_DATA
;
1234 else if (strcmp (scnhdr_int
->s_name
, ".pdata") == 0)
1235 flags
= IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_ALIGN_4BYTES
|
1236 IMAGE_SCN_MEM_READ
;
1237 /* Remember this field is a max of 8 chars, so the null is _not_ there
1238 for an 8 character name like ".reldata". (yep. Stupid bug) */
1239 else if (strncmp (scnhdr_int
->s_name
, ".reldata", 8) == 0)
1240 flags
= IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_ALIGN_8BYTES
|
1241 IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
1242 else if (strcmp (scnhdr_int
->s_name
, ".ydata") == 0)
1243 flags
= IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_ALIGN_8BYTES
|
1244 IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
1245 else if (strncmp (scnhdr_int
->s_name
, ".drectve", 8) == 0)
1246 flags
= IMAGE_SCN_LNK_INFO
| IMAGE_SCN_LNK_REMOVE
;
1247 else if (strncmp (scnhdr_int
->s_name
, ".stab", 5) == 0)
1248 flags
|= (IMAGE_SCN_LNK_INFO
| IMAGE_SCN_MEM_DISCARDABLE
1249 | IMAGE_SCN_MEM_SHARED
| IMAGE_SCN_MEM_READ
);
1250 else if (strcmp (scnhdr_int
->s_name
, ".rsrc") == 0)
1251 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_SHARED
;
1254 flags
|= IMAGE_SCN_MEM_READ
;
1255 if (! (flags
& SEC_READONLY
))
1256 flags
|= IMAGE_SCN_MEM_WRITE
;
1257 if (flags
& SEC_SHARED
)
1258 flags
|= IMAGE_SCN_MEM_SHARED
;
1261 bfd_h_put_32(abfd
, flags
, (bfd_byte
*) scnhdr_ext
->s_flags
);
1264 if (scnhdr_int
->s_nlnno
<= 0xffff)
1265 bfd_h_put_16(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
1268 (*_bfd_error_handler
) (_("%s: line number overflow: 0x%lx > 0xffff"),
1269 bfd_get_filename (abfd
),
1270 scnhdr_int
->s_nlnno
);
1271 bfd_set_error (bfd_error_file_truncated
);
1272 bfd_h_put_16 (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
1275 if (scnhdr_int
->s_nreloc
<= 0xffff)
1276 bfd_h_put_16(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
1279 (*_bfd_error_handler
) (_("%s: reloc overflow: 0x%lx > 0xffff"),
1280 bfd_get_filename (abfd
),
1281 scnhdr_int
->s_nreloc
);
1282 bfd_set_error (bfd_error_file_truncated
);
1283 bfd_h_put_16 (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
1289 static char * dir_names
[IMAGE_NUMBEROF_DIRECTORY_ENTRIES
] =
1291 N_ ("Export Directory [.edata (or where ever we found it)]"),
1292 N_ ("Import Directory [parts of .idata]"),
1293 N_ ("Resource Directory [.rsrc]"),
1294 N_ ("Exception Directory [.pdata]"),
1295 N_ ("Security Directory"),
1296 N_ ("Base Relocation Directory [.reloc]"),
1297 N_ ("Debug Directory"),
1298 N_ ("Description Directory"),
1299 N_ ("Special Directory"),
1300 N_ ("Thread Storage Directory [.tls]"),
1301 N_ ("Load Configuration Directory"),
1302 N_ ("Bound Import Directory"),
1303 N_ ("Import Address Table Directory"),
1309 /**********************************************************************/
1311 pe_print_idata(abfd
, vfile
)
1315 FILE *file
= (FILE *) vfile
;
1317 asection
*section
= bfd_get_section_by_name (abfd
, ".idata");
1320 #ifdef POWERPC_LE_PE
1321 asection
*rel_section
= bfd_get_section_by_name (abfd
, ".reldata");
1324 bfd_size_type datasize
;
1325 bfd_size_type dataoff
;
1326 bfd_size_type secsize
;
1328 bfd_size_type start
, stop
;
1331 pe_data_type
*pe
= pe_data (abfd
);
1332 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
1334 if (section
!= NULL
)
1336 datasize
= bfd_section_size (abfd
, section
);
1346 addr
= extra
->DataDirectory
[1].VirtualAddress
;
1347 size
= extra
->DataDirectory
[1].Size
;
1349 if (addr
== 0 || size
== 0)
1352 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
1354 if (section
->vma
- extra
->ImageBase
<= addr
1355 && ((section
->vma
- extra
->ImageBase
1356 + bfd_section_size (abfd
, section
))
1360 if (section
== NULL
)
1363 /* For some reason the import table size is not reliable. The
1364 import data will extend past the indicated size, and before
1365 the indicated address. */
1366 dataoff
= addr
- (section
->vma
- extra
->ImageBase
);
1370 #ifdef POWERPC_LE_PE
1371 if (rel_section
!= 0 && bfd_section_size (abfd
, rel_section
) != 0)
1373 /* The toc address can be found by taking the starting address,
1374 which on the PPC locates a function descriptor. The descriptor
1375 consists of the function code starting address followed by the
1376 address of the toc. The starting address we get from the bfd,
1377 and the descriptor is supposed to be in the .reldata section.
1380 bfd_vma loadable_toc_address
;
1381 bfd_vma toc_address
;
1382 bfd_vma start_address
;
1385 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
,
1387 if (data
== NULL
&& bfd_section_size (abfd
, rel_section
) != 0)
1390 datasize
= bfd_section_size (abfd
, rel_section
);
1392 bfd_get_section_contents (abfd
,
1395 bfd_section_size (abfd
, rel_section
));
1397 offset
= abfd
->start_address
- rel_section
->vma
;
1399 start_address
= bfd_get_32(abfd
, data
+offset
);
1400 loadable_toc_address
= bfd_get_32(abfd
, data
+offset
+4);
1401 toc_address
= loadable_toc_address
- 32768;
1404 _("\nFunction descriptor located at the start address: %04lx\n"),
1405 (unsigned long int) (abfd
->start_address
));
1407 _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
1408 start_address
, loadable_toc_address
, toc_address
);
1413 _("\nNo reldata section! Function descriptor not decoded.\n"));
1418 _("\nThe Import Tables (interpreted .idata section contents)\n"));
1420 _(" vma: Hint Time Forward DLL First\n"));
1422 _(" Table Stamp Chain Name Thunk\n"));
1424 secsize
= bfd_section_size (abfd
, section
);
1425 data
= (bfd_byte
*) bfd_malloc (secsize
);
1426 if (data
== NULL
&& secsize
!= 0)
1429 if (! bfd_get_section_contents (abfd
, section
, (PTR
) data
, 0, secsize
))
1432 adj
= (extra
->ImageBase
- section
->vma
) & 0xffffffff;
1435 stop
= dataoff
+ datasize
;
1436 for (i
= start
; i
< stop
; i
+= onaline
)
1440 bfd_vma forward_chain
;
1442 bfd_vma first_thunk
;
1449 (unsigned long int) (i
+ section
->vma
+ dataoff
));
1457 hint_addr
= bfd_get_32(abfd
, data
+i
);
1458 time_stamp
= bfd_get_32(abfd
, data
+i
+4);
1459 forward_chain
= bfd_get_32(abfd
, data
+i
+8);
1460 dll_name
= bfd_get_32(abfd
, data
+i
+12);
1461 first_thunk
= bfd_get_32(abfd
, data
+i
+16);
1463 fprintf(file
, "%08lx %08lx %08lx %08lx %08lx\n",
1470 if (hint_addr
== 0 && first_thunk
== 0)
1473 /* the image base is present in the section->vma */
1474 dll
= (char *) data
+ dll_name
+ adj
;
1475 fprintf(file
, _("\n\tDLL Name: %s\n"), dll
);
1479 fprintf (file
, _("\tvma: Hint/Ord Member-Name\n"));
1481 idx
= hint_addr
+ adj
;
1483 for (j
= 0; j
< stop
; j
+= 4)
1485 unsigned long member
= bfd_get_32 (abfd
, data
+ idx
+ j
);
1489 if (member
& 0x80000000)
1490 fprintf (file
, "\t%04lx\t %4lu", member
,
1491 member
& 0x7fffffff);
1497 ordinal
= bfd_get_16 (abfd
, data
+ member
+ adj
);
1498 member_name
= (char *) data
+ member
+ adj
+ 2;
1499 fprintf (file
, "\t%04lx\t %4d %s",
1500 member
, ordinal
, member_name
);
1503 /* If the time stamp is not zero, the import address
1504 table holds actual addresses. */
1507 && first_thunk
!= hint_addr
)
1508 fprintf (file
, "\t%04lx",
1509 bfd_get_32 (abfd
, data
+ first_thunk
+ adj
+ j
));
1511 fprintf (file
, "\n");
1515 if (hint_addr
!= first_thunk
&& time_stamp
== 0)
1520 idx2
= first_thunk
+ adj
;
1522 for (j
=0;j
<stop
;j
+=4)
1526 bfd_vma hint_member
= 0;
1530 hint_member
= bfd_get_32 (abfd
, data
+ idx
+ j
);
1531 iat_member
= bfd_get_32 (abfd
, data
+ idx2
+ j
);
1533 if (hint_addr
== 0 && iat_member
== 0)
1536 if (hint_addr
== 0 || hint_member
!= iat_member
)
1541 _("\tThe Import Address Table (difference found)\n"));
1542 fprintf(file
, _("\tvma: Hint/Ord Member-Name\n"));
1545 if (iat_member
== 0)
1548 _("\t>>> Ran out of IAT members!\n"));
1552 ordinal
= bfd_get_16(abfd
,
1553 data
+ iat_member
+ adj
);
1554 member_name
= (char *) data
+ iat_member
+ adj
+ 2;
1555 fprintf(file
, "\t%04lx\t %4d %s\n",
1556 iat_member
, ordinal
, member_name
);
1560 if (hint_addr
!= 0 && hint_member
== 0)
1566 _("\tThe Import Address Table is identical\n"));
1570 fprintf(file
, "\n");
1580 pe_print_edata (abfd
, vfile
)
1584 FILE *file
= (FILE *) vfile
;
1586 asection
*section
= bfd_get_section_by_name (abfd
, ".edata");
1588 bfd_size_type datasize
;
1589 bfd_size_type dataoff
;
1595 long export_flags
; /* reserved - should be zero */
1599 bfd_vma name
; /* rva - relative to image base */
1600 long base
; /* ordinal base */
1601 unsigned long num_functions
; /* Number in the export address table */
1602 unsigned long num_names
; /* Number in the name pointer table */
1603 bfd_vma eat_addr
; /* rva to the export address table */
1604 bfd_vma npt_addr
; /* rva to the Export Name Pointer Table */
1605 bfd_vma ot_addr
; /* rva to the Ordinal Table */
1608 pe_data_type
*pe
= pe_data (abfd
);
1609 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
1611 if (section
!= NULL
)
1613 datasize
= bfd_section_size (abfd
, section
);
1620 addr
= extra
->DataDirectory
[0].VirtualAddress
;
1621 size
= extra
->DataDirectory
[0].Size
;
1623 if (addr
== 0 || size
== 0)
1626 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
1628 if (section
->vma
- extra
->ImageBase
<= addr
1629 && ((section
->vma
- extra
->ImageBase
1630 + bfd_section_size (abfd
, section
))
1634 if (section
== NULL
)
1638 dataoff
= addr
- (section
->vma
- extra
->ImageBase
);
1641 data
= (bfd_byte
*) bfd_malloc (datasize
);
1642 if (data
== NULL
&& datasize
!= 0)
1645 if (! bfd_get_section_contents (abfd
, section
, (PTR
) data
, dataoff
,
1649 /* Go get Export Directory Table */
1650 edt
.export_flags
= bfd_get_32(abfd
, data
+0);
1651 edt
.time_stamp
= bfd_get_32(abfd
, data
+4);
1652 edt
.major_ver
= bfd_get_16(abfd
, data
+8);
1653 edt
.minor_ver
= bfd_get_16(abfd
, data
+10);
1654 edt
.name
= bfd_get_32(abfd
, data
+12);
1655 edt
.base
= bfd_get_32(abfd
, data
+16);
1656 edt
.num_functions
= bfd_get_32(abfd
, data
+20);
1657 edt
.num_names
= bfd_get_32(abfd
, data
+24);
1658 edt
.eat_addr
= bfd_get_32(abfd
, data
+28);
1659 edt
.npt_addr
= bfd_get_32(abfd
, data
+32);
1660 edt
.ot_addr
= bfd_get_32(abfd
, data
+36);
1662 adj
= (extra
->ImageBase
- (section
->vma
+ dataoff
)) & 0xffffffff;
1665 /* Dump the EDT first first */
1667 _("\nThe Export Tables (interpreted .edata section contents)\n\n"));
1670 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt
.export_flags
);
1673 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt
.time_stamp
);
1676 _("Major/Minor \t\t\t%d/%d\n"), edt
.major_ver
, edt
.minor_ver
);
1679 _("Name \t\t\t\t"));
1680 fprintf_vma (file
, edt
.name
);
1682 " %s\n", data
+ edt
.name
+ adj
);
1685 _("Ordinal Base \t\t\t%ld\n"), edt
.base
);
1691 _("\tExport Address Table \t\t%lx\n"),
1695 _("\t[Name Pointer/Ordinal] Table\t%lu\n"), edt
.num_names
);
1698 _("Table Addresses\n"));
1701 _("\tExport Address Table \t\t"));
1702 fprintf_vma (file
, edt
.eat_addr
);
1703 fprintf (file
, "\n");
1706 _("\tName Pointer Table \t\t"));
1707 fprintf_vma (file
, edt
.npt_addr
);
1708 fprintf (file
, "\n");
1711 _("\tOrdinal Table \t\t\t"));
1712 fprintf_vma (file
, edt
.ot_addr
);
1713 fprintf (file
, "\n");
1716 /* The next table to find si the Export Address Table. It's basically
1717 a list of pointers that either locate a function in this dll, or
1718 forward the call to another dll. Something like:
1723 } export_address_table_entry;
1727 _("\nExport Address Table -- Ordinal Base %ld\n"),
1730 for (i
= 0; i
< edt
.num_functions
; ++i
)
1732 bfd_vma eat_member
= bfd_get_32 (abfd
,
1733 data
+ edt
.eat_addr
+ (i
* 4) + adj
);
1734 bfd_vma eat_actual
= (extra
->ImageBase
+ eat_member
) & 0xffffffff;
1735 bfd_vma edata_start
= bfd_get_section_vma (abfd
,section
) + dataoff
;
1736 bfd_vma edata_end
= edata_start
+ datasize
;
1738 if (eat_member
== 0)
1741 if (edata_start
< eat_actual
&& eat_actual
< edata_end
)
1743 /* this rva is to a name (forwarding function) in our section */
1744 /* Should locate a function descriptor */
1746 "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1747 (long) i
, (long) (i
+ edt
.base
), eat_member
,
1748 "Forwarder RVA", data
+ eat_member
+ adj
);
1752 /* Should locate a function descriptor in the reldata section */
1754 "\t[%4ld] +base[%4ld] %04lx %s\n",
1755 (long) i
, (long) (i
+ edt
.base
), eat_member
, "Export RVA");
1759 /* The Export Name Pointer Table is paired with the Export Ordinal Table */
1760 /* Dump them in parallel for clarity */
1762 _("\n[Ordinal/Name Pointer] Table\n"));
1764 for (i
= 0; i
< edt
.num_names
; ++i
)
1766 bfd_vma name_ptr
= bfd_get_32(abfd
,
1771 char *name
= (char *) data
+ name_ptr
+ adj
;
1773 bfd_vma ord
= bfd_get_16(abfd
,
1778 "\t[%4ld] %s\n", (long) ord
, name
);
1788 pe_print_pdata (abfd
, vfile
)
1792 FILE *file
= (FILE *) vfile
;
1794 asection
*section
= bfd_get_section_by_name (abfd
, ".pdata");
1795 bfd_size_type datasize
= 0;
1797 bfd_size_type start
, stop
;
1803 stop
= bfd_section_size (abfd
, section
);
1804 if ((stop
% onaline
) != 0)
1805 fprintf (file
, _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1806 (long)stop
, onaline
);
1809 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1811 _(" vma:\t\tBegin End EH EH PrologEnd\n"));
1813 _(" \t\tAddress Address Handler Data Address\n"));
1815 if (bfd_section_size (abfd
, section
) == 0)
1818 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
, section
));
1819 datasize
= bfd_section_size (abfd
, section
);
1820 if (data
== NULL
&& datasize
!= 0)
1823 bfd_get_section_contents (abfd
,
1826 bfd_section_size (abfd
, section
));
1830 for (i
= start
; i
< stop
; i
+= onaline
)
1836 bfd_vma prolog_end_addr
;
1841 begin_addr
= bfd_get_32(abfd
, data
+i
);
1842 end_addr
= bfd_get_32(abfd
, data
+i
+4);
1843 eh_handler
= bfd_get_32(abfd
, data
+i
+8);
1844 eh_data
= bfd_get_32(abfd
, data
+i
+12);
1845 prolog_end_addr
= bfd_get_32(abfd
, data
+i
+16);
1847 if (begin_addr
== 0 && end_addr
== 0 && eh_handler
== 0
1848 && eh_data
== 0 && prolog_end_addr
== 0)
1850 /* We are probably into the padding of the
1857 (unsigned long int) (i
+ section
->vma
));
1859 fprintf(file
, "%08lx %08lx %08lx %08lx %08lx",
1866 #ifdef POWERPC_LE_PE
1867 if (eh_handler
== 0 && eh_data
!= 0)
1869 /* Special bits here, although the meaning may */
1870 /* be a little mysterious. The only one I know */
1871 /* for sure is 0x03. */
1872 /* Code Significance */
1874 /* 0x01 Register Save Millicode */
1875 /* 0x02 Register Restore Millicode */
1876 /* 0x03 Glue Code Sequence */
1880 fprintf(file
, _(" Register save millicode"));
1883 fprintf(file
, _(" Register restore millicode"));
1886 fprintf(file
, _(" Glue code sequence"));
1893 fprintf(file
, "\n");
1901 static const char *tbl
[6] =
1912 pe_print_reloc (abfd
, vfile
)
1916 FILE *file
= (FILE *) vfile
;
1918 asection
*section
= bfd_get_section_by_name (abfd
, ".reloc");
1919 bfd_size_type datasize
= 0;
1921 bfd_size_type start
, stop
;
1926 if (bfd_section_size (abfd
, section
) == 0)
1930 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
1932 data
= (bfd_byte
*) bfd_malloc ((size_t) bfd_section_size (abfd
, section
));
1933 datasize
= bfd_section_size (abfd
, section
);
1934 if (data
== NULL
&& datasize
!= 0)
1937 bfd_get_section_contents (abfd
,
1940 bfd_section_size (abfd
, section
));
1944 stop
= bfd_section_size (abfd
, section
);
1946 for (i
= start
; i
< stop
;)
1949 bfd_vma virtual_address
;
1952 /* The .reloc section is a sequence of blocks, with a header consisting
1953 of two 32 bit quantities, followed by a number of 16 bit entries */
1955 virtual_address
= bfd_get_32(abfd
, data
+i
);
1956 size
= bfd_get_32(abfd
, data
+i
+4);
1957 number
= (size
- 8) / 2;
1965 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
1966 virtual_address
, size
, size
, number
);
1968 for (j
= 0; j
< number
; ++j
)
1970 unsigned short e
= bfd_get_16(abfd
, data
+ i
+ 8 + j
*2);
1971 int t
= (e
& 0xF000) >> 12;
1972 int off
= e
& 0x0FFF;
1978 _("\treloc %4d offset %4x [%4lx] %s\n"),
1979 j
, off
, (long) (off
+ virtual_address
), tbl
[t
]);
1991 pe_print_private_bfd_data (abfd
, vfile
)
1995 FILE *file
= (FILE *) vfile
;
1997 pe_data_type
*pe
= pe_data (abfd
);
1998 struct internal_extra_pe_aouthdr
*i
= &pe
->pe_opthdr
;
2000 /* The MS dumpbin program reportedly ands with 0xff0f before
2001 printing the characteristics field. Not sure why. No reason to
2003 fprintf (file
, _("\nCharacteristics 0x%x\n"), pe
->real_flags
);
2005 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
2006 PF (F_RELFLG
, "relocations stripped");
2007 PF (F_EXEC
, "executable");
2008 PF (F_LNNO
, "line numbers stripped");
2009 PF (F_LSYMS
, "symbols stripped");
2010 PF (0x80, "little endian");
2011 PF (F_AR32WR
, "32 bit words");
2012 PF (0x200, "debugging information removed");
2013 PF (0x1000, "system file");
2015 PF (0x8000, "big endian");
2018 fprintf (file
,"\nImageBase\t\t");
2019 fprintf_vma (file
, i
->ImageBase
);
2020 fprintf (file
,"\nSectionAlignment\t");
2021 fprintf_vma (file
, i
->SectionAlignment
);
2022 fprintf (file
,"\nFileAlignment\t\t");
2023 fprintf_vma (file
, i
->FileAlignment
);
2024 fprintf (file
,"\nMajorOSystemVersion\t%d\n", i
->MajorOperatingSystemVersion
);
2025 fprintf (file
,"MinorOSystemVersion\t%d\n", i
->MinorOperatingSystemVersion
);
2026 fprintf (file
,"MajorImageVersion\t%d\n", i
->MajorImageVersion
);
2027 fprintf (file
,"MinorImageVersion\t%d\n", i
->MinorImageVersion
);
2028 fprintf (file
,"MajorSubsystemVersion\t%d\n", i
->MajorSubsystemVersion
);
2029 fprintf (file
,"MinorSubsystemVersion\t%d\n", i
->MinorSubsystemVersion
);
2030 fprintf (file
,"Reserved1\t\t%08lx\n", i
->Reserved1
);
2031 fprintf (file
,"SizeOfImage\t\t%08lx\n", i
->SizeOfImage
);
2032 fprintf (file
,"SizeOfHeaders\t\t%08lx\n", i
->SizeOfHeaders
);
2033 fprintf (file
,"CheckSum\t\t%08lx\n", i
->CheckSum
);
2034 fprintf (file
,"Subsystem\t\t%08x\n", i
->Subsystem
);
2035 fprintf (file
,"DllCharacteristics\t%08x\n", i
->DllCharacteristics
);
2036 fprintf (file
,"SizeOfStackReserve\t");
2037 fprintf_vma (file
, i
->SizeOfStackReserve
);
2038 fprintf (file
,"\nSizeOfStackCommit\t");
2039 fprintf_vma (file
, i
->SizeOfStackCommit
);
2040 fprintf (file
,"\nSizeOfHeapReserve\t");
2041 fprintf_vma (file
, i
->SizeOfHeapReserve
);
2042 fprintf (file
,"\nSizeOfHeapCommit\t");
2043 fprintf_vma (file
, i
->SizeOfHeapCommit
);
2044 fprintf (file
,"\nLoaderFlags\t\t%08lx\n", i
->LoaderFlags
);
2045 fprintf (file
,"NumberOfRvaAndSizes\t%08lx\n", i
->NumberOfRvaAndSizes
);
2047 fprintf (file
,"\nThe Data Directory\n");
2048 for (j
= 0; j
< IMAGE_NUMBEROF_DIRECTORY_ENTRIES
; j
++)
2050 fprintf (file
, "Entry %1x ", j
);
2051 fprintf_vma (file
, i
->DataDirectory
[j
].VirtualAddress
);
2052 fprintf (file
, " %08lx ", i
->DataDirectory
[j
].Size
);
2053 fprintf (file
, "%s\n", dir_names
[j
]);
2056 pe_print_idata (abfd
, vfile
);
2057 pe_print_edata (abfd
, vfile
);
2058 pe_print_pdata (abfd
, vfile
);
2059 pe_print_reloc (abfd
, vfile
);
2061 if (pe_saved_coff_bfd_print_private_bfd_data
!= NULL
)
2065 return pe_saved_coff_bfd_print_private_bfd_data (abfd
, vfile
);
2076 abfd
->tdata
.pe_obj_data
=
2077 (struct pe_tdata
*) bfd_zalloc (abfd
, sizeof (pe_data_type
));
2079 if (abfd
->tdata
.pe_obj_data
== 0)
2082 pe
= pe_data (abfd
);
2085 pe
->in_reloc_p
= in_reloc_p
;
2089 /* Create the COFF backend specific information. */
2091 pe_mkobject_hook (abfd
, filehdr
, aouthdr
)
2094 PTR aouthdr ATTRIBUTE_UNUSED
;
2096 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
2099 if (pe_mkobject (abfd
) == false)
2102 pe
= pe_data (abfd
);
2103 pe
->coff
.sym_filepos
= internal_f
->f_symptr
;
2104 /* These members communicate important constants about the symbol
2105 table to GDB's symbol-reading code. These `constants'
2106 unfortunately vary among coff implementations... */
2107 pe
->coff
.local_n_btmask
= N_BTMASK
;
2108 pe
->coff
.local_n_btshft
= N_BTSHFT
;
2109 pe
->coff
.local_n_tmask
= N_TMASK
;
2110 pe
->coff
.local_n_tshift
= N_TSHIFT
;
2111 pe
->coff
.local_symesz
= SYMESZ
;
2112 pe
->coff
.local_auxesz
= AUXESZ
;
2113 pe
->coff
.local_linesz
= LINESZ
;
2115 obj_raw_syment_count (abfd
) =
2116 obj_conv_table_size (abfd
) =
2117 internal_f
->f_nsyms
;
2119 pe
->real_flags
= internal_f
->f_flags
;
2121 if ((internal_f
->f_flags
& F_DLL
) != 0)
2124 if ((internal_f
->f_flags
& IMAGE_FILE_DEBUG_STRIPPED
) == 0)
2125 abfd
->flags
|= HAS_DEBUG
;
2127 #ifdef COFF_IMAGE_WITH_PE
2129 pe
->pe_opthdr
= ((struct internal_aouthdr
*)aouthdr
)->pe
;
2133 if (! _bfd_coff_arm_set_private_flags (abfd
, internal_f
->f_flags
))
2134 coff_data (abfd
) ->flags
= 0;
2142 /* Copy any private info we understand from the input bfd
2143 to the output bfd. */
2145 #ifdef coff_bfd_copy_private_bfd_data
2146 static boolean (*pe_saved_coff_bfd_copy_private_bfd_data
)
2147 PARAMS ((bfd
*, bfd
*))
2148 = coff_bfd_copy_private_bfd_data
;
2149 #undef coff_bfd_copy_private_bfd_data
2151 static boolean (*pe_saved_coff_bfd_copy_private_bfd_data
)
2152 PARAMS ((bfd
*, bfd
*))
2155 #define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
2158 pe_bfd_copy_private_bfd_data (ibfd
, obfd
)
2161 /* One day we may try to grok other private data. */
2162 if (ibfd
->xvec
->flavour
!= bfd_target_coff_flavour
2163 || obfd
->xvec
->flavour
!= bfd_target_coff_flavour
)
2166 pe_data (obfd
)->pe_opthdr
= pe_data (ibfd
)->pe_opthdr
;
2167 pe_data (obfd
)->dll
= pe_data (ibfd
)->dll
;
2169 if (pe_saved_coff_bfd_copy_private_bfd_data
)
2170 return pe_saved_coff_bfd_copy_private_bfd_data (ibfd
, obfd
);
2175 #ifdef COFF_IMAGE_WITH_PE
2177 /* Copy private section data. */
2179 #define coff_bfd_copy_private_section_data pe_bfd_copy_private_section_data
2181 static boolean pe_bfd_copy_private_section_data
2182 PARAMS ((bfd
*, asection
*, bfd
*, asection
*));
2185 pe_bfd_copy_private_section_data (ibfd
, isec
, obfd
, osec
)
2191 if (bfd_get_flavour (ibfd
) != bfd_target_coff_flavour
2192 || bfd_get_flavour (obfd
) != bfd_target_coff_flavour
)
2195 if (coff_section_data (ibfd
, isec
) != NULL
2196 && pei_section_data (ibfd
, isec
) != NULL
)
2198 if (coff_section_data (obfd
, osec
) == NULL
)
2201 (PTR
) bfd_zalloc (obfd
, sizeof (struct coff_section_tdata
));
2202 if (osec
->used_by_bfd
== NULL
)
2205 if (pei_section_data (obfd
, osec
) == NULL
)
2207 coff_section_data (obfd
, osec
)->tdata
=
2208 (PTR
) bfd_zalloc (obfd
, sizeof (struct pei_section_tdata
));
2209 if (coff_section_data (obfd
, osec
)->tdata
== NULL
)
2212 pei_section_data (obfd
, osec
)->virt_size
=
2213 pei_section_data (ibfd
, isec
)->virt_size
;