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]);
708 if (aouthdr_int
->entry
)
709 aouthdr_int
->entry
+= a
->ImageBase
;
710 if (aouthdr_int
->tsize
)
711 aouthdr_int
->text_start
+= a
->ImageBase
;
712 if (aouthdr_int
->dsize
)
713 aouthdr_int
->data_start
+= a
->ImageBase
;
717 static void add_data_entry (abfd
, aout
, idx
, name
, base
)
719 struct internal_extra_pe_aouthdr
*aout
;
724 asection
*sec
= bfd_get_section_by_name (abfd
, name
);
726 /* add import directory information if it exists */
729 aout
->DataDirectory
[idx
].VirtualAddress
= sec
->lma
- base
;
730 aout
->DataDirectory
[idx
].Size
= sec
->_raw_size
;
731 sec
->flags
|= SEC_DATA
;
737 coff_swap_aouthdr_out (abfd
, in
, out
)
742 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*)in
;
743 struct internal_extra_pe_aouthdr
*extra
= &pe_data (abfd
)->pe_opthdr
;
744 PEAOUTHDR
*aouthdr_out
= (PEAOUTHDR
*)out
;
746 bfd_vma sa
= extra
->SectionAlignment
;
747 bfd_vma fa
= extra
->FileAlignment
;
748 bfd_vma ib
= extra
->ImageBase
;
750 if (aouthdr_in
->tsize
)
751 aouthdr_in
->text_start
-= ib
;
752 if (aouthdr_in
->dsize
)
753 aouthdr_in
->data_start
-= ib
;
754 if (aouthdr_in
->entry
)
755 aouthdr_in
->entry
-= ib
;
757 #define FA(x) (((x) + fa -1 ) & (- fa))
758 #define SA(x) (((x) + sa -1 ) & (- sa))
760 /* We like to have the sizes aligned */
762 aouthdr_in
->bsize
= FA (aouthdr_in
->bsize
);
765 extra
->NumberOfRvaAndSizes
= IMAGE_NUMBEROF_DIRECTORY_ENTRIES
;
767 /* first null out all data directory entries .. */
768 memset (extra
->DataDirectory
, sizeof (extra
->DataDirectory
), 0);
770 add_data_entry (abfd
, extra
, 0, ".edata", ib
);
771 add_data_entry (abfd
, extra
, 1, ".idata", ib
);
772 add_data_entry (abfd
, extra
, 2, ".rsrc" ,ib
);
773 add_data_entry (abfd
, extra
, 5, ".reloc", ib
);
777 bfd_vma isize
= SA(abfd
->sections
->filepos
);
779 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
781 int rounded
= FA(sec
->_raw_size
);
782 if (sec
->flags
& SEC_DATA
)
784 if (sec
->flags
& SEC_CODE
)
786 isize
+= SA(rounded
);
789 aouthdr_in
->dsize
= dsize
;
790 aouthdr_in
->tsize
= tsize
;
791 extra
->SizeOfImage
= isize
;
794 extra
->SizeOfHeaders
= abfd
->sections
->filepos
;
795 bfd_h_put_16(abfd
, aouthdr_in
->magic
, (bfd_byte
*) aouthdr_out
->standard
.magic
);
796 bfd_h_put_16(abfd
, aouthdr_in
->vstamp
, (bfd_byte
*) aouthdr_out
->standard
.vstamp
);
797 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, (bfd_byte
*) aouthdr_out
->standard
.tsize
);
798 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, (bfd_byte
*) aouthdr_out
->standard
.dsize
);
799 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, (bfd_byte
*) aouthdr_out
->standard
.bsize
);
800 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, (bfd_byte
*) aouthdr_out
->standard
.entry
);
801 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
802 (bfd_byte
*) aouthdr_out
->standard
.text_start
);
803 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
804 (bfd_byte
*) aouthdr_out
->standard
.data_start
);
807 bfd_h_put_32 (abfd
, extra
->ImageBase
,
808 (bfd_byte
*) aouthdr_out
->ImageBase
);
809 bfd_h_put_32 (abfd
, extra
->SectionAlignment
,
810 (bfd_byte
*) aouthdr_out
->SectionAlignment
);
811 bfd_h_put_32 (abfd
, extra
->FileAlignment
,
812 (bfd_byte
*) aouthdr_out
->FileAlignment
);
813 bfd_h_put_16 (abfd
, extra
->MajorOperatingSystemVersion
,
814 (bfd_byte
*) aouthdr_out
->MajorOperatingSystemVersion
);
815 bfd_h_put_16 (abfd
, extra
->MinorOperatingSystemVersion
,
816 (bfd_byte
*) aouthdr_out
->MinorOperatingSystemVersion
);
817 bfd_h_put_16 (abfd
, extra
->MajorImageVersion
,
818 (bfd_byte
*) aouthdr_out
->MajorImageVersion
);
819 bfd_h_put_16 (abfd
, extra
->MinorImageVersion
,
820 (bfd_byte
*) aouthdr_out
->MinorImageVersion
);
821 bfd_h_put_16 (abfd
, extra
->MajorSubsystemVersion
,
822 (bfd_byte
*) aouthdr_out
->MajorSubsystemVersion
);
823 bfd_h_put_16 (abfd
, extra
->MinorSubsystemVersion
,
824 (bfd_byte
*) aouthdr_out
->MinorSubsystemVersion
);
825 bfd_h_put_32 (abfd
, extra
->Reserved1
,
826 (bfd_byte
*) aouthdr_out
->Reserved1
);
827 bfd_h_put_32 (abfd
, extra
->SizeOfImage
,
828 (bfd_byte
*) aouthdr_out
->SizeOfImage
);
829 bfd_h_put_32 (abfd
, extra
->SizeOfHeaders
,
830 (bfd_byte
*) aouthdr_out
->SizeOfHeaders
);
831 bfd_h_put_32 (abfd
, extra
->CheckSum
,
832 (bfd_byte
*) aouthdr_out
->CheckSum
);
833 bfd_h_put_16 (abfd
, extra
->Subsystem
,
834 (bfd_byte
*) aouthdr_out
->Subsystem
);
835 bfd_h_put_16 (abfd
, extra
->DllCharacteristics
,
836 (bfd_byte
*) aouthdr_out
->DllCharacteristics
);
837 bfd_h_put_32 (abfd
, extra
->SizeOfStackReserve
,
838 (bfd_byte
*) aouthdr_out
->SizeOfStackReserve
);
839 bfd_h_put_32 (abfd
, extra
->SizeOfStackCommit
,
840 (bfd_byte
*) aouthdr_out
->SizeOfStackCommit
);
841 bfd_h_put_32 (abfd
, extra
->SizeOfHeapReserve
,
842 (bfd_byte
*) aouthdr_out
->SizeOfHeapReserve
);
843 bfd_h_put_32 (abfd
, extra
->SizeOfHeapCommit
,
844 (bfd_byte
*) aouthdr_out
->SizeOfHeapCommit
);
845 bfd_h_put_32 (abfd
, extra
->LoaderFlags
,
846 (bfd_byte
*) aouthdr_out
->LoaderFlags
);
847 bfd_h_put_32 (abfd
, extra
->NumberOfRvaAndSizes
,
848 (bfd_byte
*) aouthdr_out
->NumberOfRvaAndSizes
);
851 for (idx
=0; idx
< 16; idx
++)
853 bfd_h_put_32 (abfd
, extra
->DataDirectory
[idx
].VirtualAddress
,
854 (bfd_byte
*) aouthdr_out
->DataDirectory
[idx
][0]);
855 bfd_h_put_32 (abfd
, extra
->DataDirectory
[idx
].Size
,
856 (bfd_byte
*) aouthdr_out
->DataDirectory
[idx
][1]);
861 return sizeof(AOUTHDR
);
865 coff_swap_scnhdr_in (abfd
, ext
, in
)
870 SCNHDR
*scnhdr_ext
= (SCNHDR
*) ext
;
871 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
873 memcpy(scnhdr_int
->s_name
, scnhdr_ext
->s_name
, sizeof(scnhdr_int
->s_name
));
874 scnhdr_int
->s_vaddr
=
875 GET_SCNHDR_VADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_vaddr
);
876 scnhdr_int
->s_paddr
=
877 GET_SCNHDR_PADDR (abfd
, (bfd_byte
*) scnhdr_ext
->s_paddr
);
879 GET_SCNHDR_SIZE (abfd
, (bfd_byte
*) scnhdr_ext
->s_size
);
881 scnhdr_int
->s_scnptr
=
882 GET_SCNHDR_SCNPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_scnptr
);
883 scnhdr_int
->s_relptr
=
884 GET_SCNHDR_RELPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_relptr
);
885 scnhdr_int
->s_lnnoptr
=
886 GET_SCNHDR_LNNOPTR (abfd
, (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
887 scnhdr_int
->s_flags
= bfd_h_get_32(abfd
, (bfd_byte
*) scnhdr_ext
->s_flags
);
889 scnhdr_int
->s_nreloc
= bfd_h_get_16(abfd
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
890 scnhdr_int
->s_nlnno
= bfd_h_get_16(abfd
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
892 if (scnhdr_int
->s_vaddr
!= 0)
894 scnhdr_int
->s_vaddr
+= pe_data (abfd
)->pe_opthdr
.ImageBase
;
899 coff_swap_scnhdr_out (abfd
, in
, out
)
904 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*)in
;
905 SCNHDR
*scnhdr_ext
= (SCNHDR
*)out
;
906 unsigned int ret
= sizeof (SCNHDR
);
908 memcpy(scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof(scnhdr_int
->s_name
));
911 PUT_SCNHDR_VADDR (abfd
,
913 - pe_data(abfd
)->pe_opthdr
.ImageBase
),
914 (bfd_byte
*) scnhdr_ext
->s_vaddr
);
916 /* NT wants the physical address data to be the size (s_size data) of
918 PUT_SCNHDR_PADDR (abfd
, scnhdr_int
->s_size
,
919 (bfd_byte
*) scnhdr_ext
->s_paddr
);
920 /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
921 value except for the BSS section, its s_size should be 0 */
922 if (strcmp (scnhdr_int
->s_name
, _BSS
) == 0)
923 PUT_SCNHDR_SIZE (abfd
, 0, (bfd_byte
*) scnhdr_ext
->s_size
);
926 bfd_vma rounded_size
;
927 rounded_size
= ((scnhdr_int
->s_size
+ NT_FILE_ALIGNMENT
- 1) /
930 PUT_SCNHDR_SIZE (abfd
, rounded_size
, (bfd_byte
*) scnhdr_ext
->s_size
);
933 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
934 (bfd_byte
*) scnhdr_ext
->s_scnptr
);
935 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
936 (bfd_byte
*) scnhdr_ext
->s_relptr
);
937 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
938 (bfd_byte
*) scnhdr_ext
->s_lnnoptr
);
940 /* Extra flags must be set when dealing with NT. All sections should also
941 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
942 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
943 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
944 (this is especially important when dealing with the .idata section since
945 the addresses for routines from .dlls must be overwritten). If .reloc
946 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
947 (0x02000000). Also, the resource data should also be read and
950 int flags
= scnhdr_int
->s_flags
;
951 if (strcmp (scnhdr_int
->s_name
, ".data") == 0 ||
952 strcmp (scnhdr_int
->s_name
, ".CRT") == 0 ||
953 strcmp (scnhdr_int
->s_name
, ".rsrc") == 0 ||
954 strcmp (scnhdr_int
->s_name
, ".bss") == 0)
955 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
;
956 else if (strcmp (scnhdr_int
->s_name
, ".text") == 0)
957 flags
|= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_EXECUTE
;
958 else if (strcmp (scnhdr_int
->s_name
, ".reloc") == 0)
959 flags
= SEC_DATA
| IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_DISCARDABLE
;
960 else if (strcmp (scnhdr_int
->s_name
, ".idata") == 0)
961 flags
= IMAGE_SCN_MEM_READ
| IMAGE_SCN_MEM_WRITE
| SEC_DATA
;
962 else if (strcmp (scnhdr_int
->s_name
, ".rdata") == 0
963 || strcmp (scnhdr_int
->s_name
, ".edata") == 0)
964 flags
= IMAGE_SCN_MEM_READ
| SEC_DATA
;
966 bfd_h_put_32(abfd
, flags
, (bfd_byte
*) scnhdr_ext
->s_flags
);
969 if (scnhdr_int
->s_nlnno
<= 0xffff)
970 bfd_h_put_16(abfd
, scnhdr_int
->s_nlnno
, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
973 (*_bfd_error_handler
) ("%s: line number overflow: 0x%lx > 0xffff",
974 bfd_get_filename (abfd
),
975 scnhdr_int
->s_nlnno
);
976 bfd_set_error (bfd_error_file_truncated
);
977 bfd_h_put_16 (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nlnno
);
980 if (scnhdr_int
->s_nreloc
<= 0xffff)
981 bfd_h_put_16(abfd
, scnhdr_int
->s_nreloc
, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
984 (*_bfd_error_handler
) ("%s: reloc overflow: 0x%lx > 0xffff",
985 bfd_get_filename (abfd
),
986 scnhdr_int
->s_nreloc
);
987 bfd_set_error (bfd_error_file_truncated
);
988 bfd_h_put_16 (abfd
, 0xffff, (bfd_byte
*) scnhdr_ext
->s_nreloc
);
993 /**********************************************************************/
995 pe_print_private_bfd_data (abfd
, vfile
)
1001 pe_data_type
*pe
= pe_data (abfd
);
1002 struct internal_extra_pe_aouthdr
*i
= &pe
->pe_opthdr
;
1003 fprintf (file
,"ImageBase\t\t");
1004 fprintf_vma (file
, i
->ImageBase
);
1005 fprintf (file
,"SectionAlignment\t");
1006 fprintf_vma (file
, i
->SectionAlignment
);
1007 fprintf (file
,"FileAlignment\t\t");
1008 fprintf_vma (file
, i
->FileAlignment
);
1009 fprintf (file
,"MajorOSystemVersion\t%d\n", i
->MajorOperatingSystemVersion
);
1010 fprintf (file
,"MinorOSystemVersion\t%d\n", i
->MinorOperatingSystemVersion
);
1011 fprintf (file
,"MajorImageVersion\t%d\n", i
->MajorImageVersion
);
1012 fprintf (file
,"MinorImageVersion\t%d\n", i
->MinorImageVersion
);
1013 fprintf (file
,"MajorSubsystemVersion\t%d\n", i
->MajorSubsystemVersion
);
1014 fprintf (file
,"MinorSubsystemVersion\t%d\n", i
->MinorSubsystemVersion
);
1015 fprintf (file
,"Reserved1\t\t%08lx\n", i
->Reserved1
);
1016 fprintf (file
,"SizeOfImage\t\t%08lx\n", i
->SizeOfImage
);
1017 fprintf (file
,"SizeOfHeaders\t\t%08lx\n", i
->SizeOfHeaders
);
1018 fprintf (file
,"CheckSum\t\t%08lx\n", i
->CheckSum
);
1019 fprintf (file
,"Subsystem\t\t%08x\n", i
->Subsystem
);
1020 fprintf (file
,"DllCharacteristics\t%08x\n", i
->DllCharacteristics
);
1021 fprintf (file
,"SizeOfStackReserve\t");
1022 fprintf_vma (file
, i
->SizeOfStackReserve
);
1023 fprintf (file
,"SizeOfStackCommit\t");
1024 fprintf_vma (file
, i
->SizeOfStackCommit
);
1025 fprintf (file
,"SizeOfHeapReserve\t");
1026 fprintf_vma (file
, i
->SizeOfHeapReserve
);
1027 fprintf (file
,"SizeOfHeapCommit\t");
1028 fprintf_vma (file
, i
->SizeOfHeapCommit
);
1029 fprintf (file
,"LoaderFlags\t\t%08lx\n", i
->LoaderFlags
);
1030 fprintf (file
,"NumberOfRvaAndSizes\t%08lx\n", i
->NumberOfRvaAndSizes
);
1032 for (j
= 0; j
< IMAGE_NUMBEROF_DIRECTORY_ENTRIES
; j
++)
1034 fprintf (file
, "Entry %2d ", j
);
1035 fprintf_vma (file
, i
->DataDirectory
[j
].VirtualAddress
);
1036 fprintf (file
, " %08lx\n", i
->DataDirectory
[j
].Size
);
1048 abfd
->tdata
.pe_obj_data
=
1049 (struct pe_tdata
*) bfd_zalloc (abfd
, sizeof (pe_data_type
));
1050 if (abfd
->tdata
.pe_obj_data
== 0)
1052 bfd_set_error (bfd_error_no_memory
);
1060 /* Create the COFF backend specific information. */
1062 pe_mkobject_hook (abfd
, filehdr
, aouthdr
)
1067 struct internal_filehdr
*internal_f
= (struct internal_filehdr
*) filehdr
;
1070 if (pe_mkobject (abfd
) == false)
1073 pe
= pe_data (abfd
);
1075 pe
->coff
.sym_filepos
= internal_f
->f_symptr
;
1077 /* These members communicate important constants about the symbol
1078 table to GDB's symbol-reading code. These `constants'
1079 unfortunately vary among coff implementations... */
1080 pe
->coff
.local_n_btmask
= N_BTMASK
;
1081 pe
->coff
.local_n_btshft
= N_BTSHFT
;
1082 pe
->coff
.local_n_tmask
= N_TMASK
;
1083 pe
->coff
.local_n_tshift
= N_TSHIFT
;
1084 pe
->coff
.local_symesz
= SYMESZ
;
1085 pe
->coff
.local_auxesz
= AUXESZ
;
1086 pe
->coff
.local_linesz
= LINESZ
;
1088 obj_raw_syment_count (abfd
) =
1089 obj_conv_table_size (abfd
) =
1090 internal_f
->f_nsyms
;
1092 pe
->pe_opthdr
= ((struct internal_aouthdr
*)aouthdr
)->pe
;