Coverage Report

Created: 2026-09-14 08:07

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