Coverage Report

Created: 2026-07-25 10:20

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