a3373fced18ef3ff0ec225a575e9f5fb3df68775
[deliverable/binutils-gdb.git] / bfd / peigen.c
1 /* Support for the generic parts of PE/PEI; the common executable parts.
2 Copyright 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
3 Written by Cygnus Solutions.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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. */
20
21 /*
22 Most of this hacked by Steve Chamberlain,
23 sac@cygnus.com
24
25 PE/PEI rearrangement (and code added): Donn Terry
26 Softway Systems, Inc.
27 */
28
29 /* Hey look, some documentation [and in a place you expect to find it]!
30
31 The main reference for the pei format is "Microsoft Portable Executable
32 and Common Object File Format Specification 4.1". Get it if you need to
33 do some serious hacking on this code.
34
35 Another reference:
36 "Peering Inside the PE: A Tour of the Win32 Portable Executable
37 File Format", MSJ 1994, Volume 9.
38
39 The *sole* difference between the pe format and the pei format is that the
40 latter has an MSDOS 2.0 .exe header on the front that prints the message
41 "This app must be run under Windows." (or some such).
42 (FIXME: Whether that statement is *really* true or not is unknown.
43 Are there more subtle differences between pe and pei formats?
44 For now assume there aren't. If you find one, then for God sakes
45 document it here!)
46
47 The Microsoft docs use the word "image" instead of "executable" because
48 the former can also refer to a DLL (shared library). Confusion can arise
49 because the `i' in `pei' also refers to "image". The `pe' format can
50 also create images (i.e. executables), it's just that to run on a win32
51 system you need to use the pei format.
52
53 FIXME: Please add more docs here so the next poor fool that has to hack
54 on this code has a chance of getting something accomplished without
55 wasting too much time.
56 */
57
58 #include "bfd.h"
59 #include "sysdep.h"
60 #include "libbfd.h"
61 #include "coff/internal.h"
62
63 /* NOTE: it's strange to be including an architecture specific header
64 in what's supposed to be general (to PE/PEI) code. However, that's
65 where the definitions are, and they don't vary per architecture
66 within PE/PEI, so we get them from there. FIXME: The lack of
67 variance is an assumption which may prove to be incorrect if new
68 PE/PEI targets are created. */
69 #include "coff/i386.h"
70
71 #include "coff/pe.h"
72 #include "libcoff.h"
73 #include "libpei.h"
74
75 /* FIXME: This file has various tests of POWERPC_LE_PE. Those tests
76 worked when the code was in peicode.h, but no longer work now that
77 the code is in peigen.c. PowerPC NT is said to be dead. If
78 anybody wants to revive the code, you will have to figure out how
79 to handle those issues. */
80
81 static void add_data_entry
82 PARAMS ((bfd *, struct internal_extra_pe_aouthdr *, int, char *, bfd_vma));
83 static boolean pe_print_pdata PARAMS ((bfd *, PTR));
84 static boolean pe_print_reloc PARAMS ((bfd *, PTR));
85
86 /**********************************************************************/
87
88 void
89 _bfd_pei_swap_sym_in (abfd, ext1, in1)
90 bfd *abfd;
91 PTR ext1;
92 PTR in1;
93 {
94 SYMENT *ext = (SYMENT *)ext1;
95 struct internal_syment *in = (struct internal_syment *)in1;
96
97 if( ext->e.e_name[0] == 0) {
98 in->_n._n_n._n_zeroes = 0;
99 in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
100 }
101 else {
102 memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
103 }
104
105 in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
106 in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
107 if (sizeof(ext->e_type) == 2){
108 in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
109 }
110 else {
111 in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
112 }
113 in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
114 in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
115
116 #ifndef STRICT_PE_FORMAT
117 /* This is for Gnu-created DLLs */
118
119 /* The section symbols for the .idata$ sections have class 0x68
120 (C_SECTION), which MS documentation indicates is a section
121 symbol. Unfortunately, the value field in the symbol is simply a
122 copy of the .idata section's flags rather than something useful.
123 When these symbols are encountered, change the value to 0 so that
124 they will be handled somewhat correctly in the bfd code. */
125 if (in->n_sclass == C_SECTION)
126 {
127 in->n_value = 0x0;
128
129 #if 0
130 /* FIXME: This is clearly wrong. The problem seems to be that
131 undefined C_SECTION symbols appear in the first object of a
132 MS generated .lib file, and the symbols are not defined
133 anywhere. */
134 in->n_scnum = 1;
135
136 /* I have tried setting the class to 3 and using the following
137 to set the section number. This will put the address of the
138 pointer to the string kernel32.dll at addresses 0 and 0x10
139 off start of idata section which is not correct */
140 /* if (strcmp (in->_n._n_name, ".idata$4") == 0) */
141 /* in->n_scnum = 3; */
142 /* else */
143 /* in->n_scnum = 2; */
144 #else
145 /* Create synthetic empty sections as needed. DJ */
146 if (in->n_scnum == 0)
147 {
148 asection *sec;
149 for (sec=abfd->sections; sec; sec=sec->next)
150 {
151 if (strcmp (sec->name, in->n_name) == 0)
152 {
153 in->n_scnum = sec->target_index;
154 break;
155 }
156 }
157 }
158 if (in->n_scnum == 0)
159 {
160 int unused_section_number = 0;
161 asection *sec;
162 char *name;
163 for (sec=abfd->sections; sec; sec=sec->next)
164 if (unused_section_number <= sec->target_index)
165 unused_section_number = sec->target_index+1;
166
167 name = bfd_alloc (abfd, strlen (in->n_name) + 10);
168 if (name == NULL)
169 return;
170 strcpy (name, in->n_name);
171 sec = bfd_make_section_anyway (abfd, name);
172
173 sec->vma = 0;
174 sec->lma = 0;
175 sec->_cooked_size = 0;
176 sec->_raw_size = 0;
177 sec->filepos = 0;
178 sec->rel_filepos = 0;
179 sec->reloc_count = 0;
180 sec->line_filepos = 0;
181 sec->lineno_count = 0;
182 sec->userdata = NULL;
183 sec->next = (asection *) NULL;
184 sec->flags = 0;
185 sec->alignment_power = 2;
186 sec->flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD;
187
188 sec->target_index = unused_section_number;
189
190 in->n_scnum = unused_section_number;
191 }
192 in->n_sclass = C_STAT;
193 #endif
194 }
195 #endif
196
197 #ifdef coff_swap_sym_in_hook
198 /* This won't work in peigen.c, but since it's for PPC PE, it's not
199 worth fixing. */
200 coff_swap_sym_in_hook(abfd, ext1, in1);
201 #endif
202 }
203
204 unsigned int
205 _bfd_pei_swap_sym_out (abfd, inp, extp)
206 bfd *abfd;
207 PTR inp;
208 PTR extp;
209 {
210 struct internal_syment *in = (struct internal_syment *)inp;
211 SYMENT *ext =(SYMENT *)extp;
212 if(in->_n._n_name[0] == 0) {
213 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
214 bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset);
215 }
216 else {
217 memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
218 }
219
220 bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
221 bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
222 if (sizeof(ext->e_type) == 2)
223 {
224 bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
225 }
226 else
227 {
228 bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type);
229 }
230 bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
231 bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
232
233 return SYMESZ;
234 }
235
236 void
237 _bfd_pei_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
238 bfd *abfd;
239 PTR ext1;
240 int type;
241 int class;
242 int indx ATTRIBUTE_UNUSED;
243 int numaux ATTRIBUTE_UNUSED;
244 PTR in1;
245 {
246 AUXENT *ext = (AUXENT *)ext1;
247 union internal_auxent *in = (union internal_auxent *)in1;
248
249 switch (class) {
250 case C_FILE:
251 if (ext->x_file.x_fname[0] == 0) {
252 in->x_file.x_n.x_zeroes = 0;
253 in->x_file.x_n.x_offset =
254 bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
255 } else {
256 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
257 }
258 return;
259
260
261 case C_STAT:
262 case C_LEAFSTAT:
263 case C_HIDDEN:
264 if (type == T_NULL) {
265 in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
266 in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
267 in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
268 in->x_scn.x_checksum = bfd_h_get_32 (abfd,
269 (bfd_byte *) ext->x_scn.x_checksum);
270 in->x_scn.x_associated =
271 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_scn.x_associated);
272 in->x_scn.x_comdat = bfd_h_get_8 (abfd,
273 (bfd_byte *) ext->x_scn.x_comdat);
274 return;
275 }
276 break;
277 }
278
279 in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
280 in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
281
282 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
283 {
284 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
285 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
286 }
287 else
288 {
289 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
290 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
291 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
292 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
293 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
294 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
295 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
296 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
297 }
298
299 if (ISFCN(type)) {
300 in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
301 }
302 else {
303 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
304 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
305 }
306 }
307
308 unsigned int
309 _bfd_pei_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
310 bfd *abfd;
311 PTR inp;
312 int type;
313 int class;
314 int indx ATTRIBUTE_UNUSED;
315 int numaux ATTRIBUTE_UNUSED;
316 PTR extp;
317 {
318 union internal_auxent *in = (union internal_auxent *)inp;
319 AUXENT *ext = (AUXENT *)extp;
320
321 memset((PTR)ext, 0, AUXESZ);
322 switch (class) {
323 case C_FILE:
324 if (in->x_file.x_fname[0] == 0) {
325 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
326 bfd_h_put_32(abfd,
327 in->x_file.x_n.x_offset,
328 (bfd_byte *) ext->x_file.x_n.x_offset);
329 }
330 else {
331 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
332 }
333 return AUXESZ;
334
335
336 case C_STAT:
337 case C_LEAFSTAT:
338 case C_HIDDEN:
339 if (type == T_NULL) {
340 PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
341 PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
342 PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
343 bfd_h_put_32 (abfd, in->x_scn.x_checksum,
344 (bfd_byte *) ext->x_scn.x_checksum);
345 bfd_h_put_16 (abfd, in->x_scn.x_associated,
346 (bfd_byte *) ext->x_scn.x_associated);
347 bfd_h_put_8 (abfd, in->x_scn.x_comdat,
348 (bfd_byte *) ext->x_scn.x_comdat);
349 return AUXESZ;
350 }
351 break;
352 }
353
354 bfd_h_put_32(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
355 bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
356
357 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
358 {
359 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
360 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
361 }
362 else
363 {
364 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
365 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
366 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
367 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
368 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
369 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
370 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
371 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
372 }
373
374 if (ISFCN (type))
375 bfd_h_put_32 (abfd, in->x_sym.x_misc.x_fsize,
376 (bfd_byte *) ext->x_sym.x_misc.x_fsize);
377 else
378 {
379 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
380 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
381 }
382
383 return AUXESZ;
384 }
385
386 void
387 _bfd_pei_swap_lineno_in (abfd, ext1, in1)
388 bfd *abfd;
389 PTR ext1;
390 PTR in1;
391 {
392 LINENO *ext = (LINENO *)ext1;
393 struct internal_lineno *in = (struct internal_lineno *)in1;
394
395 in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
396 in->l_lnno = GET_LINENO_LNNO(abfd, ext);
397 }
398
399 unsigned int
400 _bfd_pei_swap_lineno_out (abfd, inp, outp)
401 bfd *abfd;
402 PTR inp;
403 PTR outp;
404 {
405 struct internal_lineno *in = (struct internal_lineno *)inp;
406 struct external_lineno *ext = (struct external_lineno *)outp;
407 bfd_h_put_32(abfd, in->l_addr.l_symndx, (bfd_byte *)
408 ext->l_addr.l_symndx);
409
410 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
411 return LINESZ;
412 }
413
414 void
415 _bfd_pei_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
416 bfd *abfd;
417 PTR aouthdr_ext1;
418 PTR aouthdr_int1;
419 {
420 struct internal_extra_pe_aouthdr *a;
421 PEAOUTHDR *src = (PEAOUTHDR *)(aouthdr_ext1);
422 AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
423 struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
424
425 aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
426 aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
427 aouthdr_int->tsize =
428 GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
429 aouthdr_int->dsize =
430 GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
431 aouthdr_int->bsize =
432 GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
433 aouthdr_int->entry =
434 GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
435 aouthdr_int->text_start =
436 GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
437 #ifndef COFF_WITH_PEP64
438 /* PE32+ does not have data_start member! */
439 aouthdr_int->data_start =
440 GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
441 #endif
442
443 a = &aouthdr_int->pe;
444 a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, (bfd_byte *)src->ImageBase);
445 a->SectionAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->SectionAlignment);
446 a->FileAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->FileAlignment);
447 a->MajorOperatingSystemVersion =
448 bfd_h_get_16 (abfd, (bfd_byte *)src->MajorOperatingSystemVersion);
449 a->MinorOperatingSystemVersion =
450 bfd_h_get_16 (abfd, (bfd_byte *)src->MinorOperatingSystemVersion);
451 a->MajorImageVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MajorImageVersion);
452 a->MinorImageVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MinorImageVersion);
453 a->MajorSubsystemVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MajorSubsystemVersion);
454 a->MinorSubsystemVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MinorSubsystemVersion);
455 a->Reserved1 = bfd_h_get_32 (abfd, (bfd_byte *)src->Reserved1);
456 a->SizeOfImage = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfImage);
457 a->SizeOfHeaders = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfHeaders);
458 a->CheckSum = bfd_h_get_32 (abfd, (bfd_byte *)src->CheckSum);
459 a->Subsystem = bfd_h_get_16 (abfd, (bfd_byte *)src->Subsystem);
460 a->DllCharacteristics = bfd_h_get_16 (abfd, (bfd_byte *)src->DllCharacteristics);
461 a->SizeOfStackReserve = GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, (bfd_byte *)src->SizeOfStackReserve);
462 a->SizeOfStackCommit = GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, (bfd_byte *)src->SizeOfStackCommit);
463 a->SizeOfHeapReserve = GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, (bfd_byte *)src->SizeOfHeapReserve);
464 a->SizeOfHeapCommit = GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, (bfd_byte *)src->SizeOfHeapCommit);
465 a->LoaderFlags = bfd_h_get_32 (abfd, (bfd_byte *)src->LoaderFlags);
466 a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, (bfd_byte *)src->NumberOfRvaAndSizes);
467
468 {
469 int idx;
470 for (idx=0; idx < 16; idx++)
471 {
472 /* If data directory is empty, rva also should be 0 */
473 int size = bfd_h_get_32 (abfd, (bfd_byte *) src->DataDirectory[idx][1]);
474 a->DataDirectory[idx].Size = size;
475
476 if (size)
477 {
478 a->DataDirectory[idx].VirtualAddress =
479 bfd_h_get_32 (abfd, (bfd_byte *) src->DataDirectory[idx][0]);
480 }
481 else
482 a->DataDirectory[idx].VirtualAddress = 0;
483 }
484 }
485
486 if (aouthdr_int->entry)
487 {
488 aouthdr_int->entry += a->ImageBase;
489 #ifndef COFF_WITH_PEP64
490 aouthdr_int->entry &= 0xffffffff;
491 #endif
492 }
493 if (aouthdr_int->tsize)
494 {
495 aouthdr_int->text_start += a->ImageBase;
496 #ifndef COFF_WITH_PEP64
497 aouthdr_int->text_start &= 0xffffffff;
498 #endif
499 }
500 #ifndef COFF_WITH_PEP64
501 /* PE32+ does not have data_start member! */
502 if (aouthdr_int->dsize)
503 {
504 aouthdr_int->data_start += a->ImageBase;
505 aouthdr_int->data_start &= 0xffffffff;
506 }
507 #endif
508
509 #ifdef POWERPC_LE_PE
510 /* These three fields are normally set up by ppc_relocate_section.
511 In the case of reading a file in, we can pick them up from the
512 DataDirectory. */
513 first_thunk_address = a->DataDirectory[12].VirtualAddress ;
514 thunk_size = a->DataDirectory[12].Size;
515 import_table_size = a->DataDirectory[1].Size;
516 #endif
517
518 }
519
520 /* A support function for below. */
521
522 static void
523 add_data_entry (abfd, aout, idx, name, base)
524 bfd *abfd;
525 struct internal_extra_pe_aouthdr *aout;
526 int idx;
527 char *name;
528 bfd_vma base;
529 {
530 asection *sec = bfd_get_section_by_name (abfd, name);
531
532 /* add import directory information if it exists */
533 if ((sec != NULL)
534 && (coff_section_data (abfd, sec) != NULL)
535 && (pei_section_data (abfd, sec) != NULL))
536 {
537 /* If data directory is empty, rva also should be 0 */
538 int size = pei_section_data (abfd, sec)->virt_size;
539 aout->DataDirectory[idx].Size = size;
540
541 if (size)
542 {
543 aout->DataDirectory[idx].VirtualAddress =
544 (sec->vma - base) & 0xffffffff;
545 sec->flags |= SEC_DATA;
546 }
547 }
548 }
549
550 unsigned int
551 _bfd_pei_swap_aouthdr_out (abfd, in, out)
552 bfd *abfd;
553 PTR in;
554 PTR out;
555 {
556 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
557 struct internal_extra_pe_aouthdr *extra = &pe_data (abfd)->pe_opthdr;
558 PEAOUTHDR *aouthdr_out = (PEAOUTHDR *)out;
559 bfd_vma sa, fa, ib;
560
561 /* The following definitely is required for EFI applications.
562 Perhaps it's needed for other PEI targets as well, but I don't
563 know that for a fact, so we play it safe here and tweak the
564 alignments only if PEI_FORCE_MINIMUM_ALIGNMENT is
565 defined. --davidm */
566 #ifdef PEI_FORCE_MINIMUM_ALIGNMENT
567 if (!extra->FileAlignment)
568 extra->FileAlignment = PE_DEF_FILE_ALIGNMENT;
569 if (!extra->SectionAlignment)
570 extra->SectionAlignment = PE_DEF_SECTION_ALIGNMENT;
571 #endif
572
573 #ifdef PEI_DEFAULT_TARGET_SUBSYSTEM
574 if (extra->Subsystem == IMAGE_SUBSYSTEM_UNKNOWN)
575 extra->Subsystem = PEI_DEFAULT_TARGET_SUBSYSTEM;
576 #endif
577
578 sa = extra->SectionAlignment;
579 fa = extra->FileAlignment;
580 ib = extra->ImageBase;
581
582 if (aouthdr_in->tsize)
583 {
584 aouthdr_in->text_start -= ib;
585 aouthdr_in->text_start &= 0xffffffff;
586 }
587 if (aouthdr_in->dsize)
588 {
589 aouthdr_in->data_start -= ib;
590 aouthdr_in->data_start &= 0xffffffff;
591 }
592 if (aouthdr_in->entry)
593 {
594 aouthdr_in->entry -= ib;
595 aouthdr_in->entry &= 0xffffffff;
596 }
597
598 #define FA(x) (((x) + fa -1 ) & (- fa))
599 #define SA(x) (((x) + sa -1 ) & (- sa))
600
601 /* We like to have the sizes aligned */
602
603 aouthdr_in->bsize = FA (aouthdr_in->bsize);
604
605
606 extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
607
608 /* first null out all data directory entries .. */
609 memset (extra->DataDirectory, sizeof (extra->DataDirectory), 0);
610
611 add_data_entry (abfd, extra, 0, ".edata", ib);
612
613 /* Don't call add_data_entry for .idata$2 or .idata$5. It's done in
614 bfd_coff_final_link where all the required information is
615 available. */
616
617 /* However, until other .idata fixes are made (pending patch), the
618 entry for .idata is needed for backwards compatability. FIXME. */
619 add_data_entry (abfd, extra, 1, ".idata" , ib);
620
621 add_data_entry (abfd, extra, 2, ".rsrc" , ib);
622
623 add_data_entry (abfd, extra, 3, ".pdata", ib);
624
625 /* For some reason, the virtual size (which is what's set by
626 add_data_entry) for .reloc is not the same as the size recorded
627 in this slot by MSVC; it doesn't seem to cause problems (so far),
628 but since it's the best we've got, use it. It does do the right
629 thing for .pdata. */
630 if (pe_data (abfd)->has_reloc_section)
631 add_data_entry (abfd, extra, 5, ".reloc", ib);
632
633 {
634 asection *sec;
635 bfd_vma dsize= 0;
636 bfd_vma isize = SA(abfd->sections->filepos);
637 bfd_vma tsize= 0;
638
639 for (sec = abfd->sections; sec; sec = sec->next)
640 {
641 int rounded = FA(sec->_raw_size);
642
643 if (sec->flags & SEC_DATA)
644 dsize += rounded;
645 if (sec->flags & SEC_CODE)
646 tsize += rounded;
647 /* The image size is the total VIRTUAL size (which is what is
648 in the virt_size field). Files have been seen (from MSVC
649 5.0 link.exe) where the file size of the .data segment is
650 quite small compared to the virtual size. Without this
651 fix, strip munges the file. */
652 isize += SA (FA (pei_section_data (abfd, sec)->virt_size));
653 }
654
655 aouthdr_in->dsize = dsize;
656 aouthdr_in->tsize = tsize;
657 extra->SizeOfImage = isize;
658 }
659
660 extra->SizeOfHeaders = abfd->sections->filepos;
661 bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic);
662
663 #define LINKER_VERSION 256 /* That is, 2.56 */
664
665 /* This piece of magic sets the "linker version" field to
666 LINKER_VERSION. */
667 bfd_h_put_16 (abfd,
668 LINKER_VERSION / 100 + (LINKER_VERSION % 100) * 256,
669 (bfd_byte *) aouthdr_out->standard.vstamp);
670
671 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize);
672 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize);
673 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize);
674 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->standard.entry);
675 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
676 (bfd_byte *) aouthdr_out->standard.text_start);
677
678 #ifndef COFF_WITH_PEP64
679 /* PE32+ does not have data_start member! */
680 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
681 (bfd_byte *) aouthdr_out->standard.data_start);
682 #endif
683
684 PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase,
685 (bfd_byte *) aouthdr_out->ImageBase);
686 bfd_h_put_32 (abfd, extra->SectionAlignment,
687 (bfd_byte *) aouthdr_out->SectionAlignment);
688 bfd_h_put_32 (abfd, extra->FileAlignment,
689 (bfd_byte *) aouthdr_out->FileAlignment);
690 bfd_h_put_16 (abfd, extra->MajorOperatingSystemVersion,
691 (bfd_byte *) aouthdr_out->MajorOperatingSystemVersion);
692 bfd_h_put_16 (abfd, extra->MinorOperatingSystemVersion,
693 (bfd_byte *) aouthdr_out->MinorOperatingSystemVersion);
694 bfd_h_put_16 (abfd, extra->MajorImageVersion,
695 (bfd_byte *) aouthdr_out->MajorImageVersion);
696 bfd_h_put_16 (abfd, extra->MinorImageVersion,
697 (bfd_byte *) aouthdr_out->MinorImageVersion);
698 bfd_h_put_16 (abfd, extra->MajorSubsystemVersion,
699 (bfd_byte *) aouthdr_out->MajorSubsystemVersion);
700 bfd_h_put_16 (abfd, extra->MinorSubsystemVersion,
701 (bfd_byte *) aouthdr_out->MinorSubsystemVersion);
702 bfd_h_put_32 (abfd, extra->Reserved1,
703 (bfd_byte *) aouthdr_out->Reserved1);
704 bfd_h_put_32 (abfd, extra->SizeOfImage,
705 (bfd_byte *) aouthdr_out->SizeOfImage);
706 bfd_h_put_32 (abfd, extra->SizeOfHeaders,
707 (bfd_byte *) aouthdr_out->SizeOfHeaders);
708 bfd_h_put_32 (abfd, extra->CheckSum,
709 (bfd_byte *) aouthdr_out->CheckSum);
710 bfd_h_put_16 (abfd, extra->Subsystem,
711 (bfd_byte *) aouthdr_out->Subsystem);
712 bfd_h_put_16 (abfd, extra->DllCharacteristics,
713 (bfd_byte *) aouthdr_out->DllCharacteristics);
714 PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
715 (bfd_byte *) aouthdr_out->SizeOfStackReserve);
716 PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
717 (bfd_byte *) aouthdr_out->SizeOfStackCommit);
718 PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
719 (bfd_byte *) aouthdr_out->SizeOfHeapReserve);
720 PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
721 (bfd_byte *) aouthdr_out->SizeOfHeapCommit);
722 bfd_h_put_32 (abfd, extra->LoaderFlags,
723 (bfd_byte *) aouthdr_out->LoaderFlags);
724 bfd_h_put_32 (abfd, extra->NumberOfRvaAndSizes,
725 (bfd_byte *) aouthdr_out->NumberOfRvaAndSizes);
726 {
727 int idx;
728 for (idx=0; idx < 16; idx++)
729 {
730 bfd_h_put_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
731 (bfd_byte *) aouthdr_out->DataDirectory[idx][0]);
732 bfd_h_put_32 (abfd, extra->DataDirectory[idx].Size,
733 (bfd_byte *) aouthdr_out->DataDirectory[idx][1]);
734 }
735 }
736
737 return AOUTSZ;
738 }
739
740 unsigned int
741 _bfd_pei_only_swap_filehdr_out (abfd, in, out)
742 bfd *abfd;
743 PTR in;
744 PTR out;
745 {
746 int idx;
747 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
748 struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *)out;
749
750 if (pe_data (abfd)->has_reloc_section)
751 filehdr_in->f_flags &= ~F_RELFLG;
752
753 if (pe_data (abfd)->dll)
754 filehdr_in->f_flags |= F_DLL;
755
756 filehdr_in->pe.e_magic = DOSMAGIC;
757 filehdr_in->pe.e_cblp = 0x90;
758 filehdr_in->pe.e_cp = 0x3;
759 filehdr_in->pe.e_crlc = 0x0;
760 filehdr_in->pe.e_cparhdr = 0x4;
761 filehdr_in->pe.e_minalloc = 0x0;
762 filehdr_in->pe.e_maxalloc = 0xffff;
763 filehdr_in->pe.e_ss = 0x0;
764 filehdr_in->pe.e_sp = 0xb8;
765 filehdr_in->pe.e_csum = 0x0;
766 filehdr_in->pe.e_ip = 0x0;
767 filehdr_in->pe.e_cs = 0x0;
768 filehdr_in->pe.e_lfarlc = 0x40;
769 filehdr_in->pe.e_ovno = 0x0;
770
771 for (idx=0; idx < 4; idx++)
772 filehdr_in->pe.e_res[idx] = 0x0;
773
774 filehdr_in->pe.e_oemid = 0x0;
775 filehdr_in->pe.e_oeminfo = 0x0;
776
777 for (idx=0; idx < 10; idx++)
778 filehdr_in->pe.e_res2[idx] = 0x0;
779
780 filehdr_in->pe.e_lfanew = 0x80;
781
782 /* this next collection of data are mostly just characters. It appears
783 to be constant within the headers put on NT exes */
784 filehdr_in->pe.dos_message[0] = 0x0eba1f0e;
785 filehdr_in->pe.dos_message[1] = 0xcd09b400;
786 filehdr_in->pe.dos_message[2] = 0x4c01b821;
787 filehdr_in->pe.dos_message[3] = 0x685421cd;
788 filehdr_in->pe.dos_message[4] = 0x70207369;
789 filehdr_in->pe.dos_message[5] = 0x72676f72;
790 filehdr_in->pe.dos_message[6] = 0x63206d61;
791 filehdr_in->pe.dos_message[7] = 0x6f6e6e61;
792 filehdr_in->pe.dos_message[8] = 0x65622074;
793 filehdr_in->pe.dos_message[9] = 0x6e757220;
794 filehdr_in->pe.dos_message[10] = 0x206e6920;
795 filehdr_in->pe.dos_message[11] = 0x20534f44;
796 filehdr_in->pe.dos_message[12] = 0x65646f6d;
797 filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
798 filehdr_in->pe.dos_message[14] = 0x24;
799 filehdr_in->pe.dos_message[15] = 0x0;
800 filehdr_in->pe.nt_signature = NT_SIGNATURE;
801
802
803
804 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
805 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
806
807 bfd_h_put_32(abfd, time (0), (bfd_byte *) filehdr_out->f_timdat);
808 PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
809 (bfd_byte *) filehdr_out->f_symptr);
810 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
811 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
812 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
813
814 /* put in extra dos header stuff. This data remains essentially
815 constant, it just has to be tacked on to the beginning of all exes
816 for NT */
817 bfd_h_put_16(abfd, filehdr_in->pe.e_magic, (bfd_byte *) filehdr_out->e_magic);
818 bfd_h_put_16(abfd, filehdr_in->pe.e_cblp, (bfd_byte *) filehdr_out->e_cblp);
819 bfd_h_put_16(abfd, filehdr_in->pe.e_cp, (bfd_byte *) filehdr_out->e_cp);
820 bfd_h_put_16(abfd, filehdr_in->pe.e_crlc, (bfd_byte *) filehdr_out->e_crlc);
821 bfd_h_put_16(abfd, filehdr_in->pe.e_cparhdr,
822 (bfd_byte *) filehdr_out->e_cparhdr);
823 bfd_h_put_16(abfd, filehdr_in->pe.e_minalloc,
824 (bfd_byte *) filehdr_out->e_minalloc);
825 bfd_h_put_16(abfd, filehdr_in->pe.e_maxalloc,
826 (bfd_byte *) filehdr_out->e_maxalloc);
827 bfd_h_put_16(abfd, filehdr_in->pe.e_ss, (bfd_byte *) filehdr_out->e_ss);
828 bfd_h_put_16(abfd, filehdr_in->pe.e_sp, (bfd_byte *) filehdr_out->e_sp);
829 bfd_h_put_16(abfd, filehdr_in->pe.e_csum, (bfd_byte *) filehdr_out->e_csum);
830 bfd_h_put_16(abfd, filehdr_in->pe.e_ip, (bfd_byte *) filehdr_out->e_ip);
831 bfd_h_put_16(abfd, filehdr_in->pe.e_cs, (bfd_byte *) filehdr_out->e_cs);
832 bfd_h_put_16(abfd, filehdr_in->pe.e_lfarlc, (bfd_byte *) filehdr_out->e_lfarlc);
833 bfd_h_put_16(abfd, filehdr_in->pe.e_ovno, (bfd_byte *) filehdr_out->e_ovno);
834 {
835 int idx;
836 for (idx=0; idx < 4; idx++)
837 bfd_h_put_16(abfd, filehdr_in->pe.e_res[idx],
838 (bfd_byte *) filehdr_out->e_res[idx]);
839 }
840 bfd_h_put_16(abfd, filehdr_in->pe.e_oemid, (bfd_byte *) filehdr_out->e_oemid);
841 bfd_h_put_16(abfd, filehdr_in->pe.e_oeminfo,
842 (bfd_byte *) filehdr_out->e_oeminfo);
843 {
844 int idx;
845 for (idx=0; idx < 10; idx++)
846 bfd_h_put_16(abfd, filehdr_in->pe.e_res2[idx],
847 (bfd_byte *) filehdr_out->e_res2[idx]);
848 }
849 bfd_h_put_32(abfd, filehdr_in->pe.e_lfanew, (bfd_byte *) filehdr_out->e_lfanew);
850
851 {
852 int idx;
853 for (idx=0; idx < 16; idx++)
854 bfd_h_put_32(abfd, filehdr_in->pe.dos_message[idx],
855 (bfd_byte *) filehdr_out->dos_message[idx]);
856 }
857
858 /* also put in the NT signature */
859 bfd_h_put_32(abfd, filehdr_in->pe.nt_signature,
860 (bfd_byte *) filehdr_out->nt_signature);
861
862
863
864
865 return FILHSZ;
866 }
867
868 unsigned int
869 _bfd_pe_only_swap_filehdr_out (abfd, in, out)
870 bfd *abfd;
871 PTR in;
872 PTR out;
873 {
874 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
875 FILHDR *filehdr_out = (FILHDR *)out;
876
877 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
878 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
879 bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
880 PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
881 (bfd_byte *) filehdr_out->f_symptr);
882 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
883 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
884 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
885
886 return FILHSZ;
887 }
888
889 unsigned int
890 _bfd_pei_swap_scnhdr_out (abfd, in, out)
891 bfd *abfd;
892 PTR in;
893 PTR out;
894 {
895 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
896 SCNHDR *scnhdr_ext = (SCNHDR *)out;
897 unsigned int ret = SCNHSZ;
898 bfd_vma ps;
899 bfd_vma ss;
900
901 memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
902
903 PUT_SCNHDR_VADDR (abfd,
904 ((scnhdr_int->s_vaddr
905 - pe_data(abfd)->pe_opthdr.ImageBase)
906 & 0xffffffff),
907 (bfd_byte *) scnhdr_ext->s_vaddr);
908
909 /* NT wants the size data to be rounded up to the next
910 NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
911 sometimes). */
912
913 if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
914 {
915 ps = scnhdr_int->s_size;
916 ss = 0;
917 }
918 else
919 {
920 ps = scnhdr_int->s_paddr;
921 ss = scnhdr_int->s_size;
922 }
923
924 PUT_SCNHDR_SIZE (abfd, ss,
925 (bfd_byte *) scnhdr_ext->s_size);
926
927
928 /* s_paddr in PE is really the virtual size. */
929 PUT_SCNHDR_PADDR (abfd, ps, (bfd_byte *) scnhdr_ext->s_paddr);
930
931 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
932 (bfd_byte *) scnhdr_ext->s_scnptr);
933 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
934 (bfd_byte *) scnhdr_ext->s_relptr);
935 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
936 (bfd_byte *) scnhdr_ext->s_lnnoptr);
937
938 /* Extra flags must be set when dealing with NT. All sections should also
939 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
940 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
941 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
942 (this is especially important when dealing with the .idata section since
943 the addresses for routines from .dlls must be overwritten). If .reloc
944 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
945 (0x02000000). Also, the resource data should also be read and
946 writable. */
947
948 /* FIXME: alignment is also encoded in this field, at least on ppc (krk) */
949 /* FIXME: even worse, I don't see how to get the original alignment field*/
950 /* back... */
951
952 {
953 int flags = scnhdr_int->s_flags;
954 bfd_h_put_32(abfd, flags, (bfd_byte *) scnhdr_ext->s_flags);
955 }
956
957 if (coff_data (abfd)->link_info
958 && ! coff_data (abfd)->link_info->relocateable
959 && ! coff_data (abfd)->link_info->shared
960 && strcmp (scnhdr_int->s_name, ".text") == 0)
961 {
962 /* By inference from looking at MS output, the 32 bit field
963 which is the combintion of the number_of_relocs and
964 number_of_linenos is used for the line number count in
965 executables. A 16-bit field won't do for cc1. The MS
966 document says that the number of relocs is zero for
967 executables, but the 17-th bit has been observed to be there.
968 Overflow is not an issue: a 4G-line program will overflow a
969 bunch of other fields long before this! */
970 bfd_h_put_16 (abfd, scnhdr_int->s_nlnno & 0xffff,
971 (bfd_byte *) scnhdr_ext->s_nlnno);
972 bfd_h_put_16 (abfd, scnhdr_int->s_nlnno >> 16,
973 (bfd_byte *) scnhdr_ext->s_nreloc);
974 }
975 else
976 {
977 if (scnhdr_int->s_nlnno <= 0xffff)
978 bfd_h_put_16 (abfd, scnhdr_int->s_nlnno,
979 (bfd_byte *) scnhdr_ext->s_nlnno);
980 else
981 {
982 (*_bfd_error_handler) (_("%s: line number overflow: 0x%lx > 0xffff"),
983 bfd_get_filename (abfd),
984 scnhdr_int->s_nlnno);
985 bfd_set_error (bfd_error_file_truncated);
986 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
987 ret = 0;
988 }
989 if (scnhdr_int->s_nreloc <= 0xffff)
990 bfd_h_put_16 (abfd, scnhdr_int->s_nreloc,
991 (bfd_byte *) scnhdr_ext->s_nreloc);
992 else
993 {
994 /* PE can deal with large #s of relocs, but not here */
995 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
996 scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
997 bfd_h_put_32(abfd, scnhdr_int->s_flags,
998 (bfd_byte *) scnhdr_ext->s_flags);
999 #if 0
1000 (*_bfd_error_handler) (_("%s: reloc overflow 1: 0x%lx > 0xffff"),
1001 bfd_get_filename (abfd),
1002 scnhdr_int->s_nreloc);
1003 bfd_set_error (bfd_error_file_truncated);
1004 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
1005 ret = 0;
1006 #endif
1007 }
1008 }
1009 return ret;
1010 }
1011
1012 static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
1013 {
1014 N_ ("Export Directory [.edata (or where ever we found it)]"),
1015 N_ ("Import Directory [parts of .idata]"),
1016 N_ ("Resource Directory [.rsrc]"),
1017 N_ ("Exception Directory [.pdata]"),
1018 N_ ("Security Directory"),
1019 N_ ("Base Relocation Directory [.reloc]"),
1020 N_ ("Debug Directory"),
1021 N_ ("Description Directory"),
1022 N_ ("Special Directory"),
1023 N_ ("Thread Storage Directory [.tls]"),
1024 N_ ("Load Configuration Directory"),
1025 N_ ("Bound Import Directory"),
1026 N_ ("Import Address Table Directory"),
1027 N_ ("Delay Import Directory"),
1028 N_ ("Reserved"),
1029 N_ ("Reserved")
1030 };
1031
1032 /**********************************************************************/
1033 #ifdef POWERPC_LE_PE
1034 /* The code for the PPC really falls in the "architecture dependent"
1035 category. However, it's not clear that anyone will ever care, so
1036 we're ignoring the issue for now; if/when PPC matters, some of this
1037 may need to go into peicode.h, or arguments passed to enable the
1038 PPC- specific code. */
1039 #endif
1040
1041 /**********************************************************************/
1042 static boolean
1043 pe_print_idata (abfd, vfile)
1044 bfd *abfd;
1045 PTR vfile;
1046 {
1047 FILE *file = (FILE *) vfile;
1048 bfd_byte *data;
1049 asection *section;
1050 bfd_signed_vma adj;
1051
1052 #ifdef POWERPC_LE_PE
1053 asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
1054 #endif
1055
1056 bfd_size_type datasize = 0;
1057 bfd_size_type dataoff;
1058 bfd_size_type i;
1059 int onaline = 20;
1060
1061 pe_data_type *pe = pe_data (abfd);
1062 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1063
1064 bfd_vma addr;
1065
1066 addr = extra->DataDirectory[1].VirtualAddress;
1067
1068 if (addr == 0 && extra->DataDirectory[1].Size == 0)
1069 {
1070 /* Maybe the extra header isn't there. Look for the section. */
1071 section = bfd_get_section_by_name (abfd, ".idata");
1072 if (section == NULL)
1073 return true;
1074
1075 addr = section->vma;
1076 datasize = bfd_section_size (abfd, section);
1077 if (datasize == 0)
1078 return true;
1079 }
1080 else
1081 {
1082 addr += extra->ImageBase;
1083 for (section = abfd->sections; section != NULL; section = section->next)
1084 {
1085 datasize = bfd_section_size (abfd, section);
1086 if (addr >= section->vma && addr < section->vma + datasize)
1087 break;
1088 }
1089
1090 if (section == NULL)
1091 {
1092 fprintf (file,
1093 _("\nThere is an import table, but the section containing it could not be found\n"));
1094 return true;
1095 }
1096 }
1097
1098 fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
1099 section->name, (unsigned long) addr);
1100
1101 dataoff = addr - section->vma;
1102 datasize -= dataoff;
1103
1104 #ifdef POWERPC_LE_PE
1105 if (rel_section != 0 && bfd_section_size (abfd, rel_section) != 0)
1106 {
1107 /* The toc address can be found by taking the starting address,
1108 which on the PPC locates a function descriptor. The
1109 descriptor consists of the function code starting address
1110 followed by the address of the toc. The starting address we
1111 get from the bfd, and the descriptor is supposed to be in the
1112 .reldata section. */
1113
1114 bfd_vma loadable_toc_address;
1115 bfd_vma toc_address;
1116 bfd_vma start_address;
1117 bfd_byte *data = 0;
1118 int offset;
1119
1120 data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd,
1121 rel_section));
1122 if (data == NULL && bfd_section_size (abfd, rel_section) != 0)
1123 return false;
1124
1125 bfd_get_section_contents (abfd,
1126 rel_section,
1127 (PTR) data, 0,
1128 bfd_section_size (abfd, rel_section));
1129
1130 offset = abfd->start_address - rel_section->vma;
1131
1132 start_address = bfd_get_32 (abfd, data + offset);
1133 loadable_toc_address = bfd_get_32 (abfd, data + offset + 4);
1134 toc_address = loadable_toc_address - 32768;
1135
1136 fprintf(file,
1137 _("\nFunction descriptor located at the start address: %04lx\n"),
1138 (unsigned long int) (abfd->start_address));
1139 fprintf (file,
1140 _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
1141 start_address, loadable_toc_address, toc_address);
1142 }
1143 else
1144 {
1145 fprintf(file,
1146 _("\nNo reldata section! Function descriptor not decoded.\n"));
1147 }
1148 #endif
1149
1150 fprintf(file,
1151 _("\nThe Import Tables (interpreted %s section contents)\n"),
1152 section->name);
1153 fprintf(file,
1154 _(" vma: Hint Time Forward DLL First\n"));
1155 fprintf(file,
1156 _(" Table Stamp Chain Name Thunk\n"));
1157
1158 data = (bfd_byte *) bfd_malloc (dataoff + datasize);
1159 if (data == NULL)
1160 return false;
1161
1162 /* Read the whole section. Some of the fields might be before dataoff. */
1163 if (! bfd_get_section_contents (abfd, section, (PTR) data,
1164 0, dataoff + datasize))
1165 return false;
1166
1167 adj = section->vma - extra->ImageBase;
1168
1169 for (i = 0; i < datasize; i += onaline)
1170 {
1171 bfd_vma hint_addr;
1172 bfd_vma time_stamp;
1173 bfd_vma forward_chain;
1174 bfd_vma dll_name;
1175 bfd_vma first_thunk;
1176 int idx = 0;
1177 bfd_size_type j;
1178 char *dll;
1179
1180 /* print (i + extra->DataDirectory[1].VirtualAddress) */
1181 fprintf (file, " %08lx\t", (unsigned long) (i + adj + dataoff));
1182
1183 if (i + 20 > datasize)
1184 {
1185 /* check stuff */
1186 ;
1187 }
1188
1189 hint_addr = bfd_get_32 (abfd, data + i + dataoff);
1190 time_stamp = bfd_get_32 (abfd, data + i + 4 + dataoff);
1191 forward_chain = bfd_get_32 (abfd, data + i + 8 + dataoff);
1192 dll_name = bfd_get_32 (abfd, data + i + 12 + dataoff);
1193 first_thunk = bfd_get_32 (abfd, data + i + 16 + dataoff);
1194
1195 fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
1196 (unsigned long) hint_addr,
1197 (unsigned long) time_stamp,
1198 (unsigned long) forward_chain,
1199 (unsigned long) dll_name,
1200 (unsigned long) first_thunk);
1201
1202 if (hint_addr == 0 && first_thunk == 0)
1203 break;
1204
1205 dll = (char *) data + dll_name - adj;
1206 fprintf(file, _("\n\tDLL Name: %s\n"), dll);
1207
1208 if (hint_addr != 0)
1209 {
1210 fprintf (file, _("\tvma: Hint/Ord Member-Name\n"));
1211
1212 idx = hint_addr - adj;
1213
1214 for (j = 0; j < datasize; j += 4)
1215 {
1216 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1217
1218 if (member == 0)
1219 break;
1220 if (member & 0x80000000)
1221 fprintf (file, "\t%04lx\t %4lu", member,
1222 member & 0x7fffffff);
1223 else
1224 {
1225 int ordinal;
1226 char *member_name;
1227
1228 ordinal = bfd_get_16 (abfd, data + member - adj);
1229 member_name = (char *) data + member - adj + 2;
1230 fprintf (file, "\t%04lx\t %4d %s",
1231 member, ordinal, member_name);
1232 }
1233
1234 /* If the time stamp is not zero, the import address
1235 table holds actual addresses. */
1236 if (time_stamp != 0
1237 && first_thunk != 0
1238 && first_thunk != hint_addr)
1239 fprintf (file, "\t%04lx",
1240 (long) bfd_get_32 (abfd, data + first_thunk - adj + j));
1241
1242 fprintf (file, "\n");
1243 }
1244 }
1245
1246 if (hint_addr != first_thunk && time_stamp == 0)
1247 {
1248 int differ = 0;
1249 int idx2;
1250
1251 idx2 = first_thunk - adj;
1252
1253 for (j = 0; j < datasize; j += 4)
1254 {
1255 int ordinal;
1256 char *member_name;
1257 bfd_vma hint_member = 0;
1258 bfd_vma iat_member;
1259
1260 if (hint_addr != 0)
1261 hint_member = bfd_get_32 (abfd, data + idx + j);
1262 iat_member = bfd_get_32 (abfd, data + idx2 + j);
1263
1264 if (hint_addr == 0 && iat_member == 0)
1265 break;
1266
1267 if (hint_addr == 0 || hint_member != iat_member)
1268 {
1269 if (differ == 0)
1270 {
1271 fprintf (file,
1272 _("\tThe Import Address Table (difference found)\n"));
1273 fprintf(file, _("\tvma: Hint/Ord Member-Name\n"));
1274 differ = 1;
1275 }
1276 if (iat_member == 0)
1277 {
1278 fprintf(file,
1279 _("\t>>> Ran out of IAT members!\n"));
1280 }
1281 else
1282 {
1283 ordinal = bfd_get_16 (abfd, data + iat_member - adj);
1284 member_name = (char *) data + iat_member - adj + 2;
1285 fprintf(file, "\t%04lx\t %4d %s\n",
1286 (unsigned long) iat_member,
1287 ordinal,
1288 member_name);
1289 }
1290 }
1291
1292 if (hint_addr != 0 && hint_member == 0)
1293 break;
1294 }
1295 if (differ == 0)
1296 {
1297 fprintf(file,
1298 _("\tThe Import Address Table is identical\n"));
1299 }
1300 }
1301
1302 fprintf(file, "\n");
1303
1304 }
1305
1306 free (data);
1307
1308 return true;
1309 }
1310
1311 static boolean
1312 pe_print_edata (abfd, vfile)
1313 bfd *abfd;
1314 PTR vfile;
1315 {
1316 FILE *file = (FILE *) vfile;
1317 bfd_byte *data;
1318 asection *section;
1319
1320 bfd_size_type datasize = 0;
1321 bfd_size_type dataoff;
1322 bfd_size_type i;
1323
1324 bfd_signed_vma adj;
1325 struct EDT_type
1326 {
1327 long export_flags; /* reserved - should be zero */
1328 long time_stamp;
1329 short major_ver;
1330 short minor_ver;
1331 bfd_vma name; /* rva - relative to image base */
1332 long base; /* ordinal base */
1333 unsigned long num_functions; /* Number in the export address table */
1334 unsigned long num_names; /* Number in the name pointer table */
1335 bfd_vma eat_addr; /* rva to the export address table */
1336 bfd_vma npt_addr; /* rva to the Export Name Pointer Table */
1337 bfd_vma ot_addr; /* rva to the Ordinal Table */
1338 } edt;
1339
1340 pe_data_type *pe = pe_data (abfd);
1341 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1342
1343 bfd_vma addr;
1344
1345 addr = extra->DataDirectory[0].VirtualAddress;
1346
1347 if (addr == 0 && extra->DataDirectory[0].Size == 0)
1348 {
1349 /* Maybe the extra header isn't there. Look for the section. */
1350 section = bfd_get_section_by_name (abfd, ".edata");
1351 if (section == NULL)
1352 return true;
1353
1354 addr = section->vma;
1355 datasize = bfd_section_size (abfd, section);
1356 if (datasize == 0)
1357 return true;
1358 }
1359 else
1360 {
1361 addr += extra->ImageBase;
1362 for (section = abfd->sections; section != NULL; section = section->next)
1363 {
1364 datasize = bfd_section_size (abfd, section);
1365 if (addr >= section->vma && addr < section->vma + datasize)
1366 break;
1367 }
1368
1369 if (section == NULL)
1370 {
1371 fprintf (file,
1372 _("\nThere is an export table, but the section containing it could not be found\n"));
1373 return true;
1374 }
1375 }
1376
1377 fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
1378 section->name, (unsigned long) addr);
1379
1380 dataoff = addr - section->vma;
1381 datasize -= dataoff;
1382
1383 data = (bfd_byte *) bfd_malloc (datasize);
1384 if (data == NULL)
1385 return false;
1386
1387 if (! bfd_get_section_contents (abfd, section, (PTR) data, dataoff,
1388 datasize))
1389 return false;
1390
1391 /* Go get Export Directory Table */
1392 edt.export_flags = bfd_get_32(abfd, data+0);
1393 edt.time_stamp = bfd_get_32(abfd, data+4);
1394 edt.major_ver = bfd_get_16(abfd, data+8);
1395 edt.minor_ver = bfd_get_16(abfd, data+10);
1396 edt.name = bfd_get_32(abfd, data+12);
1397 edt.base = bfd_get_32(abfd, data+16);
1398 edt.num_functions = bfd_get_32(abfd, data+20);
1399 edt.num_names = bfd_get_32(abfd, data+24);
1400 edt.eat_addr = bfd_get_32(abfd, data+28);
1401 edt.npt_addr = bfd_get_32(abfd, data+32);
1402 edt.ot_addr = bfd_get_32(abfd, data+36);
1403
1404 adj = section->vma - extra->ImageBase + dataoff;
1405
1406 /* Dump the EDT first first */
1407 fprintf(file,
1408 _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1409 section->name);
1410
1411 fprintf(file,
1412 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1413
1414 fprintf(file,
1415 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1416
1417 fprintf(file,
1418 _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1419
1420 fprintf (file,
1421 _("Name \t\t\t\t"));
1422 fprintf_vma (file, edt.name);
1423 fprintf (file,
1424 " %s\n", data + edt.name - adj);
1425
1426 fprintf(file,
1427 _("Ordinal Base \t\t\t%ld\n"), edt.base);
1428
1429 fprintf(file,
1430 _("Number in:\n"));
1431
1432 fprintf(file,
1433 _("\tExport Address Table \t\t%08lx\n"),
1434 edt.num_functions);
1435
1436 fprintf(file,
1437 _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
1438
1439 fprintf(file,
1440 _("Table Addresses\n"));
1441
1442 fprintf (file,
1443 _("\tExport Address Table \t\t"));
1444 fprintf_vma (file, edt.eat_addr);
1445 fprintf (file, "\n");
1446
1447 fprintf (file,
1448 _("\tName Pointer Table \t\t"));
1449 fprintf_vma (file, edt.npt_addr);
1450 fprintf (file, "\n");
1451
1452 fprintf (file,
1453 _("\tOrdinal Table \t\t\t"));
1454 fprintf_vma (file, edt.ot_addr);
1455 fprintf (file, "\n");
1456
1457
1458 /* The next table to find is the Export Address Table. It's basically
1459 a list of pointers that either locate a function in this dll, or
1460 forward the call to another dll. Something like:
1461 typedef union
1462 {
1463 long export_rva;
1464 long forwarder_rva;
1465 } export_address_table_entry;
1466 */
1467
1468 fprintf(file,
1469 _("\nExport Address Table -- Ordinal Base %ld\n"),
1470 edt.base);
1471
1472 for (i = 0; i < edt.num_functions; ++i)
1473 {
1474 bfd_vma eat_member = bfd_get_32 (abfd,
1475 data + edt.eat_addr + (i * 4) - adj);
1476 if (eat_member == 0)
1477 continue;
1478
1479 if (eat_member - adj <= datasize)
1480 {
1481 /* This rva is to a name (forwarding function) in our section. */
1482 /* Should locate a function descriptor */
1483 fprintf (file,
1484 "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1485 (long) i,
1486 (long) (i + edt.base),
1487 (unsigned long) eat_member,
1488 _("Forwarder RVA"),
1489 data + eat_member - adj);
1490 }
1491 else
1492 {
1493 /* Should locate a function descriptor in the reldata section */
1494 fprintf (file,
1495 "\t[%4ld] +base[%4ld] %04lx %s\n",
1496 (long) i,
1497 (long) (i + edt.base),
1498 (unsigned long) eat_member,
1499 _("Export RVA"));
1500 }
1501 }
1502
1503 /* The Export Name Pointer Table is paired with the Export Ordinal Table */
1504 /* Dump them in parallel for clarity */
1505 fprintf(file,
1506 _("\n[Ordinal/Name Pointer] Table\n"));
1507
1508 for (i = 0; i < edt.num_names; ++i)
1509 {
1510 bfd_vma name_ptr = bfd_get_32(abfd,
1511 data +
1512 edt.npt_addr
1513 + (i*4) - adj);
1514
1515 char *name = (char *) data + name_ptr - adj;
1516
1517 bfd_vma ord = bfd_get_16(abfd,
1518 data +
1519 edt.ot_addr
1520 + (i*2) - adj);
1521 fprintf(file,
1522 "\t[%4ld] %s\n", (long) ord, name);
1523
1524 }
1525
1526 free (data);
1527
1528 return true;
1529 }
1530
1531 /* This really is architecture dependent. On IA-64, a .pdata entry
1532 consists of three dwords containing relative virtual addresses that
1533 specify the start and end address of the code range the entry
1534 covers and the address of the corresponding unwind info data. */
1535 static boolean
1536 pe_print_pdata (abfd, vfile)
1537 bfd *abfd;
1538 PTR vfile;
1539 {
1540 #ifdef COFF_WITH_PEP64
1541 # define PDATA_ROW_SIZE (3*8)
1542 #else
1543 # define PDATA_ROW_SIZE (5*4)
1544 #endif
1545 FILE *file = (FILE *) vfile;
1546 bfd_byte *data = 0;
1547 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1548 bfd_size_type datasize = 0;
1549 bfd_size_type i;
1550 bfd_size_type start, stop;
1551 int onaline = PDATA_ROW_SIZE;
1552
1553 if (section == NULL
1554 || coff_section_data (abfd, section) == NULL
1555 || pei_section_data (abfd, section) == NULL)
1556 return true;
1557
1558 stop = pei_section_data (abfd, section)->virt_size;
1559 if ((stop % onaline) != 0)
1560 fprintf (file, _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1561 (long)stop, onaline);
1562
1563 fprintf (file,
1564 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1565 #ifdef COFF_WITH_PEP64
1566 fprintf(file,
1567 _(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
1568 #else
1569 fprintf (file,
1570 _(" vma:\t\tBegin End EH EH PrologEnd Exception\n"));
1571 fprintf (file,
1572 _(" \t\tAddress Address Handler Data Address Mask\n"));
1573 #endif
1574
1575 if (bfd_section_size (abfd, section) == 0)
1576 return true;
1577
1578 data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section));
1579 datasize = bfd_section_size (abfd, section);
1580 if (data == NULL && datasize != 0)
1581 return false;
1582
1583 bfd_get_section_contents (abfd,
1584 section,
1585 (PTR) data, 0,
1586 bfd_section_size (abfd, section));
1587
1588 start = 0;
1589
1590 for (i = start; i < stop; i += onaline)
1591 {
1592 bfd_vma begin_addr;
1593 bfd_vma end_addr;
1594 bfd_vma eh_handler;
1595 bfd_vma eh_data;
1596 bfd_vma prolog_end_addr;
1597 int em_data;
1598
1599 if (i + PDATA_ROW_SIZE > stop)
1600 break;
1601
1602 begin_addr = GET_PDATA_ENTRY(abfd, data+i);
1603 end_addr = GET_PDATA_ENTRY(abfd, data+i+4);
1604 eh_handler = GET_PDATA_ENTRY(abfd, data+i+8);
1605 eh_data = GET_PDATA_ENTRY(abfd, data+i+12);
1606 prolog_end_addr = GET_PDATA_ENTRY(abfd, data+i+16);
1607
1608 if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1609 && eh_data == 0 && prolog_end_addr == 0)
1610 {
1611 /* We are probably into the padding of the section now. */
1612 break;
1613 }
1614
1615 em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
1616 eh_handler &= ~ (bfd_vma) 0x3;
1617 prolog_end_addr &= ~ (bfd_vma) 0x3;
1618
1619 fputc (' ', file);
1620 fprintf_vma (file, i + section->vma); fputc ('\t', file);
1621 fprintf_vma (file, begin_addr); fputc (' ', file);
1622 fprintf_vma (file, end_addr); fputc (' ', file);
1623 fprintf_vma (file, eh_handler);
1624 #ifndef COFF_WITH_PEP64
1625 fputc (' ', file);
1626 fprintf_vma (file, eh_data); fputc (' ', file);
1627 fprintf_vma (file, prolog_end_addr);
1628 fprintf (file, " %x", em_data);
1629 #endif
1630
1631 #ifdef POWERPC_LE_PE
1632 if (eh_handler == 0 && eh_data != 0)
1633 {
1634 /* Special bits here, although the meaning may */
1635 /* be a little mysterious. The only one I know */
1636 /* for sure is 0x03. */
1637 /* Code Significance */
1638 /* 0x00 None */
1639 /* 0x01 Register Save Millicode */
1640 /* 0x02 Register Restore Millicode */
1641 /* 0x03 Glue Code Sequence */
1642 switch (eh_data)
1643 {
1644 case 0x01:
1645 fprintf(file, _(" Register save millicode"));
1646 break;
1647 case 0x02:
1648 fprintf(file, _(" Register restore millicode"));
1649 break;
1650 case 0x03:
1651 fprintf(file, _(" Glue code sequence"));
1652 break;
1653 default:
1654 break;
1655 }
1656 }
1657 #endif
1658 fprintf(file, "\n");
1659 }
1660
1661 free (data);
1662
1663 return true;
1664 }
1665
1666 #define IMAGE_REL_BASED_HIGHADJ 4
1667 static const char * const tbl[] =
1668 {
1669 "ABSOLUTE",
1670 "HIGH",
1671 "LOW",
1672 "HIGHLOW",
1673 "HIGHADJ",
1674 "MIPS_JMPADDR",
1675 "SECTION",
1676 "REL32",
1677 "RESERVED1",
1678 "MIPS_JMPADDR16",
1679 "DIR64",
1680 "HIGH3ADJ"
1681 "UNKNOWN", /* MUST be last */
1682 };
1683
1684 static boolean
1685 pe_print_reloc (abfd, vfile)
1686 bfd *abfd;
1687 PTR vfile;
1688 {
1689 FILE *file = (FILE *) vfile;
1690 bfd_byte *data = 0;
1691 asection *section = bfd_get_section_by_name (abfd, ".reloc");
1692 bfd_size_type datasize = 0;
1693 bfd_size_type i;
1694 bfd_size_type start, stop;
1695
1696 if (section == NULL)
1697 return true;
1698
1699 if (bfd_section_size (abfd, section) == 0)
1700 return true;
1701
1702 fprintf (file,
1703 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
1704
1705 data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section));
1706 datasize = bfd_section_size (abfd, section);
1707 if (data == NULL && datasize != 0)
1708 return false;
1709
1710 bfd_get_section_contents (abfd,
1711 section,
1712 (PTR) data, 0,
1713 bfd_section_size (abfd, section));
1714
1715 start = 0;
1716
1717 stop = bfd_section_size (abfd, section);
1718
1719 for (i = start; i < stop;)
1720 {
1721 int j;
1722 bfd_vma virtual_address;
1723 long number, size;
1724
1725 /* The .reloc section is a sequence of blocks, with a header consisting
1726 of two 32 bit quantities, followed by a number of 16 bit entries */
1727
1728 virtual_address = bfd_get_32(abfd, data+i);
1729 size = bfd_get_32(abfd, data+i+4);
1730 number = (size - 8) / 2;
1731
1732 if (size == 0)
1733 {
1734 break;
1735 }
1736
1737 fprintf (file,
1738 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
1739 (unsigned long) virtual_address, size, size, number);
1740
1741 for (j = 0; j < number; ++j)
1742 {
1743 unsigned short e = bfd_get_16 (abfd, data + i + 8 + j * 2);
1744 unsigned int t = (e & 0xF000) >> 12;
1745 int off = e & 0x0FFF;
1746
1747 if (t >= sizeof (tbl) / sizeof (tbl[0]))
1748 t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
1749
1750 fprintf (file,
1751 _("\treloc %4d offset %4x [%4lx] %s"),
1752 j, off, (long) (off + virtual_address), tbl[t]);
1753
1754 /* HIGHADJ takes an argument, - the next record *is* the
1755 low 16 bits of addend. */
1756 if (t == IMAGE_REL_BASED_HIGHADJ)
1757 {
1758 fprintf (file, " (%4x)",
1759 ((unsigned int)
1760 bfd_get_16 (abfd, data + i + 8 + j * 2 + 2)));
1761 j++;
1762 }
1763
1764 fprintf (file, "\n");
1765 }
1766 i += size;
1767 }
1768
1769 free (data);
1770
1771 return true;
1772 }
1773
1774 /* Print out the program headers. */
1775
1776 boolean
1777 _bfd_pe_print_private_bfd_data_common (abfd, vfile)
1778 bfd *abfd;
1779 PTR vfile;
1780 {
1781 FILE *file = (FILE *) vfile;
1782 int j;
1783 pe_data_type *pe = pe_data (abfd);
1784 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
1785 const char *subsystem_name = NULL;
1786
1787 /* The MS dumpbin program reportedly ands with 0xff0f before
1788 printing the characteristics field. Not sure why. No reason to
1789 emulate it here. */
1790 fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
1791 #undef PF
1792 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
1793 PF (F_RELFLG, "relocations stripped");
1794 PF (F_EXEC, "executable");
1795 PF (F_LNNO, "line numbers stripped");
1796 PF (F_LSYMS, "symbols stripped");
1797 PF (0x80, "little endian");
1798 PF (F_AR32WR, "32 bit words");
1799 PF (0x200, "debugging information removed");
1800 PF (0x1000, "system file");
1801 PF (F_DLL, "DLL");
1802 PF (0x8000, "big endian");
1803 #undef PF
1804
1805 /* ctime implies '\n'. */
1806 fprintf (file, "\nTime/Date\t\t%s", ctime (&pe->coff.timestamp));
1807 fprintf (file,"\nImageBase\t\t");
1808 fprintf_vma (file, i->ImageBase);
1809 fprintf (file,"\nSectionAlignment\t");
1810 fprintf_vma (file, i->SectionAlignment);
1811 fprintf (file,"\nFileAlignment\t\t");
1812 fprintf_vma (file, i->FileAlignment);
1813 fprintf (file,"\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
1814 fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
1815 fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion);
1816 fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion);
1817 fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
1818 fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
1819 fprintf (file,"Win32Version\t\t%08lx\n", i->Reserved1);
1820 fprintf (file,"SizeOfImage\t\t%08lx\n", i->SizeOfImage);
1821 fprintf (file,"SizeOfHeaders\t\t%08lx\n", i->SizeOfHeaders);
1822 fprintf (file,"CheckSum\t\t%08lx\n", i->CheckSum);
1823 switch (i->Subsystem)
1824 {
1825 case IMAGE_SUBSYSTEM_UNKNOWN:
1826 subsystem_name = "unspecified";
1827 break;
1828 case IMAGE_SUBSYSTEM_NATIVE:
1829 subsystem_name = "NT native";
1830 break;
1831 case IMAGE_SUBSYSTEM_WINDOWS_GUI:
1832 subsystem_name = "Windows GUI";
1833 break;
1834 case IMAGE_SUBSYSTEM_WINDOWS_CUI:
1835 subsystem_name = "Windows CUI";
1836 break;
1837 case IMAGE_SUBSYSTEM_POSIX_CUI:
1838 subsystem_name = "POSIX CUI";
1839 break;
1840 case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
1841 subsystem_name = "Wince CUI";
1842 break;
1843 case IMAGE_SUBSYSTEM_EFI_APPLICATION:
1844 subsystem_name = "EFI application";
1845 break;
1846 case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
1847 subsystem_name = "EFI boot service driver";
1848 break;
1849 case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
1850 subsystem_name = "EFI runtime driver";
1851 break;
1852 }
1853 fprintf (file,"Subsystem\t\t%08x", i->Subsystem);
1854 if (subsystem_name)
1855 fprintf (file, "\t(%s)", subsystem_name);
1856 fprintf (file,"\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
1857 fprintf (file,"SizeOfStackReserve\t");
1858 fprintf_vma (file, i->SizeOfStackReserve);
1859 fprintf (file,"\nSizeOfStackCommit\t");
1860 fprintf_vma (file, i->SizeOfStackCommit);
1861 fprintf (file,"\nSizeOfHeapReserve\t");
1862 fprintf_vma (file, i->SizeOfHeapReserve);
1863 fprintf (file,"\nSizeOfHeapCommit\t");
1864 fprintf_vma (file, i->SizeOfHeapCommit);
1865 fprintf (file,"\nLoaderFlags\t\t%08lx\n", i->LoaderFlags);
1866 fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes);
1867
1868 fprintf (file,"\nThe Data Directory\n");
1869 for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
1870 {
1871 fprintf (file, "Entry %1x ", j);
1872 fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
1873 fprintf (file, " %08lx ", i->DataDirectory[j].Size);
1874 fprintf (file, "%s\n", dir_names[j]);
1875 }
1876
1877 pe_print_idata (abfd, vfile);
1878 pe_print_edata (abfd, vfile);
1879 pe_print_pdata (abfd, vfile);
1880 pe_print_reloc (abfd, vfile);
1881
1882 return true;
1883 }
1884
1885 /* Copy any private info we understand from the input bfd
1886 to the output bfd. */
1887
1888 boolean
1889 _bfd_pe_bfd_copy_private_bfd_data_common (ibfd, obfd)
1890 bfd *ibfd, *obfd;
1891 {
1892 /* One day we may try to grok other private data. */
1893 if (ibfd->xvec->flavour != bfd_target_coff_flavour
1894 || obfd->xvec->flavour != bfd_target_coff_flavour)
1895 return true;
1896
1897 pe_data (obfd)->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1898 pe_data (obfd)->dll = pe_data (ibfd)->dll;
1899
1900 /* for strip: if we removed .reloc, we'll make a real mess of things
1901 if we don't remove this entry as well. */
1902 if (! pe_data (obfd)->has_reloc_section)
1903 {
1904 pe_data(obfd)->pe_opthdr.DataDirectory[5].VirtualAddress = 0;
1905 pe_data(obfd)->pe_opthdr.DataDirectory[5].Size = 0;
1906 }
1907 return true;
1908 }
1909
1910 /* Copy private section data. */
1911 boolean
1912 _bfd_pe_bfd_copy_private_section_data (ibfd, isec, obfd, osec)
1913 bfd *ibfd;
1914 asection *isec;
1915 bfd *obfd;
1916 asection *osec;
1917 {
1918 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
1919 || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
1920 return true;
1921
1922 if (coff_section_data (ibfd, isec) != NULL
1923 && pei_section_data (ibfd, isec) != NULL)
1924 {
1925 if (coff_section_data (obfd, osec) == NULL)
1926 {
1927 osec->used_by_bfd =
1928 (PTR) bfd_zalloc (obfd, sizeof (struct coff_section_tdata));
1929 if (osec->used_by_bfd == NULL)
1930 return false;
1931 }
1932 if (pei_section_data (obfd, osec) == NULL)
1933 {
1934 coff_section_data (obfd, osec)->tdata =
1935 (PTR) bfd_zalloc (obfd, sizeof (struct pei_section_tdata));
1936 if (coff_section_data (obfd, osec)->tdata == NULL)
1937 return false;
1938 }
1939 pei_section_data (obfd, osec)->virt_size =
1940 pei_section_data (ibfd, isec)->virt_size;
1941 pei_section_data (obfd, osec)->pe_flags =
1942 pei_section_data (ibfd, isec)->pe_flags;
1943 }
1944
1945 return true;
1946 }
1947
1948 void
1949 _bfd_pe_get_symbol_info (abfd, symbol, ret)
1950 bfd *abfd;
1951 asymbol *symbol;
1952 symbol_info *ret;
1953 {
1954 coff_get_symbol_info (abfd, symbol, ret);
1955
1956 if (pe_data (abfd) != NULL
1957 && ((symbol->flags & BSF_DEBUGGING) == 0
1958 || (symbol->flags & BSF_DEBUGGING_RELOC) != 0)
1959 && ! bfd_is_abs_section (symbol->section))
1960 ret->value += pe_data (abfd)->pe_opthdr.ImageBase;
1961 }
1962
1963 /* Handle the .idata section and other things that need symbol table
1964 access. */
1965
1966 boolean
1967 _bfd_pei_final_link_postscript (abfd, pfinfo)
1968 bfd *abfd;
1969 struct coff_final_link_info *pfinfo;
1970 {
1971 struct coff_link_hash_entry *h1;
1972 struct bfd_link_info *info = pfinfo->info;
1973
1974 /* There are a few fields that need to be filled in now while we
1975 have symbol table access.
1976
1977 The .idata subsections aren't directly available as sections, but
1978 they are in the symbol table, so get them from there. */
1979
1980 /* The import directory. This is the address of .idata$2, with size
1981 of .idata$2 + .idata$3. */
1982 h1 = coff_link_hash_lookup (coff_hash_table (info),
1983 ".idata$2", false, false, true);
1984 if (h1 != NULL)
1985 {
1986 pe_data(abfd)->pe_opthdr.DataDirectory[1].VirtualAddress =
1987 (h1->root.u.def.value
1988 + h1->root.u.def.section->output_section->vma
1989 + h1->root.u.def.section->output_offset);
1990 h1 = coff_link_hash_lookup (coff_hash_table (info),
1991 ".idata$4", false, false, true);
1992 pe_data (abfd)->pe_opthdr.DataDirectory[1].Size =
1993 ((h1->root.u.def.value
1994 + h1->root.u.def.section->output_section->vma
1995 + h1->root.u.def.section->output_offset)
1996 - pe_data(abfd)->pe_opthdr.DataDirectory[1].VirtualAddress);
1997
1998 /* The import address table. This is the size/address of
1999 .idata$5. */
2000 h1 = coff_link_hash_lookup (coff_hash_table (info),
2001 ".idata$5", false, false, true);
2002 pe_data (abfd)->pe_opthdr.DataDirectory[12].VirtualAddress =
2003 (h1->root.u.def.value
2004 + h1->root.u.def.section->output_section->vma
2005 + h1->root.u.def.section->output_offset);
2006 h1 = coff_link_hash_lookup (coff_hash_table (info),
2007 ".idata$6", false, false, true);
2008 pe_data (abfd)->pe_opthdr.DataDirectory[12].Size =
2009 ((h1->root.u.def.value
2010 + h1->root.u.def.section->output_section->vma
2011 + h1->root.u.def.section->output_offset)
2012 - pe_data(abfd)->pe_opthdr.DataDirectory[12].VirtualAddress);
2013 }
2014
2015 /* If we couldn't find idata$2, we either have an excessively
2016 trivial program or are in DEEP trouble; we have to assume trivial
2017 program.... */
2018 return true;
2019 }
This page took 0.073971 seconds and 4 git commands to generate.