Warn users about mismatched PID namespaces
[deliverable/binutils-gdb.git] / bfd / peXXigen.c
CommitLineData
277d1b5e 1/* Support for the generic parts of PE/PEI; the common executable parts.
4b95cf5c 2 Copyright (C) 1995-2014 Free Software Foundation, Inc.
277d1b5e
ILT
3 Written by Cygnus Solutions.
4
5e226794 5 This file is part of BFD, the Binary File Descriptor library.
277d1b5e 6
5e226794
NC
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
cd123cb7 9 the Free Software Foundation; either version 3 of the License, or
5e226794 10 (at your option) any later version.
277d1b5e 11
5e226794
NC
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.
277d1b5e 16
5e226794
NC
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
cd123cb7
NC
19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
21
277d1b5e 22
6fa957a9 23/* Most of this hacked by Steve Chamberlain <sac@cygnus.com>.
277d1b5e 24
6fa957a9 25 PE/PEI rearrangement (and code added): Donn Terry
ca09e32b 26 Softway Systems, Inc. */
277d1b5e
ILT
27
28/* Hey look, some documentation [and in a place you expect to find it]!
29
30 The main reference for the pei format is "Microsoft Portable Executable
31 and Common Object File Format Specification 4.1". Get it if you need to
32 do some serious hacking on this code.
33
34 Another reference:
35 "Peering Inside the PE: A Tour of the Win32 Portable Executable
36 File Format", MSJ 1994, Volume 9.
37
38 The *sole* difference between the pe format and the pei format is that the
39 latter has an MSDOS 2.0 .exe header on the front that prints the message
40 "This app must be run under Windows." (or some such).
41 (FIXME: Whether that statement is *really* true or not is unknown.
42 Are there more subtle differences between pe and pei formats?
43 For now assume there aren't. If you find one, then for God sakes
44 document it here!)
45
46 The Microsoft docs use the word "image" instead of "executable" because
47 the former can also refer to a DLL (shared library). Confusion can arise
48 because the `i' in `pei' also refers to "image". The `pe' format can
49 also create images (i.e. executables), it's just that to run on a win32
50 system you need to use the pei format.
51
52 FIXME: Please add more docs here so the next poor fool that has to hack
53 on this code has a chance of getting something accomplished without
ca09e32b 54 wasting too much time. */
277d1b5e 55
99ad8390
NC
56/* This expands into COFF_WITH_pe, COFF_WITH_pep, or COFF_WITH_pex64
57 depending on whether we're compiling for straight PE or PE+. */
cbff5e0d
DD
58#define COFF_WITH_XX
59
277d1b5e 60#include "sysdep.h"
3db64b00 61#include "bfd.h"
277d1b5e
ILT
62#include "libbfd.h"
63#include "coff/internal.h"
5fdcb63c 64#include "bfdver.h"
5879bb8f
NC
65#ifdef HAVE_WCHAR_H
66#include <wchar.h>
67#endif
277d1b5e
ILT
68
69/* NOTE: it's strange to be including an architecture specific header
70 in what's supposed to be general (to PE/PEI) code. However, that's
71 where the definitions are, and they don't vary per architecture
72 within PE/PEI, so we get them from there. FIXME: The lack of
73 variance is an assumption which may prove to be incorrect if new
74 PE/PEI targets are created. */
99ad8390
NC
75#if defined COFF_WITH_pex64
76# include "coff/x86_64.h"
77#elif defined COFF_WITH_pep
cbff5e0d
DD
78# include "coff/ia64.h"
79#else
80# include "coff/i386.h"
81#endif
277d1b5e
ILT
82
83#include "coff/pe.h"
84#include "libcoff.h"
85#include "libpei.h"
5879bb8f 86#include "safe-ctype.h"
277d1b5e 87
99ad8390 88#if defined COFF_WITH_pep || defined COFF_WITH_pex64
cbff5e0d
DD
89# undef AOUTSZ
90# define AOUTSZ PEPAOUTSZ
91# define PEAOUTHDR PEPAOUTHDR
92#endif
93
5879bb8f
NC
94#define HighBitSet(val) ((val) & 0x80000000)
95#define SetHighBit(val) ((val) | 0x80000000)
96#define WithoutHighBit(val) ((val) & 0x7fffffff)
97
277d1b5e
ILT
98/* FIXME: This file has various tests of POWERPC_LE_PE. Those tests
99 worked when the code was in peicode.h, but no longer work now that
100 the code is in peigen.c. PowerPC NT is said to be dead. If
101 anybody wants to revive the code, you will have to figure out how
102 to handle those issues. */
1725a96e 103\f
277d1b5e 104void
7920ce38 105_bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
277d1b5e 106{
6fa957a9
KH
107 SYMENT *ext = (SYMENT *) ext1;
108 struct internal_syment *in = (struct internal_syment *) in1;
277d1b5e 109
6fa957a9
KH
110 if (ext->e.e_name[0] == 0)
111 {
112 in->_n._n_n._n_zeroes = 0;
dc810e39 113 in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
6fa957a9
KH
114 }
115 else
1725a96e 116 memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
277d1b5e 117
dc810e39
AM
118 in->n_value = H_GET_32 (abfd, ext->e_value);
119 in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
1725a96e 120
6fa957a9 121 if (sizeof (ext->e_type) == 2)
dc810e39 122 in->n_type = H_GET_16 (abfd, ext->e_type);
6fa957a9 123 else
dc810e39 124 in->n_type = H_GET_32 (abfd, ext->e_type);
1725a96e 125
dc810e39
AM
126 in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
127 in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
277d1b5e
ILT
128
129#ifndef STRICT_PE_FORMAT
6fa957a9 130 /* This is for Gnu-created DLLs. */
277d1b5e
ILT
131
132 /* The section symbols for the .idata$ sections have class 0x68
133 (C_SECTION), which MS documentation indicates is a section
134 symbol. Unfortunately, the value field in the symbol is simply a
135 copy of the .idata section's flags rather than something useful.
136 When these symbols are encountered, change the value to 0 so that
137 they will be handled somewhat correctly in the bfd code. */
138 if (in->n_sclass == C_SECTION)
139 {
383c383f 140 char namebuf[SYMNMLEN + 1];
ba775898 141 const char *name = NULL;
383c383f 142
277d1b5e
ILT
143 in->n_value = 0x0;
144
277d1b5e
ILT
145 /* Create synthetic empty sections as needed. DJ */
146 if (in->n_scnum == 0)
147 {
148 asection *sec;
1725a96e 149
383c383f
AM
150 name = _bfd_coff_internal_syment_name (abfd, in, namebuf);
151 if (name == NULL)
152 /* FIXME: Return error. */
153 abort ();
154 sec = bfd_get_section_by_name (abfd, name);
155 if (sec != NULL)
156 in->n_scnum = sec->target_index;
277d1b5e 157 }
1725a96e 158
277d1b5e
ILT
159 if (in->n_scnum == 0)
160 {
161 int unused_section_number = 0;
162 asection *sec;
117ed4f8 163 flagword flags;
1725a96e 164
6fa957a9 165 for (sec = abfd->sections; sec; sec = sec->next)
277d1b5e 166 if (unused_section_number <= sec->target_index)
6fa957a9 167 unused_section_number = sec->target_index + 1;
277d1b5e 168
383c383f
AM
169 if (name == namebuf)
170 {
a50b1753 171 name = (const char *) bfd_alloc (abfd, strlen (namebuf) + 1);
383c383f
AM
172 if (name == NULL)
173 /* FIXME: Return error. */
174 abort ();
175 strcpy ((char *) name, namebuf);
176 }
117ed4f8
AM
177 flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD;
178 sec = bfd_make_section_anyway_with_flags (abfd, name, flags);
383c383f
AM
179 if (sec == NULL)
180 /* FIXME: Return error. */
181 abort ();
277d1b5e
ILT
182
183 sec->vma = 0;
184 sec->lma = 0;
eea6121a 185 sec->size = 0;
277d1b5e
ILT
186 sec->filepos = 0;
187 sec->rel_filepos = 0;
188 sec->reloc_count = 0;
189 sec->line_filepos = 0;
190 sec->lineno_count = 0;
191 sec->userdata = NULL;
7920ce38 192 sec->next = NULL;
277d1b5e 193 sec->alignment_power = 2;
277d1b5e
ILT
194
195 sec->target_index = unused_section_number;
196
197 in->n_scnum = unused_section_number;
198 }
199 in->n_sclass = C_STAT;
277d1b5e
ILT
200 }
201#endif
202
203#ifdef coff_swap_sym_in_hook
204 /* This won't work in peigen.c, but since it's for PPC PE, it's not
9602af51 205 worth fixing. */
6fa957a9 206 coff_swap_sym_in_hook (abfd, ext1, in1);
277d1b5e
ILT
207#endif
208}
209
32ae0d80
NC
210static bfd_boolean
211abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data)
212{
213 bfd_vma abs_val = * (bfd_vma *) data;
214
3714081c 215 return (sec->vma <= abs_val) && ((sec->vma + (1ULL << 32)) > abs_val);
32ae0d80
NC
216}
217
277d1b5e 218unsigned int
7920ce38 219_bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp)
277d1b5e 220{
6fa957a9
KH
221 struct internal_syment *in = (struct internal_syment *) inp;
222 SYMENT *ext = (SYMENT *) extp;
1725a96e 223
6fa957a9
KH
224 if (in->_n._n_name[0] == 0)
225 {
dc810e39
AM
226 H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
227 H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
6fa957a9
KH
228 }
229 else
1725a96e 230 memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
277d1b5e 231
32ae0d80
NC
232 /* The PE32 and PE32+ formats only use 4 bytes to hold the value of a
233 symbol. This is a problem on 64-bit targets where we can generate
234 absolute symbols with values >= 1^32. We try to work around this
235 problem by finding a section whose base address is sufficient to
236 reduce the absolute value to < 1^32, and then transforming the
237 symbol into a section relative symbol. This of course is a hack. */
238 if (sizeof (in->n_value) > 4
40af4a36
NC
239 /* The strange computation of the shift amount is here in order to
240 avoid a compile time warning about the comparison always being
241 false. It does not matter if this test fails to work as expected
242 as the worst that can happen is that some absolute symbols are
243 needlessly converted into section relative symbols. */
244 && in->n_value > ((1ULL << (sizeof (in->n_value) > 4 ? 32 : 31)) - 1)
32ae0d80
NC
245 && in->n_scnum == -1)
246 {
247 asection * sec;
248
249 sec = bfd_sections_find_if (abfd, abs_finder, & in->n_value);
250 if (sec)
251 {
252 in->n_value -= sec->vma;
253 in->n_scnum = sec->target_index;
254 }
255 /* else: FIXME: The value is outside the range of any section. This
88667baf 256 happens for __image_base__ and __ImageBase and maybe some other
32ae0d80
NC
257 symbols as well. We should find a way to handle these values. */
258 }
259
dc810e39
AM
260 H_PUT_32 (abfd, in->n_value, ext->e_value);
261 H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
1725a96e 262
9602af51 263 if (sizeof (ext->e_type) == 2)
dc810e39 264 H_PUT_16 (abfd, in->n_type, ext->e_type);
277d1b5e 265 else
dc810e39 266 H_PUT_32 (abfd, in->n_type, ext->e_type);
1725a96e 267
dc810e39
AM
268 H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
269 H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
277d1b5e
ILT
270
271 return SYMESZ;
272}
273
274void
7920ce38
NC
275_bfd_XXi_swap_aux_in (bfd * abfd,
276 void * ext1,
277 int type,
96d56e9f 278 int in_class,
7920ce38
NC
279 int indx ATTRIBUTE_UNUSED,
280 int numaux ATTRIBUTE_UNUSED,
281 void * in1)
277d1b5e 282{
6fa957a9
KH
283 AUXENT *ext = (AUXENT *) ext1;
284 union internal_auxent *in = (union internal_auxent *) in1;
285
96d56e9f 286 switch (in_class)
6fa957a9
KH
287 {
288 case C_FILE:
289 if (ext->x_file.x_fname[0] == 0)
290 {
291 in->x_file.x_n.x_zeroes = 0;
dc810e39 292 in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
6fa957a9
KH
293 }
294 else
1725a96e 295 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
277d1b5e 296 return;
6fa957a9
KH
297
298 case C_STAT:
299 case C_LEAFSTAT:
300 case C_HIDDEN:
301 if (type == T_NULL)
302 {
303 in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
304 in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
305 in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
dc810e39
AM
306 in->x_scn.x_checksum = H_GET_32 (abfd, ext->x_scn.x_checksum);
307 in->x_scn.x_associated = H_GET_16 (abfd, ext->x_scn.x_associated);
308 in->x_scn.x_comdat = H_GET_8 (abfd, ext->x_scn.x_comdat);
6fa957a9
KH
309 return;
310 }
311 break;
277d1b5e 312 }
277d1b5e 313
dc810e39
AM
314 in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
315 in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
277d1b5e 316
96d56e9f
NC
317 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
318 || ISTAG (in_class))
277d1b5e
ILT
319 {
320 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
321 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
322 }
323 else
324 {
325 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
dc810e39 326 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
277d1b5e 327 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
dc810e39 328 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
277d1b5e 329 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
dc810e39 330 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
277d1b5e 331 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
dc810e39 332 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
277d1b5e
ILT
333 }
334
6fa957a9
KH
335 if (ISFCN (type))
336 {
dc810e39 337 in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
6fa957a9
KH
338 }
339 else
340 {
341 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
342 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
343 }
277d1b5e
ILT
344}
345
346unsigned int
7920ce38
NC
347_bfd_XXi_swap_aux_out (bfd * abfd,
348 void * inp,
349 int type,
96d56e9f 350 int in_class,
7920ce38
NC
351 int indx ATTRIBUTE_UNUSED,
352 int numaux ATTRIBUTE_UNUSED,
353 void * extp)
277d1b5e 354{
6fa957a9
KH
355 union internal_auxent *in = (union internal_auxent *) inp;
356 AUXENT *ext = (AUXENT *) extp;
357
7920ce38
NC
358 memset (ext, 0, AUXESZ);
359
96d56e9f 360 switch (in_class)
6fa957a9
KH
361 {
362 case C_FILE:
363 if (in->x_file.x_fname[0] == 0)
364 {
dc810e39
AM
365 H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
366 H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
6fa957a9
KH
367 }
368 else
1725a96e
NC
369 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
370
277d1b5e 371 return AUXESZ;
6fa957a9
KH
372
373 case C_STAT:
374 case C_LEAFSTAT:
375 case C_HIDDEN:
376 if (type == T_NULL)
377 {
378 PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
379 PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
380 PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
dc810e39
AM
381 H_PUT_32 (abfd, in->x_scn.x_checksum, ext->x_scn.x_checksum);
382 H_PUT_16 (abfd, in->x_scn.x_associated, ext->x_scn.x_associated);
383 H_PUT_8 (abfd, in->x_scn.x_comdat, ext->x_scn.x_comdat);
6fa957a9
KH
384 return AUXESZ;
385 }
386 break;
277d1b5e 387 }
277d1b5e 388
dc810e39
AM
389 H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
390 H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
277d1b5e 391
96d56e9f
NC
392 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
393 || ISTAG (in_class))
277d1b5e 394 {
6fa957a9
KH
395 PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
396 PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
277d1b5e
ILT
397 }
398 else
399 {
dc810e39
AM
400 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
401 ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
402 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
403 ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
404 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
405 ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
406 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
407 ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
277d1b5e
ILT
408 }
409
410 if (ISFCN (type))
dc810e39 411 H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
277d1b5e
ILT
412 else
413 {
414 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
415 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
416 }
417
418 return AUXESZ;
419}
420
421void
7920ce38 422_bfd_XXi_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
277d1b5e 423{
6fa957a9
KH
424 LINENO *ext = (LINENO *) ext1;
425 struct internal_lineno *in = (struct internal_lineno *) in1;
277d1b5e 426
dc810e39 427 in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
6fa957a9 428 in->l_lnno = GET_LINENO_LNNO (abfd, ext);
277d1b5e
ILT
429}
430
431unsigned int
7920ce38 432_bfd_XXi_swap_lineno_out (bfd * abfd, void * inp, void * outp)
277d1b5e 433{
6fa957a9
KH
434 struct internal_lineno *in = (struct internal_lineno *) inp;
435 struct external_lineno *ext = (struct external_lineno *) outp;
dc810e39 436 H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
277d1b5e
ILT
437
438 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
439 return LINESZ;
440}
441
442void
7920ce38
NC
443_bfd_XXi_swap_aouthdr_in (bfd * abfd,
444 void * aouthdr_ext1,
445 void * aouthdr_int1)
277d1b5e 446{
d13c9dc6 447 PEAOUTHDR * src = (PEAOUTHDR *) aouthdr_ext1;
7920ce38 448 AOUTHDR * aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
d13c9dc6
L
449 struct internal_aouthdr *aouthdr_int
450 = (struct internal_aouthdr *) aouthdr_int1;
451 struct internal_extra_pe_aouthdr *a = &aouthdr_int->pe;
277d1b5e 452
dc810e39
AM
453 aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
454 aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
455 aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
456 aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
457 aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
458 aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
277d1b5e 459 aouthdr_int->text_start =
dc810e39 460 GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
36e9d67b 461
99ad8390 462#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
7920ce38 463 /* PE32+ does not have data_start member! */
277d1b5e 464 aouthdr_int->data_start =
dc810e39 465 GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
d13c9dc6 466 a->BaseOfData = aouthdr_int->data_start;
fac41780 467#endif
277d1b5e 468
d13c9dc6
L
469 a->Magic = aouthdr_int->magic;
470 a->MajorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp);
471 a->MinorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp + 1);
472 a->SizeOfCode = aouthdr_int->tsize ;
473 a->SizeOfInitializedData = aouthdr_int->dsize ;
474 a->SizeOfUninitializedData = aouthdr_int->bsize ;
475 a->AddressOfEntryPoint = aouthdr_int->entry;
476 a->BaseOfCode = aouthdr_int->text_start;
dc810e39
AM
477 a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, src->ImageBase);
478 a->SectionAlignment = H_GET_32 (abfd, src->SectionAlignment);
479 a->FileAlignment = H_GET_32 (abfd, src->FileAlignment);
277d1b5e 480 a->MajorOperatingSystemVersion =
dc810e39 481 H_GET_16 (abfd, src->MajorOperatingSystemVersion);
277d1b5e 482 a->MinorOperatingSystemVersion =
dc810e39
AM
483 H_GET_16 (abfd, src->MinorOperatingSystemVersion);
484 a->MajorImageVersion = H_GET_16 (abfd, src->MajorImageVersion);
485 a->MinorImageVersion = H_GET_16 (abfd, src->MinorImageVersion);
486 a->MajorSubsystemVersion = H_GET_16 (abfd, src->MajorSubsystemVersion);
487 a->MinorSubsystemVersion = H_GET_16 (abfd, src->MinorSubsystemVersion);
488 a->Reserved1 = H_GET_32 (abfd, src->Reserved1);
489 a->SizeOfImage = H_GET_32 (abfd, src->SizeOfImage);
490 a->SizeOfHeaders = H_GET_32 (abfd, src->SizeOfHeaders);
491 a->CheckSum = H_GET_32 (abfd, src->CheckSum);
492 a->Subsystem = H_GET_16 (abfd, src->Subsystem);
493 a->DllCharacteristics = H_GET_16 (abfd, src->DllCharacteristics);
494 a->SizeOfStackReserve =
495 GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, src->SizeOfStackReserve);
496 a->SizeOfStackCommit =
497 GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, src->SizeOfStackCommit);
498 a->SizeOfHeapReserve =
499 GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, src->SizeOfHeapReserve);
500 a->SizeOfHeapCommit =
501 GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, src->SizeOfHeapCommit);
502 a->LoaderFlags = H_GET_32 (abfd, src->LoaderFlags);
503 a->NumberOfRvaAndSizes = H_GET_32 (abfd, src->NumberOfRvaAndSizes);
277d1b5e
ILT
504
505 {
506 int idx;
1725a96e 507
7e1e1988 508 /* PR 17512: Corrupt PE binaries can cause seg-faults. */
36e9d67b 509 if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
7e1e1988
NC
510 {
511 (*_bfd_error_handler)
512 (_("%B: aout header specifies an invalid number of data-directory entries: %d"),
513 abfd, a->NumberOfRvaAndSizes);
514 /* Paranoia: If the number is corrupt, then assume that the
515 actual entries themselves might be corrupt as well. */
516 a->NumberOfRvaAndSizes = 0;
517 }
518
ce63b7b3 519 for (idx = 0; idx < a->NumberOfRvaAndSizes; idx++)
277d1b5e 520 {
6fa957a9
KH
521 /* If data directory is empty, rva also should be 0. */
522 int size =
dc810e39 523 H_GET_32 (abfd, src->DataDirectory[idx][1]);
99ad8390 524
3028b4c0
DD
525 a->DataDirectory[idx].Size = size;
526
527 if (size)
1725a96e 528 a->DataDirectory[idx].VirtualAddress =
dc810e39 529 H_GET_32 (abfd, src->DataDirectory[idx][0]);
6fa957a9 530 else
3028b4c0 531 a->DataDirectory[idx].VirtualAddress = 0;
277d1b5e 532 }
36e9d67b
NC
533
534 while (idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
535 {
536 a->DataDirectory[idx].Size = 0;
537 a->DataDirectory[idx].VirtualAddress = 0;
538 idx ++;
539 }
277d1b5e
ILT
540 }
541
542 if (aouthdr_int->entry)
543 {
544 aouthdr_int->entry += a->ImageBase;
99ad8390 545#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
277d1b5e 546 aouthdr_int->entry &= 0xffffffff;
fac41780 547#endif
277d1b5e 548 }
1725a96e 549
9602af51 550 if (aouthdr_int->tsize)
277d1b5e
ILT
551 {
552 aouthdr_int->text_start += a->ImageBase;
99ad8390 553#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
277d1b5e 554 aouthdr_int->text_start &= 0xffffffff;
fac41780 555#endif
277d1b5e 556 }
1725a96e 557
99ad8390 558#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
7920ce38 559 /* PE32+ does not have data_start member! */
9602af51 560 if (aouthdr_int->dsize)
277d1b5e
ILT
561 {
562 aouthdr_int->data_start += a->ImageBase;
563 aouthdr_int->data_start &= 0xffffffff;
564 }
fac41780 565#endif
277d1b5e
ILT
566
567#ifdef POWERPC_LE_PE
568 /* These three fields are normally set up by ppc_relocate_section.
569 In the case of reading a file in, we can pick them up from the
570 DataDirectory. */
6c73cbb1
NC
571 first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
572 thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
573 import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
277d1b5e 574#endif
277d1b5e
ILT
575}
576
5933bdc9
ILT
577/* A support function for below. */
578
579static void
7920ce38
NC
580add_data_entry (bfd * abfd,
581 struct internal_extra_pe_aouthdr *aout,
582 int idx,
583 char *name,
584 bfd_vma base)
277d1b5e
ILT
585{
586 asection *sec = bfd_get_section_by_name (abfd, name);
587
1725a96e 588 /* Add import directory information if it exists. */
277d1b5e
ILT
589 if ((sec != NULL)
590 && (coff_section_data (abfd, sec) != NULL)
591 && (pei_section_data (abfd, sec) != NULL))
592 {
1725a96e 593 /* If data directory is empty, rva also should be 0. */
3028b4c0
DD
594 int size = pei_section_data (abfd, sec)->virt_size;
595 aout->DataDirectory[idx].Size = size;
596
597 if (size)
6fa957a9
KH
598 {
599 aout->DataDirectory[idx].VirtualAddress =
600 (sec->vma - base) & 0xffffffff;
601 sec->flags |= SEC_DATA;
602 }
277d1b5e
ILT
603 }
604}
605
606unsigned int
7920ce38 607_bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
277d1b5e 608{
6fa957a9 609 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
cbff5e0d
DD
610 pe_data_type *pe = pe_data (abfd);
611 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
6fa957a9 612 PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
fac41780 613 bfd_vma sa, fa, ib;
ca6dee30 614 IMAGE_DATA_DIRECTORY idata2, idata5, tls;
4e1fc599 615
fac41780
JW
616 sa = extra->SectionAlignment;
617 fa = extra->FileAlignment;
618 ib = extra->ImageBase;
277d1b5e 619
6c73cbb1
NC
620 idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
621 idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
622 tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
4e1fc599 623
9602af51 624 if (aouthdr_in->tsize)
277d1b5e
ILT
625 {
626 aouthdr_in->text_start -= ib;
99ad8390 627#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
277d1b5e 628 aouthdr_in->text_start &= 0xffffffff;
cbff5e0d 629#endif
277d1b5e 630 }
1725a96e 631
9602af51 632 if (aouthdr_in->dsize)
277d1b5e
ILT
633 {
634 aouthdr_in->data_start -= ib;
99ad8390 635#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
277d1b5e 636 aouthdr_in->data_start &= 0xffffffff;
cbff5e0d 637#endif
277d1b5e 638 }
1725a96e 639
9602af51 640 if (aouthdr_in->entry)
277d1b5e
ILT
641 {
642 aouthdr_in->entry -= ib;
99ad8390 643#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
277d1b5e 644 aouthdr_in->entry &= 0xffffffff;
cbff5e0d 645#endif
277d1b5e
ILT
646 }
647
6fa957a9
KH
648#define FA(x) (((x) + fa -1 ) & (- fa))
649#define SA(x) (((x) + sa -1 ) & (- sa))
277d1b5e 650
6fa957a9 651 /* We like to have the sizes aligned. */
277d1b5e
ILT
652 aouthdr_in->bsize = FA (aouthdr_in->bsize);
653
277d1b5e
ILT
654 extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
655
8181c403 656 add_data_entry (abfd, extra, 0, ".edata", ib);
9602af51 657 add_data_entry (abfd, extra, 2, ".rsrc", ib);
8181c403 658 add_data_entry (abfd, extra, 3, ".pdata", ib);
2fbadf2c 659
c25cfdf8
NC
660 /* In theory we do not need to call add_data_entry for .idata$2 or
661 .idata$5. It will be done in bfd_coff_final_link where all the
662 required information is available. If however, we are not going
663 to perform a final link, eg because we have been invoked by objcopy
664 or strip, then we need to make sure that these Data Directory
665 entries are initialised properly.
666
667 So - we copy the input values into the output values, and then, if
668 a final link is going to be performed, it can overwrite them. */
6c73cbb1
NC
669 extra->DataDirectory[PE_IMPORT_TABLE] = idata2;
670 extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5;
671 extra->DataDirectory[PE_TLS_TABLE] = tls;
c25cfdf8 672
6c73cbb1 673 if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0)
c25cfdf8 674 /* Until other .idata fixes are made (pending patch), the entry for
7dee875e 675 .idata is needed for backwards compatibility. FIXME. */
c25cfdf8 676 add_data_entry (abfd, extra, 1, ".idata", ib);
4e1fc599 677
2fbadf2c
ILT
678 /* For some reason, the virtual size (which is what's set by
679 add_data_entry) for .reloc is not the same as the size recorded
680 in this slot by MSVC; it doesn't seem to cause problems (so far),
681 but since it's the best we've got, use it. It does do the right
682 thing for .pdata. */
cbff5e0d 683 if (pe->has_reloc_section)
8181c403 684 add_data_entry (abfd, extra, 5, ".reloc", ib);
277d1b5e
ILT
685
686 {
687 asection *sec;
d48bdb99 688 bfd_vma hsize = 0;
6fa957a9 689 bfd_vma dsize = 0;
d48bdb99 690 bfd_vma isize = 0;
6fa957a9 691 bfd_vma tsize = 0;
277d1b5e
ILT
692
693 for (sec = abfd->sections; sec; sec = sec->next)
694 {
7920ce38 695 int rounded = FA (sec->size);
277d1b5e 696
d48bdb99
AM
697 /* The first non-zero section filepos is the header size.
698 Sections without contents will have a filepos of 0. */
699 if (hsize == 0)
700 hsize = sec->filepos;
277d1b5e
ILT
701 if (sec->flags & SEC_DATA)
702 dsize += rounded;
703 if (sec->flags & SEC_CODE)
704 tsize += rounded;
5933bdc9
ILT
705 /* The image size is the total VIRTUAL size (which is what is
706 in the virt_size field). Files have been seen (from MSVC
707 5.0 link.exe) where the file size of the .data segment is
708 quite small compared to the virtual size. Without this
50572669
L
709 fix, strip munges the file.
710
711 FIXME: We need to handle holes between sections, which may
712 happpen when we covert from another format. We just use
713 the virtual address and virtual size of the last section
714 for the image size. */
98a96df7
CF
715 if (coff_section_data (abfd, sec) != NULL
716 && pei_section_data (abfd, sec) != NULL)
50572669
L
717 isize = (sec->vma - extra->ImageBase
718 + SA (FA (pei_section_data (abfd, sec)->virt_size)));
277d1b5e
ILT
719 }
720
721 aouthdr_in->dsize = dsize;
722 aouthdr_in->tsize = tsize;
d48bdb99 723 extra->SizeOfHeaders = hsize;
50572669 724 extra->SizeOfImage = isize;
277d1b5e
ILT
725 }
726
dc810e39 727 H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->standard.magic);
277d1b5e 728
5fdcb63c
KT
729/* e.g. 219510000 is linker version 2.19 */
730#define LINKER_VERSION ((short) (BFD_VERSION / 1000000))
5933bdc9
ILT
731
732 /* This piece of magic sets the "linker version" field to
733 LINKER_VERSION. */
dc810e39
AM
734 H_PUT_16 (abfd, (LINKER_VERSION / 100 + (LINKER_VERSION % 100) * 256),
735 aouthdr_out->standard.vstamp);
736
737 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->standard.tsize);
738 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->standard.dsize);
739 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->standard.bsize);
740 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->standard.entry);
277d1b5e 741 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
dc810e39 742 aouthdr_out->standard.text_start);
277d1b5e 743
99ad8390 744#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
c25cfdf8 745 /* PE32+ does not have data_start member! */
277d1b5e 746 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
dc810e39 747 aouthdr_out->standard.data_start);
fac41780 748#endif
277d1b5e 749
dc810e39
AM
750 PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase, aouthdr_out->ImageBase);
751 H_PUT_32 (abfd, extra->SectionAlignment, aouthdr_out->SectionAlignment);
752 H_PUT_32 (abfd, extra->FileAlignment, aouthdr_out->FileAlignment);
753 H_PUT_16 (abfd, extra->MajorOperatingSystemVersion,
754 aouthdr_out->MajorOperatingSystemVersion);
755 H_PUT_16 (abfd, extra->MinorOperatingSystemVersion,
756 aouthdr_out->MinorOperatingSystemVersion);
757 H_PUT_16 (abfd, extra->MajorImageVersion, aouthdr_out->MajorImageVersion);
758 H_PUT_16 (abfd, extra->MinorImageVersion, aouthdr_out->MinorImageVersion);
759 H_PUT_16 (abfd, extra->MajorSubsystemVersion,
760 aouthdr_out->MajorSubsystemVersion);
761 H_PUT_16 (abfd, extra->MinorSubsystemVersion,
762 aouthdr_out->MinorSubsystemVersion);
763 H_PUT_32 (abfd, extra->Reserved1, aouthdr_out->Reserved1);
764 H_PUT_32 (abfd, extra->SizeOfImage, aouthdr_out->SizeOfImage);
765 H_PUT_32 (abfd, extra->SizeOfHeaders, aouthdr_out->SizeOfHeaders);
766 H_PUT_32 (abfd, extra->CheckSum, aouthdr_out->CheckSum);
767 H_PUT_16 (abfd, extra->Subsystem, aouthdr_out->Subsystem);
768 H_PUT_16 (abfd, extra->DllCharacteristics, aouthdr_out->DllCharacteristics);
fac41780 769 PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
dc810e39 770 aouthdr_out->SizeOfStackReserve);
fac41780 771 PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
dc810e39 772 aouthdr_out->SizeOfStackCommit);
fac41780 773 PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
dc810e39 774 aouthdr_out->SizeOfHeapReserve);
fac41780 775 PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
dc810e39
AM
776 aouthdr_out->SizeOfHeapCommit);
777 H_PUT_32 (abfd, extra->LoaderFlags, aouthdr_out->LoaderFlags);
778 H_PUT_32 (abfd, extra->NumberOfRvaAndSizes,
779 aouthdr_out->NumberOfRvaAndSizes);
277d1b5e
ILT
780 {
781 int idx;
1725a96e 782
36e9d67b 783 for (idx = 0; idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; idx++)
277d1b5e 784 {
dc810e39
AM
785 H_PUT_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
786 aouthdr_out->DataDirectory[idx][0]);
787 H_PUT_32 (abfd, extra->DataDirectory[idx].Size,
788 aouthdr_out->DataDirectory[idx][1]);
277d1b5e
ILT
789 }
790 }
791
792 return AOUTSZ;
793}
794
795unsigned int
7920ce38 796_bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
277d1b5e
ILT
797{
798 int idx;
6fa957a9
KH
799 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
800 struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *) out;
277d1b5e 801
441f34fa
L
802 if (pe_data (abfd)->has_reloc_section
803 || pe_data (abfd)->dont_strip_reloc)
277d1b5e
ILT
804 filehdr_in->f_flags &= ~F_RELFLG;
805
806 if (pe_data (abfd)->dll)
807 filehdr_in->f_flags |= F_DLL;
808
809 filehdr_in->pe.e_magic = DOSMAGIC;
810 filehdr_in->pe.e_cblp = 0x90;
811 filehdr_in->pe.e_cp = 0x3;
812 filehdr_in->pe.e_crlc = 0x0;
813 filehdr_in->pe.e_cparhdr = 0x4;
814 filehdr_in->pe.e_minalloc = 0x0;
815 filehdr_in->pe.e_maxalloc = 0xffff;
816 filehdr_in->pe.e_ss = 0x0;
817 filehdr_in->pe.e_sp = 0xb8;
818 filehdr_in->pe.e_csum = 0x0;
819 filehdr_in->pe.e_ip = 0x0;
820 filehdr_in->pe.e_cs = 0x0;
821 filehdr_in->pe.e_lfarlc = 0x40;
822 filehdr_in->pe.e_ovno = 0x0;
823
6fa957a9 824 for (idx = 0; idx < 4; idx++)
277d1b5e
ILT
825 filehdr_in->pe.e_res[idx] = 0x0;
826
827 filehdr_in->pe.e_oemid = 0x0;
828 filehdr_in->pe.e_oeminfo = 0x0;
829
6fa957a9 830 for (idx = 0; idx < 10; idx++)
277d1b5e
ILT
831 filehdr_in->pe.e_res2[idx] = 0x0;
832
833 filehdr_in->pe.e_lfanew = 0x80;
834
6fa957a9
KH
835 /* This next collection of data are mostly just characters. It
836 appears to be constant within the headers put on NT exes. */
277d1b5e
ILT
837 filehdr_in->pe.dos_message[0] = 0x0eba1f0e;
838 filehdr_in->pe.dos_message[1] = 0xcd09b400;
839 filehdr_in->pe.dos_message[2] = 0x4c01b821;
840 filehdr_in->pe.dos_message[3] = 0x685421cd;
841 filehdr_in->pe.dos_message[4] = 0x70207369;
842 filehdr_in->pe.dos_message[5] = 0x72676f72;
843 filehdr_in->pe.dos_message[6] = 0x63206d61;
844 filehdr_in->pe.dos_message[7] = 0x6f6e6e61;
845 filehdr_in->pe.dos_message[8] = 0x65622074;
846 filehdr_in->pe.dos_message[9] = 0x6e757220;
847 filehdr_in->pe.dos_message[10] = 0x206e6920;
848 filehdr_in->pe.dos_message[11] = 0x20534f44;
849 filehdr_in->pe.dos_message[12] = 0x65646f6d;
850 filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
851 filehdr_in->pe.dos_message[14] = 0x24;
852 filehdr_in->pe.dos_message[15] = 0x0;
853 filehdr_in->pe.nt_signature = NT_SIGNATURE;
854
dc810e39
AM
855 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
856 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
277d1b5e 857
0cb112f7
CF
858 /* Only use a real timestamp if the option was chosen. */
859 if ((pe_data (abfd)->insert_timestamp))
61e2488c 860 H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
0cb112f7 861
dc810e39
AM
862 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
863 filehdr_out->f_symptr);
864 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
865 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
866 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
277d1b5e 867
1725a96e 868 /* Put in extra dos header stuff. This data remains essentially
277d1b5e 869 constant, it just has to be tacked on to the beginning of all exes
1725a96e 870 for NT. */
dc810e39
AM
871 H_PUT_16 (abfd, filehdr_in->pe.e_magic, filehdr_out->e_magic);
872 H_PUT_16 (abfd, filehdr_in->pe.e_cblp, filehdr_out->e_cblp);
873 H_PUT_16 (abfd, filehdr_in->pe.e_cp, filehdr_out->e_cp);
874 H_PUT_16 (abfd, filehdr_in->pe.e_crlc, filehdr_out->e_crlc);
875 H_PUT_16 (abfd, filehdr_in->pe.e_cparhdr, filehdr_out->e_cparhdr);
876 H_PUT_16 (abfd, filehdr_in->pe.e_minalloc, filehdr_out->e_minalloc);
877 H_PUT_16 (abfd, filehdr_in->pe.e_maxalloc, filehdr_out->e_maxalloc);
878 H_PUT_16 (abfd, filehdr_in->pe.e_ss, filehdr_out->e_ss);
879 H_PUT_16 (abfd, filehdr_in->pe.e_sp, filehdr_out->e_sp);
880 H_PUT_16 (abfd, filehdr_in->pe.e_csum, filehdr_out->e_csum);
881 H_PUT_16 (abfd, filehdr_in->pe.e_ip, filehdr_out->e_ip);
882 H_PUT_16 (abfd, filehdr_in->pe.e_cs, filehdr_out->e_cs);
883 H_PUT_16 (abfd, filehdr_in->pe.e_lfarlc, filehdr_out->e_lfarlc);
884 H_PUT_16 (abfd, filehdr_in->pe.e_ovno, filehdr_out->e_ovno);
1725a96e
NC
885
886 for (idx = 0; idx < 4; idx++)
dc810e39 887 H_PUT_16 (abfd, filehdr_in->pe.e_res[idx], filehdr_out->e_res[idx]);
1725a96e 888
dc810e39
AM
889 H_PUT_16 (abfd, filehdr_in->pe.e_oemid, filehdr_out->e_oemid);
890 H_PUT_16 (abfd, filehdr_in->pe.e_oeminfo, filehdr_out->e_oeminfo);
1725a96e
NC
891
892 for (idx = 0; idx < 10; idx++)
dc810e39 893 H_PUT_16 (abfd, filehdr_in->pe.e_res2[idx], filehdr_out->e_res2[idx]);
1725a96e 894
dc810e39 895 H_PUT_32 (abfd, filehdr_in->pe.e_lfanew, filehdr_out->e_lfanew);
277d1b5e 896
1725a96e 897 for (idx = 0; idx < 16; idx++)
dc810e39
AM
898 H_PUT_32 (abfd, filehdr_in->pe.dos_message[idx],
899 filehdr_out->dos_message[idx]);
277d1b5e 900
6fa957a9 901 /* Also put in the NT signature. */
dc810e39 902 H_PUT_32 (abfd, filehdr_in->pe.nt_signature, filehdr_out->nt_signature);
277d1b5e 903
277d1b5e
ILT
904 return FILHSZ;
905}
906
907unsigned int
7920ce38 908_bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
277d1b5e 909{
6fa957a9
KH
910 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
911 FILHDR *filehdr_out = (FILHDR *) out;
277d1b5e 912
dc810e39
AM
913 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
914 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
915 H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
916 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
917 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
918 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
919 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
277d1b5e
ILT
920
921 return FILHSZ;
922}
923
924unsigned int
7920ce38 925_bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
277d1b5e 926{
6fa957a9
KH
927 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
928 SCNHDR *scnhdr_ext = (SCNHDR *) out;
277d1b5e
ILT
929 unsigned int ret = SCNHSZ;
930 bfd_vma ps;
931 bfd_vma ss;
932
6fa957a9 933 memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
277d1b5e
ILT
934
935 PUT_SCNHDR_VADDR (abfd,
9602af51 936 ((scnhdr_int->s_vaddr
6fa957a9 937 - pe_data (abfd)->pe_opthdr.ImageBase)
277d1b5e 938 & 0xffffffff),
dc810e39 939 scnhdr_ext->s_vaddr);
277d1b5e 940
5933bdc9
ILT
941 /* NT wants the size data to be rounded up to the next
942 NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
943 sometimes). */
5933bdc9 944 if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
277d1b5e 945 {
92dd4511 946 if (bfd_pei_p (abfd))
ff0c9faf
NC
947 {
948 ps = scnhdr_int->s_size;
949 ss = 0;
950 }
951 else
952 {
953 ps = 0;
954 ss = scnhdr_int->s_size;
955 }
277d1b5e
ILT
956 }
957 else
958 {
92dd4511 959 if (bfd_pei_p (abfd))
ff0c9faf
NC
960 ps = scnhdr_int->s_paddr;
961 else
962 ps = 0;
963
277d1b5e
ILT
964 ss = scnhdr_int->s_size;
965 }
966
967 PUT_SCNHDR_SIZE (abfd, ss,
dc810e39 968 scnhdr_ext->s_size);
277d1b5e 969
5933bdc9 970 /* s_paddr in PE is really the virtual size. */
dc810e39 971 PUT_SCNHDR_PADDR (abfd, ps, scnhdr_ext->s_paddr);
277d1b5e
ILT
972
973 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
dc810e39 974 scnhdr_ext->s_scnptr);
277d1b5e 975 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
dc810e39 976 scnhdr_ext->s_relptr);
277d1b5e 977 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
dc810e39 978 scnhdr_ext->s_lnnoptr);
277d1b5e 979
277d1b5e 980 {
25c80428
NC
981 /* Extra flags must be set when dealing with PE. All sections should also
982 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
983 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
984 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
985 (this is especially important when dealing with the .idata section since
986 the addresses for routines from .dlls must be overwritten). If .reloc
987 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
988 (0x02000000). Also, the resource data should also be read and
989 writable. */
990
4e1fc599 991 /* FIXME: Alignment is also encoded in this field, at least on PPC and
25c80428
NC
992 ARM-WINCE. Although - how do we get the original alignment field
993 back ? */
994
995 typedef struct
996 {
997 const char * section_name;
998 unsigned long must_have;
999 }
1000 pe_required_section_flags;
4e1fc599 1001
25c80428
NC
1002 pe_required_section_flags known_sections [] =
1003 {
1004 { ".arch", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES },
1005 { ".bss", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1006 { ".data", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1007 { ".edata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1008 { ".idata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1009 { ".pdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1010 { ".rdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1011 { ".reloc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE },
1012 { ".rsrc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1013 { ".text" , IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE },
1014 { ".tls", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1015 { ".xdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1016 { NULL, 0}
1017 };
1018
1019 pe_required_section_flags * p;
1725a96e 1020
66bed356
DS
1021 /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now
1022 we know exactly what this specific section wants so we remove it
1023 and then allow the must_have field to add it back in if necessary.
1024 However, we don't remove IMAGE_SCN_MEM_WRITE flag from .text if the
1025 default WP_TEXT file flag has been cleared. WP_TEXT may be cleared
1026 by ld --enable-auto-import (if auto-import is actually needed),
1027 by ld --omagic, or by obcopy --writable-text. */
66bed356 1028
25c80428
NC
1029 for (p = known_sections; p->section_name; p++)
1030 if (strcmp (scnhdr_int->s_name, p->section_name) == 0)
1031 {
3c9d0484
DS
1032 if (strcmp (scnhdr_int->s_name, ".text")
1033 || (bfd_get_file_flags (abfd) & WP_TEXT))
d48bdb99
AM
1034 scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE;
1035 scnhdr_int->s_flags |= p->must_have;
25c80428
NC
1036 break;
1037 }
1038
d48bdb99 1039 H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
277d1b5e
ILT
1040 }
1041
cb43721d 1042 if (coff_data (abfd)->link_info
1049f94e 1043 && ! coff_data (abfd)->link_info->relocatable
cb43721d
ILT
1044 && ! coff_data (abfd)->link_info->shared
1045 && strcmp (scnhdr_int->s_name, ".text") == 0)
277d1b5e 1046 {
cb43721d 1047 /* By inference from looking at MS output, the 32 bit field
7dee875e 1048 which is the combination of the number_of_relocs and
cb43721d
ILT
1049 number_of_linenos is used for the line number count in
1050 executables. A 16-bit field won't do for cc1. The MS
1051 document says that the number of relocs is zero for
1052 executables, but the 17-th bit has been observed to be there.
1053 Overflow is not an issue: a 4G-line program will overflow a
1054 bunch of other fields long before this! */
dc810e39
AM
1055 H_PUT_16 (abfd, (scnhdr_int->s_nlnno & 0xffff), scnhdr_ext->s_nlnno);
1056 H_PUT_16 (abfd, (scnhdr_int->s_nlnno >> 16), scnhdr_ext->s_nreloc);
277d1b5e 1057 }
277d1b5e
ILT
1058 else
1059 {
cb43721d 1060 if (scnhdr_int->s_nlnno <= 0xffff)
dc810e39 1061 H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
cb43721d
ILT
1062 else
1063 {
1064 (*_bfd_error_handler) (_("%s: line number overflow: 0x%lx > 0xffff"),
1065 bfd_get_filename (abfd),
1066 scnhdr_int->s_nlnno);
1067 bfd_set_error (bfd_error_file_truncated);
dc810e39 1068 H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nlnno);
cb43721d
ILT
1069 ret = 0;
1070 }
1725a96e 1071
cd339148
NS
1072 /* Although we could encode 0xffff relocs here, we do not, to be
1073 consistent with other parts of bfd. Also it lets us warn, as
1074 we should never see 0xffff here w/o having the overflow flag
1075 set. */
1076 if (scnhdr_int->s_nreloc < 0xffff)
dc810e39 1077 H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
cb43721d
ILT
1078 else
1079 {
1725a96e 1080 /* PE can deal with large #s of relocs, but not here. */
dc810e39 1081 H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc);
3e4554a2 1082 scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
dc810e39 1083 H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
cb43721d 1084 }
277d1b5e
ILT
1085 }
1086 return ret;
1087}
1088
61e2488c
JT
1089void
1090_bfd_XXi_swap_debugdir_in (bfd * abfd, void * ext1, void * in1)
1091{
1092 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) ext1;
1093 struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) in1;
1094
1095 in->Characteristics = H_GET_32(abfd, ext->Characteristics);
1096 in->TimeDateStamp = H_GET_32(abfd, ext->TimeDateStamp);
1097 in->MajorVersion = H_GET_16(abfd, ext->MajorVersion);
1098 in->MinorVersion = H_GET_16(abfd, ext->MinorVersion);
1099 in->Type = H_GET_32(abfd, ext->Type);
1100 in->SizeOfData = H_GET_32(abfd, ext->SizeOfData);
1101 in->AddressOfRawData = H_GET_32(abfd, ext->AddressOfRawData);
1102 in->PointerToRawData = H_GET_32(abfd, ext->PointerToRawData);
1103}
1104
1105unsigned int
1106_bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp)
1107{
1108 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) extp;
1109 struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) inp;
1110
1111 H_PUT_32(abfd, in->Characteristics, ext->Characteristics);
1112 H_PUT_32(abfd, in->TimeDateStamp, ext->TimeDateStamp);
1113 H_PUT_16(abfd, in->MajorVersion, ext->MajorVersion);
1114 H_PUT_16(abfd, in->MinorVersion, ext->MinorVersion);
1115 H_PUT_32(abfd, in->Type, ext->Type);
1116 H_PUT_32(abfd, in->SizeOfData, ext->SizeOfData);
1117 H_PUT_32(abfd, in->AddressOfRawData, ext->AddressOfRawData);
1118 H_PUT_32(abfd, in->PointerToRawData, ext->PointerToRawData);
1119
1120 return sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1121}
1122
1123static CODEVIEW_INFO *
1124_bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo)
1125{
1126 char buffer[256+1];
1127
1128 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1129 return NULL;
1130
1131 if (bfd_bread (buffer, 256, abfd) < 4)
1132 return NULL;
1133
6e6e7cfc 1134 /* Ensure null termination of filename. */
61e2488c
JT
1135 buffer[256] = '\0';
1136
1137 cvinfo->CVSignature = H_GET_32(abfd, buffer);
1138 cvinfo->Age = 0;
1139
1140 if ((cvinfo->CVSignature == CVINFO_PDB70_CVSIGNATURE)
1141 && (length > sizeof (CV_INFO_PDB70)))
1142 {
1143 CV_INFO_PDB70 *cvinfo70 = (CV_INFO_PDB70 *)(buffer);
1144
1145 cvinfo->Age = H_GET_32(abfd, cvinfo70->Age);
6e6e7cfc
JT
1146
1147 /* A GUID consists of 4,2,2 byte values in little-endian order, followed
1148 by 8 single bytes. Byte swap them so we can conveniently treat the GUID
1149 as 16 bytes in big-endian order. */
1150 bfd_putb32 (bfd_getl32 (cvinfo70->Signature), cvinfo->Signature);
1151 bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[4])), &(cvinfo->Signature[4]));
1152 bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[6])), &(cvinfo->Signature[6]));
1153 memcpy (&(cvinfo->Signature[8]), &(cvinfo70->Signature[8]), 8);
1154
61e2488c
JT
1155 cvinfo->SignatureLength = CV_INFO_SIGNATURE_LENGTH;
1156 // cvinfo->PdbFileName = cvinfo70->PdbFileName;
1157
1158 return cvinfo;
1159 }
1160 else if ((cvinfo->CVSignature == CVINFO_PDB20_CVSIGNATURE)
1161 && (length > sizeof (CV_INFO_PDB20)))
1162 {
1163 CV_INFO_PDB20 *cvinfo20 = (CV_INFO_PDB20 *)(buffer);
1164 cvinfo->Age = H_GET_32(abfd, cvinfo20->Age);
1165 memcpy (cvinfo->Signature, cvinfo20->Signature, 4);
1166 cvinfo->SignatureLength = 4;
1167 // cvinfo->PdbFileName = cvinfo20->PdbFileName;
1168
1169 return cvinfo;
1170 }
1171
1172 return NULL;
1173}
1174
1175unsigned int
1176_bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo)
1177{
1178 unsigned int size = sizeof (CV_INFO_PDB70) + 1;
1179 CV_INFO_PDB70 *cvinfo70;
1180 char buffer[size];
1181
1182 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1183 return 0;
1184
1185 cvinfo70 = (CV_INFO_PDB70 *) buffer;
1186 H_PUT_32 (abfd, CVINFO_PDB70_CVSIGNATURE, cvinfo70->CvSignature);
6e6e7cfc
JT
1187
1188 /* Byte swap the GUID from 16 bytes in big-endian order to 4,2,2 byte values
1189 in little-endian order, followed by 8 single bytes. */
1190 bfd_putl32 (bfd_getb32 (cvinfo->Signature), cvinfo70->Signature);
1191 bfd_putl16 (bfd_getb16 (&(cvinfo->Signature[4])), &(cvinfo70->Signature[4]));
1192 bfd_putl16 (bfd_getb16 (&(cvinfo->Signature[6])), &(cvinfo70->Signature[6]));
1193 memcpy (&(cvinfo70->Signature[8]), &(cvinfo->Signature[8]), 8);
1194
61e2488c
JT
1195 H_PUT_32 (abfd, cvinfo->Age, cvinfo70->Age);
1196 cvinfo70->PdbFileName[0] = '\0';
1197
1198 if (bfd_bwrite (buffer, size, abfd) != size)
1199 return 0;
1200
1201 return size;
1202}
1203
1725a96e 1204static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
7920ce38
NC
1205{
1206 N_("Export Directory [.edata (or where ever we found it)]"),
1207 N_("Import Directory [parts of .idata]"),
1208 N_("Resource Directory [.rsrc]"),
1209 N_("Exception Directory [.pdata]"),
1210 N_("Security Directory"),
1211 N_("Base Relocation Directory [.reloc]"),
1212 N_("Debug Directory"),
1213 N_("Description Directory"),
1214 N_("Special Directory"),
1215 N_("Thread Storage Directory [.tls]"),
1216 N_("Load Configuration Directory"),
1217 N_("Bound Import Directory"),
1218 N_("Import Address Table Directory"),
1219 N_("Delay Import Directory"),
6c73cbb1 1220 N_("CLR Runtime Header"),
7920ce38
NC
1221 N_("Reserved")
1222};
1725a96e 1223
277d1b5e
ILT
1224#ifdef POWERPC_LE_PE
1225/* The code for the PPC really falls in the "architecture dependent"
1226 category. However, it's not clear that anyone will ever care, so
1227 we're ignoring the issue for now; if/when PPC matters, some of this
1228 may need to go into peicode.h, or arguments passed to enable the
1229 PPC- specific code. */
1230#endif
1231
b34976b6 1232static bfd_boolean
7920ce38 1233pe_print_idata (bfd * abfd, void * vfile)
277d1b5e
ILT
1234{
1235 FILE *file = (FILE *) vfile;
a76b448c 1236 bfd_byte *data;
8181c403
AM
1237 asection *section;
1238 bfd_signed_vma adj;
277d1b5e
ILT
1239
1240#ifdef POWERPC_LE_PE
1241 asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
1242#endif
1243
a76b448c 1244 bfd_size_type datasize = 0;
277d1b5e 1245 bfd_size_type dataoff;
277d1b5e 1246 bfd_size_type i;
277d1b5e
ILT
1247 int onaline = 20;
1248
1249 pe_data_type *pe = pe_data (abfd);
1250 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1251
8181c403 1252 bfd_vma addr;
277d1b5e 1253
6c73cbb1 1254 addr = extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
277d1b5e 1255
6c73cbb1 1256 if (addr == 0 && extra->DataDirectory[PE_IMPORT_TABLE].Size == 0)
8181c403 1257 {
a76b448c
AM
1258 /* Maybe the extra header isn't there. Look for the section. */
1259 section = bfd_get_section_by_name (abfd, ".idata");
1260 if (section == NULL)
b34976b6 1261 return TRUE;
a76b448c
AM
1262
1263 addr = section->vma;
eea6121a 1264 datasize = section->size;
a76b448c 1265 if (datasize == 0)
b34976b6 1266 return TRUE;
8181c403 1267 }
a76b448c 1268 else
8181c403 1269 {
a76b448c
AM
1270 addr += extra->ImageBase;
1271 for (section = abfd->sections; section != NULL; section = section->next)
1272 {
eea6121a 1273 datasize = section->size;
a76b448c
AM
1274 if (addr >= section->vma && addr < section->vma + datasize)
1275 break;
1276 }
1277
1278 if (section == NULL)
1279 {
1280 fprintf (file,
1281 _("\nThere is an import table, but the section containing it could not be found\n"));
b34976b6 1282 return TRUE;
a76b448c 1283 }
b69c8728
JT
1284 else if (!(section->flags & SEC_HAS_CONTENTS))
1285 {
1286 fprintf (file,
1287 _("\nThere is an import table in %s, but that section has no contents\n"),
1288 section->name);
1289 return TRUE;
1290 }
8181c403 1291 }
5933bdc9 1292
8181c403
AM
1293 fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
1294 section->name, (unsigned long) addr);
277d1b5e 1295
8181c403 1296 dataoff = addr - section->vma;
277d1b5e
ILT
1297
1298#ifdef POWERPC_LE_PE
eea6121a 1299 if (rel_section != 0 && rel_section->size != 0)
277d1b5e
ILT
1300 {
1301 /* The toc address can be found by taking the starting address,
1302 which on the PPC locates a function descriptor. The
1303 descriptor consists of the function code starting address
1304 followed by the address of the toc. The starting address we
1305 get from the bfd, and the descriptor is supposed to be in the
1306 .reldata section. */
1307
1308 bfd_vma loadable_toc_address;
1309 bfd_vma toc_address;
1310 bfd_vma start_address;
eea6121a 1311 bfd_byte *data;
a50b2160 1312 bfd_vma offset;
8181c403 1313
eea6121a
AM
1314 if (!bfd_malloc_and_get_section (abfd, rel_section, &data))
1315 {
1316 if (data != NULL)
1317 free (data);
1318 return FALSE;
1319 }
277d1b5e
ILT
1320
1321 offset = abfd->start_address - rel_section->vma;
1322
a50b2160
JJ
1323 if (offset >= rel_section->size || offset + 8 > rel_section->size)
1324 {
1325 if (data != NULL)
1326 free (data);
1327 return FALSE;
1328 }
1329
db8503c4
AM
1330 start_address = bfd_get_32 (abfd, data + offset);
1331 loadable_toc_address = bfd_get_32 (abfd, data + offset + 4);
277d1b5e
ILT
1332 toc_address = loadable_toc_address - 32768;
1333
9602af51 1334 fprintf (file,
6fa957a9
KH
1335 _("\nFunction descriptor located at the start address: %04lx\n"),
1336 (unsigned long int) (abfd->start_address));
277d1b5e
ILT
1337 fprintf (file,
1338 _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
1339 start_address, loadable_toc_address, toc_address);
eea6121a
AM
1340 if (data != NULL)
1341 free (data);
277d1b5e
ILT
1342 }
1343 else
1344 {
9602af51 1345 fprintf (file,
6fa957a9 1346 _("\nNo reldata section! Function descriptor not decoded.\n"));
277d1b5e
ILT
1347 }
1348#endif
1349
9602af51 1350 fprintf (file,
6fa957a9
KH
1351 _("\nThe Import Tables (interpreted %s section contents)\n"),
1352 section->name);
9602af51 1353 fprintf (file,
ca09e32b
NC
1354 _("\
1355 vma: Hint Time Forward DLL First\n\
1356 Table Stamp Chain Name Thunk\n"));
277d1b5e 1357
db8503c4 1358 /* Read the whole section. Some of the fields might be before dataoff. */
eea6121a
AM
1359 if (!bfd_malloc_and_get_section (abfd, section, &data))
1360 {
1361 if (data != NULL)
1362 free (data);
1363 return FALSE;
1364 }
277d1b5e 1365
db8503c4 1366 adj = section->vma - extra->ImageBase;
277d1b5e 1367
5e226794 1368 /* Print all image import descriptors. */
4e1fc599 1369 for (i = dataoff; i + onaline <= datasize; i += onaline)
277d1b5e
ILT
1370 {
1371 bfd_vma hint_addr;
1372 bfd_vma time_stamp;
1373 bfd_vma forward_chain;
1374 bfd_vma dll_name;
1375 bfd_vma first_thunk;
1376 int idx = 0;
1377 bfd_size_type j;
1378 char *dll;
1379
6c73cbb1 1380 /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */
4e1fc599
AM
1381 fprintf (file, " %08lx\t", (unsigned long) (i + adj));
1382 hint_addr = bfd_get_32 (abfd, data + i);
1383 time_stamp = bfd_get_32 (abfd, data + i + 4);
1384 forward_chain = bfd_get_32 (abfd, data + i + 8);
1385 dll_name = bfd_get_32 (abfd, data + i + 12);
1386 first_thunk = bfd_get_32 (abfd, data + i + 16);
5933bdc9
ILT
1387
1388 fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
a76b448c
AM
1389 (unsigned long) hint_addr,
1390 (unsigned long) time_stamp,
1391 (unsigned long) forward_chain,
1392 (unsigned long) dll_name,
1393 (unsigned long) first_thunk);
277d1b5e
ILT
1394
1395 if (hint_addr == 0 && first_thunk == 0)
1396 break;
1397
a50b2160
JJ
1398 if (dll_name - adj >= section->size)
1399 break;
1400
8181c403 1401 dll = (char *) data + dll_name - adj;
36e9d67b
NC
1402 /* PR 17512 file: 078-12277-0.004. */
1403 bfd_size_type maxlen = (char *)(data + datasize) - dll - 1;
1404 fprintf (file, _("\n\tDLL Name: %.*s\n"), (int) maxlen, dll);
277d1b5e
ILT
1405
1406 if (hint_addr != 0)
1407 {
6e7c73dd
CF
1408 bfd_byte *ft_data;
1409 asection *ft_section;
1410 bfd_vma ft_addr;
1411 bfd_size_type ft_datasize;
1412 int ft_idx;
4e1fc599 1413 int ft_allocated;
6e7c73dd 1414
5e226794 1415 fprintf (file, _("\tvma: Hint/Ord Member-Name Bound-To\n"));
277d1b5e 1416
8181c403 1417 idx = hint_addr - adj;
4e1fc599 1418
5e226794 1419 ft_addr = first_thunk + extra->ImageBase;
6e7c73dd 1420 ft_idx = first_thunk - adj;
4e1fc599
AM
1421 ft_data = data + ft_idx;
1422 ft_datasize = datasize - ft_idx;
1423 ft_allocated = 0;
6c73cbb1
NC
1424
1425 if (first_thunk != hint_addr)
6e7c73dd
CF
1426 {
1427 /* Find the section which contains the first thunk. */
1428 for (ft_section = abfd->sections;
1429 ft_section != NULL;
1430 ft_section = ft_section->next)
1431 {
6e7c73dd 1432 if (ft_addr >= ft_section->vma
4e1fc599 1433 && ft_addr < ft_section->vma + ft_section->size)
6e7c73dd
CF
1434 break;
1435 }
1436
1437 if (ft_section == NULL)
1438 {
1439 fprintf (file,
1440 _("\nThere is a first thunk, but the section containing it could not be found\n"));
1441 continue;
1442 }
1443
1444 /* Now check to see if this section is the same as our current
1445 section. If it is not then we will have to load its data in. */
4e1fc599 1446 if (ft_section != section)
6e7c73dd
CF
1447 {
1448 ft_idx = first_thunk - (ft_section->vma - extra->ImageBase);
4e1fc599
AM
1449 ft_datasize = ft_section->size - ft_idx;
1450 ft_data = (bfd_byte *) bfd_malloc (ft_datasize);
6e7c73dd
CF
1451 if (ft_data == NULL)
1452 continue;
1453
4e1fc599
AM
1454 /* Read ft_datasize bytes starting at offset ft_idx. */
1455 if (!bfd_get_section_contents (abfd, ft_section, ft_data,
1456 (bfd_vma) ft_idx, ft_datasize))
6e7c73dd
CF
1457 {
1458 free (ft_data);
1459 continue;
1460 }
6e7c73dd
CF
1461 ft_allocated = 1;
1462 }
1463 }
5e226794
NC
1464
1465 /* Print HintName vector entries. */
99ad8390 1466#ifdef COFF_WITH_pex64
4e1fc599 1467 for (j = 0; idx + j + 8 <= datasize; j += 8)
99ad8390
NC
1468 {
1469 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1470 unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
1471
1472 if (!member && !member_high)
1473 break;
1474
5879bb8f 1475 if (HighBitSet (member_high))
99ad8390 1476 fprintf (file, "\t%lx%08lx\t %4lx%08lx <none>",
5879bb8f
NC
1477 member_high, member,
1478 WithoutHighBit (member_high), member);
20ad5e28 1479 /* PR binutils/17512: Handle corrupt PE data. */
d1f5d98a 1480 else if ((bfd_vma) member - adj + 2 >= datasize)
20ad5e28 1481 fprintf (file, _("\t<corrupt: 0x%04lx>"), member);
99ad8390
NC
1482 else
1483 {
1484 int ordinal;
1485 char *member_name;
1486
1487 ordinal = bfd_get_16 (abfd, data + member - adj);
1488 member_name = (char *) data + member - adj + 2;
1489 fprintf (file, "\t%04lx\t %4d %s",member, ordinal, member_name);
1490 }
1491
1492 /* If the time stamp is not zero, the import address
1493 table holds actual addresses. */
1494 if (time_stamp != 0
1495 && first_thunk != 0
4e1fc599
AM
1496 && first_thunk != hint_addr
1497 && j + 4 <= ft_datasize)
99ad8390 1498 fprintf (file, "\t%04lx",
4e1fc599 1499 (unsigned long) bfd_get_32 (abfd, ft_data + j));
99ad8390
NC
1500 fprintf (file, "\n");
1501 }
1502#else
4e1fc599 1503 for (j = 0; idx + j + 4 <= datasize; j += 4)
277d1b5e
ILT
1504 {
1505 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1506
4e1fc599 1507 /* Print single IMAGE_IMPORT_BY_NAME vector. */
277d1b5e
ILT
1508 if (member == 0)
1509 break;
5e226794 1510
5879bb8f 1511 if (HighBitSet (member))
5e226794 1512 fprintf (file, "\t%04lx\t %4lu <none>",
5879bb8f 1513 member, WithoutHighBit (member));
20ad5e28 1514 /* PR binutils/17512: Handle corrupt PE data. */
d1f5d98a 1515 else if ((bfd_vma) member - adj + 2 >= datasize)
20ad5e28 1516 fprintf (file, _("\t<corrupt: 0x%04lx>"), member);
277d1b5e
ILT
1517 else
1518 {
1519 int ordinal;
1520 char *member_name;
1521
8181c403
AM
1522 ordinal = bfd_get_16 (abfd, data + member - adj);
1523 member_name = (char *) data + member - adj + 2;
277d1b5e
ILT
1524 fprintf (file, "\t%04lx\t %4d %s",
1525 member, ordinal, member_name);
1526 }
5e226794 1527
277d1b5e 1528 /* If the time stamp is not zero, the import address
5e226794
NC
1529 table holds actual addresses. */
1530 if (time_stamp != 0
1531 && first_thunk != 0
4e1fc599
AM
1532 && first_thunk != hint_addr
1533 && j + 4 <= ft_datasize)
277d1b5e 1534 fprintf (file, "\t%04lx",
4e1fc599 1535 (unsigned long) bfd_get_32 (abfd, ft_data + j));
277d1b5e
ILT
1536
1537 fprintf (file, "\n");
1538 }
99ad8390 1539#endif
e4cf60a8
NC
1540 if (ft_allocated)
1541 free (ft_data);
277d1b5e
ILT
1542 }
1543
9602af51 1544 fprintf (file, "\n");
277d1b5e
ILT
1545 }
1546
1547 free (data);
1548
b34976b6 1549 return TRUE;
277d1b5e
ILT
1550}
1551
b34976b6 1552static bfd_boolean
7920ce38 1553pe_print_edata (bfd * abfd, void * vfile)
277d1b5e
ILT
1554{
1555 FILE *file = (FILE *) vfile;
a76b448c 1556 bfd_byte *data;
8181c403 1557 asection *section;
a76b448c 1558 bfd_size_type datasize = 0;
277d1b5e
ILT
1559 bfd_size_type dataoff;
1560 bfd_size_type i;
b69c8728 1561 bfd_vma adj;
1725a96e
NC
1562 struct EDT_type
1563 {
7920ce38 1564 long export_flags; /* Reserved - should be zero. */
6fa957a9
KH
1565 long time_stamp;
1566 short major_ver;
1567 short minor_ver;
7920ce38
NC
1568 bfd_vma name; /* RVA - relative to image base. */
1569 long base; /* Ordinal base. */
1570 unsigned long num_functions;/* Number in the export address table. */
1571 unsigned long num_names; /* Number in the name pointer table. */
1572 bfd_vma eat_addr; /* RVA to the export address table. */
1573 bfd_vma npt_addr; /* RVA to the Export Name Pointer Table. */
1574 bfd_vma ot_addr; /* RVA to the Ordinal Table. */
6fa957a9 1575 } edt;
277d1b5e
ILT
1576
1577 pe_data_type *pe = pe_data (abfd);
1578 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1579
8181c403 1580 bfd_vma addr;
277d1b5e 1581
6c73cbb1 1582 addr = extra->DataDirectory[PE_EXPORT_TABLE].VirtualAddress;
277d1b5e 1583
6c73cbb1 1584 if (addr == 0 && extra->DataDirectory[PE_EXPORT_TABLE].Size == 0)
8181c403 1585 {
a76b448c
AM
1586 /* Maybe the extra header isn't there. Look for the section. */
1587 section = bfd_get_section_by_name (abfd, ".edata");
1588 if (section == NULL)
b34976b6 1589 return TRUE;
a76b448c
AM
1590
1591 addr = section->vma;
0facbdf5 1592 dataoff = 0;
eea6121a 1593 datasize = section->size;
a76b448c 1594 if (datasize == 0)
b34976b6 1595 return TRUE;
8181c403 1596 }
a76b448c 1597 else
8181c403 1598 {
a76b448c 1599 addr += extra->ImageBase;
1725a96e 1600
a76b448c 1601 for (section = abfd->sections; section != NULL; section = section->next)
0facbdf5
NC
1602 if (addr >= section->vma && addr < section->vma + section->size)
1603 break;
a76b448c
AM
1604
1605 if (section == NULL)
1606 {
1607 fprintf (file,
1608 _("\nThere is an export table, but the section containing it could not be found\n"));
b34976b6 1609 return TRUE;
a76b448c 1610 }
b69c8728
JT
1611 else if (!(section->flags & SEC_HAS_CONTENTS))
1612 {
1613 fprintf (file,
1614 _("\nThere is an export table in %s, but that section has no contents\n"),
1615 section->name);
1616 return TRUE;
1617 }
0facbdf5
NC
1618
1619 dataoff = addr - section->vma;
6c73cbb1 1620 datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
0facbdf5
NC
1621 if (datasize > section->size - dataoff)
1622 {
1623 fprintf (file,
1624 _("\nThere is an export table in %s, but it does not fit into that section\n"),
1625 section->name);
1626 return TRUE;
1627 }
277d1b5e
ILT
1628 }
1629
5a4b0ccc
NC
1630 /* PR 17512: Handle corrupt PE binaries. */
1631 if (datasize < 36)
1632 {
1633 fprintf (file,
1634 _("\nThere is an export table in %s, but it is too small (%d)\n"),
1635 section->name, (int) datasize);
1636 return TRUE;
1637 }
1638
8181c403
AM
1639 fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
1640 section->name, (unsigned long) addr);
1641
a50b1753 1642 data = (bfd_byte *) bfd_malloc (datasize);
8181c403 1643 if (data == NULL)
b34976b6 1644 return FALSE;
277d1b5e 1645
7920ce38 1646 if (! bfd_get_section_contents (abfd, section, data,
dc810e39 1647 (file_ptr) dataoff, datasize))
b34976b6 1648 return FALSE;
277d1b5e 1649
6fa957a9
KH
1650 /* Go get Export Directory Table. */
1651 edt.export_flags = bfd_get_32 (abfd, data + 0);
1652 edt.time_stamp = bfd_get_32 (abfd, data + 4);
1653 edt.major_ver = bfd_get_16 (abfd, data + 8);
1654 edt.minor_ver = bfd_get_16 (abfd, data + 10);
1655 edt.name = bfd_get_32 (abfd, data + 12);
1656 edt.base = bfd_get_32 (abfd, data + 16);
1657 edt.num_functions = bfd_get_32 (abfd, data + 20);
1658 edt.num_names = bfd_get_32 (abfd, data + 24);
1659 edt.eat_addr = bfd_get_32 (abfd, data + 28);
1660 edt.npt_addr = bfd_get_32 (abfd, data + 32);
1661 edt.ot_addr = bfd_get_32 (abfd, data + 36);
277d1b5e 1662
8181c403 1663 adj = section->vma - extra->ImageBase + dataoff;
277d1b5e 1664
1725a96e 1665 /* Dump the EDT first. */
9602af51 1666 fprintf (file,
6fa957a9
KH
1667 _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1668 section->name);
277d1b5e 1669
9602af51 1670 fprintf (file,
6fa957a9 1671 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
277d1b5e 1672
9602af51 1673 fprintf (file,
6fa957a9 1674 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
277d1b5e 1675
9602af51 1676 fprintf (file,
6fa957a9 1677 _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
277d1b5e
ILT
1678
1679 fprintf (file,
1680 _("Name \t\t\t\t"));
ebf12fbe 1681 bfd_fprintf_vma (abfd, file, edt.name);
b69c8728
JT
1682
1683 if ((edt.name >= adj) && (edt.name < adj + datasize))
1684 fprintf (file, " %s\n", data + edt.name - adj);
1685 else
1686 fprintf (file, "(outside .edata section)\n");
277d1b5e 1687
9602af51 1688 fprintf (file,
6fa957a9 1689 _("Ordinal Base \t\t\t%ld\n"), edt.base);
277d1b5e 1690
9602af51 1691 fprintf (file,
6fa957a9 1692 _("Number in:\n"));
277d1b5e 1693
9602af51 1694 fprintf (file,
6fa957a9
KH
1695 _("\tExport Address Table \t\t%08lx\n"),
1696 edt.num_functions);
277d1b5e 1697
9602af51 1698 fprintf (file,
6fa957a9 1699 _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
277d1b5e 1700
9602af51 1701 fprintf (file,
6fa957a9 1702 _("Table Addresses\n"));
277d1b5e
ILT
1703
1704 fprintf (file,
1705 _("\tExport Address Table \t\t"));
ebf12fbe 1706 bfd_fprintf_vma (abfd, file, edt.eat_addr);
277d1b5e
ILT
1707 fprintf (file, "\n");
1708
1709 fprintf (file,
6fa957a9 1710 _("\tName Pointer Table \t\t"));
ebf12fbe 1711 bfd_fprintf_vma (abfd, file, edt.npt_addr);
277d1b5e
ILT
1712 fprintf (file, "\n");
1713
1714 fprintf (file,
1715 _("\tOrdinal Table \t\t\t"));
ebf12fbe 1716 bfd_fprintf_vma (abfd, file, edt.ot_addr);
277d1b5e
ILT
1717 fprintf (file, "\n");
1718
5933bdc9 1719 /* The next table to find is the Export Address Table. It's basically
277d1b5e
ILT
1720 a list of pointers that either locate a function in this dll, or
1721 forward the call to another dll. Something like:
1725a96e
NC
1722 typedef union
1723 {
277d1b5e
ILT
1724 long export_rva;
1725 long forwarder_rva;
7920ce38 1726 } export_address_table_entry; */
277d1b5e 1727
9602af51 1728 fprintf (file,
277d1b5e
ILT
1729 _("\nExport Address Table -- Ordinal Base %ld\n"),
1730 edt.base);
1731
bf67003b 1732 /* PR 17512: Handle corrupt PE binaries. */
36e9d67b
NC
1733 if (edt.eat_addr + (edt.num_functions * 4) - adj >= datasize
1734 /* PR 17512 file: 140-165018-0.004. */
1735 || data + edt.eat_addr - adj < data)
bf67003b
NC
1736 fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
1737 (long) edt.eat_addr,
1738 (long) edt.num_functions);
1739 else for (i = 0; i < edt.num_functions; ++i)
277d1b5e
ILT
1740 {
1741 bfd_vma eat_member = bfd_get_32 (abfd,
8181c403 1742 data + edt.eat_addr + (i * 4) - adj);
277d1b5e
ILT
1743 if (eat_member == 0)
1744 continue;
1745
db8503c4 1746 if (eat_member - adj <= datasize)
277d1b5e 1747 {
db8503c4 1748 /* This rva is to a name (forwarding function) in our section. */
6fa957a9 1749 /* Should locate a function descriptor. */
5933bdc9 1750 fprintf (file,
36e9d67b 1751 "\t[%4ld] +base[%4ld] %04lx %s -- %.*s\n",
a76b448c
AM
1752 (long) i,
1753 (long) (i + edt.base),
1754 (unsigned long) eat_member,
1755 _("Forwarder RVA"),
36e9d67b 1756 (int)(datasize - (eat_member - adj)),
a76b448c 1757 data + eat_member - adj);
277d1b5e
ILT
1758 }
1759 else
1760 {
6fa957a9 1761 /* Should locate a function descriptor in the reldata section. */
5933bdc9
ILT
1762 fprintf (file,
1763 "\t[%4ld] +base[%4ld] %04lx %s\n",
a76b448c
AM
1764 (long) i,
1765 (long) (i + edt.base),
1766 (unsigned long) eat_member,
5933bdc9 1767 _("Export RVA"));
277d1b5e
ILT
1768 }
1769 }
1770
6fa957a9
KH
1771 /* The Export Name Pointer Table is paired with the Export Ordinal Table. */
1772 /* Dump them in parallel for clarity. */
9602af51 1773 fprintf (file,
6fa957a9 1774 _("\n[Ordinal/Name Pointer] Table\n"));
277d1b5e 1775
bf67003b 1776 /* PR 17512: Handle corrupt PE binaries. */
36e9d67b
NC
1777 if (edt.npt_addr + (edt.num_names * 4) - adj >= datasize
1778 || (data + edt.npt_addr - adj) < data)
bf67003b
NC
1779 fprintf (file, _("\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"),
1780 (long) edt.npt_addr,
1781 (long) edt.num_names);
36e9d67b
NC
1782 /* PR 17512: file: 140-147171-0.004. */
1783 else if (edt.ot_addr + (edt.num_names * 2) - adj >= datasize
1784 || data + edt.ot_addr - adj < data)
bf67003b
NC
1785 fprintf (file, _("\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"),
1786 (long) edt.ot_addr,
1787 (long) edt.num_names);
1788 else for (i = 0; i < edt.num_names; ++i)
277d1b5e 1789 {
20ad5e28
NC
1790 bfd_vma name_ptr;
1791 bfd_vma ord;
9602af51 1792
20ad5e28
NC
1793 ord = bfd_get_16 (abfd, data + edt.ot_addr + (i * 2) - adj);
1794 name_ptr = bfd_get_32 (abfd, data + edt.npt_addr + (i * 4) - adj);
277d1b5e 1795
20ad5e28
NC
1796 if ((name_ptr - adj) >= datasize)
1797 {
1798 fprintf (file, _("\t[%4ld] <corrupt offset: %lx>\n"),
1799 (long) ord, (long) name_ptr);
1800 }
1801 else
1802 {
1803 char * name = (char *) data + name_ptr - adj;
1804
36e9d67b
NC
1805 fprintf (file, "\t[%4ld] %.*s\n", (long) ord,
1806 (int)((char *)(data + datasize) - name), name);
20ad5e28 1807 }
277d1b5e
ILT
1808 }
1809
1810 free (data);
1811
b34976b6 1812 return TRUE;
277d1b5e
ILT
1813}
1814
fac41780
JW
1815/* This really is architecture dependent. On IA-64, a .pdata entry
1816 consists of three dwords containing relative virtual addresses that
1817 specify the start and end address of the code range the entry
4e1fc599 1818 covers and the address of the corresponding unwind info data.
2b5c217d
NC
1819
1820 On ARM and SH-4, a compressed PDATA structure is used :
1821 _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
1822 _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
1823 See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
1824
799c00e0 1825 This is the version for uncompressed data. */
6fa957a9 1826
b34976b6 1827static bfd_boolean
7920ce38 1828pe_print_pdata (bfd * abfd, void * vfile)
277d1b5e 1829{
99ad8390
NC
1830#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1831# define PDATA_ROW_SIZE (3 * 8)
fac41780 1832#else
99ad8390 1833# define PDATA_ROW_SIZE (5 * 4)
fac41780 1834#endif
277d1b5e
ILT
1835 FILE *file = (FILE *) vfile;
1836 bfd_byte *data = 0;
1837 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1838 bfd_size_type datasize = 0;
1839 bfd_size_type i;
1840 bfd_size_type start, stop;
fac41780 1841 int onaline = PDATA_ROW_SIZE;
277d1b5e 1842
5933bdc9
ILT
1843 if (section == NULL
1844 || coff_section_data (abfd, section) == NULL
1845 || pei_section_data (abfd, section) == NULL)
b34976b6 1846 return TRUE;
277d1b5e 1847
5933bdc9 1848 stop = pei_section_data (abfd, section)->virt_size;
277d1b5e 1849 if ((stop % onaline) != 0)
6fa957a9
KH
1850 fprintf (file,
1851 _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1852 (long) stop, onaline);
277d1b5e 1853
5933bdc9
ILT
1854 fprintf (file,
1855 _("\nThe Function Table (interpreted .pdata section contents)\n"));
99ad8390 1856#if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
9602af51 1857 fprintf (file,
6fa957a9 1858 _(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
fac41780 1859#else
ca09e32b
NC
1860 fprintf (file, _("\
1861 vma:\t\tBegin End EH EH PrologEnd Exception\n\
1862 \t\tAddress Address Handler Data Address Mask\n"));
fac41780 1863#endif
277d1b5e 1864
eea6121a 1865 datasize = section->size;
dc810e39 1866 if (datasize == 0)
b34976b6 1867 return TRUE;
277d1b5e 1868
7920ce38 1869 if (! bfd_malloc_and_get_section (abfd, section, &data))
eea6121a
AM
1870 {
1871 if (data != NULL)
1872 free (data);
1873 return FALSE;
1874 }
277d1b5e
ILT
1875
1876 start = 0;
1877
1878 for (i = start; i < stop; i += onaline)
1879 {
1880 bfd_vma begin_addr;
1881 bfd_vma end_addr;
1882 bfd_vma eh_handler;
1883 bfd_vma eh_data;
1884 bfd_vma prolog_end_addr;
c7e2358a 1885#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
5933bdc9 1886 int em_data;
c7e2358a 1887#endif
277d1b5e 1888
fac41780 1889 if (i + PDATA_ROW_SIZE > stop)
277d1b5e 1890 break;
5933bdc9 1891
6fa957a9
KH
1892 begin_addr = GET_PDATA_ENTRY (abfd, data + i );
1893 end_addr = GET_PDATA_ENTRY (abfd, data + i + 4);
1894 eh_handler = GET_PDATA_ENTRY (abfd, data + i + 8);
1895 eh_data = GET_PDATA_ENTRY (abfd, data + i + 12);
1896 prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16);
9602af51 1897
277d1b5e
ILT
1898 if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1899 && eh_data == 0 && prolog_end_addr == 0)
1725a96e
NC
1900 /* We are probably into the padding of the section now. */
1901 break;
277d1b5e 1902
c7e2358a 1903#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
5933bdc9 1904 em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
c7e2358a 1905#endif
6fa957a9
KH
1906 eh_handler &= ~(bfd_vma) 0x3;
1907 prolog_end_addr &= ~(bfd_vma) 0x3;
fac41780
JW
1908
1909 fputc (' ', file);
ebf12fbe
DK
1910 bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
1911 bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
1912 bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
1913 bfd_fprintf_vma (abfd, file, eh_handler);
99ad8390 1914#if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
fac41780 1915 fputc (' ', file);
ebf12fbe
DK
1916 bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
1917 bfd_fprintf_vma (abfd, file, prolog_end_addr);
fac41780
JW
1918 fprintf (file, " %x", em_data);
1919#endif
277d1b5e
ILT
1920
1921#ifdef POWERPC_LE_PE
1922 if (eh_handler == 0 && eh_data != 0)
1923 {
6fa957a9 1924 /* Special bits here, although the meaning may be a little
7920ce38
NC
1925 mysterious. The only one I know for sure is 0x03
1926 Code Significance
1927 0x00 None
1928 0x01 Register Save Millicode
1929 0x02 Register Restore Millicode
1930 0x03 Glue Code Sequence. */
277d1b5e
ILT
1931 switch (eh_data)
1932 {
1933 case 0x01:
9602af51 1934 fprintf (file, _(" Register save millicode"));
277d1b5e
ILT
1935 break;
1936 case 0x02:
9602af51 1937 fprintf (file, _(" Register restore millicode"));
277d1b5e
ILT
1938 break;
1939 case 0x03:
9602af51 1940 fprintf (file, _(" Glue code sequence"));
277d1b5e
ILT
1941 break;
1942 default:
1943 break;
1944 }
1945 }
1946#endif
9602af51 1947 fprintf (file, "\n");
277d1b5e
ILT
1948 }
1949
1950 free (data);
1951
b34976b6 1952 return TRUE;
2b5c217d 1953#undef PDATA_ROW_SIZE
277d1b5e
ILT
1954}
1955
799c00e0
NC
1956typedef struct sym_cache
1957{
1958 int symcount;
1959 asymbol ** syms;
1960} sym_cache;
1961
1962static asymbol **
1963slurp_symtab (bfd *abfd, sym_cache *psc)
1964{
1965 asymbol ** sy = NULL;
1966 long storage;
1967
1968 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1969 {
1970 psc->symcount = 0;
1971 return NULL;
1972 }
1973
1974 storage = bfd_get_symtab_upper_bound (abfd);
1975 if (storage < 0)
1976 return NULL;
1977 if (storage)
a50b1753 1978 sy = (asymbol **) bfd_malloc (storage);
799c00e0
NC
1979
1980 psc->symcount = bfd_canonicalize_symtab (abfd, sy);
1981 if (psc->symcount < 0)
1982 return NULL;
1983 return sy;
1984}
1985
1986static const char *
1987my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
1988{
1989 int i;
1990
1991 if (psc->syms == 0)
1992 psc->syms = slurp_symtab (abfd, psc);
1993
1994 for (i = 0; i < psc->symcount; i++)
1995 {
1996 if (psc->syms[i]->section->vma + psc->syms[i]->value == func)
1997 return psc->syms[i]->name;
1998 }
1999
2000 return NULL;
2001}
2002
2003static void
2004cleanup_syms (sym_cache *psc)
2005{
2006 psc->symcount = 0;
2007 free (psc->syms);
2008 psc->syms = NULL;
2009}
2010
2011/* This is the version for "compressed" pdata. */
2012
2013bfd_boolean
2014_bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
2015{
2016# define PDATA_ROW_SIZE (2 * 4)
2017 FILE *file = (FILE *) vfile;
2018 bfd_byte *data = NULL;
2019 asection *section = bfd_get_section_by_name (abfd, ".pdata");
2020 bfd_size_type datasize = 0;
2021 bfd_size_type i;
2022 bfd_size_type start, stop;
2023 int onaline = PDATA_ROW_SIZE;
91d6fa6a 2024 struct sym_cache cache = {0, 0} ;
799c00e0
NC
2025
2026 if (section == NULL
2027 || coff_section_data (abfd, section) == NULL
2028 || pei_section_data (abfd, section) == NULL)
2029 return TRUE;
2030
2031 stop = pei_section_data (abfd, section)->virt_size;
2032 if ((stop % onaline) != 0)
2033 fprintf (file,
2034 _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
2035 (long) stop, onaline);
2036
2037 fprintf (file,
2038 _("\nThe Function Table (interpreted .pdata section contents)\n"));
2039
2040 fprintf (file, _("\
2041 vma:\t\tBegin Prolog Function Flags Exception EH\n\
2042 \t\tAddress Length Length 32b exc Handler Data\n"));
2043
2044 datasize = section->size;
2045 if (datasize == 0)
2046 return TRUE;
2047
2048 if (! bfd_malloc_and_get_section (abfd, section, &data))
2049 {
2050 if (data != NULL)
2051 free (data);
2052 return FALSE;
2053 }
2054
2055 start = 0;
2056
2057 for (i = start; i < stop; i += onaline)
2058 {
2059 bfd_vma begin_addr;
2060 bfd_vma other_data;
2061 bfd_vma prolog_length, function_length;
2062 int flag32bit, exception_flag;
799c00e0
NC
2063 asection *tsection;
2064
2065 if (i + PDATA_ROW_SIZE > stop)
2066 break;
2067
2068 begin_addr = GET_PDATA_ENTRY (abfd, data + i );
2069 other_data = GET_PDATA_ENTRY (abfd, data + i + 4);
2070
2071 if (begin_addr == 0 && other_data == 0)
2072 /* We are probably into the padding of the section now. */
2073 break;
2074
2075 prolog_length = (other_data & 0x000000FF);
2076 function_length = (other_data & 0x3FFFFF00) >> 8;
2077 flag32bit = (int)((other_data & 0x40000000) >> 30);
2078 exception_flag = (int)((other_data & 0x80000000) >> 31);
2079
2080 fputc (' ', file);
ebf12fbe
DK
2081 bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
2082 bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
2083 bfd_fprintf_vma (abfd, file, prolog_length); fputc (' ', file);
2084 bfd_fprintf_vma (abfd, file, function_length); fputc (' ', file);
799c00e0
NC
2085 fprintf (file, "%2d %2d ", flag32bit, exception_flag);
2086
2087 /* Get the exception handler's address and the data passed from the
2088 .text section. This is really the data that belongs with the .pdata
2089 but got "compressed" out for the ARM and SH4 architectures. */
2090 tsection = bfd_get_section_by_name (abfd, ".text");
2091 if (tsection && coff_section_data (abfd, tsection)
2092 && pei_section_data (abfd, tsection))
2093 {
4e1fc599
AM
2094 bfd_vma eh_off = (begin_addr - 8) - tsection->vma;
2095 bfd_byte *tdata;
799c00e0 2096
4e1fc599
AM
2097 tdata = (bfd_byte *) bfd_malloc (8);
2098 if (tdata)
2099 {
2100 if (bfd_get_section_contents (abfd, tsection, tdata, eh_off, 8))
799c00e0
NC
2101 {
2102 bfd_vma eh, eh_data;
2103
2104 eh = bfd_get_32 (abfd, tdata);
2105 eh_data = bfd_get_32 (abfd, tdata + 4);
2106 fprintf (file, "%08x ", (unsigned int) eh);
2107 fprintf (file, "%08x", (unsigned int) eh_data);
2108 if (eh != 0)
2109 {
91d6fa6a 2110 const char *s = my_symbol_for_address (abfd, eh, &cache);
799c00e0
NC
2111
2112 if (s)
2113 fprintf (file, " (%s) ", s);
2114 }
2115 }
2116 free (tdata);
2117 }
799c00e0
NC
2118 }
2119
2120 fprintf (file, "\n");
2121 }
2122
2123 free (data);
2124
91d6fa6a 2125 cleanup_syms (& cache);
799c00e0
NC
2126
2127 return TRUE;
2128#undef PDATA_ROW_SIZE
2129}
c7c7219d 2130
799c00e0 2131\f
5933bdc9 2132#define IMAGE_REL_BASED_HIGHADJ 4
1725a96e 2133static const char * const tbl[] =
7920ce38
NC
2134{
2135 "ABSOLUTE",
2136 "HIGH",
2137 "LOW",
2138 "HIGHLOW",
2139 "HIGHADJ",
2140 "MIPS_JMPADDR",
2141 "SECTION",
2142 "REL32",
2143 "RESERVED1",
2144 "MIPS_JMPADDR16",
2145 "DIR64",
2bfd55ca 2146 "HIGH3ADJ",
7920ce38
NC
2147 "UNKNOWN", /* MUST be last. */
2148};
277d1b5e 2149
b34976b6 2150static bfd_boolean
7920ce38 2151pe_print_reloc (bfd * abfd, void * vfile)
277d1b5e
ILT
2152{
2153 FILE *file = (FILE *) vfile;
2154 bfd_byte *data = 0;
2155 asection *section = bfd_get_section_by_name (abfd, ".reloc");
513ea82e 2156 bfd_byte *p, *end;
277d1b5e 2157
b69c8728 2158 if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
b34976b6 2159 return TRUE;
277d1b5e 2160
5933bdc9
ILT
2161 fprintf (file,
2162 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
277d1b5e 2163
7920ce38 2164 if (! bfd_malloc_and_get_section (abfd, section, &data))
eea6121a
AM
2165 {
2166 if (data != NULL)
2167 free (data);
2168 return FALSE;
2169 }
277d1b5e 2170
513ea82e
AM
2171 p = data;
2172 end = data + section->size;
2173 while (p + 8 <= end)
277d1b5e
ILT
2174 {
2175 int j;
2176 bfd_vma virtual_address;
2177 long number, size;
513ea82e 2178 bfd_byte *chunk_end;
277d1b5e
ILT
2179
2180 /* The .reloc section is a sequence of blocks, with a header consisting
1725a96e 2181 of two 32 bit quantities, followed by a number of 16 bit entries. */
513ea82e
AM
2182 virtual_address = bfd_get_32 (abfd, p);
2183 size = bfd_get_32 (abfd, p + 4);
2184 p += 8;
277d1b5e
ILT
2185 number = (size - 8) / 2;
2186
2187 if (size == 0)
1725a96e 2188 break;
277d1b5e
ILT
2189
2190 fprintf (file,
2191 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
0af1713e 2192 (unsigned long) virtual_address, size, (unsigned long) size, number);
277d1b5e 2193
513ea82e
AM
2194 chunk_end = p + size;
2195 if (chunk_end > end)
2196 chunk_end = end;
2197 j = 0;
2198 while (p + 2 <= chunk_end)
277d1b5e 2199 {
513ea82e 2200 unsigned short e = bfd_get_16 (abfd, p);
5933bdc9 2201 unsigned int t = (e & 0xF000) >> 12;
277d1b5e
ILT
2202 int off = e & 0x0FFF;
2203
5933bdc9
ILT
2204 if (t >= sizeof (tbl) / sizeof (tbl[0]))
2205 t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
277d1b5e 2206
5933bdc9
ILT
2207 fprintf (file,
2208 _("\treloc %4d offset %4x [%4lx] %s"),
0af1713e 2209 j, off, (unsigned long) (off + virtual_address), tbl[t]);
277d1b5e 2210
513ea82e
AM
2211 p += 2;
2212 j++;
2213
17505c5c 2214 /* HIGHADJ takes an argument, - the next record *is* the
9602af51 2215 low 16 bits of addend. */
513ea82e 2216 if (t == IMAGE_REL_BASED_HIGHADJ && p + 2 <= chunk_end)
5933bdc9 2217 {
513ea82e
AM
2218 fprintf (file, " (%4x)", (unsigned int) bfd_get_16 (abfd, p));
2219 p += 2;
6fa957a9 2220 j++;
5933bdc9 2221 }
9602af51 2222
17505c5c 2223 fprintf (file, "\n");
277d1b5e 2224 }
277d1b5e
ILT
2225 }
2226
2227 free (data);
2228
b34976b6 2229 return TRUE;
277d1b5e 2230}
5879bb8f 2231\f
3714081c
NC
2232/* A data structure describing the regions of a .rsrc section.
2233 Some fields are filled in as the section is parsed. */
2234
2235typedef struct rsrc_regions
2236{
2237 bfd_byte * section_start;
2238 bfd_byte * section_end;
2239 bfd_byte * strings_start;
2240 bfd_byte * resource_start;
2241} rsrc_regions;
277d1b5e 2242
11a6da56 2243static bfd_byte *
3714081c
NC
2244rsrc_print_resource_directory (FILE * , bfd *, unsigned int, bfd_byte *,
2245 rsrc_regions *, bfd_vma);
11a6da56 2246
20ad5e28
NC
2247/* Print the resource entry at DATA, with the text indented by INDENT.
2248 Recusively calls rsrc_print_resource_directory to print the contents
2249 of directory entries.
2250 Returns the address of the end of the data associated with the entry
2251 or section_end + 1 upon failure. */
2252
11a6da56 2253static bfd_byte *
3714081c
NC
2254rsrc_print_resource_entries (FILE * file,
2255 bfd * abfd,
2256 unsigned int indent,
2257 bfd_boolean is_name,
2258 bfd_byte * data,
2259 rsrc_regions * regions,
2260 bfd_vma rva_bias)
11a6da56
NC
2261{
2262 unsigned long entry, addr, size;
2263
3714081c
NC
2264 if (data + 8 >= regions->section_end)
2265 return regions->section_end + 1;
11a6da56 2266
3714081c 2267 fprintf (file, _("%03x %*.s Entry: "), (int)(data - regions->section_start), indent, " ");
11a6da56 2268
20ad5e28 2269 entry = (unsigned long) bfd_get_32 (abfd, data);
11a6da56
NC
2270 if (is_name)
2271 {
5879bb8f
NC
2272 bfd_byte * name;
2273
3714081c 2274 /* Note - the documentation says that this field is an RVA value
5879bb8f
NC
2275 but windres appears to produce a section relative offset with
2276 the top bit set. Support both styles for now. */
2277 if (HighBitSet (entry))
3714081c 2278 name = regions->section_start + WithoutHighBit (entry);
5879bb8f 2279 else
3714081c 2280 name = regions->section_start + entry - rva_bias;
5879bb8f 2281
20ad5e28 2282 if (name + 2 < regions->section_end && name > regions->section_start)
11a6da56
NC
2283 {
2284 unsigned int len;
3714081c
NC
2285
2286 if (regions->strings_start == NULL)
2287 regions->strings_start = name;
2288
5879bb8f 2289 len = bfd_get_16 (abfd, name);
9373215c 2290
5879bb8f 2291 fprintf (file, _("name: [val: %08lx len %d]: "), entry, len);
20ad5e28 2292
3714081c 2293 if (name + 2 + len * 2 < regions->section_end)
5879bb8f
NC
2294 {
2295 /* This strange loop is to cope with multibyte characters. */
2296 while (len --)
2297 {
20ad5e28
NC
2298 char c;
2299
5879bb8f 2300 name += 2;
20ad5e28
NC
2301 c = * name;
2302 /* Avoid printing control characters. */
2303 if (c > 0 && c < 32)
2304 fprintf (file, "^%c", c + 64);
2305 else
2306 fprintf (file, "%.1s", name);
5879bb8f
NC
2307 }
2308 }
11a6da56 2309 else
20ad5e28
NC
2310 {
2311 fprintf (file, _("<corrupt string length: %#x>\n"), len);
2312 /* PR binutils/17512: Do not try to continue decoding a
2313 corrupted resource section. It is likely to end up with
2314 reams of extraneous output. FIXME: We could probably
2315 continue if we disable the printing of strings... */
2316 return regions->section_end + 1;
2317 }
11a6da56
NC
2318 }
2319 else
20ad5e28
NC
2320 {
2321 fprintf (file, _("<corrupt string offset: %#lx>\n"), entry);
2322 return regions->section_end + 1;
2323 }
11a6da56
NC
2324 }
2325 else
2326 fprintf (file, _("ID: %#08lx"), entry);
9373215c 2327
11a6da56 2328 entry = (long) bfd_get_32 (abfd, data + 4);
5879bb8f 2329 fprintf (file, _(", Value: %#08lx\n"), entry);
11a6da56 2330
5879bb8f 2331 if (HighBitSet (entry))
20ad5e28
NC
2332 {
2333 data = regions->section_start + WithoutHighBit (entry);
2334 if (data <= regions->section_start || data > regions->section_end)
2335 return regions->section_end + 1;
2336
2337 /* FIXME: PR binutils/17512: A corrupt file could contain a loop
2338 in the resource table. We need some way to detect this. */
2339 return rsrc_print_resource_directory (file, abfd, indent + 1, data,
2340 regions, rva_bias);
2341 }
11a6da56 2342
3714081c
NC
2343 if (regions->section_start + entry + 16 >= regions->section_end)
2344 return regions->section_end + 1;
11a6da56 2345
3714081c
NC
2346 fprintf (file, _("%03x %*.s Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"),
2347 (int) (entry),
5879bb8f 2348 indent, " ",
3714081c
NC
2349 addr = (long) bfd_get_32 (abfd, regions->section_start + entry),
2350 size = (long) bfd_get_32 (abfd, regions->section_start + entry + 4),
2351 (int) bfd_get_32 (abfd, regions->section_start + entry + 8));
9373215c 2352
11a6da56 2353 /* Check that the reserved entry is 0. */
3714081c 2354 if (bfd_get_32 (abfd, regions->section_start + entry + 12) != 0
11a6da56 2355 /* And that the data address/size is valid too. */
3714081c
NC
2356 || (regions->section_start + (addr - rva_bias) + size > regions->section_end))
2357 return regions->section_end + 1;
11a6da56 2358
3714081c
NC
2359 if (regions->resource_start == NULL)
2360 regions->resource_start = regions->section_start + (addr - rva_bias);
2361
2362 return regions->section_start + (addr - rva_bias) + size;
11a6da56
NC
2363}
2364
5879bb8f
NC
2365#define max(a,b) ((a) > (b) ? (a) : (b))
2366#define min(a,b) ((a) < (b) ? (a) : (b))
2367
11a6da56 2368static bfd_byte *
3714081c
NC
2369rsrc_print_resource_directory (FILE * file,
2370 bfd * abfd,
2371 unsigned int indent,
2372 bfd_byte * data,
2373 rsrc_regions * regions,
2374 bfd_vma rva_bias)
11a6da56
NC
2375{
2376 unsigned int num_names, num_ids;
5879bb8f 2377 bfd_byte * highest_data = data;
11a6da56 2378
3714081c
NC
2379 if (data + 16 >= regions->section_end)
2380 return regions->section_end + 1;
11a6da56 2381
3714081c 2382 fprintf (file, "%03x %*.s ", (int)(data - regions->section_start), indent, " ");
11a6da56
NC
2383 switch (indent)
2384 {
2385 case 0: fprintf (file, "Type"); break;
2386 case 2: fprintf (file, "Name"); break;
2387 case 4: fprintf (file, "Language"); break;
20ad5e28
NC
2388 default:
2389 fprintf (file, _("<unknown directory type: %d>\n"), indent);
2390 /* FIXME: For now we end the printing here. If in the
2391 future more directory types are added to the RSRC spec
2392 then we will need to change this. */
2393 return regions->section_end + 1;
11a6da56
NC
2394 }
2395
2396 fprintf (file, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"),
2397 (int) bfd_get_32 (abfd, data),
2398 (long) bfd_get_32 (abfd, data + 4),
2399 (int) bfd_get_16 (abfd, data + 8),
2400 (int) bfd_get_16 (abfd, data + 10),
2401 num_names = (int) bfd_get_16 (abfd, data + 12),
2402 num_ids = (int) bfd_get_16 (abfd, data + 14));
2403 data += 16;
2404
5879bb8f 2405 while (num_names --)
11a6da56 2406 {
5879bb8f
NC
2407 bfd_byte * entry_end;
2408
2409 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, TRUE,
3714081c 2410 data, regions, rva_bias);
5879bb8f
NC
2411 data += 8;
2412 highest_data = max (highest_data, entry_end);
3714081c 2413 if (entry_end >= regions->section_end)
5879bb8f 2414 return entry_end;
11a6da56
NC
2415 }
2416
5879bb8f 2417 while (num_ids --)
11a6da56 2418 {
5879bb8f
NC
2419 bfd_byte * entry_end;
2420
2421 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, FALSE,
3714081c 2422 data, regions, rva_bias);
5879bb8f
NC
2423 data += 8;
2424 highest_data = max (highest_data, entry_end);
3714081c 2425 if (entry_end >= regions->section_end)
5879bb8f 2426 return entry_end;
11a6da56
NC
2427 }
2428
5879bb8f 2429 return max (highest_data, data);
11a6da56
NC
2430}
2431
2432/* Display the contents of a .rsrc section. We do not try to
2433 reproduce the resources, windres does that. Instead we dump
2434 the tables in a human readable format. */
2435
2436static bfd_boolean
5879bb8f 2437rsrc_print_section (bfd * abfd, void * vfile)
11a6da56
NC
2438{
2439 bfd_vma rva_bias;
2440 pe_data_type * pe;
2441 FILE * file = (FILE *) vfile;
2442 bfd_size_type datasize;
2443 asection * section;
2444 bfd_byte * data;
3714081c 2445 rsrc_regions regions;
11a6da56 2446
11a6da56 2447 pe = pe_data (abfd);
5879bb8f 2448 if (pe == NULL)
11a6da56
NC
2449 return TRUE;
2450
5879bb8f
NC
2451 section = bfd_get_section_by_name (abfd, ".rsrc");
2452 if (section == NULL)
11a6da56 2453 return TRUE;
b69c8728
JT
2454 if (!(section->flags & SEC_HAS_CONTENTS))
2455 return TRUE;
5879bb8f 2456
11a6da56
NC
2457 datasize = section->size;
2458 if (datasize == 0)
2459 return TRUE;
2460
b69c8728
JT
2461 rva_bias = section->vma - pe->pe_opthdr.ImageBase;
2462
5879bb8f 2463 if (! bfd_malloc_and_get_section (abfd, section, & data))
11a6da56
NC
2464 {
2465 if (data != NULL)
2466 free (data);
2467 return FALSE;
2468 }
3714081c
NC
2469
2470 regions.section_start = data;
2471 regions.section_end = data + datasize;
2472 regions.strings_start = NULL;
2473 regions.resource_start = NULL;
11a6da56
NC
2474
2475 fflush (file);
2476 fprintf (file, "\nThe .rsrc Resource Directory section:\n");
2477
3714081c 2478 while (data < regions.section_end)
11a6da56 2479 {
5879bb8f
NC
2480 bfd_byte * p = data;
2481
3714081c 2482 data = rsrc_print_resource_directory (file, abfd, 0, data, & regions, rva_bias);
11a6da56 2483
3714081c 2484 if (data == regions.section_end + 1)
11a6da56
NC
2485 fprintf (file, _("Corrupt .rsrc section detected!\n"));
2486 else
2487 {
2488 /* Align data before continuing. */
2489 int align = (1 << section->alignment_power) - 1;
5879bb8f 2490
b9e95fa2 2491 data = (bfd_byte *) (((ptrdiff_t) (data + align)) & ~ align);
5879bb8f 2492 rva_bias += data - p;
11a6da56
NC
2493
2494 /* For reasons that are unclear .rsrc sections are sometimes created
2495 aligned to a 1^3 boundary even when their alignment is set at
2496 1^2. Catch that case here before we issue a spurious warning
2497 message. */
3714081c
NC
2498 if (data == (regions.section_end - 4))
2499 data = regions.section_end;
2500 else if (data < regions.section_end)
c32abae8
NC
2501 {
2502 /* If the extra data is all zeros then do not complain.
2503 This is just padding so that the section meets the
2504 page size requirements. */
2505 while (data ++ < regions.section_end)
2506 if (*data != 0)
2507 break;
2508 if (data < regions.section_end)
2509 fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
2510 }
11a6da56
NC
2511 }
2512 }
2513
3714081c 2514 if (regions.strings_start != NULL)
20ad5e28 2515 fprintf (file, " String table starts at offset: %#03x\n",
08937d80 2516 (int) (regions.strings_start - regions.section_start));
3714081c 2517 if (regions.resource_start != NULL)
20ad5e28 2518 fprintf (file, " Resources start at offset: %#03x\n",
08937d80 2519 (int) (regions.resource_start - regions.section_start));
3714081c
NC
2520
2521 free (regions.section_start);
11a6da56
NC
2522 return TRUE;
2523}
2524
61e2488c
JT
2525#define IMAGE_NUMBEROF_DEBUG_TYPES 12
2526
2527static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] =
2528{
2529 "Unknown",
2530 "COFF",
2531 "CodeView",
2532 "FPO",
2533 "Misc",
2534 "Exception",
2535 "Fixup",
2536 "OMAP-to-SRC",
2537 "OMAP-from-SRC",
2538 "Borland",
2539 "Reserved",
2540 "CLSID",
2541};
2542
2543static bfd_boolean
2544pe_print_debugdata (bfd * abfd, void * vfile)
2545{
2546 FILE *file = (FILE *) vfile;
2547 pe_data_type *pe = pe_data (abfd);
2548 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
2549 asection *section;
2550 bfd_byte *data = 0;
2551 bfd_size_type dataoff;
2552 unsigned int i;
2553
2554 bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2555 bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2556
2557 if (size == 0)
2558 return TRUE;
2559
2560 addr += extra->ImageBase;
2561 for (section = abfd->sections; section != NULL; section = section->next)
2562 {
2563 if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2564 break;
2565 }
2566
2567 if (section == NULL)
2568 {
2569 fprintf (file,
2570 _("\nThere is a debug directory, but the section containing it could not be found\n"));
2571 return TRUE;
2572 }
6e6e7cfc
JT
2573 else if (!(section->flags & SEC_HAS_CONTENTS))
2574 {
2575 fprintf (file,
2576 _("\nThere is a debug directory in %s, but that section has no contents\n"),
2577 section->name);
2578 return TRUE;
2579 }
5a3f568b
NC
2580 else if (section->size < size)
2581 {
2582 fprintf (file,
2583 _("\nError: section %s contains the debug data starting address but it is too small\n"),
2584 section->name);
2585 return FALSE;
2586 }
61e2488c
JT
2587
2588 fprintf (file, _("\nThere is a debug directory in %s at 0x%lx\n\n"),
2589 section->name, (unsigned long) addr);
2590
2591 dataoff = addr - section->vma;
2592
a6f921c8
NC
2593 if (size > (section->size - dataoff))
2594 {
2595 fprintf (file, _("The debug data size field in the data directory is too big for the section"));
2596 return FALSE;
2597 }
2598
61e2488c
JT
2599 fprintf (file,
2600 _("Type Size Rva Offset\n"));
2601
5a3f568b 2602 /* Read the whole section. */
61e2488c
JT
2603 if (!bfd_malloc_and_get_section (abfd, section, &data))
2604 {
2605 if (data != NULL)
2606 free (data);
2607 return FALSE;
2608 }
2609
2610 for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2611 {
2612 const char *type_name;
2613 struct external_IMAGE_DEBUG_DIRECTORY *ext
2614 = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
2615 struct internal_IMAGE_DEBUG_DIRECTORY idd;
2616
2617 _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
2618
20ad5e28 2619 if ((idd.Type) >= IMAGE_NUMBEROF_DEBUG_TYPES)
61e2488c
JT
2620 type_name = debug_type_names[0];
2621 else
2622 type_name = debug_type_names[idd.Type];
2623
2624 fprintf (file, " %2ld %14s %08lx %08lx %08lx\n",
2625 idd.Type, type_name, idd.SizeOfData,
2626 idd.AddressOfRawData, idd.PointerToRawData);
2627
2628 if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
2629 {
2630 char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1];
2631 char buffer[256 + 1];
2632 CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
2633
2634 /* The debug entry doesn't have to have to be in a section,
2635 in which case AddressOfRawData is 0, so always use PointerToRawData. */
2636 if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData,
2637 idd.SizeOfData, cvinfo))
2638 continue;
2639
2640 for (i = 0; i < cvinfo->SignatureLength; i++)
2641 sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff);
2642
2643 fprintf (file, "(format %c%c%c%c signature %s age %ld)\n",
2644 buffer[0], buffer[1], buffer[2], buffer[3],
2645 signature, cvinfo->Age);
2646 }
2647 }
2648
2649 if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
2650 fprintf (file,
2651 _("The debug directory size is not a multiple of the debug directory entry size\n"));
2652
2653 return TRUE;
2654}
2655
277d1b5e
ILT
2656/* Print out the program headers. */
2657
b34976b6 2658bfd_boolean
7920ce38 2659_bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
277d1b5e
ILT
2660{
2661 FILE *file = (FILE *) vfile;
2662 int j;
2663 pe_data_type *pe = pe_data (abfd);
2664 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
fac41780 2665 const char *subsystem_name = NULL;
d13c9dc6 2666 const char *name;
277d1b5e
ILT
2667
2668 /* The MS dumpbin program reportedly ands with 0xff0f before
2669 printing the characteristics field. Not sure why. No reason to
2670 emulate it here. */
2671 fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
2672#undef PF
6fa957a9 2673#define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
d70270c5
BF
2674 PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
2675 PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
2676 PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
2677 PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
2678 PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
2679 PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
2680 PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words");
2681 PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
2682 PF (IMAGE_FILE_SYSTEM, "system file");
2683 PF (IMAGE_FILE_DLL, "DLL");
2684 PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
277d1b5e
ILT
2685#undef PF
2686
5933bdc9 2687 /* ctime implies '\n'. */
0b6488e2
RH
2688 {
2689 time_t t = pe->coff.timestamp;
2690 fprintf (file, "\nTime/Date\t\t%s", ctime (&t));
2691 }
d13c9dc6
L
2692
2693#ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
2694# define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
2695#endif
2696#ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2697# define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2698#endif
2699#ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2700# define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2701#endif
2702
2703 switch (i->Magic)
2704 {
2705 case IMAGE_NT_OPTIONAL_HDR_MAGIC:
2706 name = "PE32";
2707 break;
2708 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
2709 name = "PE32+";
2710 break;
2711 case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
2712 name = "ROM";
2713 break;
2714 default:
2715 name = NULL;
2716 break;
2717 }
2718 fprintf (file, "Magic\t\t\t%04x", i->Magic);
2719 if (name)
2720 fprintf (file, "\t(%s)",name);
2721 fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion);
2722 fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion);
0af1713e 2723 fprintf (file, "SizeOfCode\t\t%08lx\n", (unsigned long) i->SizeOfCode);
d13c9dc6 2724 fprintf (file, "SizeOfInitializedData\t%08lx\n",
0af1713e 2725 (unsigned long) i->SizeOfInitializedData);
d13c9dc6 2726 fprintf (file, "SizeOfUninitializedData\t%08lx\n",
0af1713e 2727 (unsigned long) i->SizeOfUninitializedData);
d13c9dc6 2728 fprintf (file, "AddressOfEntryPoint\t");
ebf12fbe 2729 bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
d13c9dc6 2730 fprintf (file, "\nBaseOfCode\t\t");
ebf12fbe 2731 bfd_fprintf_vma (abfd, file, i->BaseOfCode);
d13c9dc6
L
2732#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
2733 /* PE32+ does not have BaseOfData member! */
2734 fprintf (file, "\nBaseOfData\t\t");
ebf12fbe 2735 bfd_fprintf_vma (abfd, file, i->BaseOfData);
d13c9dc6
L
2736#endif
2737
9602af51 2738 fprintf (file, "\nImageBase\t\t");
ebf12fbe 2739 bfd_fprintf_vma (abfd, file, i->ImageBase);
9602af51 2740 fprintf (file, "\nSectionAlignment\t");
ebf12fbe 2741 bfd_fprintf_vma (abfd, file, i->SectionAlignment);
9602af51 2742 fprintf (file, "\nFileAlignment\t\t");
ebf12fbe 2743 bfd_fprintf_vma (abfd, file, i->FileAlignment);
9602af51
KH
2744 fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
2745 fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
2746 fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
2747 fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion);
2748 fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
2749 fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
0af1713e
AM
2750 fprintf (file, "Win32Version\t\t%08lx\n", (unsigned long) i->Reserved1);
2751 fprintf (file, "SizeOfImage\t\t%08lx\n", (unsigned long) i->SizeOfImage);
2752 fprintf (file, "SizeOfHeaders\t\t%08lx\n", (unsigned long) i->SizeOfHeaders);
2753 fprintf (file, "CheckSum\t\t%08lx\n", (unsigned long) i->CheckSum);
1725a96e 2754
fac41780
JW
2755 switch (i->Subsystem)
2756 {
2757 case IMAGE_SUBSYSTEM_UNKNOWN:
2758 subsystem_name = "unspecified";
2759 break;
2760 case IMAGE_SUBSYSTEM_NATIVE:
2761 subsystem_name = "NT native";
2762 break;
2763 case IMAGE_SUBSYSTEM_WINDOWS_GUI:
2764 subsystem_name = "Windows GUI";
2765 break;
2766 case IMAGE_SUBSYSTEM_WINDOWS_CUI:
2767 subsystem_name = "Windows CUI";
2768 break;
2769 case IMAGE_SUBSYSTEM_POSIX_CUI:
2770 subsystem_name = "POSIX CUI";
2771 break;
2772 case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
2773 subsystem_name = "Wince CUI";
2774 break;
d9118602 2775 // These are from UEFI Platform Initialization Specification 1.1.
fac41780
JW
2776 case IMAGE_SUBSYSTEM_EFI_APPLICATION:
2777 subsystem_name = "EFI application";
2778 break;
2779 case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
2780 subsystem_name = "EFI boot service driver";
2781 break;
2782 case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
9602af51 2783 subsystem_name = "EFI runtime driver";
fac41780 2784 break;
d9118602
L
2785 case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
2786 subsystem_name = "SAL runtime driver";
6c73cbb1 2787 break;
d9118602 2788 // This is from revision 8.0 of the MS PE/COFF spec
6c73cbb1
NC
2789 case IMAGE_SUBSYSTEM_XBOX:
2790 subsystem_name = "XBOX";
2791 break;
2792 // Added default case for clarity - subsystem_name is NULL anyway.
2793 default:
2794 subsystem_name = NULL;
fac41780 2795 }
1725a96e 2796
9602af51 2797 fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
fac41780
JW
2798 if (subsystem_name)
2799 fprintf (file, "\t(%s)", subsystem_name);
9602af51
KH
2800 fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
2801 fprintf (file, "SizeOfStackReserve\t");
ebf12fbe 2802 bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve);
9602af51 2803 fprintf (file, "\nSizeOfStackCommit\t");
ebf12fbe 2804 bfd_fprintf_vma (abfd, file, i->SizeOfStackCommit);
9602af51 2805 fprintf (file, "\nSizeOfHeapReserve\t");
ebf12fbe 2806 bfd_fprintf_vma (abfd, file, i->SizeOfHeapReserve);
9602af51 2807 fprintf (file, "\nSizeOfHeapCommit\t");
ebf12fbe 2808 bfd_fprintf_vma (abfd, file, i->SizeOfHeapCommit);
0af1713e
AM
2809 fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
2810 fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
2811 (unsigned long) i->NumberOfRvaAndSizes);
277d1b5e 2812
9602af51 2813 fprintf (file, "\nThe Data Directory\n");
277d1b5e
ILT
2814 for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
2815 {
2816 fprintf (file, "Entry %1x ", j);
ebf12fbe 2817 bfd_fprintf_vma (abfd, file, i->DataDirectory[j].VirtualAddress);
0af1713e 2818 fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
277d1b5e
ILT
2819 fprintf (file, "%s\n", dir_names[j]);
2820 }
2821
2822 pe_print_idata (abfd, vfile);
2823 pe_print_edata (abfd, vfile);
2b5c217d
NC
2824 if (bfd_coff_have_print_pdata (abfd))
2825 bfd_coff_print_pdata (abfd, vfile);
2826 else
2827 pe_print_pdata (abfd, vfile);
277d1b5e 2828 pe_print_reloc (abfd, vfile);
61e2488c 2829 pe_print_debugdata (abfd, file);
277d1b5e 2830
5879bb8f 2831 rsrc_print_section (abfd, vfile);
9373215c 2832
b34976b6 2833 return TRUE;
277d1b5e
ILT
2834}
2835
6e6e7cfc
JT
2836static bfd_boolean
2837is_vma_in_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
2838{
2839 bfd_vma addr = * (bfd_vma *) obj;
2840 return (addr >= sect->vma) && (addr < (sect->vma + sect->size));
2841}
2842
2843static asection *
2844find_section_by_vma (bfd *abfd, bfd_vma addr)
2845{
2846 return bfd_sections_find_if (abfd, is_vma_in_section, (void *) & addr);
2847}
2848
277d1b5e
ILT
2849/* Copy any private info we understand from the input bfd
2850 to the output bfd. */
2851
b34976b6 2852bfd_boolean
7920ce38 2853_bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
277d1b5e 2854{
4be8cddc
L
2855 pe_data_type *ipe, *ope;
2856
277d1b5e
ILT
2857 /* One day we may try to grok other private data. */
2858 if (ibfd->xvec->flavour != bfd_target_coff_flavour
2859 || obfd->xvec->flavour != bfd_target_coff_flavour)
b34976b6 2860 return TRUE;
277d1b5e 2861
4be8cddc
L
2862 ipe = pe_data (ibfd);
2863 ope = pe_data (obfd);
4e1fc599 2864
325c681d 2865 /* pe_opthdr is copied in copy_object. */
4be8cddc
L
2866 ope->dll = ipe->dll;
2867
2868 /* Don't copy input subsystem if output is different from input. */
2869 if (obfd->xvec != ibfd->xvec)
2870 ope->pe_opthdr.Subsystem = IMAGE_SUBSYSTEM_UNKNOWN;
277d1b5e 2871
1725a96e 2872 /* For strip: if we removed .reloc, we'll make a real mess of things
5933bdc9
ILT
2873 if we don't remove this entry as well. */
2874 if (! pe_data (obfd)->has_reloc_section)
2875 {
6c73cbb1
NC
2876 pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
2877 pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
5933bdc9 2878 }
441f34fa
L
2879
2880 /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
2881 But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
2882 won't be added. */
2883 if (! pe_data (ibfd)->has_reloc_section
2884 && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
2885 pe_data (obfd)->dont_strip_reloc = 1;
2886
6e6e7cfc
JT
2887 /* The file offsets contained in the debug directory need rewriting. */
2888 if (ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size != 0)
2889 {
2890 bfd_vma addr = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
2891 + ope->pe_opthdr.ImageBase;
2892 asection *section = find_section_by_vma (obfd, addr);
2893 bfd_byte *data;
2894
2895 if (section && bfd_malloc_and_get_section (obfd, section, &data))
2896 {
2897 unsigned int i;
2898 struct external_IMAGE_DEBUG_DIRECTORY *dd =
2899 (struct external_IMAGE_DEBUG_DIRECTORY *)(data + (addr - section->vma));
2900
2901 for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
2902 / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2903 {
2904 asection *ddsection;
2905 struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]);
2906 struct internal_IMAGE_DEBUG_DIRECTORY idd;
2907
2908 _bfd_XXi_swap_debugdir_in (obfd, edd, &idd);
2909
2910 if (idd.AddressOfRawData == 0)
2911 continue; /* RVA 0 means only offset is valid, not handled yet. */
2912
2913 ddsection = find_section_by_vma (obfd, idd.AddressOfRawData + ope->pe_opthdr.ImageBase);
2914 if (!ddsection)
2915 continue; /* Not in a section! */
2916
2917 idd.PointerToRawData = ddsection->filepos + (idd.AddressOfRawData
2918 + ope->pe_opthdr.ImageBase) - ddsection->vma;
2919
2920 _bfd_XXi_swap_debugdir_out (obfd, &idd, edd);
2921 }
2922
2923 if (!bfd_set_section_contents (obfd, section, data, 0, section->size))
2924 _bfd_error_handler (_("Failed to update file offsets in debug directory"));
2925 }
2926 }
2927
b34976b6 2928 return TRUE;
277d1b5e
ILT
2929}
2930
9602af51 2931/* Copy private section data. */
1725a96e 2932
b34976b6 2933bfd_boolean
7920ce38
NC
2934_bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
2935 asection *isec,
2936 bfd *obfd,
2937 asection *osec)
277d1b5e
ILT
2938{
2939 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
2940 || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
b34976b6 2941 return TRUE;
277d1b5e
ILT
2942
2943 if (coff_section_data (ibfd, isec) != NULL
2944 && pei_section_data (ibfd, isec) != NULL)
2945 {
2946 if (coff_section_data (obfd, osec) == NULL)
2947 {
dc810e39 2948 bfd_size_type amt = sizeof (struct coff_section_tdata);
7920ce38 2949 osec->used_by_bfd = bfd_zalloc (obfd, amt);
277d1b5e 2950 if (osec->used_by_bfd == NULL)
b34976b6 2951 return FALSE;
277d1b5e 2952 }
1725a96e 2953
277d1b5e
ILT
2954 if (pei_section_data (obfd, osec) == NULL)
2955 {
dc810e39 2956 bfd_size_type amt = sizeof (struct pei_section_tdata);
7920ce38 2957 coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt);
277d1b5e 2958 if (coff_section_data (obfd, osec)->tdata == NULL)
b34976b6 2959 return FALSE;
277d1b5e 2960 }
1725a96e 2961
277d1b5e
ILT
2962 pei_section_data (obfd, osec)->virt_size =
2963 pei_section_data (ibfd, isec)->virt_size;
5933bdc9 2964 pei_section_data (obfd, osec)->pe_flags =
6fa957a9 2965 pei_section_data (ibfd, isec)->pe_flags;
277d1b5e
ILT
2966 }
2967
b34976b6 2968 return TRUE;
277d1b5e 2969}
7d2b58d6
ILT
2970
2971void
7920ce38 2972_bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
7d2b58d6
ILT
2973{
2974 coff_get_symbol_info (abfd, symbol, ret);
7d2b58d6 2975}
2fbadf2c 2976
5174d0fb
KT
2977#if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
2978static int
2979sort_x64_pdata (const void *l, const void *r)
2980{
2981 const char *lp = (const char *) l;
2982 const char *rp = (const char *) r;
2983 bfd_vma vl, vr;
2984 vl = bfd_getl32 (lp); vr = bfd_getl32 (rp);
2985 if (vl != vr)
2986 return (vl < vr ? -1 : 1);
2987 /* We compare just begin address. */
2988 return 0;
2989}
2990#endif
5879bb8f
NC
2991\f
2992/* Functions to process a .rsrc section. */
2993
2994static unsigned int sizeof_leaves;
2995static unsigned int sizeof_strings;
2996static unsigned int sizeof_tables_and_entries;
2997
2998static bfd_byte *
2999rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma);
3000
3001static bfd_byte *
3002rsrc_count_entries (bfd * abfd,
3003 bfd_boolean is_name,
3004 bfd_byte * datastart,
3005 bfd_byte * data,
3006 bfd_byte * dataend,
3007 bfd_vma rva_bias)
3008{
3009 unsigned long entry, addr, size;
3010
3011 if (data + 8 >= dataend)
3012 return dataend + 1;
3013
3014 if (is_name)
3015 {
3016 bfd_byte * name;
3017
3018 entry = (long) bfd_get_32 (abfd, data);
3019
3020 if (HighBitSet (entry))
3021 name = datastart + WithoutHighBit (entry);
3022 else
3023 name = datastart + entry - rva_bias;
3024
20ad5e28 3025 if (name + 2 >= dataend || name < datastart)
5879bb8f
NC
3026 return dataend + 1;
3027
3028 unsigned int len = bfd_get_16 (abfd, name);
3029 if (len == 0 || len > 256)
3030 return dataend + 1;
5879bb8f
NC
3031 }
3032
3033 entry = (long) bfd_get_32 (abfd, data + 4);
3034
3035 if (HighBitSet (entry))
20ad5e28
NC
3036 {
3037 data = datastart + WithoutHighBit (entry);
3038
3039 if (data <= datastart || data >= dataend)
3040 return dataend + 1;
3041
3042 return rsrc_count_directory (abfd, datastart, data, dataend, rva_bias);
3043 }
5879bb8f
NC
3044
3045 if (datastart + entry + 16 >= dataend)
3046 return dataend + 1;
3047
3048 addr = (long) bfd_get_32 (abfd, datastart + entry);
3049 size = (long) bfd_get_32 (abfd, datastart + entry + 4);
3050
5879bb8f
NC
3051 return datastart + addr - rva_bias + size;
3052}
9373215c 3053
5879bb8f
NC
3054static bfd_byte *
3055rsrc_count_directory (bfd * abfd,
3056 bfd_byte * datastart,
3057 bfd_byte * data,
3058 bfd_byte * dataend,
3059 bfd_vma rva_bias)
3060{
3061 unsigned int num_entries, num_ids;
3062 bfd_byte * highest_data = data;
3063
3064 if (data + 16 >= dataend)
3065 return dataend + 1;
3066
3067 num_entries = (int) bfd_get_16 (abfd, data + 12);
3068 num_ids = (int) bfd_get_16 (abfd, data + 14);
3069
3070 num_entries += num_ids;
3071
3072 data += 16;
5879bb8f
NC
3073
3074 while (num_entries --)
3075 {
3076 bfd_byte * entry_end;
3077
3078 entry_end = rsrc_count_entries (abfd, num_entries >= num_ids,
3079 datastart, data, dataend, rva_bias);
3080 data += 8;
5879bb8f
NC
3081 highest_data = max (highest_data, entry_end);
3082 if (entry_end >= dataend)
3083 break;
3084 }
3085
3086 return max (highest_data, data);
3087}
3088
3089typedef struct rsrc_dir_chain
3090{
3091 unsigned int num_entries;
3092 struct rsrc_entry * first_entry;
3093 struct rsrc_entry * last_entry;
3094} rsrc_dir_chain;
3095
3096typedef struct rsrc_directory
3097{
3098 unsigned int characteristics;
3099 unsigned int time;
3100 unsigned int major;
3101 unsigned int minor;
3102
3103 rsrc_dir_chain names;
3104 rsrc_dir_chain ids;
3105
3106 struct rsrc_entry * entry;
3107} rsrc_directory;
3108
3109typedef struct rsrc_string
3110{
3111 unsigned int len;
3112 bfd_byte * string;
3113} rsrc_string;
9373215c 3114
5879bb8f
NC
3115typedef struct rsrc_leaf
3116{
3117 unsigned int size;
3118 unsigned int codepage;
3119 bfd_byte * data;
3120} rsrc_leaf;
3121
3122typedef struct rsrc_entry
3123{
3124 bfd_boolean is_name;
3125 union
3126 {
3127 unsigned int id;
3128 struct rsrc_string name;
3129 } name_id;
3130
3131 bfd_boolean is_dir;
3132 union
3133 {
3134 struct rsrc_directory * directory;
3135 struct rsrc_leaf * leaf;
3136 } value;
3137
3138 struct rsrc_entry * next_entry;
3139 struct rsrc_directory * parent;
3140} rsrc_entry;
3141
3142static bfd_byte *
3143rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *,
3144 bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *);
3145
3146static bfd_byte *
3147rsrc_parse_entry (bfd * abfd,
3148 bfd_boolean is_name,
3149 rsrc_entry * entry,
3150 bfd_byte * datastart,
3151 bfd_byte * data,
3152 bfd_byte * dataend,
3153 bfd_vma rva_bias,
3154 rsrc_directory * parent)
3155{
3156 unsigned long val, addr, size;
3157
3158 val = bfd_get_32 (abfd, data);
3159
3160 entry->parent = parent;
3161 entry->is_name = is_name;
3162
3163 if (is_name)
3164 {
20ad5e28
NC
3165 bfd_byte * address;
3166
5879bb8f
NC
3167 if (HighBitSet (val))
3168 {
3169 val = WithoutHighBit (val);
3170
20ad5e28 3171 address = datastart + val;
5879bb8f
NC
3172 }
3173 else
3174 {
20ad5e28 3175 address = datastart + val - rva_bias;
5879bb8f 3176 }
20ad5e28
NC
3177
3178 if (address + 3 > dataend)
3179 return dataend;
3180
3181 entry->name_id.name.len = bfd_get_16 (abfd, address);
3182 entry->name_id.name.string = address + 2;
5879bb8f
NC
3183 }
3184 else
3185 entry->name_id.id = val;
3186
3187 val = bfd_get_32 (abfd, data + 4);
3188
3189 if (HighBitSet (val))
3190 {
3191 entry->is_dir = TRUE;
3192 entry->value.directory = bfd_malloc (sizeof * entry->value.directory);
3193 if (entry->value.directory == NULL)
3194 return dataend;
3195
3196 return rsrc_parse_directory (abfd, entry->value.directory,
3197 datastart,
3198 datastart + WithoutHighBit (val),
3199 dataend, rva_bias, entry);
3200 }
3201
3202 entry->is_dir = FALSE;
3203 entry->value.leaf = bfd_malloc (sizeof * entry->value.leaf);
3204 if (entry->value.leaf == NULL)
3205 return dataend;
3206
3207 addr = bfd_get_32 (abfd, datastart + val);
3208 size = entry->value.leaf->size = bfd_get_32 (abfd, datastart + val + 4);
3209 entry->value.leaf->codepage = bfd_get_32 (abfd, datastart + val + 8);
3210
3211 entry->value.leaf->data = bfd_malloc (size);
3212 if (entry->value.leaf->data == NULL)
3213 return dataend;
3214
3215 memcpy (entry->value.leaf->data, datastart + addr - rva_bias, size);
3216 return datastart + (addr - rva_bias) + size;
3217}
3218
3219static bfd_byte *
3220rsrc_parse_entries (bfd * abfd,
3221 rsrc_dir_chain * chain,
3222 bfd_boolean is_name,
3223 bfd_byte * highest_data,
3224 bfd_byte * datastart,
3225 bfd_byte * data,
3226 bfd_byte * dataend,
3227 bfd_vma rva_bias,
3228 rsrc_directory * parent)
3229{
9373215c 3230 unsigned int i;
5879bb8f
NC
3231 rsrc_entry * entry;
3232
3233 if (chain->num_entries == 0)
3234 {
3235 chain->first_entry = chain->last_entry = NULL;
3236 return highest_data;
3237 }
3238
3239 entry = bfd_malloc (sizeof * entry);
3240 if (entry == NULL)
3241 return dataend;
3242
3243 chain->first_entry = entry;
3244
5879bb8f
NC
3245 for (i = chain->num_entries; i--;)
3246 {
3247 bfd_byte * entry_end;
3248
3249 entry_end = rsrc_parse_entry (abfd, is_name, entry, datastart,
3250 data, dataend, rva_bias, parent);
3251 data += 8;
3252 highest_data = max (entry_end, highest_data);
3253 if (entry_end > dataend)
3254 return dataend;
3255
3256 if (i)
3257 {
3258 entry->next_entry = bfd_malloc (sizeof * entry);
3259 entry = entry->next_entry;
3260 if (entry == NULL)
3261 return dataend;
3262 }
3263 else
3264 entry->next_entry = NULL;
3265 }
3266
3267 chain->last_entry = entry;
3268
3269 return highest_data;
3270}
3271
3272static bfd_byte *
3273rsrc_parse_directory (bfd * abfd,
3274 rsrc_directory * table,
3275 bfd_byte * datastart,
3276 bfd_byte * data,
3277 bfd_byte * dataend,
3278 bfd_vma rva_bias,
3279 rsrc_entry * entry)
3280{
3281 bfd_byte * highest_data = data;
3282
3283 if (table == NULL)
3284 return dataend;
3285
3286 table->characteristics = bfd_get_32 (abfd, data);
3287 table->time = bfd_get_32 (abfd, data + 4);
3288 table->major = bfd_get_16 (abfd, data + 8);
3289 table->minor = bfd_get_16 (abfd, data + 10);
3290 table->names.num_entries = bfd_get_16 (abfd, data + 12);
3291 table->ids.num_entries = bfd_get_16 (abfd, data + 14);
3292 table->entry = entry;
3293
3294 data += 16;
3295
3296 highest_data = rsrc_parse_entries (abfd, & table->names, TRUE, data,
3297 datastart, data, dataend, rva_bias, table);
3298 data += table->names.num_entries * 8;
3299
3300 highest_data = rsrc_parse_entries (abfd, & table->ids, FALSE, highest_data,
3301 datastart, data, dataend, rva_bias, table);
3302 data += table->ids.num_entries * 8;
3303
3304 return max (highest_data, data);
3305}
3306
3307typedef struct rsrc_write_data
3308{
3309 bfd * abfd;
3310 bfd_byte * datastart;
3311 bfd_byte * next_table;
3312 bfd_byte * next_leaf;
3313 bfd_byte * next_string;
3314 bfd_byte * next_data;
3315 bfd_vma rva_bias;
9373215c
PM
3316} rsrc_write_data;
3317
5879bb8f
NC
3318static void
3319rsrc_write_string (rsrc_write_data * data,
3320 rsrc_string * string)
3321{
3322 bfd_put_16 (data->abfd, string->len, data->next_string);
3323 memcpy (data->next_string + 2, string->string, string->len * 2);
3324 data->next_string += (string->len + 1) * 2;
3325}
3326
3327static inline unsigned int
3328rsrc_compute_rva (rsrc_write_data * data,
3329 bfd_byte * addr)
3330{
3331 return (addr - data->datastart) + data->rva_bias;
3332}
3333
3334static void
3335rsrc_write_leaf (rsrc_write_data * data,
3336 rsrc_leaf * leaf)
3337{
9373215c
PM
3338 bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data),
3339 data->next_leaf);
5879bb8f
NC
3340 bfd_put_32 (data->abfd, leaf->size, data->next_leaf + 4);
3341 bfd_put_32 (data->abfd, leaf->codepage, data->next_leaf + 8);
3342 bfd_put_32 (data->abfd, 0 /*reserved*/, data->next_leaf + 12);
3343 data->next_leaf += 16;
3344
3345 memcpy (data->next_data, leaf->data, leaf->size);
3714081c
NC
3346 /* An undocumented feature of Windows resources is that each unit
3347 of raw data is 8-byte aligned... */
3348 data->next_data += ((leaf->size + 7) & ~7);
5879bb8f
NC
3349}
3350
3351static void rsrc_write_directory (rsrc_write_data *, rsrc_directory *);
3352
3353static void
3354rsrc_write_entry (rsrc_write_data * data,
3355 bfd_byte * where,
3356 rsrc_entry * entry)
3357{
3358 if (entry->is_name)
3359 {
3360 bfd_put_32 (data->abfd,
3361 SetHighBit (data->next_string - data->datastart),
3362 where);
3363 rsrc_write_string (data, & entry->name_id.name);
3364 }
3365 else
3366 bfd_put_32 (data->abfd, entry->name_id.id, where);
3367
3368 if (entry->is_dir)
3369 {
3370 bfd_put_32 (data->abfd,
3371 SetHighBit (data->next_table - data->datastart),
3372 where + 4);
3373 rsrc_write_directory (data, entry->value.directory);
3374 }
3375 else
3376 {
3377 bfd_put_32 (data->abfd, data->next_leaf - data->datastart, where + 4);
3378 rsrc_write_leaf (data, entry->value.leaf);
3379 }
3380}
3381
3714081c
NC
3382static void
3383rsrc_compute_region_sizes (rsrc_directory * dir)
3384{
3385 struct rsrc_entry * entry;
3386
3387 if (dir == NULL)
3388 return;
3389
3390 sizeof_tables_and_entries += 16;
3391
3392 for (entry = dir->names.first_entry; entry != NULL; entry = entry->next_entry)
3393 {
3394 sizeof_tables_and_entries += 8;
3395
3396 sizeof_strings += (entry->name_id.name.len + 1) * 2;
3397
3398 if (entry->is_dir)
3399 rsrc_compute_region_sizes (entry->value.directory);
3400 else
3401 sizeof_leaves += 16;
3402 }
3403
3404 for (entry = dir->ids.first_entry; entry != NULL; entry = entry->next_entry)
3405 {
3406 sizeof_tables_and_entries += 8;
3407
3408 if (entry->is_dir)
3409 rsrc_compute_region_sizes (entry->value.directory);
3410 else
3411 sizeof_leaves += 16;
3412 }
3413}
3414
5879bb8f
NC
3415static void
3416rsrc_write_directory (rsrc_write_data * data,
3417 rsrc_directory * dir)
3418{
3419 rsrc_entry * entry;
3420 unsigned int i;
9373215c
PM
3421 bfd_byte * next_entry;
3422 bfd_byte * nt;
5879bb8f
NC
3423
3424 bfd_put_32 (data->abfd, dir->characteristics, data->next_table);
3425 bfd_put_32 (data->abfd, 0 /*dir->time*/, data->next_table + 4);
3426 bfd_put_16 (data->abfd, dir->major, data->next_table + 8);
3427 bfd_put_16 (data->abfd, dir->minor, data->next_table + 10);
3428 bfd_put_16 (data->abfd, dir->names.num_entries, data->next_table + 12);
3429 bfd_put_16 (data->abfd, dir->ids.num_entries, data->next_table + 14);
3430
3431 /* Compute where the entries and the next table will be placed. */
9373215c
PM
3432 next_entry = data->next_table + 16;
3433 data->next_table = next_entry + (dir->names.num_entries * 8)
3434 + (dir->ids.num_entries * 8);
3435 nt = data->next_table;
3436
5879bb8f
NC
3437 /* Write the entries. */
3438 for (i = dir->names.num_entries, entry = dir->names.first_entry;
3439 i > 0 && entry != NULL;
3440 i--, entry = entry->next_entry)
3441 {
3714081c 3442 BFD_ASSERT (entry->is_name);
5879bb8f
NC
3443 rsrc_write_entry (data, next_entry, entry);
3444 next_entry += 8;
3445 }
3446 BFD_ASSERT (i == 0);
3447 BFD_ASSERT (entry == NULL);
3448
3449 for (i = dir->ids.num_entries, entry = dir->ids.first_entry;
3450 i > 0 && entry != NULL;
3451 i--, entry = entry->next_entry)
3452 {
3714081c 3453 BFD_ASSERT (! entry->is_name);
5879bb8f
NC
3454 rsrc_write_entry (data, next_entry, entry);
3455 next_entry += 8;
3456 }
3457 BFD_ASSERT (i == 0);
3458 BFD_ASSERT (entry == NULL);
3459 BFD_ASSERT (nt == next_entry);
3460}
3461
9373215c 3462#if defined HAVE_WCHAR_H && ! defined __CYGWIN__ && ! defined __MINGW32__
5879bb8f
NC
3463/* Return the length (number of units) of the first character in S,
3464 putting its 'ucs4_t' representation in *PUC. */
3465
3466static unsigned int
3467u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n)
3468{
3469 unsigned short c = * s;
3470
3471 if (c < 0xd800 || c >= 0xe000)
3472 {
3473 *puc = c;
3474 return 1;
3475 }
3476
3477 if (c < 0xdc00)
3478 {
3479 if (n >= 2)
3480 {
3481 if (s[1] >= 0xdc00 && s[1] < 0xe000)
3482 {
3483 *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
3484 return 2;
3485 }
3486 }
3487 else
3488 {
3489 /* Incomplete multibyte character. */
3490 *puc = 0xfffd;
3491 return n;
3492 }
3493 }
3494
3495 /* Invalid multibyte character. */
3496 *puc = 0xfffd;
3497 return 1;
3498}
9373215c 3499#endif /* HAVE_WCHAR_H and not Cygwin/Mingw */
5879bb8f
NC
3500
3501/* Perform a comparison of two entries. */
3502static signed int
3503rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b)
3504{
9373215c 3505 signed int res;
9373215c
PM
3506 bfd_byte * astring;
3507 unsigned int alen;
3508 bfd_byte * bstring;
3509 unsigned int blen;
3510
5879bb8f 3511 if (! is_name)
9373215c 3512 return a->name_id.id - b->name_id.id;
5879bb8f
NC
3513
3514 /* We have to perform a case insenstive, unicode string comparison... */
9373215c
PM
3515 astring = a->name_id.name.string;
3516 alen = a->name_id.name.len;
3517 bstring = b->name_id.name.string;
3518 blen = b->name_id.name.len;
5879bb8f 3519
9373215c
PM
3520#if defined __CYGWIN__ || defined __MINGW32__
3521 /* Under Windows hosts (both Cygwin and Mingw types),
3522 unicode == UTF-16 == wchar_t. The case insensitive string comparison
3523 function however goes by different names in the two environments... */
3524
3525#undef rscpcmp
5879bb8f 3526#ifdef __CYGWIN__
9373215c
PM
3527#define rscpcmp wcsncasecmp
3528#endif
3529#ifdef __MINGW32__
3530#define rscpcmp wcsnicmp
3531#endif
3532
3533 res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring,
3534 min (alen, blen));
5879bb8f 3535
9373215c 3536#elif defined HAVE_WCHAR_H
3f10b67a
PM
3537 {
3538 unsigned int i;
3539 res = 0;
3540 for (i = min (alen, blen); i--; astring += 2, bstring += 2)
3541 {
3542 wchar_t awc;
3543 wchar_t bwc;
3544
3545 /* Convert UTF-16 unicode characters into wchar_t characters so
3546 that we can then perform a case insensitive comparison. */
3547 int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
3548 int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
3549
3550 if (Alen != Blen)
3551 return Alen - Blen;
3552 res = wcsncasecmp (& awc, & bwc, 1);
3553 if (res)
3554 break;
3555 }
3556 }
5879bb8f 3557#else
9373215c
PM
3558 /* Do the best we can - a case sensitive, untranslated comparison. */
3559 res = memcmp (astring, bstring, min (alen, blen) * 2);
5879bb8f
NC
3560#endif
3561
3562 if (res == 0)
3563 res = alen - blen;
3564
3565 return res;
3566}
3567
3568static void
3569rsrc_print_name (char * buffer, rsrc_string string)
3570{
3571 unsigned int i;
3572 bfd_byte * name = string.string;
3573
3574 for (i = string.len; i--; name += 2)
3575 sprintf (buffer + strlen (buffer), "%.1s", name);
3576}
3577
3578static const char *
3579rsrc_resource_name (rsrc_entry * entry, rsrc_directory * dir)
3580{
3581 static char buffer [256];
3582 bfd_boolean is_string = FALSE;
3583
3584 buffer[0] = 0;
3585
9373215c
PM
3586 if (dir != NULL && dir->entry != NULL && dir->entry->parent != NULL
3587 && dir->entry->parent->entry != NULL)
5879bb8f
NC
3588 {
3589 strcpy (buffer, "type: ");
3590 if (dir->entry->parent->entry->is_name)
9373215c
PM
3591 rsrc_print_name (buffer + strlen (buffer),
3592 dir->entry->parent->entry->name_id.name);
5879bb8f
NC
3593 else
3594 {
3595 unsigned int id = dir->entry->parent->entry->name_id.id;
3596
3597 sprintf (buffer + strlen (buffer), "%x", id);
3598 switch (id)
3599 {
3600 case 1: strcat (buffer, " (CURSOR)"); break;
3601 case 2: strcat (buffer, " (BITMAP)"); break;
3602 case 3: strcat (buffer, " (ICON)"); break;
3603 case 4: strcat (buffer, " (MENU)"); break;
3604 case 5: strcat (buffer, " (DIALOG)"); break;
3605 case 6: strcat (buffer, " (STRING)"); is_string = TRUE; break;
3606 case 7: strcat (buffer, " (FONTDIR)"); break;
3607 case 8: strcat (buffer, " (FONT)"); break;
3608 case 9: strcat (buffer, " (ACCELERATOR)"); break;
3609 case 10: strcat (buffer, " (RCDATA)"); break;
3610 case 11: strcat (buffer, " (MESSAGETABLE)"); break;
3611 case 12: strcat (buffer, " (GROUP_CURSOR)"); break;
3612 case 14: strcat (buffer, " (GROUP_ICON)"); break;
3613 case 16: strcat (buffer, " (VERSION)"); break;
3614 case 17: strcat (buffer, " (DLGINCLUDE)"); break;
3615 case 19: strcat (buffer, " (PLUGPLAY)"); break;
3616 case 20: strcat (buffer, " (VXD)"); break;
3617 case 21: strcat (buffer, " (ANICURSOR)"); break;
3618 case 22: strcat (buffer, " (ANIICON)"); break;
3619 case 23: strcat (buffer, " (HTML)"); break;
3620 case 24: strcat (buffer, " (MANIFEST)"); break;
3621 case 240: strcat (buffer, " (DLGINIT)"); break;
3622 case 241: strcat (buffer, " (TOOLBAR)"); break;
3623 }
3624 }
3625 }
3626
3627 if (dir != NULL && dir->entry != NULL)
3628 {
3629 strcat (buffer, " name: ");
3630 if (dir->entry->is_name)
3631 rsrc_print_name (buffer + strlen (buffer), dir->entry->name_id.name);
3632 else
3633 {
3634 unsigned int id = dir->entry->name_id.id;
3635
3636 sprintf (buffer + strlen (buffer), "%x", id);
3637
3638 if (is_string)
3639 sprintf (buffer + strlen (buffer), " (resource id range: %d - %d)",
3640 (id - 1) << 4, (id << 4) - 1);
3641 }
3642 }
3643
3644 if (entry != NULL)
3645 {
3646 strcat (buffer, " lang: ");
3647
3648 if (entry->is_name)
3649 rsrc_print_name (buffer + strlen (buffer), entry->name_id.name);
3650 else
3651 sprintf (buffer + strlen (buffer), "%x", entry->name_id.id);
3652 }
3653
3654 return buffer;
3655}
3656
3657/* *sigh* Windows resource strings are special. Only the top 28-bits of
3658 their ID is stored in the NAME entry. The bottom four bits are used as
3659 an index into unicode string table that makes up the data of the leaf.
3660 So identical type-name-lang string resources may not actually be
3661 identical at all.
3662
3663 This function is called when we have detected two string resources with
3664 match top-28-bit IDs. We have to scan the string tables inside the leaves
3665 and discover if there are any real collisions. If there are then we report
9373215c
PM
3666 them and return FALSE. Otherwise we copy any strings from B into A and
3667 then return TRUE. */
5879bb8f
NC
3668
3669static bfd_boolean
3670rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED,
3671 rsrc_entry * b ATTRIBUTE_UNUSED)
3672{
3673 unsigned int copy_needed = 0;
3674 unsigned int i;
9373215c
PM
3675 bfd_byte * astring;
3676 bfd_byte * bstring;
3677 bfd_byte * new_data;
3678 bfd_byte * nstring;
5879bb8f
NC
3679
3680 /* Step one: Find out what we have to do. */
3681 BFD_ASSERT (! a->is_dir);
9373215c 3682 astring = a->value.leaf->data;
5879bb8f
NC
3683
3684 BFD_ASSERT (! b->is_dir);
9373215c 3685 bstring = b->value.leaf->data;
5879bb8f
NC
3686
3687 for (i = 0; i < 16; i++)
3688 {
3689 unsigned int alen = astring[0] + (astring[1] << 8);
3690 unsigned int blen = bstring[0] + (bstring[1] << 8);
3691
3692 if (alen == 0)
3693 {
3694 copy_needed += blen * 2;
3695 }
3696 else if (blen == 0)
3697 ;
3698 else if (alen != blen)
3699 /* FIXME: Should we continue the loop in order to report other duplicates ? */
3700 break;
3701 /* alen == blen != 0. We might have two identical strings. If so we
3702 can ignore the second one. There is no need for wchar_t vs UTF-16
3703 theatrics here - we are only interested in (case sensitive) equality. */
3704 else if (memcmp (astring + 2, bstring + 2, alen * 2) != 0)
3705 break;
3706
3707 astring += (alen + 1) * 2;
3708 bstring += (blen + 1) * 2;
3709 }
3710
3711 if (i != 16)
3712 {
3713 if (a->parent != NULL
3714 && a->parent->entry != NULL
3715 && a->parent->entry->is_name == FALSE)
3716 _bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"),
3717 ((a->parent->entry->name_id.id - 1) << 4) + i);
3718 return FALSE;
3719 }
3720
3721 if (copy_needed == 0)
3722 return TRUE;
3723
3724 /* If we reach here then A and B must both have non-colliding strings.
3725 (We never get string resources with fully empty string tables).
3726 We need to allocate an extra COPY_NEEDED bytes in A and then bring
3727 in B's strings. */
9373215c 3728 new_data = bfd_malloc (a->value.leaf->size + copy_needed);
5879bb8f
NC
3729 if (new_data == NULL)
3730 return FALSE;
3731
9373215c 3732 nstring = new_data;
5879bb8f
NC
3733 astring = a->value.leaf->data;
3734 bstring = b->value.leaf->data;
3735
3736 for (i = 0; i < 16; i++)
3737 {
3738 unsigned int alen = astring[0] + (astring[1] << 8);
3739 unsigned int blen = bstring[0] + (bstring[1] << 8);
3740
3741 if (alen != 0)
3742 {
3743 memcpy (nstring, astring, (alen + 1) * 2);
3744 nstring += (alen + 1) * 2;
3745 }
3746 else if (blen != 0)
3747 {
3748 memcpy (nstring, bstring, (blen + 1) * 2);
3749 nstring += (blen + 1) * 2;
3750 }
3751 else
3752 {
3753 * nstring++ = 0;
3754 * nstring++ = 0;
3755 }
9373215c 3756
5879bb8f
NC
3757 astring += (alen + 1) * 2;
3758 bstring += (blen + 1) * 2;
3759 }
3760
3761 BFD_ASSERT (nstring - new_data == (signed) (a->value.leaf->size + copy_needed));
9373215c 3762
5879bb8f
NC
3763 free (a->value.leaf->data);
3764 a->value.leaf->data = new_data;
3765 a->value.leaf->size += copy_needed;
3766
3767 return TRUE;
3768}
3769
3770static void rsrc_merge (rsrc_entry *, rsrc_entry *);
3771
3772/* Sort the entries in given part of the directory.
3773 We use an old fashioned bubble sort because we are dealing
9373215c 3774 with lists and we want to handle matches specially. */
5879bb8f
NC
3775
3776static void
3777rsrc_sort_entries (rsrc_dir_chain * chain,
3778 bfd_boolean is_name,
3779 rsrc_directory * dir)
3780{
3781 rsrc_entry * entry;
3782 rsrc_entry * next;
3783 rsrc_entry ** points_to_entry;
3784 bfd_boolean swapped;
3785
3786 if (chain->num_entries < 2)
3787 return;
3788
3789 do
3790 {
3791 swapped = FALSE;
3792 points_to_entry = & chain->first_entry;
3793 entry = * points_to_entry;
3794 next = entry->next_entry;
3795
3796 do
3797 {
3798 signed int cmp = rsrc_cmp (is_name, entry, next);
3799
3800 if (cmp > 0)
3801 {
3802 entry->next_entry = next->next_entry;
3803 next->next_entry = entry;
3804 * points_to_entry = next;
3805 points_to_entry = & next->next_entry;
3806 next = entry->next_entry;
3807 swapped = TRUE;
3808 }
3809 else if (cmp == 0)
3810 {
3811 if (entry->is_dir && next->is_dir)
3812 {
3813 /* When we encounter identical directory entries we have to
3814 merge them together. The exception to this rule is for
3815 resource manifests - there can only be one of these,
3816 even if they differ in language. Zero-language manifests
3817 are assumed to be default manifests (provided by the
3714081c 3818 Cygwin/MinGW build system) and these can be silently dropped,
5879bb8f
NC
3819 unless that would reduce the number of manifests to zero.
3820 There should only ever be one non-zero lang manifest -
3821 if there are more it is an error. A non-zero lang
3822 manifest takes precedence over a default manifest. */
3823 if (entry->is_name == FALSE
3824 && entry->name_id.id == 1
3825 && dir != NULL
3826 && dir->entry != NULL
3827 && dir->entry->is_name == FALSE
3828 && dir->entry->name_id.id == 0x18)
3829 {
3830 if (next->value.directory->names.num_entries == 0
3831 && next->value.directory->ids.num_entries == 1
3832 && next->value.directory->ids.first_entry->is_name == FALSE
3833 && next->value.directory->ids.first_entry->name_id.id == 0)
3834 /* Fall through so that NEXT is dropped. */
3835 ;
3836 else if (entry->value.directory->names.num_entries == 0
3837 && entry->value.directory->ids.num_entries == 1
3838 && entry->value.directory->ids.first_entry->is_name == FALSE
3839 && entry->value.directory->ids.first_entry->name_id.id == 0)
3840 {
3841 /* Swap ENTRY and NEXT. Then fall through so that the old ENTRY is dropped. */
3842 entry->next_entry = next->next_entry;
3843 next->next_entry = entry;
3844 * points_to_entry = next;
3845 points_to_entry = & next->next_entry;
3846 next = entry->next_entry;
3847 swapped = TRUE;
3848 }
3849 else
3850 {
3851 _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
3852 bfd_set_error (bfd_error_file_truncated);
3853 return;
3854 }
9373215c 3855
5879bb8f
NC
3856 /* Unhook NEXT from the chain. */
3857 /* FIXME: memory loss here. */
3858 entry->next_entry = next->next_entry;
3859 chain->num_entries --;
3860 if (chain->num_entries < 2)
3861 return;
3862 next = next->next_entry;
3863 }
3864 else
3865 rsrc_merge (entry, next);
3866 }
3867 else if (entry->is_dir != next->is_dir)
3868 {
3869 _bfd_error_handler (_(".rsrc merge failure: a directory matches a leaf"));
3870 bfd_set_error (bfd_error_file_truncated);
3871 return;
3872 }
3873 else
3874 {
3875 /* Otherwise with identical leaves we issue an error
3876 message - because there should never be duplicates.
3877 The exception is Type 18/Name 1/Lang 0 which is the
3878 defaul manifest - this can just be dropped. */
3879 if (entry->is_name == FALSE
3880 && entry->name_id.id == 0
3881 && dir != NULL
3882 && dir->entry != NULL
3883 && dir->entry->is_name == FALSE
3884 && dir->entry->name_id.id == 1
3885 && dir->entry->parent != NULL
3886 && dir->entry->parent->entry != NULL
3887 && dir->entry->parent->entry->is_name == FALSE
3888 && dir->entry->parent->entry->name_id.id == 0x18 /* RT_MANIFEST */)
3889 ;
3890 else if (dir != NULL
3891 && dir->entry != NULL
3892 && dir->entry->parent != NULL
3893 && dir->entry->parent->entry != NULL
3894 && dir->entry->parent->entry->is_name == FALSE
3895 && dir->entry->parent->entry->name_id.id == 0x6 /* RT_STRING */)
3896 {
3897 /* Strings need special handling. */
3898 if (! rsrc_merge_string_entries (entry, next))
3899 {
3900 /* _bfd_error_handler should have been called inside merge_strings. */
3901 bfd_set_error (bfd_error_file_truncated);
3902 return;
3903 }
3904 }
3905 else
3906 {
3907 if (dir == NULL
3908 || dir->entry == NULL
3909 || dir->entry->parent == NULL
3910 || dir->entry->parent->entry == NULL)
3911 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
3912 else
3913 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
3914 rsrc_resource_name (entry, dir));
3915 bfd_set_error (bfd_error_file_truncated);
3916 return;
3917 }
3918 }
3919
3920 /* Unhook NEXT from the chain. */
3921 entry->next_entry = next->next_entry;
3922 chain->num_entries --;
3923 if (chain->num_entries < 2)
3924 return;
3925 next = next->next_entry;
3926 }
3927 else
3928 {
3929 points_to_entry = & entry->next_entry;
3930 entry = next;
3931 next = next->next_entry;
3932 }
3933 }
3934 while (next);
3935
3936 chain->last_entry = entry;
3937 }
3938 while (swapped);
3939}
3940
3941/* Attach B's chain onto A. */
3942static void
9373215c 3943rsrc_attach_chain (rsrc_dir_chain * achain, rsrc_dir_chain * bchain)
5879bb8f
NC
3944{
3945 if (bchain->num_entries == 0)
3946 return;
3947
3948 achain->num_entries += bchain->num_entries;
3949
3950 if (achain->first_entry == NULL)
3951 {
3952 achain->first_entry = bchain->first_entry;
3953 achain->last_entry = bchain->last_entry;
3954 }
3955 else
3956 {
3957 achain->last_entry->next_entry = bchain->first_entry;
3958 achain->last_entry = bchain->last_entry;
3959 }
9373215c 3960
5879bb8f
NC
3961 bchain->num_entries = 0;
3962 bchain->first_entry = bchain->last_entry = NULL;
3963}
3964
3965static void
3966rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b)
3967{
9373215c
PM
3968 rsrc_directory * adir;
3969 rsrc_directory * bdir;
3970
5879bb8f
NC
3971 BFD_ASSERT (a->is_dir);
3972 BFD_ASSERT (b->is_dir);
3973
9373215c
PM
3974 adir = a->value.directory;
3975 bdir = b->value.directory;
3976
5879bb8f
NC
3977 if (adir->characteristics != bdir->characteristics)
3978 {
3979 _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics\n"));
3980 bfd_set_error (bfd_error_file_truncated);
3981 return;
3982 }
9373215c 3983
5879bb8f
NC
3984 if (adir->major != bdir->major || adir->minor != bdir->minor)
3985 {
3986 _bfd_error_handler (_(".rsrc merge failure: differing directory versions\n"));
3987 bfd_set_error (bfd_error_file_truncated);
3988 return;
3989 }
3990
3991 /* Attach B's name chain to A. */
3992 rsrc_attach_chain (& adir->names, & bdir->names);
3993
3994 /* Attach B's ID chain to A. */
3995 rsrc_attach_chain (& adir->ids, & bdir->ids);
3996
3997 /* Now sort A's entries. */
3998 rsrc_sort_entries (& adir->names, TRUE, adir);
3999 rsrc_sort_entries (& adir->ids, FALSE, adir);
4000}
4001
4002/* Check the .rsrc section. If it contains multiple concatenated
4003 resources then we must merge them properly. Otherwise Windows
4004 will ignore all but the first set. */
4005
4006static void
4007rsrc_process_section (bfd * abfd,
4008 struct coff_final_link_info * pfinfo)
4009{
9373215c
PM
4010 rsrc_directory new_table;
4011 bfd_size_type size;
4012 asection * sec;
4013 pe_data_type * pe;
4014 bfd_vma rva_bias;
4015 bfd_byte * data;
4016 bfd_byte * datastart;
4017 bfd_byte * dataend;
4018 bfd_byte * new_data;
4019 unsigned int num_resource_sets;
4020 rsrc_directory * type_tables;
4021 rsrc_write_data write_data;
4022 unsigned int indx;
6caf7111
NC
4023 bfd * input;
4024 unsigned int num_input_rsrc = 0;
4025 unsigned int max_num_input_rsrc = 4;
4026 ptrdiff_t * rsrc_sizes = NULL;
5879bb8f
NC
4027
4028 new_table.names.num_entries = 0;
4029 new_table.ids.num_entries = 0;
9373215c 4030
5879bb8f
NC
4031 sec = bfd_get_section_by_name (abfd, ".rsrc");
4032 if (sec == NULL || (size = sec->rawsize) == 0)
4033 return;
4034
9373215c 4035 pe = pe_data (abfd);
5879bb8f
NC
4036 if (pe == NULL)
4037 return;
4038
5879bb8f
NC
4039 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4040
9373215c 4041 data = bfd_malloc (size);
5879bb8f
NC
4042 if (data == NULL)
4043 return;
c32abae8 4044
9373215c 4045 datastart = data;
5879bb8f
NC
4046
4047 if (! bfd_get_section_contents (abfd, sec, data, 0, size))
4048 goto end;
4049
6caf7111
NC
4050 /* Step zero: Scan the input bfds looking for .rsrc sections and record
4051 their lengths. Note - we rely upon the fact that the linker script
4052 does *not* sort the input .rsrc sections, so that the order in the
4053 linkinfo list matches the order in the output .rsrc section.
4054
4055 We need to know the lengths because each input .rsrc section has padding
4056 at the end of a variable amount. (It does not appear to be based upon
4057 the section alignment or the file alignment). We need to skip any
4058 padding bytes when parsing the input .rsrc sections. */
4059 rsrc_sizes = bfd_malloc (max_num_input_rsrc * sizeof * rsrc_sizes);
4060 if (rsrc_sizes == NULL)
4061 goto end;
4062
4063 for (input = pfinfo->info->input_bfds;
4064 input != NULL;
c72f2fb2 4065 input = input->link.next)
6caf7111
NC
4066 {
4067 asection * rsrc_sec = bfd_get_section_by_name (input, ".rsrc");
4068
4069 if (rsrc_sec != NULL)
4070 {
4071 if (num_input_rsrc == max_num_input_rsrc)
4072 {
4073 max_num_input_rsrc += 10;
4074 rsrc_sizes = bfd_realloc (rsrc_sizes, max_num_input_rsrc
4075 * sizeof * rsrc_sizes);
4076 if (rsrc_sizes == NULL)
4077 goto end;
4078 }
4079
4080 BFD_ASSERT (rsrc_sec->size > 0);
4081 rsrc_sizes [num_input_rsrc ++] = rsrc_sec->size;
4082 }
4083 }
4084
4085 if (num_input_rsrc < 2)
4086 goto end;
61e2488c 4087
5879bb8f
NC
4088 /* Step one: Walk the section, computing the size of the tables,
4089 leaves and data and decide if we need to do anything. */
1d63324c 4090 dataend = data + size;
9373215c 4091 num_resource_sets = 0;
5879bb8f
NC
4092
4093 while (data < dataend)
4094 {
4095 bfd_byte * p = data;
4096
4097 data = rsrc_count_directory (abfd, data, data, dataend, rva_bias);
1d63324c 4098
5879bb8f
NC
4099 if (data > dataend)
4100 {
4101 /* Corrupted .rsrc section - cannot merge. */
4102 _bfd_error_handler (_("%s: .rsrc merge failure: corrupt .rsrc section"),
4103 bfd_get_filename (abfd));
4104 bfd_set_error (bfd_error_file_truncated);
4105 goto end;
4106 }
4107
6caf7111
NC
4108 if ((data - p) > rsrc_sizes [num_resource_sets])
4109 {
4110 _bfd_error_handler (_("%s: .rsrc merge failure: unexpected .rsrc size"),
4111 bfd_get_filename (abfd));
4112 bfd_set_error (bfd_error_file_truncated);
4113 goto end;
4114 }
4115 /* FIXME: Should we add a check for "data - p" being much smaller
4116 than rsrc_sizes[num_resource_sets] ? */
4117
4118 data = p + rsrc_sizes[num_resource_sets];
5879bb8f 4119 rva_bias += data - p;
5879bb8f
NC
4120 ++ num_resource_sets;
4121 }
6caf7111 4122 BFD_ASSERT (num_resource_sets == num_input_rsrc);
5879bb8f
NC
4123
4124 /* Step two: Walk the data again, building trees of the resources. */
4125 data = datastart;
4126 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4127
9373215c 4128 type_tables = bfd_malloc (num_resource_sets * sizeof * type_tables);
5879bb8f
NC
4129 if (type_tables == NULL)
4130 goto end;
4131
9373215c 4132 indx = 0;
5879bb8f
NC
4133 while (data < dataend)
4134 {
4135 bfd_byte * p = data;
4136
6caf7111 4137 (void) rsrc_parse_directory (abfd, type_tables + indx, data, data,
9373215c 4138 dataend, rva_bias, NULL);
6caf7111 4139 data = p + rsrc_sizes[indx];
5879bb8f 4140 rva_bias += data - p;
6caf7111 4141 ++ indx;
5879bb8f 4142 }
337e86d7 4143 BFD_ASSERT (indx == num_resource_sets);
9373215c 4144
5879bb8f 4145 /* Step three: Merge the top level tables (there can be only one).
9373215c 4146
5879bb8f 4147 We must ensure that the merged entries are in ascending order.
9373215c 4148
5879bb8f
NC
4149 We also thread the top level table entries from the old tree onto
4150 the new table, so that they can be pulled off later. */
4151
4152 /* FIXME: Should we verify that all type tables are the same ? */
4153 new_table.characteristics = type_tables[0].characteristics;
4154 new_table.time = type_tables[0].time;
4155 new_table.major = type_tables[0].major;
4156 new_table.minor = type_tables[0].minor;
4157
4158 /* Chain the NAME entries onto the table. */
4159 new_table.names.first_entry = NULL;
4160 new_table.names.last_entry = NULL;
4161
337e86d7
L
4162 for (indx = 0; indx < num_resource_sets; indx++)
4163 rsrc_attach_chain (& new_table.names, & type_tables[indx].names);
5879bb8f
NC
4164
4165 rsrc_sort_entries (& new_table.names, TRUE, & new_table);
9373215c 4166
5879bb8f
NC
4167 /* Chain the ID entries onto the table. */
4168 new_table.ids.first_entry = NULL;
4169 new_table.ids.last_entry = NULL;
4170
337e86d7
L
4171 for (indx = 0; indx < num_resource_sets; indx++)
4172 rsrc_attach_chain (& new_table.ids, & type_tables[indx].ids);
5879bb8f
NC
4173
4174 rsrc_sort_entries (& new_table.ids, FALSE, & new_table);
4175
4176 /* Step four: Create new contents for the .rsrc section. */
3714081c
NC
4177 /* Step four point one: Compute the size of each region of the .rsrc section.
4178 We do this now, rather than earlier, as the merging above may have dropped
4179 some entries. */
4180 sizeof_leaves = sizeof_strings = sizeof_tables_and_entries = 0;
4181 rsrc_compute_region_sizes (& new_table);
4182 /* We increment sizeof_strings to make sure that resource data
4183 starts on an 8-byte boundary. FIXME: Is this correct ? */
4184 sizeof_strings = (sizeof_strings + 7) & ~ 7;
4185
c32abae8 4186 new_data = bfd_zalloc (abfd, size);
5879bb8f
NC
4187 if (new_data == NULL)
4188 goto end;
4189
5879bb8f
NC
4190 write_data.abfd = abfd;
4191 write_data.datastart = new_data;
4192 write_data.next_table = new_data;
4193 write_data.next_leaf = new_data + sizeof_tables_and_entries;
4194 write_data.next_string = write_data.next_leaf + sizeof_leaves;
4195 write_data.next_data = write_data.next_string + sizeof_strings;
9373215c 4196 write_data.rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
5879bb8f
NC
4197
4198 rsrc_write_directory (& write_data, & new_table);
4199
4200 /* Step five: Replace the old contents with the new.
4201 We recompute the size as we may have lost entries due to mergeing. */
9373215c 4202 size = ((write_data.next_data - new_data) + 3) & ~ 3;
c32abae8
NC
4203
4204 {
4205 int page_size;
4206
4207 if (coff_data (abfd)->link_info)
4208 {
4209 page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
4210
4211 /* If no file alignment has been set, default to one.
4212 This repairs 'ld -r' for arm-wince-pe target. */
4213 if (page_size == 0)
4214 page_size = 1;
4215 }
4216 else
4217 page_size = PE_DEF_FILE_ALIGNMENT;
4218 size = (size + page_size - 1) & - page_size;
4219 }
4220
5879bb8f
NC
4221 bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size);
4222 sec->size = sec->rawsize = size;
9373215c 4223
5879bb8f 4224 end:
3714081c 4225 /* Step six: Free all the memory that we have used. */
5879bb8f
NC
4226 /* FIXME: Free the resource tree, if we have one. */
4227 free (datastart);
6caf7111 4228 free (rsrc_sizes);
5879bb8f 4229}
5174d0fb 4230
2fbadf2c
ILT
4231/* Handle the .idata section and other things that need symbol table
4232 access. */
4233
b34976b6 4234bfd_boolean
7920ce38 4235_bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
2fbadf2c
ILT
4236{
4237 struct coff_link_hash_entry *h1;
4238 struct bfd_link_info *info = pfinfo->info;
4e22f78d 4239 bfd_boolean result = TRUE;
2fbadf2c
ILT
4240
4241 /* There are a few fields that need to be filled in now while we
4242 have symbol table access.
4243
4244 The .idata subsections aren't directly available as sections, but
4245 they are in the symbol table, so get them from there. */
4246
4247 /* The import directory. This is the address of .idata$2, with size
4248 of .idata$2 + .idata$3. */
4249 h1 = coff_link_hash_lookup (coff_hash_table (info),
b34976b6 4250 ".idata$2", FALSE, FALSE, TRUE);
2fbadf2c
ILT
4251 if (h1 != NULL)
4252 {
4e1fc599 4253 /* PR ld/2729: We cannot rely upon all the output sections having been
4e22f78d
NC
4254 created properly, so check before referencing them. Issue a warning
4255 message for any sections tht could not be found. */
b92997d6
AM
4256 if ((h1->root.type == bfd_link_hash_defined
4257 || h1->root.type == bfd_link_hash_defweak)
4258 && h1->root.u.def.section != NULL
4e22f78d 4259 && h1->root.u.def.section->output_section != NULL)
6c73cbb1 4260 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
4e22f78d
NC
4261 (h1->root.u.def.value
4262 + h1->root.u.def.section->output_section->vma
4263 + h1->root.u.def.section->output_offset);
4264 else
4265 {
4266 _bfd_error_handler
4e1fc599 4267 (_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"),
4e22f78d
NC
4268 abfd);
4269 result = FALSE;
4270 }
4271
2fbadf2c 4272 h1 = coff_link_hash_lookup (coff_hash_table (info),
b34976b6 4273 ".idata$4", FALSE, FALSE, TRUE);
4e22f78d 4274 if (h1 != NULL
b92997d6
AM
4275 && (h1->root.type == bfd_link_hash_defined
4276 || h1->root.type == bfd_link_hash_defweak)
4e22f78d
NC
4277 && h1->root.u.def.section != NULL
4278 && h1->root.u.def.section->output_section != NULL)
6c73cbb1 4279 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
4e22f78d
NC
4280 ((h1->root.u.def.value
4281 + h1->root.u.def.section->output_section->vma
4282 + h1->root.u.def.section->output_offset)
6c73cbb1 4283 - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
4e22f78d
NC
4284 else
4285 {
4286 _bfd_error_handler
4e1fc599 4287 (_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"),
4e22f78d
NC
4288 abfd);
4289 result = FALSE;
4290 }
2fbadf2c
ILT
4291
4292 /* The import address table. This is the size/address of
4293 .idata$5. */
4294 h1 = coff_link_hash_lookup (coff_hash_table (info),
b34976b6 4295 ".idata$5", FALSE, FALSE, TRUE);
4e22f78d 4296 if (h1 != NULL
b92997d6
AM
4297 && (h1->root.type == bfd_link_hash_defined
4298 || h1->root.type == bfd_link_hash_defweak)
4e22f78d
NC
4299 && h1->root.u.def.section != NULL
4300 && h1->root.u.def.section->output_section != NULL)
6c73cbb1 4301 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4e22f78d
NC
4302 (h1->root.u.def.value
4303 + h1->root.u.def.section->output_section->vma
4304 + h1->root.u.def.section->output_offset);
4305 else
4306 {
4307 _bfd_error_handler
4e1fc599 4308 (_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"),
4e22f78d
NC
4309 abfd);
4310 result = FALSE;
4311 }
4312
2fbadf2c 4313 h1 = coff_link_hash_lookup (coff_hash_table (info),
b34976b6 4314 ".idata$6", FALSE, FALSE, TRUE);
4e22f78d 4315 if (h1 != NULL
b92997d6
AM
4316 && (h1->root.type == bfd_link_hash_defined
4317 || h1->root.type == bfd_link_hash_defweak)
4e22f78d
NC
4318 && h1->root.u.def.section != NULL
4319 && h1->root.u.def.section->output_section != NULL)
6c73cbb1 4320 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4e22f78d
NC
4321 ((h1->root.u.def.value
4322 + h1->root.u.def.section->output_section->vma
4323 + h1->root.u.def.section->output_offset)
4e1fc599 4324 - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
4e22f78d
NC
4325 else
4326 {
4327 _bfd_error_handler
4e1fc599 4328 (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
4e22f78d
NC
4329 abfd);
4330 result = FALSE;
4331 }
2fbadf2c 4332 }
cb2f80e6
KT
4333 else
4334 {
4335 h1 = coff_link_hash_lookup (coff_hash_table (info),
4336 "__IAT_start__", FALSE, FALSE, TRUE);
4337 if (h1 != NULL
4338 && (h1->root.type == bfd_link_hash_defined
4339 || h1->root.type == bfd_link_hash_defweak)
4340 && h1->root.u.def.section != NULL
4341 && h1->root.u.def.section->output_section != NULL)
4342 {
4343 bfd_vma iat_va;
4344
4345 iat_va =
4346 (h1->root.u.def.value
4347 + h1->root.u.def.section->output_section->vma
4348 + h1->root.u.def.section->output_offset);
4349
4350 h1 = coff_link_hash_lookup (coff_hash_table (info),
4351 "__IAT_end__", FALSE, FALSE, TRUE);
4352 if (h1 != NULL
4353 && (h1->root.type == bfd_link_hash_defined
4354 || h1->root.type == bfd_link_hash_defweak)
4355 && h1->root.u.def.section != NULL
4356 && h1->root.u.def.section->output_section != NULL)
4357 {
4358 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4359 ((h1->root.u.def.value
4360 + h1->root.u.def.section->output_section->vma
4361 + h1->root.u.def.section->output_offset)
4362 - iat_va);
4363 if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size != 0)
4364 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4365 iat_va - pe_data (abfd)->pe_opthdr.ImageBase;
4366 }
4367 else
4368 {
4369 _bfd_error_handler
4370 (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
4371 " because .idata$6 is missing"), abfd);
4372 result = FALSE;
4373 }
4374 }
4375 }
ca6dee30
NC
4376
4377 h1 = coff_link_hash_lookup (coff_hash_table (info),
61e2488c 4378 (bfd_get_symbol_leading_char (abfd) != 0
c91a930c
KT
4379 ? "__tls_used" : "_tls_used"),
4380 FALSE, FALSE, TRUE);
ca6dee30
NC
4381 if (h1 != NULL)
4382 {
b92997d6
AM
4383 if ((h1->root.type == bfd_link_hash_defined
4384 || h1->root.type == bfd_link_hash_defweak)
4385 && h1->root.u.def.section != NULL
4e22f78d 4386 && h1->root.u.def.section->output_section != NULL)
6c73cbb1 4387 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
4e22f78d
NC
4388 (h1->root.u.def.value
4389 + h1->root.u.def.section->output_section->vma
4390 + h1->root.u.def.section->output_offset
4391 - pe_data (abfd)->pe_opthdr.ImageBase);
4392 else
4393 {
4394 _bfd_error_handler
4e1fc599 4395 (_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"),
4e22f78d
NC
4396 abfd);
4397 result = FALSE;
4398 }
bc2b2990
PM
4399 /* According to PECOFF sepcifications by Microsoft version 8.2
4400 the TLS data directory consists of 4 pointers, followed
4401 by two 4-byte integer. This implies that the total size
68ffbac6 4402 is different for 32-bit and 64-bit executables. */
bc2b2990 4403#if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
6c73cbb1 4404 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
bc2b2990
PM
4405#else
4406 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
4407#endif
ca6dee30
NC
4408 }
4409
5174d0fb
KT
4410/* If there is a .pdata section and we have linked pdata finally, we
4411 need to sort the entries ascending. */
4412#if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
4413 {
4414 asection *sec = bfd_get_section_by_name (abfd, ".pdata");
4415
4416 if (sec)
4417 {
21e68916
KT
4418 bfd_size_type x = sec->rawsize;
4419 bfd_byte *tmp_data = NULL;
5174d0fb 4420
21e68916
KT
4421 if (x)
4422 tmp_data = bfd_malloc (x);
4423
4424 if (tmp_data != NULL)
5174d0fb 4425 {
21e68916
KT
4426 if (bfd_get_section_contents (abfd, sec, tmp_data, 0, x))
4427 {
4428 qsort (tmp_data,
4429 (size_t) (x / 12),
4430 12, sort_x64_pdata);
4431 bfd_set_section_contents (pfinfo->output_bfd, sec,
4432 tmp_data, 0, x);
4433 }
4434 free (tmp_data);
5174d0fb
KT
4435 }
4436 }
4437 }
4438#endif
4439
5879bb8f
NC
4440 rsrc_process_section (abfd, pfinfo);
4441
2fbadf2c
ILT
4442 /* If we couldn't find idata$2, we either have an excessively
4443 trivial program or are in DEEP trouble; we have to assume trivial
4444 program.... */
4e22f78d 4445 return result;
2fbadf2c 4446}
This page took 1.377813 seconds and 4 git commands to generate.