1 /* Support for the generic parts of most COFF variants, for BFD.
2 Copyright 1995 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
33 #ifndef GET_FCN_LNNOPTR
34 #define GET_FCN_LNNOPTR(abfd, ext) 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) bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
41 #ifndef PUT_FCN_LNNOPTR
42 #define PUT_FCN_LNNOPTR(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
44 #ifndef PUT_FCN_ENDNDX
45 #define PUT_FCN_ENDNDX(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
48 #define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
51 #define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
54 #define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
57 #define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
59 #ifndef GET_SCN_SCNLEN
60 #define GET_SCN_SCNLEN(abfd, ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
62 #ifndef GET_SCN_NRELOC
63 #define GET_SCN_NRELOC(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
65 #ifndef GET_SCN_NLINNO
66 #define GET_SCN_NLINNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
68 #ifndef PUT_SCN_SCNLEN
69 #define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
71 #ifndef PUT_SCN_NRELOC
72 #define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
74 #ifndef PUT_SCN_NLINNO
75 #define PUT_SCN_NLINNO(abfd,in, ext) bfd_h_put_16(abfd,in, (bfd_byte *) ext->x_scn.x_nlinno)
77 #ifndef GET_LINENO_LNNO
78 #define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
80 #ifndef PUT_LINENO_LNNO
81 #define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val, (bfd_byte *) (ext->l_lnno));
84 /* The f_symptr field in the filehdr is sometimes 64 bits. */
85 #ifndef GET_FILEHDR_SYMPTR
86 #define GET_FILEHDR_SYMPTR bfd_h_get_32
88 #ifndef PUT_FILEHDR_SYMPTR
89 #define PUT_FILEHDR_SYMPTR bfd_h_put_32
92 /* Some fields in the aouthdr are sometimes 64 bits. */
93 #ifndef GET_AOUTHDR_TSIZE
94 #define GET_AOUTHDR_TSIZE bfd_h_get_32
96 #ifndef PUT_AOUTHDR_TSIZE
97 #define PUT_AOUTHDR_TSIZE bfd_h_put_32
99 #ifndef GET_AOUTHDR_DSIZE
100 #define GET_AOUTHDR_DSIZE bfd_h_get_32
102 #ifndef PUT_AOUTHDR_DSIZE
103 #define PUT_AOUTHDR_DSIZE bfd_h_put_32
105 #ifndef GET_AOUTHDR_BSIZE
106 #define GET_AOUTHDR_BSIZE bfd_h_get_32
108 #ifndef PUT_AOUTHDR_BSIZE
109 #define PUT_AOUTHDR_BSIZE bfd_h_put_32
111 #ifndef GET_AOUTHDR_ENTRY
112 #define GET_AOUTHDR_ENTRY bfd_h_get_32
114 #ifndef PUT_AOUTHDR_ENTRY
115 #define PUT_AOUTHDR_ENTRY bfd_h_put_32
117 #ifndef GET_AOUTHDR_TEXT_START
118 #define GET_AOUTHDR_TEXT_START bfd_h_get_32
120 #ifndef PUT_AOUTHDR_TEXT_START
121 #define PUT_AOUTHDR_TEXT_START bfd_h_put_32
123 #ifndef GET_AOUTHDR_DATA_START
124 #define GET_AOUTHDR_DATA_START bfd_h_get_32
126 #ifndef PUT_AOUTHDR_DATA_START
127 #define PUT_AOUTHDR_DATA_START bfd_h_put_32
130 /* Some fields in the scnhdr are sometimes 64 bits. */
131 #ifndef GET_SCNHDR_PADDR
132 #define GET_SCNHDR_PADDR bfd_h_get_32
134 #ifndef PUT_SCNHDR_PADDR
135 #define PUT_SCNHDR_PADDR bfd_h_put_32
137 #ifndef GET_SCNHDR_VADDR
138 #define GET_SCNHDR_VADDR bfd_h_get_32
140 #ifndef PUT_SCNHDR_VADDR
141 #define PUT_SCNHDR_VADDR bfd_h_put_32
143 #ifndef GET_SCNHDR_SIZE
144 #define GET_SCNHDR_SIZE bfd_h_get_32
146 #ifndef PUT_SCNHDR_SIZE
147 #define PUT_SCNHDR_SIZE bfd_h_put_32
149 #ifndef GET_SCNHDR_SCNPTR
150 #define GET_SCNHDR_SCNPTR bfd_h_get_32
152 #ifndef PUT_SCNHDR_SCNPTR
153 #define PUT_SCNHDR_SCNPTR bfd_h_put_32
155 #ifndef GET_SCNHDR_RELPTR
156 #define GET_SCNHDR_RELPTR bfd_h_get_32
158 #ifndef PUT_SCNHDR_RELPTR
159 #define PUT_SCNHDR_RELPTR bfd_h_put_32
161 #ifndef GET_SCNHDR_LNNOPTR
162 #define GET_SCNHDR_LNNOPTR bfd_h_get_32
164 #ifndef PUT_SCNHDR_LNNOPTR
165 #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
170 /**********************************************************************/
173 coff_swap_reloc_in (abfd, src, dst)
178 RELOC *reloc_src = (RELOC *) src;
179 struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
181 reloc_dst->r_vaddr = bfd_h_get_32(abfd, (bfd_byte *)reloc_src->r_vaddr);
182 reloc_dst->r_symndx = bfd_h_get_signed_32(abfd, (bfd_byte *) reloc_src->r_symndx);
184 reloc_dst->r_type = bfd_h_get_16(abfd, (bfd_byte *) reloc_src->r_type);
186 #ifdef SWAP_IN_RELOC_OFFSET
187 reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET(abfd,
188 (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);
231 filehdr_dst->f_symptr =
232 bfd_h_get_32 (abfd, (bfd_byte *) filehdr_src->f_symptr);
233 filehdr_dst->f_nsyms = bfd_h_get_32(abfd, (bfd_byte *)filehdr_src-> f_nsyms);
234 filehdr_dst->f_opthdr = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_opthdr);
235 filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
239 coff_swap_filehdr_out (abfd, in, out)
244 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
245 FILHDR *filehdr_out = (FILHDR *)out;
247 if (bfd_get_section_by_name (abfd, ".reloc"))
248 filehdr_in->f_flags &= ~F_RELFLG;
250 if (pe_data (abfd)->dll)
251 filehdr_in->f_flags |= F_DLL;
253 filehdr_in->pe.e_magic = DOSMAGIC;
254 filehdr_in->pe.e_cblp = 0x90;
255 filehdr_in->pe.e_cp = 0x3;
256 filehdr_in->pe.e_crlc = 0x0;
257 filehdr_in->pe.e_cparhdr = 0x4;
258 filehdr_in->pe.e_minalloc = 0x0;
259 filehdr_in->pe.e_maxalloc = 0xffff;
260 filehdr_in->pe.e_ss = 0x0;
261 filehdr_in->pe.e_sp = 0xb8;
262 filehdr_in->pe.e_csum = 0x0;
263 filehdr_in->pe.e_ip = 0x0;
264 filehdr_in->pe.e_cs = 0x0;
265 filehdr_in->pe.e_lfarlc = 0x40;
266 filehdr_in->pe.e_ovno = 0x0;
269 for (idx=0; idx < 4; idx++)
270 filehdr_in->pe.e_res[idx] = 0x0;
272 filehdr_in->pe.e_oemid = 0x0;
273 filehdr_in->pe.e_oeminfo = 0x0;
276 for (idx=0; idx < 10; idx++)
277 filehdr_in->pe.e_res2[idx] = 0x0;
279 filehdr_in->pe.e_lfanew = 0x80;
281 /* this next collection of data are mostly just characters. It appears
282 to be constant within the headers put on NT exes */
283 filehdr_in->pe.dos_message[0] = 0x0eba1f0e;
284 filehdr_in->pe.dos_message[1] = 0xcd09b400;
285 filehdr_in->pe.dos_message[2] = 0x4c01b821;
286 filehdr_in->pe.dos_message[3] = 0x685421cd;
287 filehdr_in->pe.dos_message[4] = 0x70207369;
288 filehdr_in->pe.dos_message[5] = 0x72676f72;
289 filehdr_in->pe.dos_message[6] = 0x63206d61;
290 filehdr_in->pe.dos_message[7] = 0x6f6e6e61;
291 filehdr_in->pe.dos_message[8] = 0x65622074;
292 filehdr_in->pe.dos_message[9] = 0x6e757220;
293 filehdr_in->pe.dos_message[10] = 0x206e6920;
294 filehdr_in->pe.dos_message[11] = 0x20534f44;
295 filehdr_in->pe.dos_message[12] = 0x65646f6d;
296 filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
297 filehdr_in->pe.dos_message[14] = 0x24;
298 filehdr_in->pe.dos_message[15] = 0x0;
299 filehdr_in->pe.nt_signature = NT_SIGNATURE;
303 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
304 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
306 bfd_h_put_32(abfd, time (0), (bfd_byte *) filehdr_out->f_timdat);
307 PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
308 (bfd_byte *) filehdr_out->f_symptr);
309 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
310 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
311 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
314 /* put in extra dos header stuff. This data remains essentially
315 constant, it just has to be tacked on to the beginning of all exes
317 bfd_h_put_16(abfd, filehdr_in->pe.e_magic, (bfd_byte *) filehdr_out->e_magic);
318 bfd_h_put_16(abfd, filehdr_in->pe.e_cblp, (bfd_byte *) filehdr_out->e_cblp);
319 bfd_h_put_16(abfd, filehdr_in->pe.e_cp, (bfd_byte *) filehdr_out->e_cp);
320 bfd_h_put_16(abfd, filehdr_in->pe.e_crlc, (bfd_byte *) filehdr_out->e_crlc);
321 bfd_h_put_16(abfd, filehdr_in->pe.e_cparhdr,
322 (bfd_byte *) filehdr_out->e_cparhdr);
323 bfd_h_put_16(abfd, filehdr_in->pe.e_minalloc,
324 (bfd_byte *) filehdr_out->e_minalloc);
325 bfd_h_put_16(abfd, filehdr_in->pe.e_maxalloc,
326 (bfd_byte *) filehdr_out->e_maxalloc);
327 bfd_h_put_16(abfd, filehdr_in->pe.e_ss, (bfd_byte *) filehdr_out->e_ss);
328 bfd_h_put_16(abfd, filehdr_in->pe.e_sp, (bfd_byte *) filehdr_out->e_sp);
329 bfd_h_put_16(abfd, filehdr_in->pe.e_csum, (bfd_byte *) filehdr_out->e_csum);
330 bfd_h_put_16(abfd, filehdr_in->pe.e_ip, (bfd_byte *) filehdr_out->e_ip);
331 bfd_h_put_16(abfd, filehdr_in->pe.e_cs, (bfd_byte *) filehdr_out->e_cs);
332 bfd_h_put_16(abfd, filehdr_in->pe.e_lfarlc, (bfd_byte *) filehdr_out->e_lfarlc);
333 bfd_h_put_16(abfd, filehdr_in->pe.e_ovno, (bfd_byte *) filehdr_out->e_ovno);
336 for (idx=0; idx < 4; idx++)
337 bfd_h_put_16(abfd, filehdr_in->pe.e_res[idx],
338 (bfd_byte *) filehdr_out->e_res[idx]);
340 bfd_h_put_16(abfd, filehdr_in->pe.e_oemid, (bfd_byte *) filehdr_out->e_oemid);
341 bfd_h_put_16(abfd, filehdr_in->pe.e_oeminfo,
342 (bfd_byte *) filehdr_out->e_oeminfo);
345 for (idx=0; idx < 10; idx++)
346 bfd_h_put_16(abfd, filehdr_in->pe.e_res2[idx],
347 (bfd_byte *) filehdr_out->e_res2[idx]);
349 bfd_h_put_32(abfd, filehdr_in->pe.e_lfanew, (bfd_byte *) filehdr_out->e_lfanew);
353 for (idx=0; idx < 16; idx++)
354 bfd_h_put_32(abfd, filehdr_in->pe.dos_message[idx],
355 (bfd_byte *) filehdr_out->dos_message[idx]);
358 /* also put in the NT signature */
359 bfd_h_put_32(abfd, filehdr_in->pe.nt_signature,
360 (bfd_byte *) filehdr_out->nt_signature);
365 return sizeof(FILHDR);
371 coff_swap_sym_in (abfd, ext1, in1)
376 SYMENT *ext = (SYMENT *)ext1;
377 struct internal_syment *in = (struct internal_syment *)in1;
379 if( ext->e.e_name[0] == 0) {
380 in->_n._n_n._n_zeroes = 0;
381 in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
384 #if SYMNMLEN != E_SYMNMLEN
385 -> Error, we need to cope with truncating or extending SYMNMLEN!;
387 memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
390 in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
391 in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
392 if (sizeof(ext->e_type) == 2){
393 in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
396 in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
398 in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
399 in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
401 /* The section symbols for the .idata$ sections have class 68, which MS
402 documentation indicates is a section symbol. The problem is that the
403 value field in the symbol is simply a copy of the .idata section's flags
404 rather than something useful. When these symbols are encountered, change
405 the value to 0 and the section number to 1 so that they will be handled
406 somewhat correctly in the bfd code. */
407 if (in->n_sclass == 0x68) {
410 /* I have tried setting the class to 3 and using the following to set
411 the section number. This will put the address of the pointer to the
412 string kernel32.dll at addresses 0 and 0x10 off start of idata section
413 which is not correct */
414 /* if (strcmp (in->_n._n_name, ".idata$4") == 0) */
415 /* in->n_scnum = 3; */
417 /* in->n_scnum = 2; */
422 coff_swap_sym_out (abfd, inp, extp)
427 struct internal_syment *in = (struct internal_syment *)inp;
428 SYMENT *ext =(SYMENT *)extp;
429 if(in->_n._n_name[0] == 0) {
430 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
431 bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset);
434 #if SYMNMLEN != E_SYMNMLEN
435 -> Error, we need to cope with truncating or extending SYMNMLEN!;
437 memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
440 bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
441 bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
442 if (sizeof(ext->e_type) == 2)
444 bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
448 bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type);
450 bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
451 bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
452 return sizeof(SYMENT);
456 coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
465 AUXENT *ext = (AUXENT *)ext1;
466 union internal_auxent *in = (union internal_auxent *)in1;
470 if (ext->x_file.x_fname[0] == 0) {
471 in->x_file.x_n.x_zeroes = 0;
472 in->x_file.x_n.x_offset =
473 bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
475 #if FILNMLEN != E_FILNMLEN
476 -> Error, we need to cope with truncating or extending FILNMLEN!;
478 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
489 if (type == T_NULL) {
490 in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
491 in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
492 in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
498 in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
500 in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
503 if (class == C_BLOCK || ISFCN (type) || ISTAG (class))
505 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
506 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
510 #if DIMNUM != E_DIMNUM
511 #error we need to cope with truncating or extending DIMNUM
513 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
514 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
515 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
516 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
517 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
518 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
519 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
520 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
524 in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
527 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
528 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
533 coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
542 union internal_auxent *in = (union internal_auxent *)inp;
543 AUXENT *ext = (AUXENT *)extp;
545 memset((PTR)ext, 0, AUXESZ);
548 if (in->x_file.x_fname[0] == 0) {
549 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
551 in->x_file.x_n.x_offset,
552 (bfd_byte *) ext->x_file.x_n.x_offset);
555 #if FILNMLEN != E_FILNMLEN
556 -> Error, we need to cope with truncating or extending FILNMLEN!;
558 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
561 return sizeof (AUXENT);
569 if (type == T_NULL) {
570 PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
571 PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
572 PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
573 return sizeof (AUXENT);
578 bfd_h_put_32(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
580 bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
583 if (class == C_BLOCK || ISFCN (type) || ISTAG (class))
585 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
586 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
590 #if DIMNUM != E_DIMNUM
591 #error we need to cope with truncating or extending DIMNUM
593 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
594 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
595 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
596 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
597 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
598 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
599 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
600 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
604 bfd_h_put_32 (abfd, in->x_sym.x_misc.x_fsize,
605 (bfd_byte *) ext->x_sym.x_misc.x_fsize);
608 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
609 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
612 return sizeof(AUXENT);
617 coff_swap_lineno_in (abfd, ext1, in1)
622 LINENO *ext = (LINENO *)ext1;
623 struct internal_lineno *in = (struct internal_lineno *)in1;
625 in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
626 in->l_lnno = GET_LINENO_LNNO(abfd, ext);
630 coff_swap_lineno_out (abfd, inp, outp)
635 struct internal_lineno *in = (struct internal_lineno *)inp;
636 struct external_lineno *ext = (struct external_lineno *)outp;
637 bfd_h_put_32(abfd, in->l_addr.l_symndx, (bfd_byte *)
638 ext->l_addr.l_symndx);
640 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
641 return sizeof(struct external_lineno);
647 coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
652 struct internal_extra_pe_aouthdr *a;
653 PEAOUTHDR *src = (PEAOUTHDR *)(aouthdr_ext1);
654 AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
655 struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
657 aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
658 aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
660 GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
662 GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
664 GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
666 GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
667 aouthdr_int->text_start =
668 GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
669 aouthdr_int->data_start =
670 GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
672 a = &aouthdr_int->pe;
673 a->ImageBase = bfd_h_get_32 (abfd, src->ImageBase);
674 a->SectionAlignment = bfd_h_get_32 (abfd, src->SectionAlignment);
675 a->FileAlignment = bfd_h_get_32 (abfd, src->FileAlignment);
676 a->MajorOperatingSystemVersion =
677 bfd_h_get_16 (abfd, src->MajorOperatingSystemVersion);
678 a->MinorOperatingSystemVersion =
679 bfd_h_get_16 (abfd, src->MinorOperatingSystemVersion);
680 a->MajorImageVersion = bfd_h_get_16 (abfd, src->MajorImageVersion);
681 a->MinorImageVersion = bfd_h_get_16 (abfd, src->MinorImageVersion);
682 a->MajorSubsystemVersion = bfd_h_get_16 (abfd, src->MajorSubsystemVersion);
683 a->MinorSubsystemVersion = bfd_h_get_16 (abfd, src->MinorSubsystemVersion);
684 a->Reserved1 = bfd_h_get_32 (abfd, src->Reserved1);
685 a->SizeOfImage = bfd_h_get_32 (abfd, src->SizeOfImage);
686 a->SizeOfHeaders = bfd_h_get_32 (abfd, src->SizeOfHeaders);
687 a->CheckSum = bfd_h_get_32 (abfd, src->CheckSum);
688 a->Subsystem = bfd_h_get_16 (abfd, src->Subsystem);
689 a->DllCharacteristics = bfd_h_get_16 (abfd, src->DllCharacteristics);
690 a->SizeOfStackReserve = bfd_h_get_32 (abfd, src->SizeOfStackReserve);
691 a->SizeOfStackCommit = bfd_h_get_32 (abfd, src->SizeOfStackCommit);
692 a->SizeOfHeapReserve = bfd_h_get_32 (abfd, src->SizeOfHeapReserve);
693 a->SizeOfHeapCommit = bfd_h_get_32 (abfd, src->SizeOfHeapCommit);
694 a->LoaderFlags = bfd_h_get_32 (abfd, src->LoaderFlags);
695 a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, src->NumberOfRvaAndSizes);
699 for (idx=0; idx < 16; idx++)
701 a->DataDirectory[idx].VirtualAddress =
702 bfd_h_get_32 (abfd, src->DataDirectory[idx][0]);
703 a->DataDirectory[idx].Size =
704 bfd_h_get_32 (abfd, src->DataDirectory[idx][1]);
710 static void add_data_entry (abfd, aout, idx, name, base)
712 struct internal_extra_pe_aouthdr *aout;
717 asection *sec = bfd_get_section_by_name (abfd, name);
719 /* add import directory information if it exists */
722 aout->DataDirectory[idx].VirtualAddress = sec->lma - base;
723 aout->DataDirectory[idx].Size = sec->_raw_size;
724 sec->flags |= SEC_DATA;
730 coff_swap_aouthdr_out (abfd, in, out)
735 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
736 struct internal_extra_pe_aouthdr *extra = &pe_data (abfd)->pe_opthdr;
737 PEAOUTHDR *aouthdr_out = (PEAOUTHDR *)out;
739 bfd_vma sa = extra->SectionAlignment;
740 bfd_vma fa = extra->FileAlignment;
741 bfd_vma ib = extra->ImageBase ;
743 if (aouthdr_in->tsize)
744 aouthdr_in->text_start -= ib;
745 if (aouthdr_in->dsize)
746 aouthdr_in->data_start -= ib;
747 if (aouthdr_in->entry)
748 aouthdr_in->entry -= ib;
750 #define FA(x) (((x) + fa -1 ) & (- fa))
751 #define SA(x) (((x) + sa -1 ) & (- sa))
753 /* We like to have the sizes aligned */
755 aouthdr_in->bsize = FA (aouthdr_in->bsize);
758 extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
760 /* first null out all data directory entries .. */
761 memset (extra->DataDirectory, sizeof (extra->DataDirectory), 0);
763 add_data_entry (abfd, extra, 0, ".edata", ib);
764 add_data_entry (abfd, extra, 1, ".idata", ib);
765 add_data_entry (abfd, extra, 2, ".rsrc" ,ib);
766 add_data_entry (abfd, extra, 5, ".reloc", ib);
770 bfd_vma isize = SA(abfd->sections->filepos);
772 for (sec = abfd->sections; sec; sec = sec->next)
774 int rounded = FA(sec->_raw_size);
775 if (sec->flags & SEC_DATA)
777 if (sec->flags & SEC_CODE)
779 isize += SA(rounded);
782 aouthdr_in->dsize = dsize;
783 aouthdr_in->tsize = tsize;
784 extra->SizeOfImage = isize;
787 extra->SizeOfHeaders = abfd->sections->filepos;
788 bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic);
789 bfd_h_put_16(abfd, aouthdr_in->vstamp, (bfd_byte *) aouthdr_out->standard.vstamp);
790 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize);
791 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize);
792 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize);
793 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->standard.entry);
794 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
795 (bfd_byte *) aouthdr_out->standard.text_start);
796 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
797 (bfd_byte *) aouthdr_out->standard.data_start);
800 bfd_h_put_32 (abfd, extra->ImageBase,
801 (bfd_byte *) aouthdr_out->ImageBase);
802 bfd_h_put_32 (abfd, extra->SectionAlignment,
803 (bfd_byte *) aouthdr_out->SectionAlignment);
804 bfd_h_put_32 (abfd, extra->FileAlignment,
805 (bfd_byte *) aouthdr_out->FileAlignment);
806 bfd_h_put_16 (abfd, extra->MajorOperatingSystemVersion,
807 (bfd_byte *) aouthdr_out->MajorOperatingSystemVersion);
808 bfd_h_put_16 (abfd, extra->MinorOperatingSystemVersion,
809 (bfd_byte *) aouthdr_out->MinorOperatingSystemVersion);
810 bfd_h_put_16 (abfd, extra->MajorImageVersion,
811 (bfd_byte *) aouthdr_out->MajorImageVersion);
812 bfd_h_put_16 (abfd, extra->MinorImageVersion,
813 (bfd_byte *) aouthdr_out->MinorImageVersion);
814 bfd_h_put_16 (abfd, extra->MajorSubsystemVersion,
815 (bfd_byte *) aouthdr_out->MajorSubsystemVersion);
816 bfd_h_put_16 (abfd, extra->MinorSubsystemVersion,
817 (bfd_byte *) aouthdr_out->MinorSubsystemVersion);
818 bfd_h_put_32 (abfd, extra->Reserved1,
819 (bfd_byte *) aouthdr_out->Reserved1);
820 bfd_h_put_32 (abfd, extra->SizeOfImage,
821 (bfd_byte *) aouthdr_out->SizeOfImage);
822 bfd_h_put_32 (abfd, extra->SizeOfHeaders,
823 (bfd_byte *) aouthdr_out->SizeOfHeaders);
824 bfd_h_put_32 (abfd, extra->CheckSum,
825 (bfd_byte *) aouthdr_out->CheckSum);
826 bfd_h_put_16 (abfd, extra->Subsystem,
827 (bfd_byte *) aouthdr_out->Subsystem);
828 bfd_h_put_16 (abfd, extra->DllCharacteristics,
829 (bfd_byte *) aouthdr_out->DllCharacteristics);
830 bfd_h_put_32 (abfd, extra->SizeOfStackReserve,
831 (bfd_byte *) aouthdr_out->SizeOfStackReserve);
832 bfd_h_put_32 (abfd, extra->SizeOfStackCommit,
833 (bfd_byte *) aouthdr_out->SizeOfStackCommit);
834 bfd_h_put_32 (abfd, extra->SizeOfHeapReserve,
835 (bfd_byte *) aouthdr_out->SizeOfHeapReserve);
836 bfd_h_put_32 (abfd, extra->SizeOfHeapCommit,
837 (bfd_byte *) aouthdr_out->SizeOfHeapCommit);
838 bfd_h_put_32 (abfd, extra->LoaderFlags,
839 (bfd_byte *) aouthdr_out->LoaderFlags);
840 bfd_h_put_32 (abfd, extra->NumberOfRvaAndSizes,
841 (bfd_byte *) aouthdr_out->NumberOfRvaAndSizes);
844 for (idx=0; idx < 16; idx++)
846 bfd_h_put_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
847 (bfd_byte *) aouthdr_out->DataDirectory[idx][0]);
848 bfd_h_put_32 (abfd, extra->DataDirectory[idx].Size,
849 (bfd_byte *) aouthdr_out->DataDirectory[idx][1]);
854 return sizeof(AOUTHDR);
858 coff_swap_scnhdr_in (abfd, ext, in)
863 SCNHDR *scnhdr_ext = (SCNHDR *) ext;
864 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
866 memcpy(scnhdr_int->s_name, scnhdr_ext->s_name, sizeof(scnhdr_int->s_name));
867 scnhdr_int->s_vaddr =
868 GET_SCNHDR_VADDR (abfd, (bfd_byte *) scnhdr_ext->s_vaddr);
869 scnhdr_int->s_paddr =
870 GET_SCNHDR_PADDR (abfd, (bfd_byte *) scnhdr_ext->s_paddr);
872 GET_SCNHDR_SIZE (abfd, (bfd_byte *) scnhdr_ext->s_size);
874 scnhdr_int->s_scnptr =
875 GET_SCNHDR_SCNPTR (abfd, (bfd_byte *) scnhdr_ext->s_scnptr);
876 scnhdr_int->s_relptr =
877 GET_SCNHDR_RELPTR (abfd, (bfd_byte *) scnhdr_ext->s_relptr);
878 scnhdr_int->s_lnnoptr =
879 GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
880 scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags);
882 scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
883 scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
885 if (scnhdr_int->s_vaddr != 0)
887 scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
892 coff_swap_scnhdr_out (abfd, in, out)
897 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
898 SCNHDR *scnhdr_ext = (SCNHDR *)out;
899 unsigned int ret = sizeof (SCNHDR);
901 memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
904 PUT_SCNHDR_VADDR (abfd,
906 - pe_data(abfd)->pe_opthdr.ImageBase),
907 (bfd_byte *) scnhdr_ext->s_vaddr);
909 /* NT wants the physical address data to be the size (s_size data) of
911 PUT_SCNHDR_PADDR (abfd, scnhdr_int->s_size,
912 (bfd_byte *) scnhdr_ext->s_paddr);
913 /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
914 value except for the BSS section, its s_size should be 0 */
915 if (strcmp (scnhdr_int->s_name, _BSS) == 0)
916 PUT_SCNHDR_SIZE (abfd, 0, (bfd_byte *) scnhdr_ext->s_size);
919 bfd_vma rounded_size;
920 rounded_size = ((scnhdr_int->s_size + NT_FILE_ALIGNMENT - 1) /
923 PUT_SCNHDR_SIZE (abfd, rounded_size, (bfd_byte *) scnhdr_ext->s_size);
926 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
927 (bfd_byte *) scnhdr_ext->s_scnptr);
928 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
929 (bfd_byte *) scnhdr_ext->s_relptr);
930 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
931 (bfd_byte *) scnhdr_ext->s_lnnoptr);
933 /* Extra flags must be set when dealing with NT. All sections should also
934 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
935 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
936 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
937 (this is especially important when dealing with the .idata section since
938 the addresses for routines from .dlls must be overwritten). If .reloc
939 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
940 (0x02000000). Also, the resource data should also be read and
943 int flags = scnhdr_int->s_flags;
944 if (strcmp (scnhdr_int->s_name, ".data") == 0 ||
945 strcmp (scnhdr_int->s_name, ".CRT") == 0 ||
946 strcmp (scnhdr_int->s_name, ".rsrc") == 0 ||
947 strcmp (scnhdr_int->s_name, ".bss") == 0)
948 flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
949 else if (strcmp (scnhdr_int->s_name, ".text") == 0)
950 flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE;
951 else if (strcmp (scnhdr_int->s_name, ".reloc") == 0)
952 flags = SEC_DATA| IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE;
953 else if (strcmp (scnhdr_int->s_name, ".idata") == 0)
954 flags = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | SEC_DATA;
955 else if (strcmp (scnhdr_int->s_name, ".rdata") == 0
956 || strcmp (scnhdr_int->s_name, ".edata") == 0)
957 flags = IMAGE_SCN_MEM_READ | SEC_DATA;
959 bfd_h_put_32(abfd, flags, (bfd_byte *) scnhdr_ext->s_flags);
962 if (scnhdr_int->s_nlnno <= 0xffff)
963 bfd_h_put_16(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
966 (*_bfd_error_handler) ("%s: line number overflow: 0x%lx > 0xffff",
967 bfd_get_filename (abfd),
968 scnhdr_int->s_nlnno);
969 bfd_set_error (bfd_error_file_truncated);
970 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
973 if (scnhdr_int->s_nreloc <= 0xffff)
974 bfd_h_put_16(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
977 (*_bfd_error_handler) ("%s: reloc overflow: 0x%lx > 0xffff",
978 bfd_get_filename (abfd),
979 scnhdr_int->s_nreloc);
980 bfd_set_error (bfd_error_file_truncated);
981 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
986 /**********************************************************************/
988 pe_print_private_bfd_data (abfd, vfile)
994 pe_data_type *pe = pe_data (abfd);
995 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
996 fprintf (file,"ImageBase\t\t%08x\n", i->ImageBase);
997 fprintf (file,"SectionAlignment\t%08x\n", i->SectionAlignment);
998 fprintf (file,"FileAlignment\t\t%08x\n", i->FileAlignment);
999 fprintf (file,"MajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
1000 fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
1001 fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion);
1002 fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion);
1003 fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
1004 fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
1005 fprintf (file,"Reserved1\t\t%08x\n", i->Reserved1);
1006 fprintf (file,"SizeOfImage\t\t%08x\n", i->SizeOfImage);
1007 fprintf (file,"SizeOfHeaders\t\t%08x\n", i->SizeOfHeaders);
1008 fprintf (file,"CheckSum\t\t%08x\n", i->CheckSum);
1009 fprintf (file,"Subsystem\t\t%08x\n", i->Subsystem);
1010 fprintf (file,"DllCharacteristics\t%08x\n", i->DllCharacteristics);
1011 fprintf (file,"SizeOfStackReserve\t%08x\n", i->SizeOfStackReserve);
1012 fprintf (file,"SizeOfStackCommit\t%08x\n", i->SizeOfStackCommit);
1013 fprintf (file,"SizeOfHeapReserve\t%08x\n", i->SizeOfHeapReserve);
1014 fprintf (file,"SizeOfHeapCommit\t%08x\n", i->SizeOfHeapCommit);
1015 fprintf (file,"LoaderFlags\t\t%08x\n", i->LoaderFlags);
1016 fprintf (file,"NumberOfRvaAndSizes\t%08x\n", i->NumberOfRvaAndSizes);
1018 for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
1020 fprintf(file, "Entry %2d %08x %08x\n",
1022 i->DataDirectory[j].VirtualAddress,
1023 i->DataDirectory[j].Size);
1033 abfd->tdata.pe_obj_data =
1034 (struct pe_tdata *) bfd_zalloc (abfd, sizeof (pe_data_type));
1035 if (abfd->tdata.pe_obj_data == 0)
1037 bfd_set_error (bfd_error_no_memory);
1045 /* Create the COFF backend specific information. */
1047 pe_mkobject_hook (abfd, filehdr, aouthdr)
1052 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
1055 if (pe_mkobject (abfd) == false)
1058 pe = pe_data (abfd);
1060 pe->coff.sym_filepos = internal_f->f_symptr;
1062 /* These members communicate important constants about the symbol
1063 table to GDB's symbol-reading code. These `constants'
1064 unfortunately vary among coff implementations... */
1065 pe->coff.local_n_btmask = N_BTMASK;
1066 pe->coff.local_n_btshft = N_BTSHFT;
1067 pe->coff.local_n_tmask = N_TMASK;
1068 pe->coff.local_n_tshift = N_TSHIFT;
1069 pe->coff.local_symesz = SYMESZ;
1070 pe->coff.local_auxesz = AUXESZ;
1071 pe->coff.local_linesz = LINESZ;
1073 obj_raw_syment_count (abfd) =
1074 obj_conv_table_size (abfd) =
1075 internal_f->f_nsyms;
1077 pe->pe_opthdr = ((struct internal_aouthdr *)aouthdr)->pe;