Coverage Report

Created: 2023-08-28 06:31

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