Coverage Report

Created: 2023-06-29 07:03

/src/binutils-gdb/bfd/peicode.h
Line
Count
Source (jump to first uncovered line)
1
/* Support for the generic parts of PE/PEI, for BFD.
2
   Copyright (C) 1995-2023 Free Software Foundation, Inc.
3
   Written by Cygnus Solutions.
4
5
   This file is part of BFD, the Binary File Descriptor library.
6
7
   This program is free software; you can redistribute it and/or modify
8
   it under the terms of the GNU General Public License as published by
9
   the Free Software Foundation; either version 3 of the License, or
10
   (at your option) any later version.
11
12
   This program is distributed in the hope that it will be useful,
13
   but WITHOUT ANY WARRANTY; without even the implied warranty of
14
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
   GNU General Public License for more details.
16
17
   You should have received a copy of the GNU General Public License
18
   along with this program; if not, write to the Free Software
19
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20
   MA 02110-1301, USA.  */
21
22
23
/* Most of this hacked by  Steve Chamberlain,
24
      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 *sole* difference between the pe format and the pei format is that the
40
   latter has an MSDOS 2.0 .exe header on the front that prints the message
41
   "This app must be run under Windows." (or some such).
42
   (FIXME: Whether that statement is *really* true or not is unknown.
43
   Are there more subtle differences between pe and pei formats?
44
   For now assume there aren't.  If you find one, then for God sakes
45
   document it here!)
46
47
   The Microsoft docs use the word "image" instead of "executable" because
48
   the former can also refer to a DLL (shared library).  Confusion can arise
49
   because the `i' in `pei' also refers to "image".  The `pe' format can
50
   also create images (i.e. executables), it's just that to run on a win32
51
   system you need to use the pei format.
52
53
   FIXME: Please add more docs here so the next poor fool that has to hack
54
   on this code has a chance of getting something accomplished without
55
   wasting too much time.  */
56
57
#include "libpei.h"
58
59
static bool (*pe_saved_coff_bfd_print_private_bfd_data) (bfd *, void *) =
60
#ifndef coff_bfd_print_private_bfd_data
61
     NULL;
62
#else
63
     coff_bfd_print_private_bfd_data;
64
#undef coff_bfd_print_private_bfd_data
65
#endif
66
67
static bool pe_print_private_bfd_data (bfd *, void *);
68
#define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
69
70
static bool (*pe_saved_coff_bfd_copy_private_bfd_data) (bfd *, bfd *) =
71
#ifndef coff_bfd_copy_private_bfd_data
72
     NULL;
73
#else
74
     coff_bfd_copy_private_bfd_data;
75
#undef coff_bfd_copy_private_bfd_data
76
#endif
77
78
static bool pe_bfd_copy_private_bfd_data (bfd *, bfd *);
79
#define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
80
81
#define coff_mkobject    pe_mkobject
82
#define coff_mkobject_hook pe_mkobject_hook
83
84
#ifdef COFF_IMAGE_WITH_PE
85
/* This structure contains static variables used by the ILF code.  */
86
typedef asection * asection_ptr;
87
88
typedef struct
89
{
90
  bfd *     abfd;
91
  bfd_byte *    data;
92
  struct bfd_in_memory * bim;
93
  unsigned short  magic;
94
95
  arelent *   reltab;
96
  unsigned int    relcount;
97
98
  coff_symbol_type *  sym_cache;
99
  coff_symbol_type *  sym_ptr;
100
  unsigned int    sym_index;
101
102
  unsigned int *  sym_table;
103
  unsigned int *  table_ptr;
104
105
  combined_entry_type * native_syms;
106
  combined_entry_type * native_ptr;
107
108
  coff_symbol_type ** sym_ptr_table;
109
  coff_symbol_type ** sym_ptr_ptr;
110
111
  unsigned int    sec_index;
112
113
  char *    string_table;
114
  char *    string_ptr;
115
  char *    end_string_ptr;
116
117
  SYMENT *    esym_table;
118
  SYMENT *    esym_ptr;
119
120
  struct internal_reloc * int_reltab;
121
}
122
pe_ILF_vars;
123
#endif /* COFF_IMAGE_WITH_PE */
124
125
bfd_cleanup coff_real_object_p
126
  (bfd *, unsigned, struct internal_filehdr *, struct internal_aouthdr *);
127

128
#ifndef NO_COFF_RELOCS
129
static void
130
coff_swap_reloc_in (bfd * abfd, void * src, void * dst)
131
15.0k
{
132
15.0k
  RELOC *reloc_src = (RELOC *) src;
133
15.0k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
15.0k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
15.0k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
15.0k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
6.21k
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
15.0k
}
pei-i386.c:coff_swap_reloc_in
Line
Count
Source
131
1.22k
{
132
1.22k
  RELOC *reloc_src = (RELOC *) src;
133
1.22k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
1.22k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
1.22k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
1.22k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
1.22k
}
Unexecuted instantiation: pe-x86_64.c:coff_swap_reloc_in
pei-x86_64.c:coff_swap_reloc_in
Line
Count
Source
131
771
{
132
771
  RELOC *reloc_src = (RELOC *) src;
133
771
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
771
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
771
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
771
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
771
}
pei-aarch64.c:coff_swap_reloc_in
Line
Count
Source
131
1.34k
{
132
1.34k
  RELOC *reloc_src = (RELOC *) src;
133
1.34k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
1.34k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
1.34k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
1.34k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
1.34k
}
Unexecuted instantiation: pe-aarch64.c:coff_swap_reloc_in
pei-ia64.c:coff_swap_reloc_in
Line
Count
Source
131
1.10k
{
132
1.10k
  RELOC *reloc_src = (RELOC *) src;
133
1.10k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
1.10k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
1.10k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
1.10k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
1.10k
}
pei-loongarch64.c:coff_swap_reloc_in
Line
Count
Source
131
1.28k
{
132
1.28k
  RELOC *reloc_src = (RELOC *) src;
133
1.28k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
1.28k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
1.28k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
1.28k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
1.28k
#ifdef SWAP_IN_RELOC_OFFSET
139
1.28k
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
1.28k
#endif
141
1.28k
}
Unexecuted instantiation: pe-arm-wince.c:coff_swap_reloc_in
Unexecuted instantiation: pe-arm.c:coff_swap_reloc_in
pe-i386.c:coff_swap_reloc_in
Line
Count
Source
131
3.23k
{
132
3.23k
  RELOC *reloc_src = (RELOC *) src;
133
3.23k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
3.23k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
3.23k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
3.23k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
3.23k
}
Unexecuted instantiation: pe-mcore.c:coff_swap_reloc_in
Unexecuted instantiation: pe-sh.c:coff_swap_reloc_in
pei-arm-wince.c:coff_swap_reloc_in
Line
Count
Source
131
2.01k
{
132
2.01k
  RELOC *reloc_src = (RELOC *) src;
133
2.01k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
2.01k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
2.01k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
2.01k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
2.01k
#ifdef SWAP_IN_RELOC_OFFSET
139
2.01k
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
2.01k
#endif
141
2.01k
}
pei-arm.c:coff_swap_reloc_in
Line
Count
Source
131
2.28k
{
132
2.28k
  RELOC *reloc_src = (RELOC *) src;
133
2.28k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
2.28k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
2.28k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
2.28k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
2.28k
#ifdef SWAP_IN_RELOC_OFFSET
139
2.28k
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
2.28k
#endif
141
2.28k
}
pei-mcore.c:coff_swap_reloc_in
Line
Count
Source
131
634
{
132
634
  RELOC *reloc_src = (RELOC *) src;
133
634
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
634
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
634
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
634
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
634
#ifdef SWAP_IN_RELOC_OFFSET
139
634
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
634
#endif
141
634
}
pei-sh.c:coff_swap_reloc_in
Line
Count
Source
131
1.15k
{
132
1.15k
  RELOC *reloc_src = (RELOC *) src;
133
1.15k
  struct internal_reloc *reloc_dst = (struct internal_reloc *) dst;
134
135
1.15k
  reloc_dst->r_vaddr  = H_GET_32 (abfd, reloc_src->r_vaddr);
136
1.15k
  reloc_dst->r_symndx = H_GET_S32 (abfd, reloc_src->r_symndx);
137
1.15k
  reloc_dst->r_type   = H_GET_16 (abfd, reloc_src->r_type);
138
#ifdef SWAP_IN_RELOC_OFFSET
139
  reloc_dst->r_offset = SWAP_IN_RELOC_OFFSET (abfd, reloc_src->r_offset);
140
#endif
141
1.15k
}
142
143
static unsigned int
144
coff_swap_reloc_out (bfd * abfd, void * src, void * dst)
145
0
{
146
0
  struct internal_reloc *reloc_src = (struct internal_reloc *) src;
147
0
  struct external_reloc *reloc_dst = (struct external_reloc *) dst;
148
149
0
  H_PUT_32 (abfd, reloc_src->r_vaddr, reloc_dst->r_vaddr);
150
0
  H_PUT_32 (abfd, reloc_src->r_symndx, reloc_dst->r_symndx);
151
0
  H_PUT_16 (abfd, reloc_src->r_type, reloc_dst->r_type);
152
153
#ifdef SWAP_OUT_RELOC_OFFSET
154
0
  SWAP_OUT_RELOC_OFFSET (abfd, reloc_src->r_offset, reloc_dst->r_offset);
155
#endif
156
#ifdef SWAP_OUT_RELOC_EXTRA
157
  SWAP_OUT_RELOC_EXTRA (abfd, reloc_src, reloc_dst);
158
#endif
159
0
  return RELSZ;
160
0
}
Unexecuted instantiation: pei-i386.c:coff_swap_reloc_out
Unexecuted instantiation: pe-x86_64.c:coff_swap_reloc_out
Unexecuted instantiation: pei-x86_64.c:coff_swap_reloc_out
Unexecuted instantiation: pei-aarch64.c:coff_swap_reloc_out
Unexecuted instantiation: pe-aarch64.c:coff_swap_reloc_out
Unexecuted instantiation: pei-ia64.c:coff_swap_reloc_out
Unexecuted instantiation: pei-loongarch64.c:coff_swap_reloc_out
Unexecuted instantiation: pe-arm-wince.c:coff_swap_reloc_out
Unexecuted instantiation: pe-arm.c:coff_swap_reloc_out
Unexecuted instantiation: pe-i386.c:coff_swap_reloc_out
Unexecuted instantiation: pe-mcore.c:coff_swap_reloc_out
Unexecuted instantiation: pe-sh.c:coff_swap_reloc_out
Unexecuted instantiation: pei-arm-wince.c:coff_swap_reloc_out
Unexecuted instantiation: pei-arm.c:coff_swap_reloc_out
Unexecuted instantiation: pei-mcore.c:coff_swap_reloc_out
Unexecuted instantiation: pei-sh.c:coff_swap_reloc_out
161
#endif /* not NO_COFF_RELOCS */
162
163
#ifdef COFF_IMAGE_WITH_PE
164
#undef FILHDR
165
65.6k
#define FILHDR struct external_PEI_IMAGE_hdr
166
#endif
167
168
static void
169
coff_swap_filehdr_in (bfd * abfd, void * src, void * dst)
170
174k
{
171
174k
  FILHDR *filehdr_src = (FILHDR *) src;
172
174k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
174k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
174k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
174k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
174k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
174k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
174k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
174k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
12.4k
    {
185
12.4k
      filehdr_dst->f_nsyms = 0;
186
12.4k
      filehdr_dst->f_flags |= F_LSYMS;
187
12.4k
    }
188
189
174k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
174k
}
pei-i386.c:coff_swap_filehdr_in
Line
Count
Source
170
8.19k
{
171
8.19k
  FILHDR *filehdr_src = (FILHDR *) src;
172
8.19k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
8.19k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
8.19k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
8.19k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
8.19k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
8.19k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
8.19k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
8.19k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
402
    {
185
402
      filehdr_dst->f_nsyms = 0;
186
402
      filehdr_dst->f_flags |= F_LSYMS;
187
402
    }
188
189
8.19k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
8.19k
}
pe-x86_64.c:coff_swap_filehdr_in
Line
Count
Source
170
10.8k
{
171
10.8k
  FILHDR *filehdr_src = (FILHDR *) src;
172
10.8k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
10.8k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
10.8k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
10.8k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
10.8k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
10.8k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
10.8k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
10.8k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
949
    {
185
949
      filehdr_dst->f_nsyms = 0;
186
949
      filehdr_dst->f_flags |= F_LSYMS;
187
949
    }
188
189
10.8k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
10.8k
}
pei-x86_64.c:coff_swap_filehdr_in
Line
Count
Source
170
8.21k
{
171
8.21k
  FILHDR *filehdr_src = (FILHDR *) src;
172
8.21k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
8.21k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
8.21k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
8.21k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
8.21k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
8.21k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
8.21k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
8.21k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
405
    {
185
405
      filehdr_dst->f_nsyms = 0;
186
405
      filehdr_dst->f_flags |= F_LSYMS;
187
405
    }
188
189
8.21k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
8.21k
}
pei-aarch64.c:coff_swap_filehdr_in
Line
Count
Source
170
7.94k
{
171
7.94k
  FILHDR *filehdr_src = (FILHDR *) src;
172
7.94k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
7.94k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
7.94k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
7.94k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
7.94k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
7.94k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
7.94k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
7.94k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
390
    {
185
390
      filehdr_dst->f_nsyms = 0;
186
390
      filehdr_dst->f_flags |= F_LSYMS;
187
390
    }
188
189
7.94k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
7.94k
}
pe-aarch64.c:coff_swap_filehdr_in
Line
Count
Source
170
10.8k
{
171
10.8k
  FILHDR *filehdr_src = (FILHDR *) src;
172
10.8k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
10.8k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
10.8k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
10.8k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
10.8k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
10.8k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
10.8k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
10.8k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
900
    {
185
900
      filehdr_dst->f_nsyms = 0;
186
900
      filehdr_dst->f_flags |= F_LSYMS;
187
900
    }
188
189
10.8k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
10.8k
}
pei-ia64.c:coff_swap_filehdr_in
Line
Count
Source
170
1.96k
{
171
1.96k
  FILHDR *filehdr_src = (FILHDR *) src;
172
1.96k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
1.96k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
1.96k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
1.96k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
1.96k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
1.96k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
1.96k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
1.96k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
50
    {
185
50
      filehdr_dst->f_nsyms = 0;
186
50
      filehdr_dst->f_flags |= F_LSYMS;
187
50
    }
188
189
1.96k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
1.96k
}
pei-loongarch64.c:coff_swap_filehdr_in
Line
Count
Source
170
7.81k
{
171
7.81k
  FILHDR *filehdr_src = (FILHDR *) src;
172
7.81k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
7.81k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
7.81k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
7.81k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
7.81k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
7.81k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
7.81k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
7.81k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
380
    {
185
380
      filehdr_dst->f_nsyms = 0;
186
380
      filehdr_dst->f_flags |= F_LSYMS;
187
380
    }
188
189
7.81k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
7.81k
}
pe-arm-wince.c:coff_swap_filehdr_in
Line
Count
Source
170
21.7k
{
171
21.7k
  FILHDR *filehdr_src = (FILHDR *) src;
172
21.7k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
21.7k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
21.7k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
21.7k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
21.7k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
21.7k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
21.7k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
21.7k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
1.80k
    {
185
1.80k
      filehdr_dst->f_nsyms = 0;
186
1.80k
      filehdr_dst->f_flags |= F_LSYMS;
187
1.80k
    }
188
189
21.7k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
21.7k
}
pe-arm.c:coff_swap_filehdr_in
Line
Count
Source
170
21.7k
{
171
21.7k
  FILHDR *filehdr_src = (FILHDR *) src;
172
21.7k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
21.7k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
21.7k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
21.7k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
21.7k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
21.7k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
21.7k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
21.7k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
1.80k
    {
185
1.80k
      filehdr_dst->f_nsyms = 0;
186
1.80k
      filehdr_dst->f_flags |= F_LSYMS;
187
1.80k
    }
188
189
21.7k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
21.7k
}
pe-i386.c:coff_swap_filehdr_in
Line
Count
Source
170
10.8k
{
171
10.8k
  FILHDR *filehdr_src = (FILHDR *) src;
172
10.8k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
10.8k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
10.8k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
10.8k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
10.8k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
10.8k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
10.8k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
10.8k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
949
    {
185
949
      filehdr_dst->f_nsyms = 0;
186
949
      filehdr_dst->f_flags |= F_LSYMS;
187
949
    }
188
189
10.8k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
10.8k
}
pe-mcore.c:coff_swap_filehdr_in
Line
Count
Source
170
21.7k
{
171
21.7k
  FILHDR *filehdr_src = (FILHDR *) src;
172
21.7k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
21.7k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
21.7k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
21.7k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
21.7k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
21.7k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
21.7k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
21.7k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
1.89k
    {
185
1.89k
      filehdr_dst->f_nsyms = 0;
186
1.89k
      filehdr_dst->f_flags |= F_LSYMS;
187
1.89k
    }
188
189
21.7k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
21.7k
}
pe-sh.c:coff_swap_filehdr_in
Line
Count
Source
170
10.8k
{
171
10.8k
  FILHDR *filehdr_src = (FILHDR *) src;
172
10.8k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
10.8k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
10.8k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
10.8k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
10.8k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
10.8k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
10.8k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
10.8k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
949
    {
185
949
      filehdr_dst->f_nsyms = 0;
186
949
      filehdr_dst->f_flags |= F_LSYMS;
187
949
    }
188
189
10.8k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
10.8k
}
pei-arm-wince.c:coff_swap_filehdr_in
Line
Count
Source
170
7.94k
{
171
7.94k
  FILHDR *filehdr_src = (FILHDR *) src;
172
7.94k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
7.94k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
7.94k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
7.94k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
7.94k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
7.94k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
7.94k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
7.94k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
390
    {
185
390
      filehdr_dst->f_nsyms = 0;
186
390
      filehdr_dst->f_flags |= F_LSYMS;
187
390
    }
188
189
7.94k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
7.94k
}
pei-arm.c:coff_swap_filehdr_in
Line
Count
Source
170
7.94k
{
171
7.94k
  FILHDR *filehdr_src = (FILHDR *) src;
172
7.94k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
7.94k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
7.94k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
7.94k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
7.94k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
7.94k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
7.94k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
7.94k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
390
    {
185
390
      filehdr_dst->f_nsyms = 0;
186
390
      filehdr_dst->f_flags |= F_LSYMS;
187
390
    }
188
189
7.94k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
7.94k
}
pei-mcore.c:coff_swap_filehdr_in
Line
Count
Source
170
7.81k
{
171
7.81k
  FILHDR *filehdr_src = (FILHDR *) src;
172
7.81k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
7.81k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
7.81k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
7.81k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
7.81k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
7.81k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
7.81k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
7.81k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
380
    {
185
380
      filehdr_dst->f_nsyms = 0;
186
380
      filehdr_dst->f_flags |= F_LSYMS;
187
380
    }
188
189
7.81k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
7.81k
}
pei-sh.c:coff_swap_filehdr_in
Line
Count
Source
170
7.81k
{
171
7.81k
  FILHDR *filehdr_src = (FILHDR *) src;
172
7.81k
  struct internal_filehdr *filehdr_dst = (struct internal_filehdr *) dst;
173
174
7.81k
  filehdr_dst->f_magic  = H_GET_16 (abfd, filehdr_src->f_magic);
175
7.81k
  filehdr_dst->f_nscns  = H_GET_16 (abfd, filehdr_src->f_nscns);
176
7.81k
  filehdr_dst->f_timdat = H_GET_32 (abfd, filehdr_src->f_timdat);
177
7.81k
  filehdr_dst->f_nsyms  = H_GET_32 (abfd, filehdr_src->f_nsyms);
178
7.81k
  filehdr_dst->f_flags  = H_GET_16 (abfd, filehdr_src->f_flags);
179
7.81k
  filehdr_dst->f_symptr = H_GET_32 (abfd, filehdr_src->f_symptr);
180
181
  /* Other people's tools sometimes generate headers with an nsyms but
182
     a zero symptr.  */
183
7.81k
  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
184
380
    {
185
380
      filehdr_dst->f_nsyms = 0;
186
380
      filehdr_dst->f_flags |= F_LSYMS;
187
380
    }
188
189
7.81k
  filehdr_dst->f_opthdr = H_GET_16 (abfd, filehdr_src-> f_opthdr);
190
7.81k
}
191
192
#ifdef COFF_IMAGE_WITH_PE
193
# define coff_swap_filehdr_out _bfd_XXi_only_swap_filehdr_out
194
#elif defined COFF_WITH_peAArch64
195
# define coff_swap_filehdr_out _bfd_XX_only_swap_filehdr_out
196
#elif defined COFF_WITH_pex64
197
# define coff_swap_filehdr_out _bfd_pex64_only_swap_filehdr_out
198
#elif defined COFF_WITH_pep
199
# define coff_swap_filehdr_out _bfd_pep_only_swap_filehdr_out
200
#else
201
# define coff_swap_filehdr_out _bfd_pe_only_swap_filehdr_out
202
#endif
203
204
static void
205
coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in)
206
92.0k
{
207
92.0k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
92.0k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
92.0k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
92.0k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
92.0k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
92.0k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
92.0k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
92.0k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
92.0k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
92.0k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
#ifdef COFF_IMAGE_WITH_PE
224
76.8k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
76.8k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
  scnhdr_int->s_nreloc = 0;
227
#else
228
15.2k
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
15.2k
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
92.0k
  if (scnhdr_int->s_vaddr != 0)
233
68.3k
    {
234
68.3k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
      scnhdr_int->s_vaddr &= 0xffffffff;
238
#endif
239
68.3k
    }
240
241
92.0k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
92.0k
  if (scnhdr_int->s_paddr > 0
247
92.0k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
74.5k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
74.5k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
32.2k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
92.0k
#endif
256
92.0k
}
pei-i386.c:coff_swap_scnhdr_in
Line
Count
Source
206
10.6k
{
207
10.6k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
10.6k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
10.6k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
10.6k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
10.6k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
10.6k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
10.6k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
10.6k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
10.6k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
10.6k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
10.6k
#ifdef COFF_IMAGE_WITH_PE
224
10.6k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
10.6k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
10.6k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
10.6k
  if (scnhdr_int->s_vaddr != 0)
233
8.39k
    {
234
8.39k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
8.39k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
8.39k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
8.39k
#endif
239
8.39k
    }
240
241
10.6k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
10.6k
  if (scnhdr_int->s_paddr > 0
247
10.6k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
9.02k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
9.02k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
3.79k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
10.6k
#endif
256
10.6k
}
Unexecuted instantiation: pe-x86_64.c:coff_swap_scnhdr_in
pei-x86_64.c:coff_swap_scnhdr_in
Line
Count
Source
206
7.08k
{
207
7.08k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
7.08k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
7.08k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
7.08k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
7.08k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
7.08k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
7.08k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
7.08k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
7.08k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
7.08k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
7.08k
#ifdef COFF_IMAGE_WITH_PE
224
7.08k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
7.08k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
7.08k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
7.08k
  if (scnhdr_int->s_vaddr != 0)
233
5.57k
    {
234
5.57k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
      scnhdr_int->s_vaddr &= 0xffffffff;
238
#endif
239
5.57k
    }
240
241
7.08k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
7.08k
  if (scnhdr_int->s_paddr > 0
247
7.08k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
5.92k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
5.92k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
2.54k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
7.08k
#endif
256
7.08k
}
pei-aarch64.c:coff_swap_scnhdr_in
Line
Count
Source
206
7.52k
{
207
7.52k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
7.52k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
7.52k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
7.52k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
7.52k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
7.52k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
7.52k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
7.52k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
7.52k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
7.52k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
7.52k
#ifdef COFF_IMAGE_WITH_PE
224
7.52k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
7.52k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
7.52k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
7.52k
  if (scnhdr_int->s_vaddr != 0)
233
5.25k
    {
234
5.25k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
      scnhdr_int->s_vaddr &= 0xffffffff;
238
#endif
239
5.25k
    }
240
241
7.52k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
7.52k
  if (scnhdr_int->s_paddr > 0
247
7.52k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
5.87k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
5.87k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
2.88k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
7.52k
#endif
256
7.52k
}
Unexecuted instantiation: pe-aarch64.c:coff_swap_scnhdr_in
pei-ia64.c:coff_swap_scnhdr_in
Line
Count
Source
206
8.37k
{
207
8.37k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
8.37k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
8.37k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
8.37k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
8.37k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
8.37k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
8.37k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
8.37k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
8.37k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
8.37k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
8.37k
#ifdef COFF_IMAGE_WITH_PE
224
8.37k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
8.37k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
8.37k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
8.37k
  if (scnhdr_int->s_vaddr != 0)
233
6.05k
    {
234
6.05k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
6.05k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
6.05k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
6.05k
#endif
239
6.05k
    }
240
241
8.37k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
8.37k
  if (scnhdr_int->s_paddr > 0
247
8.37k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
6.64k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
6.64k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
3.12k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
8.37k
#endif
256
8.37k
}
pei-loongarch64.c:coff_swap_scnhdr_in
Line
Count
Source
206
8.24k
{
207
8.24k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
8.24k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
8.24k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
8.24k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
8.24k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
8.24k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
8.24k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
8.24k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
8.24k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
8.24k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
8.24k
#ifdef COFF_IMAGE_WITH_PE
224
8.24k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
8.24k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
8.24k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
8.24k
  if (scnhdr_int->s_vaddr != 0)
233
6.17k
    {
234
6.17k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
      scnhdr_int->s_vaddr &= 0xffffffff;
238
#endif
239
6.17k
    }
240
241
8.24k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
8.24k
  if (scnhdr_int->s_paddr > 0
247
8.24k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
6.38k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
6.38k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
2.92k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
8.24k
#endif
256
8.24k
}
Unexecuted instantiation: pe-arm-wince.c:coff_swap_scnhdr_in
Unexecuted instantiation: pe-arm.c:coff_swap_scnhdr_in
pe-i386.c:coff_swap_scnhdr_in
Line
Count
Source
206
15.2k
{
207
15.2k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
15.2k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
15.2k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
15.2k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
15.2k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
15.2k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
15.2k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
15.2k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
15.2k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
15.2k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
#ifdef COFF_IMAGE_WITH_PE
224
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
  scnhdr_int->s_nreloc = 0;
227
#else
228
15.2k
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
15.2k
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
15.2k
#endif
231
232
15.2k
  if (scnhdr_int->s_vaddr != 0)
233
10.5k
    {
234
10.5k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
10.5k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
10.5k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
10.5k
#endif
239
10.5k
    }
240
241
15.2k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
15.2k
  if (scnhdr_int->s_paddr > 0
247
15.2k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
12.0k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
12.0k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
3.61k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
15.2k
#endif
256
15.2k
}
Unexecuted instantiation: pe-mcore.c:coff_swap_scnhdr_in
Unexecuted instantiation: pe-sh.c:coff_swap_scnhdr_in
pei-arm-wince.c:coff_swap_scnhdr_in
Line
Count
Source
206
10.1k
{
207
10.1k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
10.1k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
10.1k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
10.1k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
10.1k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
10.1k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
10.1k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
10.1k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
10.1k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
10.1k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
10.1k
#ifdef COFF_IMAGE_WITH_PE
224
10.1k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
10.1k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
10.1k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
10.1k
  if (scnhdr_int->s_vaddr != 0)
233
7.77k
    {
234
7.77k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
7.77k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
7.77k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
7.77k
#endif
239
7.77k
    }
240
241
10.1k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
10.1k
  if (scnhdr_int->s_paddr > 0
247
10.1k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
8.54k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
8.54k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
4.19k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
10.1k
#endif
256
10.1k
}
pei-arm.c:coff_swap_scnhdr_in
Line
Count
Source
206
11.7k
{
207
11.7k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
11.7k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
11.7k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
11.7k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
11.7k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
11.7k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
11.7k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
11.7k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
11.7k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
11.7k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
11.7k
#ifdef COFF_IMAGE_WITH_PE
224
11.7k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
11.7k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
11.7k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
11.7k
  if (scnhdr_int->s_vaddr != 0)
233
9.06k
    {
234
9.06k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
9.06k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
9.06k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
9.06k
#endif
239
9.06k
    }
240
241
11.7k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
11.7k
  if (scnhdr_int->s_paddr > 0
247
11.7k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
9.96k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
9.96k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
4.76k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
11.7k
#endif
256
11.7k
}
pei-mcore.c:coff_swap_scnhdr_in
Line
Count
Source
206
6.26k
{
207
6.26k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
6.26k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
6.26k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
6.26k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
6.26k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
6.26k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
6.26k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
6.26k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
6.26k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
6.26k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
6.26k
#ifdef COFF_IMAGE_WITH_PE
224
6.26k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
6.26k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
6.26k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
6.26k
  if (scnhdr_int->s_vaddr != 0)
233
4.76k
    {
234
4.76k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
4.76k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
4.76k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
4.76k
#endif
239
4.76k
    }
240
241
6.26k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
6.26k
  if (scnhdr_int->s_paddr > 0
247
6.26k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
4.99k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
4.99k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
2.18k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
6.26k
#endif
256
6.26k
}
pei-sh.c:coff_swap_scnhdr_in
Line
Count
Source
206
6.85k
{
207
6.85k
  SCNHDR *scnhdr_ext = (SCNHDR *) ext;
208
6.85k
  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
209
210
6.85k
  memcpy (scnhdr_int->s_name, scnhdr_ext->s_name, sizeof (scnhdr_int->s_name));
211
212
6.85k
  scnhdr_int->s_vaddr   = GET_SCNHDR_VADDR (abfd, scnhdr_ext->s_vaddr);
213
6.85k
  scnhdr_int->s_paddr   = GET_SCNHDR_PADDR (abfd, scnhdr_ext->s_paddr);
214
6.85k
  scnhdr_int->s_size    = GET_SCNHDR_SIZE (abfd, scnhdr_ext->s_size);
215
6.85k
  scnhdr_int->s_scnptr  = GET_SCNHDR_SCNPTR (abfd, scnhdr_ext->s_scnptr);
216
6.85k
  scnhdr_int->s_relptr  = GET_SCNHDR_RELPTR (abfd, scnhdr_ext->s_relptr);
217
6.85k
  scnhdr_int->s_lnnoptr = GET_SCNHDR_LNNOPTR (abfd, scnhdr_ext->s_lnnoptr);
218
6.85k
  scnhdr_int->s_flags   = H_GET_32 (abfd, scnhdr_ext->s_flags);
219
220
  /* MS handles overflow of line numbers by carrying into the reloc
221
     field (it appears).  Since it's supposed to be zero for PE
222
     *IMAGE* format, that's safe.  This is still a bit iffy.  */
223
6.85k
#ifdef COFF_IMAGE_WITH_PE
224
6.85k
  scnhdr_int->s_nlnno = (H_GET_16 (abfd, scnhdr_ext->s_nlnno)
225
6.85k
       + (H_GET_16 (abfd, scnhdr_ext->s_nreloc) << 16));
226
6.85k
  scnhdr_int->s_nreloc = 0;
227
#else
228
  scnhdr_int->s_nreloc = H_GET_16 (abfd, scnhdr_ext->s_nreloc);
229
  scnhdr_int->s_nlnno = H_GET_16 (abfd, scnhdr_ext->s_nlnno);
230
#endif
231
232
6.85k
  if (scnhdr_int->s_vaddr != 0)
233
4.82k
    {
234
4.82k
      scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
235
      /* Do not cut upper 32-bits for 64-bit vma.  */
236
4.82k
#if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
237
4.82k
      scnhdr_int->s_vaddr &= 0xffffffff;
238
4.82k
#endif
239
4.82k
    }
240
241
6.85k
#ifndef COFF_NO_HACK_SCNHDR_SIZE
242
  /* If this section holds uninitialized data and is from an object file
243
     or from an executable image that has not initialized the field,
244
     or if the image is an executable file and the physical size is padded,
245
     use the virtual size (stored in s_paddr) instead.  */
246
6.85k
  if (scnhdr_int->s_paddr > 0
247
6.85k
      && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0
248
5.20k
     && (! bfd_pei_p (abfd) || scnhdr_int->s_size == 0))
249
5.20k
    || (bfd_pei_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr))))
250
  /* This code used to set scnhdr_int->s_paddr to 0.  However,
251
     coff_set_alignment_hook stores s_paddr in virt_size, which
252
     only works if it correctly holds the virtual size of the
253
     section.  */
254
2.22k
    scnhdr_int->s_size = scnhdr_int->s_paddr;
255
6.85k
#endif
256
6.85k
}
257
258
static bool
259
pe_mkobject (bfd * abfd)
260
10.7k
{
261
10.7k
  pe_data_type *pe;
262
10.7k
  size_t amt = sizeof (pe_data_type);
263
264
10.7k
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
10.7k
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
10.7k
  pe = pe_data (abfd);
270
271
10.7k
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
10.7k
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
10.7k
  pe->dos_message[0]  = 0x0eba1f0e;
278
10.7k
  pe->dos_message[1]  = 0xcd09b400;
279
10.7k
  pe->dos_message[2]  = 0x4c01b821;
280
10.7k
  pe->dos_message[3]  = 0x685421cd;
281
10.7k
  pe->dos_message[4]  = 0x70207369;
282
10.7k
  pe->dos_message[5]  = 0x72676f72;
283
10.7k
  pe->dos_message[6]  = 0x63206d61;
284
10.7k
  pe->dos_message[7]  = 0x6f6e6e61;
285
10.7k
  pe->dos_message[8]  = 0x65622074;
286
10.7k
  pe->dos_message[9]  = 0x6e757220;
287
10.7k
  pe->dos_message[10] = 0x206e6920;
288
10.7k
  pe->dos_message[11] = 0x20534f44;
289
10.7k
  pe->dos_message[12] = 0x65646f6d;
290
10.7k
  pe->dos_message[13] = 0x0a0d0d2e;
291
10.7k
  pe->dos_message[14] = 0x24;
292
10.7k
  pe->dos_message[15] = 0x0;
293
294
10.7k
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
10.7k
  bfd_coff_long_section_names (abfd)
297
10.7k
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
10.7k
  return true;
300
10.7k
}
pei-i386.c:pe_mkobject
Line
Count
Source
260
1.17k
{
261
1.17k
  pe_data_type *pe;
262
1.17k
  size_t amt = sizeof (pe_data_type);
263
264
1.17k
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
1.17k
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
1.17k
  pe = pe_data (abfd);
270
271
1.17k
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
1.17k
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
1.17k
  pe->dos_message[0]  = 0x0eba1f0e;
278
1.17k
  pe->dos_message[1]  = 0xcd09b400;
279
1.17k
  pe->dos_message[2]  = 0x4c01b821;
280
1.17k
  pe->dos_message[3]  = 0x685421cd;
281
1.17k
  pe->dos_message[4]  = 0x70207369;
282
1.17k
  pe->dos_message[5]  = 0x72676f72;
283
1.17k
  pe->dos_message[6]  = 0x63206d61;
284
1.17k
  pe->dos_message[7]  = 0x6f6e6e61;
285
1.17k
  pe->dos_message[8]  = 0x65622074;
286
1.17k
  pe->dos_message[9]  = 0x6e757220;
287
1.17k
  pe->dos_message[10] = 0x206e6920;
288
1.17k
  pe->dos_message[11] = 0x20534f44;
289
1.17k
  pe->dos_message[12] = 0x65646f6d;
290
1.17k
  pe->dos_message[13] = 0x0a0d0d2e;
291
1.17k
  pe->dos_message[14] = 0x24;
292
1.17k
  pe->dos_message[15] = 0x0;
293
294
1.17k
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
1.17k
  bfd_coff_long_section_names (abfd)
297
1.17k
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
1.17k
  return true;
300
1.17k
}
Unexecuted instantiation: pe-x86_64.c:pe_mkobject
pei-x86_64.c:pe_mkobject
Line
Count
Source
260
1.30k
{
261
1.30k
  pe_data_type *pe;
262
1.30k
  size_t amt = sizeof (pe_data_type);
263
264
1.30k
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
1.30k
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
1.30k
  pe = pe_data (abfd);
270
271
1.30k
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
1.30k
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
1.30k
  pe->dos_message[0]  = 0x0eba1f0e;
278
1.30k
  pe->dos_message[1]  = 0xcd09b400;
279
1.30k
  pe->dos_message[2]  = 0x4c01b821;
280
1.30k
  pe->dos_message[3]  = 0x685421cd;
281
1.30k
  pe->dos_message[4]  = 0x70207369;
282
1.30k
  pe->dos_message[5]  = 0x72676f72;
283
1.30k
  pe->dos_message[6]  = 0x63206d61;
284
1.30k
  pe->dos_message[7]  = 0x6f6e6e61;
285
1.30k
  pe->dos_message[8]  = 0x65622074;
286
1.30k
  pe->dos_message[9]  = 0x6e757220;
287
1.30k
  pe->dos_message[10] = 0x206e6920;
288
1.30k
  pe->dos_message[11] = 0x20534f44;
289
1.30k
  pe->dos_message[12] = 0x65646f6d;
290
1.30k
  pe->dos_message[13] = 0x0a0d0d2e;
291
1.30k
  pe->dos_message[14] = 0x24;
292
1.30k
  pe->dos_message[15] = 0x0;
293
294
1.30k
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
1.30k
  bfd_coff_long_section_names (abfd)
297
1.30k
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
1.30k
  return true;
300
1.30k
}
pei-aarch64.c:pe_mkobject
Line
Count
Source
260
962
{
261
962
  pe_data_type *pe;
262
962
  size_t amt = sizeof (pe_data_type);
263
264
962
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
962
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
962
  pe = pe_data (abfd);
270
271
962
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
962
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
962
  pe->dos_message[0]  = 0x0eba1f0e;
278
962
  pe->dos_message[1]  = 0xcd09b400;
279
962
  pe->dos_message[2]  = 0x4c01b821;
280
962
  pe->dos_message[3]  = 0x685421cd;
281
962
  pe->dos_message[4]  = 0x70207369;
282
962
  pe->dos_message[5]  = 0x72676f72;
283
962
  pe->dos_message[6]  = 0x63206d61;
284
962
  pe->dos_message[7]  = 0x6f6e6e61;
285
962
  pe->dos_message[8]  = 0x65622074;
286
962
  pe->dos_message[9]  = 0x6e757220;
287
962
  pe->dos_message[10] = 0x206e6920;
288
962
  pe->dos_message[11] = 0x20534f44;
289
962
  pe->dos_message[12] = 0x65646f6d;
290
962
  pe->dos_message[13] = 0x0a0d0d2e;
291
962
  pe->dos_message[14] = 0x24;
292
962
  pe->dos_message[15] = 0x0;
293
294
962
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
962
  bfd_coff_long_section_names (abfd)
297
962
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
962
  return true;
300
962
}
Unexecuted instantiation: pe-aarch64.c:pe_mkobject
pei-ia64.c:pe_mkobject
Line
Count
Source
260
939
{
261
939
  pe_data_type *pe;
262
939
  size_t amt = sizeof (pe_data_type);
263
264
939
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
939
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
939
  pe = pe_data (abfd);
270
271
939
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
939
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
939
  pe->dos_message[0]  = 0x0eba1f0e;
278
939
  pe->dos_message[1]  = 0xcd09b400;
279
939
  pe->dos_message[2]  = 0x4c01b821;
280
939
  pe->dos_message[3]  = 0x685421cd;
281
939
  pe->dos_message[4]  = 0x70207369;
282
939
  pe->dos_message[5]  = 0x72676f72;
283
939
  pe->dos_message[6]  = 0x63206d61;
284
939
  pe->dos_message[7]  = 0x6f6e6e61;
285
939
  pe->dos_message[8]  = 0x65622074;
286
939
  pe->dos_message[9]  = 0x6e757220;
287
939
  pe->dos_message[10] = 0x206e6920;
288
939
  pe->dos_message[11] = 0x20534f44;
289
939
  pe->dos_message[12] = 0x65646f6d;
290
939
  pe->dos_message[13] = 0x0a0d0d2e;
291
939
  pe->dos_message[14] = 0x24;
292
939
  pe->dos_message[15] = 0x0;
293
294
939
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
939
  bfd_coff_long_section_names (abfd)
297
939
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
939
  return true;
300
939
}
pei-loongarch64.c:pe_mkobject
Line
Count
Source
260
906
{
261
906
  pe_data_type *pe;
262
906
  size_t amt = sizeof (pe_data_type);
263
264
906
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
906
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
906
  pe = pe_data (abfd);
270
271
906
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
906
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
906
  pe->dos_message[0]  = 0x0eba1f0e;
278
906
  pe->dos_message[1]  = 0xcd09b400;
279
906
  pe->dos_message[2]  = 0x4c01b821;
280
906
  pe->dos_message[3]  = 0x685421cd;
281
906
  pe->dos_message[4]  = 0x70207369;
282
906
  pe->dos_message[5]  = 0x72676f72;
283
906
  pe->dos_message[6]  = 0x63206d61;
284
906
  pe->dos_message[7]  = 0x6f6e6e61;
285
906
  pe->dos_message[8]  = 0x65622074;
286
906
  pe->dos_message[9]  = 0x6e757220;
287
906
  pe->dos_message[10] = 0x206e6920;
288
906
  pe->dos_message[11] = 0x20534f44;
289
906
  pe->dos_message[12] = 0x65646f6d;
290
906
  pe->dos_message[13] = 0x0a0d0d2e;
291
906
  pe->dos_message[14] = 0x24;
292
906
  pe->dos_message[15] = 0x0;
293
294
906
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
906
  bfd_coff_long_section_names (abfd)
297
906
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
906
  return true;
300
906
}
Unexecuted instantiation: pe-arm-wince.c:pe_mkobject
Unexecuted instantiation: pe-arm.c:pe_mkobject
pe-i386.c:pe_mkobject
Line
Count
Source
260
1.40k
{
261
1.40k
  pe_data_type *pe;
262
1.40k
  size_t amt = sizeof (pe_data_type);
263
264
1.40k
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
1.40k
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
1.40k
  pe = pe_data (abfd);
270
271
1.40k
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
1.40k
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
1.40k
  pe->dos_message[0]  = 0x0eba1f0e;
278
1.40k
  pe->dos_message[1]  = 0xcd09b400;
279
1.40k
  pe->dos_message[2]  = 0x4c01b821;
280
1.40k
  pe->dos_message[3]  = 0x685421cd;
281
1.40k
  pe->dos_message[4]  = 0x70207369;
282
1.40k
  pe->dos_message[5]  = 0x72676f72;
283
1.40k
  pe->dos_message[6]  = 0x63206d61;
284
1.40k
  pe->dos_message[7]  = 0x6f6e6e61;
285
1.40k
  pe->dos_message[8]  = 0x65622074;
286
1.40k
  pe->dos_message[9]  = 0x6e757220;
287
1.40k
  pe->dos_message[10] = 0x206e6920;
288
1.40k
  pe->dos_message[11] = 0x20534f44;
289
1.40k
  pe->dos_message[12] = 0x65646f6d;
290
1.40k
  pe->dos_message[13] = 0x0a0d0d2e;
291
1.40k
  pe->dos_message[14] = 0x24;
292
1.40k
  pe->dos_message[15] = 0x0;
293
294
1.40k
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
1.40k
  bfd_coff_long_section_names (abfd)
297
1.40k
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
1.40k
  return true;
300
1.40k
}
Unexecuted instantiation: pe-mcore.c:pe_mkobject
Unexecuted instantiation: pe-sh.c:pe_mkobject
pei-arm-wince.c:pe_mkobject
Line
Count
Source
260
1.11k
{
261
1.11k
  pe_data_type *pe;
262
1.11k
  size_t amt = sizeof (pe_data_type);
263
264
1.11k
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
1.11k
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
1.11k
  pe = pe_data (abfd);
270
271
1.11k
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
1.11k
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
1.11k
  pe->dos_message[0]  = 0x0eba1f0e;
278
1.11k
  pe->dos_message[1]  = 0xcd09b400;
279
1.11k
  pe->dos_message[2]  = 0x4c01b821;
280
1.11k
  pe->dos_message[3]  = 0x685421cd;
281
1.11k
  pe->dos_message[4]  = 0x70207369;
282
1.11k
  pe->dos_message[5]  = 0x72676f72;
283
1.11k
  pe->dos_message[6]  = 0x63206d61;
284
1.11k
  pe->dos_message[7]  = 0x6f6e6e61;
285
1.11k
  pe->dos_message[8]  = 0x65622074;
286
1.11k
  pe->dos_message[9]  = 0x6e757220;
287
1.11k
  pe->dos_message[10] = 0x206e6920;
288
1.11k
  pe->dos_message[11] = 0x20534f44;
289
1.11k
  pe->dos_message[12] = 0x65646f6d;
290
1.11k
  pe->dos_message[13] = 0x0a0d0d2e;
291
1.11k
  pe->dos_message[14] = 0x24;
292
1.11k
  pe->dos_message[15] = 0x0;
293
294
1.11k
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
1.11k
  bfd_coff_long_section_names (abfd)
297
1.11k
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
1.11k
  return true;
300
1.11k
}
pei-arm.c:pe_mkobject
Line
Count
Source
260
1.25k
{
261
1.25k
  pe_data_type *pe;
262
1.25k
  size_t amt = sizeof (pe_data_type);
263
264
1.25k
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
1.25k
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
1.25k
  pe = pe_data (abfd);
270
271
1.25k
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
1.25k
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
1.25k
  pe->dos_message[0]  = 0x0eba1f0e;
278
1.25k
  pe->dos_message[1]  = 0xcd09b400;
279
1.25k
  pe->dos_message[2]  = 0x4c01b821;
280
1.25k
  pe->dos_message[3]  = 0x685421cd;
281
1.25k
  pe->dos_message[4]  = 0x70207369;
282
1.25k
  pe->dos_message[5]  = 0x72676f72;
283
1.25k
  pe->dos_message[6]  = 0x63206d61;
284
1.25k
  pe->dos_message[7]  = 0x6f6e6e61;
285
1.25k
  pe->dos_message[8]  = 0x65622074;
286
1.25k
  pe->dos_message[9]  = 0x6e757220;
287
1.25k
  pe->dos_message[10] = 0x206e6920;
288
1.25k
  pe->dos_message[11] = 0x20534f44;
289
1.25k
  pe->dos_message[12] = 0x65646f6d;
290
1.25k
  pe->dos_message[13] = 0x0a0d0d2e;
291
1.25k
  pe->dos_message[14] = 0x24;
292
1.25k
  pe->dos_message[15] = 0x0;
293
294
1.25k
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
1.25k
  bfd_coff_long_section_names (abfd)
297
1.25k
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
1.25k
  return true;
300
1.25k
}
pei-mcore.c:pe_mkobject
Line
Count
Source
260
847
{
261
847
  pe_data_type *pe;
262
847
  size_t amt = sizeof (pe_data_type);
263
264
847
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
847
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
847
  pe = pe_data (abfd);
270
271
847
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
847
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
847
  pe->dos_message[0]  = 0x0eba1f0e;
278
847
  pe->dos_message[1]  = 0xcd09b400;
279
847
  pe->dos_message[2]  = 0x4c01b821;
280
847
  pe->dos_message[3]  = 0x685421cd;
281
847
  pe->dos_message[4]  = 0x70207369;
282
847
  pe->dos_message[5]  = 0x72676f72;
283
847
  pe->dos_message[6]  = 0x63206d61;
284
847
  pe->dos_message[7]  = 0x6f6e6e61;
285
847
  pe->dos_message[8]  = 0x65622074;
286
847
  pe->dos_message[9]  = 0x6e757220;
287
847
  pe->dos_message[10] = 0x206e6920;
288
847
  pe->dos_message[11] = 0x20534f44;
289
847
  pe->dos_message[12] = 0x65646f6d;
290
847
  pe->dos_message[13] = 0x0a0d0d2e;
291
847
  pe->dos_message[14] = 0x24;
292
847
  pe->dos_message[15] = 0x0;
293
294
847
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
847
  bfd_coff_long_section_names (abfd)
297
847
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
847
  return true;
300
847
}
pei-sh.c:pe_mkobject
Line
Count
Source
260
826
{
261
826
  pe_data_type *pe;
262
826
  size_t amt = sizeof (pe_data_type);
263
264
826
  abfd->tdata.pe_obj_data = (struct pe_tdata *) bfd_zalloc (abfd, amt);
265
266
826
  if (abfd->tdata.pe_obj_data == 0)
267
0
    return false;
268
269
826
  pe = pe_data (abfd);
270
271
826
  pe->coff.pe = 1;
272
273
  /* in_reloc_p is architecture dependent.  */
274
826
  pe->in_reloc_p = in_reloc_p;
275
276
  /* Default DOS message string.  */
277
826
  pe->dos_message[0]  = 0x0eba1f0e;
278
826
  pe->dos_message[1]  = 0xcd09b400;
279
826
  pe->dos_message[2]  = 0x4c01b821;
280
826
  pe->dos_message[3]  = 0x685421cd;
281
826
  pe->dos_message[4]  = 0x70207369;
282
826
  pe->dos_message[5]  = 0x72676f72;
283
826
  pe->dos_message[6]  = 0x63206d61;
284
826
  pe->dos_message[7]  = 0x6f6e6e61;
285
826
  pe->dos_message[8]  = 0x65622074;
286
826
  pe->dos_message[9]  = 0x6e757220;
287
826
  pe->dos_message[10] = 0x206e6920;
288
826
  pe->dos_message[11] = 0x20534f44;
289
826
  pe->dos_message[12] = 0x65646f6d;
290
826
  pe->dos_message[13] = 0x0a0d0d2e;
291
826
  pe->dos_message[14] = 0x24;
292
826
  pe->dos_message[15] = 0x0;
293
294
826
  memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
295
296
826
  bfd_coff_long_section_names (abfd)
297
826
    = coff_backend_info (abfd)->_bfd_coff_long_section_names;
298
299
826
  return true;
300
826
}
301
302
/* Create the COFF backend specific information.  */
303
304
static void *
305
pe_mkobject_hook (bfd * abfd,
306
      void * filehdr,
307
      void * aouthdr ATTRIBUTE_UNUSED)
308
10.7k
{
309
10.7k
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
10.7k
  pe_data_type *pe;
311
312
10.7k
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
10.7k
  pe = pe_data (abfd);
316
10.7k
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
10.7k
  pe->coff.local_n_btmask = N_BTMASK;
321
10.7k
  pe->coff.local_n_btshft = N_BTSHFT;
322
10.7k
  pe->coff.local_n_tmask = N_TMASK;
323
10.7k
  pe->coff.local_n_tshift = N_TSHIFT;
324
10.7k
  pe->coff.local_symesz = SYMESZ;
325
10.7k
  pe->coff.local_auxesz = AUXESZ;
326
10.7k
  pe->coff.local_linesz = LINESZ;
327
328
10.7k
  pe->coff.timestamp = internal_f->f_timdat;
329
330
10.7k
  obj_raw_syment_count (abfd) =
331
10.7k
    obj_conv_table_size (abfd) =
332
10.7k
      internal_f->f_nsyms;
333
334
10.7k
  pe->real_flags = internal_f->f_flags;
335
336
10.7k
  if ((internal_f->f_flags & F_DLL) != 0)
337
3.48k
    pe->dll = 1;
338
339
10.7k
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
7.44k
    abfd->flags |= HAS_DEBUG;
341
342
#ifdef COFF_IMAGE_WITH_PE
343
9.33k
  if (aouthdr)
344
5.23k
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
#endif
346
347
#ifdef ARM
348
2.37k
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
0
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
10.7k
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
10.7k
    sizeof (pe->dos_message));
354
355
10.7k
  return (void *) pe;
356
10.7k
}
pei-i386.c:pe_mkobject_hook
Line
Count
Source
308
1.17k
{
309
1.17k
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
1.17k
  pe_data_type *pe;
311
312
1.17k
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
1.17k
  pe = pe_data (abfd);
316
1.17k
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
1.17k
  pe->coff.local_n_btmask = N_BTMASK;
321
1.17k
  pe->coff.local_n_btshft = N_BTSHFT;
322
1.17k
  pe->coff.local_n_tmask = N_TMASK;
323
1.17k
  pe->coff.local_n_tshift = N_TSHIFT;
324
1.17k
  pe->coff.local_symesz = SYMESZ;
325
1.17k
  pe->coff.local_auxesz = AUXESZ;
326
1.17k
  pe->coff.local_linesz = LINESZ;
327
328
1.17k
  pe->coff.timestamp = internal_f->f_timdat;
329
330
1.17k
  obj_raw_syment_count (abfd) =
331
1.17k
    obj_conv_table_size (abfd) =
332
1.17k
      internal_f->f_nsyms;
333
334
1.17k
  pe->real_flags = internal_f->f_flags;
335
336
1.17k
  if ((internal_f->f_flags & F_DLL) != 0)
337
368
    pe->dll = 1;
338
339
1.17k
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
727
    abfd->flags |= HAS_DEBUG;
341
342
1.17k
#ifdef COFF_IMAGE_WITH_PE
343
1.17k
  if (aouthdr)
344
658
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
1.17k
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
1.17k
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
1.17k
    sizeof (pe->dos_message));
354
355
1.17k
  return (void *) pe;
356
1.17k
}
Unexecuted instantiation: pe-x86_64.c:pe_mkobject_hook
pei-x86_64.c:pe_mkobject_hook
Line
Count
Source
308
1.30k
{
309
1.30k
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
1.30k
  pe_data_type *pe;
311
312
1.30k
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
1.30k
  pe = pe_data (abfd);
316
1.30k
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
1.30k
  pe->coff.local_n_btmask = N_BTMASK;
321
1.30k
  pe->coff.local_n_btshft = N_BTSHFT;
322
1.30k
  pe->coff.local_n_tmask = N_TMASK;
323
1.30k
  pe->coff.local_n_tshift = N_TSHIFT;
324
1.30k
  pe->coff.local_symesz = SYMESZ;
325
1.30k
  pe->coff.local_auxesz = AUXESZ;
326
1.30k
  pe->coff.local_linesz = LINESZ;
327
328
1.30k
  pe->coff.timestamp = internal_f->f_timdat;
329
330
1.30k
  obj_raw_syment_count (abfd) =
331
1.30k
    obj_conv_table_size (abfd) =
332
1.30k
      internal_f->f_nsyms;
333
334
1.30k
  pe->real_flags = internal_f->f_flags;
335
336
1.30k
  if ((internal_f->f_flags & F_DLL) != 0)
337
421
    pe->dll = 1;
338
339
1.30k
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
904
    abfd->flags |= HAS_DEBUG;
341
342
1.30k
#ifdef COFF_IMAGE_WITH_PE
343
1.30k
  if (aouthdr)
344
910
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
1.30k
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
1.30k
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
1.30k
    sizeof (pe->dos_message));
354
355
1.30k
  return (void *) pe;
356
1.30k
}
pei-aarch64.c:pe_mkobject_hook
Line
Count
Source
308
962
{
309
962
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
962
  pe_data_type *pe;
311
312
962
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
962
  pe = pe_data (abfd);
316
962
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
962
  pe->coff.local_n_btmask = N_BTMASK;
321
962
  pe->coff.local_n_btshft = N_BTSHFT;
322
962
  pe->coff.local_n_tmask = N_TMASK;
323
962
  pe->coff.local_n_tshift = N_TSHIFT;
324
962
  pe->coff.local_symesz = SYMESZ;
325
962
  pe->coff.local_auxesz = AUXESZ;
326
962
  pe->coff.local_linesz = LINESZ;
327
328
962
  pe->coff.timestamp = internal_f->f_timdat;
329
330
962
  obj_raw_syment_count (abfd) =
331
962
    obj_conv_table_size (abfd) =
332
962
      internal_f->f_nsyms;
333
334
962
  pe->real_flags = internal_f->f_flags;
335
336
962
  if ((internal_f->f_flags & F_DLL) != 0)
337
507
    pe->dll = 1;
338
339
962
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
665
    abfd->flags |= HAS_DEBUG;
341
342
962
#ifdef COFF_IMAGE_WITH_PE
343
962
  if (aouthdr)
344
681
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
962
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
962
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
962
    sizeof (pe->dos_message));
354
355
962
  return (void *) pe;
356
962
}
Unexecuted instantiation: pe-aarch64.c:pe_mkobject_hook
pei-ia64.c:pe_mkobject_hook
Line
Count
Source
308
939
{
309
939
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
939
  pe_data_type *pe;
311
312
939
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
939
  pe = pe_data (abfd);
316
939
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
939
  pe->coff.local_n_btmask = N_BTMASK;
321
939
  pe->coff.local_n_btshft = N_BTSHFT;
322
939
  pe->coff.local_n_tmask = N_TMASK;
323
939
  pe->coff.local_n_tshift = N_TSHIFT;
324
939
  pe->coff.local_symesz = SYMESZ;
325
939
  pe->coff.local_auxesz = AUXESZ;
326
939
  pe->coff.local_linesz = LINESZ;
327
328
939
  pe->coff.timestamp = internal_f->f_timdat;
329
330
939
  obj_raw_syment_count (abfd) =
331
939
    obj_conv_table_size (abfd) =
332
939
      internal_f->f_nsyms;
333
334
939
  pe->real_flags = internal_f->f_flags;
335
336
939
  if ((internal_f->f_flags & F_DLL) != 0)
337
273
    pe->dll = 1;
338
339
939
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
735
    abfd->flags |= HAS_DEBUG;
341
342
939
#ifdef COFF_IMAGE_WITH_PE
343
939
  if (aouthdr)
344
472
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
939
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
939
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
939
    sizeof (pe->dos_message));
354
355
939
  return (void *) pe;
356
939
}
pei-loongarch64.c:pe_mkobject_hook
Line
Count
Source
308
906
{
309
906
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
906
  pe_data_type *pe;
311
312
906
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
906
  pe = pe_data (abfd);
316
906
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
906
  pe->coff.local_n_btmask = N_BTMASK;
321
906
  pe->coff.local_n_btshft = N_BTSHFT;
322
906
  pe->coff.local_n_tmask = N_TMASK;
323
906
  pe->coff.local_n_tshift = N_TSHIFT;
324
906
  pe->coff.local_symesz = SYMESZ;
325
906
  pe->coff.local_auxesz = AUXESZ;
326
906
  pe->coff.local_linesz = LINESZ;
327
328
906
  pe->coff.timestamp = internal_f->f_timdat;
329
330
906
  obj_raw_syment_count (abfd) =
331
906
    obj_conv_table_size (abfd) =
332
906
      internal_f->f_nsyms;
333
334
906
  pe->real_flags = internal_f->f_flags;
335
336
906
  if ((internal_f->f_flags & F_DLL) != 0)
337
338
    pe->dll = 1;
338
339
906
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
728
    abfd->flags |= HAS_DEBUG;
341
342
906
#ifdef COFF_IMAGE_WITH_PE
343
906
  if (aouthdr)
344
643
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
906
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
906
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
906
    sizeof (pe->dos_message));
354
355
906
  return (void *) pe;
356
906
}
Unexecuted instantiation: pe-arm-wince.c:pe_mkobject_hook
Unexecuted instantiation: pe-arm.c:pe_mkobject_hook
pe-i386.c:pe_mkobject_hook
Line
Count
Source
308
1.40k
{
309
1.40k
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
1.40k
  pe_data_type *pe;
311
312
1.40k
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
1.40k
  pe = pe_data (abfd);
316
1.40k
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
1.40k
  pe->coff.local_n_btmask = N_BTMASK;
321
1.40k
  pe->coff.local_n_btshft = N_BTSHFT;
322
1.40k
  pe->coff.local_n_tmask = N_TMASK;
323
1.40k
  pe->coff.local_n_tshift = N_TSHIFT;
324
1.40k
  pe->coff.local_symesz = SYMESZ;
325
1.40k
  pe->coff.local_auxesz = AUXESZ;
326
1.40k
  pe->coff.local_linesz = LINESZ;
327
328
1.40k
  pe->coff.timestamp = internal_f->f_timdat;
329
330
1.40k
  obj_raw_syment_count (abfd) =
331
1.40k
    obj_conv_table_size (abfd) =
332
1.40k
      internal_f->f_nsyms;
333
334
1.40k
  pe->real_flags = internal_f->f_flags;
335
336
1.40k
  if ((internal_f->f_flags & F_DLL) != 0)
337
299
    pe->dll = 1;
338
339
1.40k
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
815
    abfd->flags |= HAS_DEBUG;
341
342
#ifdef COFF_IMAGE_WITH_PE
343
  if (aouthdr)
344
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
1.40k
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
1.40k
    sizeof (pe->dos_message));
354
355
1.40k
  return (void *) pe;
356
1.40k
}
Unexecuted instantiation: pe-mcore.c:pe_mkobject_hook
Unexecuted instantiation: pe-sh.c:pe_mkobject_hook
pei-arm-wince.c:pe_mkobject_hook
Line
Count
Source
308
1.11k
{
309
1.11k
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
1.11k
  pe_data_type *pe;
311
312
1.11k
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
1.11k
  pe = pe_data (abfd);
316
1.11k
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
1.11k
  pe->coff.local_n_btmask = N_BTMASK;
321
1.11k
  pe->coff.local_n_btshft = N_BTSHFT;
322
1.11k
  pe->coff.local_n_tmask = N_TMASK;
323
1.11k
  pe->coff.local_n_tshift = N_TSHIFT;
324
1.11k
  pe->coff.local_symesz = SYMESZ;
325
1.11k
  pe->coff.local_auxesz = AUXESZ;
326
1.11k
  pe->coff.local_linesz = LINESZ;
327
328
1.11k
  pe->coff.timestamp = internal_f->f_timdat;
329
330
1.11k
  obj_raw_syment_count (abfd) =
331
1.11k
    obj_conv_table_size (abfd) =
332
1.11k
      internal_f->f_nsyms;
333
334
1.11k
  pe->real_flags = internal_f->f_flags;
335
336
1.11k
  if ((internal_f->f_flags & F_DLL) != 0)
337
302
    pe->dll = 1;
338
339
1.11k
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
820
    abfd->flags |= HAS_DEBUG;
341
342
1.11k
#ifdef COFF_IMAGE_WITH_PE
343
1.11k
  if (aouthdr)
344
267
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
1.11k
#endif
346
347
1.11k
#ifdef ARM
348
1.11k
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
0
    coff_data (abfd) ->flags = 0;
350
1.11k
#endif
351
352
1.11k
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
1.11k
    sizeof (pe->dos_message));
354
355
1.11k
  return (void *) pe;
356
1.11k
}
pei-arm.c:pe_mkobject_hook
Line
Count
Source
308
1.25k
{
309
1.25k
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
1.25k
  pe_data_type *pe;
311
312
1.25k
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
1.25k
  pe = pe_data (abfd);
316
1.25k
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
1.25k
  pe->coff.local_n_btmask = N_BTMASK;
321
1.25k
  pe->coff.local_n_btshft = N_BTSHFT;
322
1.25k
  pe->coff.local_n_tmask = N_TMASK;
323
1.25k
  pe->coff.local_n_tshift = N_TSHIFT;
324
1.25k
  pe->coff.local_symesz = SYMESZ;
325
1.25k
  pe->coff.local_auxesz = AUXESZ;
326
1.25k
  pe->coff.local_linesz = LINESZ;
327
328
1.25k
  pe->coff.timestamp = internal_f->f_timdat;
329
330
1.25k
  obj_raw_syment_count (abfd) =
331
1.25k
    obj_conv_table_size (abfd) =
332
1.25k
      internal_f->f_nsyms;
333
334
1.25k
  pe->real_flags = internal_f->f_flags;
335
336
1.25k
  if ((internal_f->f_flags & F_DLL) != 0)
337
348
    pe->dll = 1;
338
339
1.25k
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
916
    abfd->flags |= HAS_DEBUG;
341
342
1.25k
#ifdef COFF_IMAGE_WITH_PE
343
1.25k
  if (aouthdr)
344
406
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
1.25k
#endif
346
347
1.25k
#ifdef ARM
348
1.25k
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
0
    coff_data (abfd) ->flags = 0;
350
1.25k
#endif
351
352
1.25k
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
1.25k
    sizeof (pe->dos_message));
354
355
1.25k
  return (void *) pe;
356
1.25k
}
pei-mcore.c:pe_mkobject_hook
Line
Count
Source
308
847
{
309
847
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
847
  pe_data_type *pe;
311
312
847
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
847
  pe = pe_data (abfd);
316
847
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
847
  pe->coff.local_n_btmask = N_BTMASK;
321
847
  pe->coff.local_n_btshft = N_BTSHFT;
322
847
  pe->coff.local_n_tmask = N_TMASK;
323
847
  pe->coff.local_n_tshift = N_TSHIFT;
324
847
  pe->coff.local_symesz = SYMESZ;
325
847
  pe->coff.local_auxesz = AUXESZ;
326
847
  pe->coff.local_linesz = LINESZ;
327
328
847
  pe->coff.timestamp = internal_f->f_timdat;
329
330
847
  obj_raw_syment_count (abfd) =
331
847
    obj_conv_table_size (abfd) =
332
847
      internal_f->f_nsyms;
333
334
847
  pe->real_flags = internal_f->f_flags;
335
336
847
  if ((internal_f->f_flags & F_DLL) != 0)
337
252
    pe->dll = 1;
338
339
847
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
575
    abfd->flags |= HAS_DEBUG;
341
342
847
#ifdef COFF_IMAGE_WITH_PE
343
847
  if (aouthdr)
344
625
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
847
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
847
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
847
    sizeof (pe->dos_message));
354
355
847
  return (void *) pe;
356
847
}
pei-sh.c:pe_mkobject_hook
Line
Count
Source
308
826
{
309
826
  struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
310
826
  pe_data_type *pe;
311
312
826
  if (! pe_mkobject (abfd))
313
0
    return NULL;
314
315
826
  pe = pe_data (abfd);
316
826
  pe->coff.sym_filepos = internal_f->f_symptr;
317
  /* These members communicate important constants about the symbol
318
     table to GDB's symbol-reading code.  These `constants'
319
     unfortunately vary among coff implementations...  */
320
826
  pe->coff.local_n_btmask = N_BTMASK;
321
826
  pe->coff.local_n_btshft = N_BTSHFT;
322
826
  pe->coff.local_n_tmask = N_TMASK;
323
826
  pe->coff.local_n_tshift = N_TSHIFT;
324
826
  pe->coff.local_symesz = SYMESZ;
325
826
  pe->coff.local_auxesz = AUXESZ;
326
826
  pe->coff.local_linesz = LINESZ;
327
328
826
  pe->coff.timestamp = internal_f->f_timdat;
329
330
826
  obj_raw_syment_count (abfd) =
331
826
    obj_conv_table_size (abfd) =
332
826
      internal_f->f_nsyms;
333
334
826
  pe->real_flags = internal_f->f_flags;
335
336
826
  if ((internal_f->f_flags & F_DLL) != 0)
337
379
    pe->dll = 1;
338
339
826
  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
340
557
    abfd->flags |= HAS_DEBUG;
341
342
826
#ifdef COFF_IMAGE_WITH_PE
343
826
  if (aouthdr)
344
572
    pe->pe_opthdr = ((struct internal_aouthdr *) aouthdr)->pe;
345
826
#endif
346
347
#ifdef ARM
348
  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
349
    coff_data (abfd) ->flags = 0;
350
#endif
351
352
826
  memcpy (pe->dos_message, internal_f->pe.dos_message,
353
826
    sizeof (pe->dos_message));
354
355
826
  return (void *) pe;
356
826
}
357
358
static bool
359
pe_print_private_bfd_data (bfd *abfd, void * vfile)
360
0
{
361
0
  FILE *file = (FILE *) vfile;
362
363
0
  if (!_bfd_XX_print_private_bfd_data_common (abfd, vfile))
364
0
    return false;
365
366
0
  if (pe_saved_coff_bfd_print_private_bfd_data == NULL)
367
0
    return true;
368
369
0
  fputc ('\n', file);
370
371
0
  return pe_saved_coff_bfd_print_private_bfd_data (abfd, vfile);
372
0
}
Unexecuted instantiation: pei-i386.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-x86_64.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-x86_64.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-aarch64.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-aarch64.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-ia64.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-loongarch64.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-arm-wince.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-arm.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-i386.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-mcore.c:pe_print_private_bfd_data
Unexecuted instantiation: pe-sh.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-arm-wince.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-arm.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-mcore.c:pe_print_private_bfd_data
Unexecuted instantiation: pei-sh.c:pe_print_private_bfd_data
373
374
/* Copy any private info we understand from the input bfd
375
   to the output bfd.  */
376
377
static bool
378
pe_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
379
0
{
380
  /* PR binutils/716: Copy the large address aware flag.
381
     XXX: Should we be copying other flags or other fields in the pe_data()
382
     structure ?  */
383
0
  if (pe_data (obfd) != NULL
384
0
      && pe_data (ibfd) != NULL
385
0
      && pe_data (ibfd)->real_flags & IMAGE_FILE_LARGE_ADDRESS_AWARE)
386
0
    pe_data (obfd)->real_flags |= IMAGE_FILE_LARGE_ADDRESS_AWARE;
387
388
0
  if (!_bfd_XX_bfd_copy_private_bfd_data_common (ibfd, obfd))
389
0
    return false;
390
391
0
  if (pe_saved_coff_bfd_copy_private_bfd_data)
392
0
    return pe_saved_coff_bfd_copy_private_bfd_data (ibfd, obfd);
393
394
0
  return true;
395
0
}
Unexecuted instantiation: pei-i386.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-x86_64.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-x86_64.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-aarch64.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-aarch64.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-ia64.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-loongarch64.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-arm-wince.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-arm.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-i386.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-mcore.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pe-sh.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-arm-wince.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-arm.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-mcore.c:pe_bfd_copy_private_bfd_data
Unexecuted instantiation: pei-sh.c:pe_bfd_copy_private_bfd_data
396
397
#define coff_bfd_copy_private_section_data \
398
  _bfd_XX_bfd_copy_private_section_data
399
400
#define coff_get_symbol_info _bfd_XX_get_symbol_info
401
402
#ifdef COFF_IMAGE_WITH_PE
403

404
/* Code to handle Microsoft's Import Library Format.
405
   Also known as LINK6 format.
406
   Documentation about this format can be found at:
407
408
   https://learn.microsoft.com/en-us/windows/win32/debug/pe-format#import-library-format  */
409
410
/* The following constants specify the sizes of the various data
411
   structures that we have to create in order to build a bfd describing
412
   an ILF object file.  The final "+ 1" in the definitions of SIZEOF_IDATA6
413
   and SIZEOF_IDATA7 below is to allow for the possibility that we might
414
   need a padding byte in order to ensure 16 bit alignment for the section's
415
   contents.
416
417
   The value for SIZEOF_ILF_STRINGS is computed as follows:
418
419
      There will be NUM_ILF_SECTIONS section symbols.  Allow 9 characters
420
      per symbol for their names (longest section name is .idata$x).
421
422
      There will be two symbols for the imported value, one the symbol name
423
      and one with _imp__ prefixed.  Allowing for the terminating nul's this
424
      is strlen (symbol_name) * 2 + 8 + 21 + strlen (source_dll).
425
426
      The strings in the string table must start STRING__SIZE_SIZE bytes into
427
      the table in order to for the string lookup code in coffgen/coffcode to
428
      work.  */
429
0
#define NUM_ILF_RELOCS    8
430
0
#define NUM_ILF_SECTIONS  6
431
0
#define NUM_ILF_SYMS    (2 + NUM_ILF_SECTIONS)
432
433
0
#define SIZEOF_ILF_SYMS    (NUM_ILF_SYMS * sizeof (* vars.sym_cache))
434
0
#define SIZEOF_ILF_SYM_TABLE   (NUM_ILF_SYMS * sizeof (* vars.sym_table))
435
0
#define SIZEOF_ILF_NATIVE_SYMS   (NUM_ILF_SYMS * sizeof (* vars.native_syms))
436
0
#define SIZEOF_ILF_SYM_PTR_TABLE (NUM_ILF_SYMS * sizeof (* vars.sym_ptr_table))
437
0
#define SIZEOF_ILF_EXT_SYMS  (NUM_ILF_SYMS * sizeof (* vars.esym_table))
438
0
#define SIZEOF_ILF_RELOCS  (NUM_ILF_RELOCS * sizeof (* vars.reltab))
439
0
#define SIZEOF_ILF_INT_RELOCS  (NUM_ILF_RELOCS * sizeof (* vars.int_reltab))
440
0
#define SIZEOF_ILF_STRINGS   (strlen (symbol_name) * 2 + 8 \
441
0
          + 21 + strlen (source_dll) \
442
0
          + NUM_ILF_SECTIONS * 9 \
443
0
          + STRING_SIZE_SIZE)
444
0
#define SIZEOF_IDATA2   (5 * 4)
445
446
/* For PEx64 idata4 & 5 have thumb size of 8 bytes.  */
447
#if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
448
0
#define SIZEOF_IDATA4   (2 * 4)
449
0
#define SIZEOF_IDATA5   (2 * 4)
450
#else
451
0
#define SIZEOF_IDATA4   (1 * 4)
452
0
#define SIZEOF_IDATA5   (1 * 4)
453
#endif
454
455
0
#define SIZEOF_IDATA6   (2 + strlen (symbol_name) + 1 + 1)
456
0
#define SIZEOF_IDATA7   (strlen (source_dll) + 1 + 1)
457
0
#define SIZEOF_ILF_SECTIONS (NUM_ILF_SECTIONS * sizeof (struct coff_section_tdata))
458
459
#define ILF_DATA_SIZE       \
460
0
    + SIZEOF_ILF_SYMS        \
461
0
    + SIZEOF_ILF_SYM_TABLE      \
462
0
    + SIZEOF_ILF_NATIVE_SYMS      \
463
0
    + SIZEOF_ILF_SYM_PTR_TABLE      \
464
0
    + SIZEOF_ILF_EXT_SYMS      \
465
0
    + SIZEOF_ILF_RELOCS        \
466
0
    + SIZEOF_ILF_INT_RELOCS      \
467
0
    + SIZEOF_ILF_STRINGS      \
468
0
    + SIZEOF_IDATA2        \
469
0
    + SIZEOF_IDATA4        \
470
0
    + SIZEOF_IDATA5        \
471
0
    + SIZEOF_IDATA6        \
472
0
    + SIZEOF_IDATA7        \
473
0
    + SIZEOF_ILF_SECTIONS      \
474
0
    + MAX_TEXT_SECTION_SIZE
475
476
/* Create an empty relocation against the given symbol.  */
477
478
static void
479
pe_ILF_make_a_symbol_reloc (pe_ILF_vars *   vars,
480
          bfd_vma     address,
481
          bfd_reloc_code_real_type  reloc,
482
          struct bfd_symbol **  sym,
483
          unsigned int    sym_index)
484
0
{
485
0
  arelent * entry;
486
0
  struct internal_reloc * internal;
487
488
0
  entry = vars->reltab + vars->relcount;
489
0
  internal = vars->int_reltab + vars->relcount;
490
491
0
  entry->address     = address;
492
0
  entry->addend      = 0;
493
0
  entry->howto       = bfd_reloc_type_lookup (vars->abfd, reloc);
494
0
  entry->sym_ptr_ptr = sym;
495
496
0
  internal->r_vaddr  = address;
497
0
  internal->r_symndx = sym_index;
498
0
  internal->r_type   = entry->howto ? entry->howto->type : 0;
499
500
0
  vars->relcount ++;
501
502
0
  BFD_ASSERT (vars->relcount <= NUM_ILF_RELOCS);
503
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-x86_64.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-aarch64.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-ia64.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-arm.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-mcore.c:pe_ILF_make_a_symbol_reloc
Unexecuted instantiation: pei-sh.c:pe_ILF_make_a_symbol_reloc
504
505
/* Create an empty relocation against the given section.  */
506
507
static void
508
pe_ILF_make_a_reloc (pe_ILF_vars *         vars,
509
         bfd_vma           address,
510
         bfd_reloc_code_real_type  reloc,
511
         asection_ptr        sec)
512
0
{
513
0
  pe_ILF_make_a_symbol_reloc (vars, address, reloc, sec->symbol_ptr_ptr,
514
0
            coff_section_data (vars->abfd, sec)->i);
515
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-x86_64.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-aarch64.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-ia64.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-arm.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-mcore.c:pe_ILF_make_a_reloc
Unexecuted instantiation: pei-sh.c:pe_ILF_make_a_reloc
516
517
/* Move the queued relocs into the given section.  */
518
519
static void
520
pe_ILF_save_relocs (pe_ILF_vars * vars,
521
        asection_ptr  sec)
522
0
{
523
  /* Make sure that there is somewhere to store the internal relocs.  */
524
0
  if (coff_section_data (vars->abfd, sec) == NULL)
525
    /* We should probably return an error indication here.  */
526
0
    abort ();
527
528
0
  coff_section_data (vars->abfd, sec)->relocs = vars->int_reltab;
529
530
0
  sec->relocation  = vars->reltab;
531
0
  sec->reloc_count = vars->relcount;
532
0
  sec->flags      |= SEC_RELOC;
533
534
0
  vars->reltab     += vars->relcount;
535
0
  vars->int_reltab += vars->relcount;
536
0
  vars->relcount   = 0;
537
538
0
  BFD_ASSERT ((bfd_byte *) vars->int_reltab < (bfd_byte *) vars->string_table);
539
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-x86_64.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-aarch64.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-ia64.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-arm.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-mcore.c:pe_ILF_save_relocs
Unexecuted instantiation: pei-sh.c:pe_ILF_save_relocs
540
541
/* Create a global symbol and add it to the relevant tables.  */
542
543
static void
544
pe_ILF_make_a_symbol (pe_ILF_vars *  vars,
545
          const char *   prefix,
546
          const char *   symbol_name,
547
          asection_ptr   section,
548
          flagword       extra_flags)
549
0
{
550
0
  coff_symbol_type * sym;
551
0
  combined_entry_type * ent;
552
0
  SYMENT * esym;
553
0
  unsigned short sclass;
554
555
0
  if (extra_flags & BSF_LOCAL)
556
0
    sclass = C_STAT;
557
0
  else
558
0
    sclass = C_EXT;
559
560
#ifdef THUMBPEMAGIC
561
0
  if (vars->magic == THUMBPEMAGIC)
562
0
    {
563
0
      if (extra_flags & BSF_FUNCTION)
564
0
  sclass = C_THUMBEXTFUNC;
565
0
      else if (extra_flags & BSF_LOCAL)
566
0
  sclass = C_THUMBSTAT;
567
0
      else
568
0
  sclass = C_THUMBEXT;
569
0
    }
570
#endif
571
572
0
  BFD_ASSERT (vars->sym_index < NUM_ILF_SYMS);
573
574
0
  sym = vars->sym_ptr;
575
0
  ent = vars->native_ptr;
576
0
  esym = vars->esym_ptr;
577
578
  /* Copy the symbol's name into the string table.  */
579
0
  int len = sprintf (vars->string_ptr, "%s%s", prefix, symbol_name);
580
581
0
  if (section == NULL)
582
0
    section = bfd_und_section_ptr;
583
584
  /* Initialise the external symbol.  */
585
0
  H_PUT_32 (vars->abfd, vars->string_ptr - vars->string_table,
586
0
      esym->e.e.e_offset);
587
0
  H_PUT_16 (vars->abfd, section->target_index, esym->e_scnum);
588
0
  esym->e_sclass[0] = sclass;
589
590
  /* The following initialisations are unnecessary - the memory is
591
     zero initialised.  They are just kept here as reminders.  */
592
593
  /* Initialise the internal symbol structure.  */
594
0
  ent->u.syment.n_sclass    = sclass;
595
0
  ent->u.syment.n_scnum     = section->target_index;
596
0
  ent->u.syment._n._n_n._n_offset = (uintptr_t) sym;
597
0
  ent->is_sym = true;
598
599
0
  sym->symbol.the_bfd = vars->abfd;
600
0
  sym->symbol.name    = vars->string_ptr;
601
0
  sym->symbol.flags   = BSF_EXPORT | BSF_GLOBAL | extra_flags;
602
0
  sym->symbol.section = section;
603
0
  sym->native       = ent;
604
605
0
  * vars->table_ptr = vars->sym_index;
606
0
  * vars->sym_ptr_ptr = sym;
607
608
  /* Adjust pointers for the next symbol.  */
609
0
  vars->sym_index ++;
610
0
  vars->sym_ptr ++;
611
0
  vars->sym_ptr_ptr ++;
612
0
  vars->table_ptr ++;
613
0
  vars->native_ptr ++;
614
0
  vars->esym_ptr ++;
615
0
  vars->string_ptr += len + 1;
616
617
0
  BFD_ASSERT (vars->string_ptr < vars->end_string_ptr);
618
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-x86_64.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-aarch64.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-ia64.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-arm.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-mcore.c:pe_ILF_make_a_symbol
Unexecuted instantiation: pei-sh.c:pe_ILF_make_a_symbol
619
620
/* Create a section.  */
621
622
static asection_ptr
623
pe_ILF_make_a_section (pe_ILF_vars * vars,
624
           const char *  name,
625
           unsigned int  size,
626
           flagword      extra_flags)
627
0
{
628
0
  asection_ptr sec;
629
0
  flagword     flags;
630
0
  intptr_t alignment;
631
632
0
  sec = bfd_make_section_old_way (vars->abfd, name);
633
0
  if (sec == NULL)
634
0
    return NULL;
635
636
0
  flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_KEEP | SEC_IN_MEMORY;
637
638
0
  bfd_set_section_flags (sec, flags | extra_flags);
639
640
0
  bfd_set_section_alignment (sec, 2);
641
642
  /* Check that we will not run out of space.  */
643
0
  BFD_ASSERT (vars->data + size < vars->bim->buffer + vars->bim->size);
644
645
  /* Set the section size and contents.  The actual
646
     contents are filled in by our parent.  */
647
0
  bfd_set_section_size (sec, (bfd_size_type) size);
648
0
  sec->contents = vars->data;
649
0
  sec->target_index = vars->sec_index ++;
650
651
  /* Advance data pointer in the vars structure.  */
652
0
  vars->data += size;
653
654
  /* Skip the padding byte if it was not needed.
655
     The logic here is that if the string length is odd,
656
     then the entire string length, including the null byte,
657
     is even and so the extra, padding byte, is not needed.  */
658
0
  if (size & 1)
659
0
    vars->data --;
660
661
  /* PR 18758: See note in pe_ILF_buid_a_bfd.  We must make sure that we
662
     preserve host alignment requirements.  The BFD_ASSERTs in this
663
     functions will warn us if we run out of room, but we should
664
     already have enough padding built in to ILF_DATA_SIZE.  */
665
0
#if GCC_VERSION >= 3000
666
0
  alignment = __alignof__ (struct coff_section_tdata);
667
#else
668
  alignment = 8;
669
#endif
670
0
  vars->data
671
0
    = (bfd_byte *) (((intptr_t) vars->data + alignment - 1) & -alignment);
672
673
  /* Create a coff_section_tdata structure for our use.  */
674
0
  sec->used_by_bfd = (struct coff_section_tdata *) vars->data;
675
0
  vars->data += sizeof (struct coff_section_tdata);
676
677
0
  BFD_ASSERT (vars->data <= vars->bim->buffer + vars->bim->size);
678
679
  /* Create a symbol to refer to this section.  */
680
0
  pe_ILF_make_a_symbol (vars, "", name, sec, BSF_LOCAL);
681
682
  /* Cache the index to the symbol in the coff_section_data structure.  */
683
0
  coff_section_data (vars->abfd, sec)->i = vars->sym_index - 1;
684
685
0
  return sec;
686
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-x86_64.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-aarch64.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-ia64.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-arm.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-mcore.c:pe_ILF_make_a_section
Unexecuted instantiation: pei-sh.c:pe_ILF_make_a_section
687
688
/* This structure contains the code that goes into the .text section
689
   in order to perform a jump into the DLL lookup table.  The entries
690
   in the table are index by the magic number used to represent the
691
   machine type in the PE file.  The contents of the data[] arrays in
692
   these entries are stolen from the jtab[] arrays in ld/pe-dll.c.
693
   The SIZE field says how many bytes in the DATA array are actually
694
   used.  The OFFSET field says where in the data array the address
695
   of the .idata$5 section should be placed.  */
696
0
#define MAX_TEXT_SECTION_SIZE 32
697
698
typedef struct
699
{
700
  unsigned short magic;
701
  unsigned char  data[MAX_TEXT_SECTION_SIZE];
702
  unsigned int   size;
703
  unsigned int   offset;
704
}
705
jump_table;
706
707
static const jump_table jtab[] =
708
{
709
#ifdef I386MAGIC
710
  { I386MAGIC,
711
    { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
712
    8, 2
713
  },
714
#endif
715
716
#ifdef AMD64MAGIC
717
  { AMD64MAGIC,
718
    { 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0x90, 0x90 },
719
    8, 2
720
  },
721
#endif
722
723
#ifdef  MC68MAGIC
724
  { MC68MAGIC,
725
    { /* XXX fill me in */ },
726
    0, 0
727
  },
728
#endif
729
730
#ifdef  MIPS_ARCH_MAGIC_WINCE
731
  { MIPS_ARCH_MAGIC_WINCE,
732
    { 0x00, 0x00, 0x08, 0x3c, 0x00, 0x00, 0x08, 0x8d,
733
      0x08, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 },
734
    16, 0
735
  },
736
#endif
737
738
#ifdef  SH_ARCH_MAGIC_WINCE
739
  { SH_ARCH_MAGIC_WINCE,
740
    { 0x01, 0xd0, 0x02, 0x60, 0x2b, 0x40,
741
      0x09, 0x00, 0x00, 0x00, 0x00, 0x00 },
742
    12, 8
743
  },
744
#endif
745
746
#ifdef AARCH64MAGIC
747
/* We don't currently support jumping to DLLs, so if
748
   someone does try emit a runtime trap.  Through UDF #0.  */
749
  { AARCH64MAGIC,
750
    { 0x00, 0x00, 0x00, 0x00 },
751
    4, 0
752
  },
753
754
#endif
755
756
#ifdef  ARMPEMAGIC
757
  { ARMPEMAGIC,
758
    { 0x00, 0xc0, 0x9f, 0xe5, 0x00, 0xf0,
759
      0x9c, 0xe5, 0x00, 0x00, 0x00, 0x00},
760
    12, 8
761
  },
762
#endif
763
764
#ifdef  THUMBPEMAGIC
765
  { THUMBPEMAGIC,
766
    { 0x40, 0xb4, 0x02, 0x4e, 0x36, 0x68, 0xb4, 0x46,
767
      0x40, 0xbc, 0x60, 0x47, 0x00, 0x00, 0x00, 0x00 },
768
    16, 12
769
  },
770
#endif
771
772
#ifdef LOONGARCH64MAGIC
773
/* We don't currently support jumping to DLLs, so if
774
   someone does try emit a runtime trap.  Through BREAK 0.  */
775
  { LOONGARCH64MAGIC,
776
    { 0x00, 0x00, 0x2a, 0x00 },
777
    4, 0
778
  },
779
780
#endif
781
782
  { 0, { 0 }, 0, 0 }
783
};
784
785
#ifndef NUM_ENTRIES
786
0
#define NUM_ENTRIES(a) (sizeof (a) / sizeof (a)[0])
787
#endif
788
789
/* Build a full BFD from the information supplied in a ILF object.  */
790
791
static bool
792
pe_ILF_build_a_bfd (bfd *     abfd,
793
        unsigned int    magic,
794
        char *      symbol_name,
795
        char *      source_dll,
796
        unsigned int    ordinal,
797
        unsigned int    types)
798
0
{
799
0
  bfd_byte *       ptr;
800
0
  pe_ILF_vars      vars;
801
0
  struct internal_filehdr  internal_f;
802
0
  unsigned int       import_type;
803
0
  unsigned int       import_name_type;
804
0
  asection_ptr       id4, id5, id6 = NULL, text = NULL;
805
0
  coff_symbol_type **    imp_sym;
806
0
  unsigned int       imp_index;
807
0
  intptr_t alignment;
808
809
  /* Decode and verify the types field of the ILF structure.  */
810
0
  import_type = types & 0x3;
811
0
  import_name_type = (types & 0x1c) >> 2;
812
813
0
  switch (import_type)
814
0
    {
815
0
    case IMPORT_CODE:
816
0
    case IMPORT_DATA:
817
0
      break;
818
819
0
    case IMPORT_CONST:
820
      /* XXX code yet to be written.  */
821
      /* xgettext:c-format */
822
0
      _bfd_error_handler (_("%pB: unhandled import type; %x"),
823
0
        abfd, import_type);
824
0
      return false;
825
826
0
    default:
827
      /* xgettext:c-format */
828
0
      _bfd_error_handler (_("%pB: unrecognized import type; %x"),
829
0
        abfd, import_type);
830
0
      return false;
831
0
    }
832
833
0
  switch (import_name_type)
834
0
    {
835
0
    case IMPORT_ORDINAL:
836
0
    case IMPORT_NAME:
837
0
    case IMPORT_NAME_NOPREFIX:
838
0
    case IMPORT_NAME_UNDECORATE:
839
0
      break;
840
841
0
    default:
842
      /* xgettext:c-format */
843
0
      _bfd_error_handler (_("%pB: unrecognized import name type; %x"),
844
0
        abfd, import_name_type);
845
0
      return false;
846
0
    }
847
848
  /* Initialise local variables.
849
850
     Note these are kept in a structure rather than being
851
     declared as statics since bfd frowns on global variables.
852
853
     We are going to construct the contents of the BFD in memory,
854
     so allocate all the space that we will need right now.  */
855
0
  vars.bim
856
0
    = (struct bfd_in_memory *) bfd_malloc ((bfd_size_type) sizeof (*vars.bim));
857
0
  if (vars.bim == NULL)
858
0
    return false;
859
860
0
  ptr = (bfd_byte *) bfd_zmalloc ((bfd_size_type) ILF_DATA_SIZE);
861
0
  vars.bim->buffer = ptr;
862
0
  vars.bim->size   = ILF_DATA_SIZE;
863
0
  if (ptr == NULL)
864
0
    goto error_return;
865
866
  /* Initialise the pointers to regions of the memory and the
867
     other contents of the pe_ILF_vars structure as well.  */
868
0
  vars.sym_cache = (coff_symbol_type *) ptr;
869
0
  vars.sym_ptr   = (coff_symbol_type *) ptr;
870
0
  vars.sym_index = 0;
871
0
  ptr += SIZEOF_ILF_SYMS;
872
873
0
  vars.sym_table = (unsigned int *) ptr;
874
0
  vars.table_ptr = (unsigned int *) ptr;
875
0
  ptr += SIZEOF_ILF_SYM_TABLE;
876
877
0
  vars.native_syms = (combined_entry_type *) ptr;
878
0
  vars.native_ptr  = (combined_entry_type *) ptr;
879
0
  ptr += SIZEOF_ILF_NATIVE_SYMS;
880
881
0
  vars.sym_ptr_table = (coff_symbol_type **) ptr;
882
0
  vars.sym_ptr_ptr   = (coff_symbol_type **) ptr;
883
0
  ptr += SIZEOF_ILF_SYM_PTR_TABLE;
884
885
0
  vars.esym_table = (SYMENT *) ptr;
886
0
  vars.esym_ptr   = (SYMENT *) ptr;
887
0
  ptr += SIZEOF_ILF_EXT_SYMS;
888
889
0
  vars.reltab   = (arelent *) ptr;
890
0
  vars.relcount = 0;
891
0
  ptr += SIZEOF_ILF_RELOCS;
892
893
0
  vars.int_reltab  = (struct internal_reloc *) ptr;
894
0
  ptr += SIZEOF_ILF_INT_RELOCS;
895
896
0
  vars.string_table = (char *) ptr;
897
0
  vars.string_ptr   = (char *) ptr + STRING_SIZE_SIZE;
898
0
  ptr += SIZEOF_ILF_STRINGS;
899
0
  vars.end_string_ptr = (char *) ptr;
900
901
  /* The remaining space in bim->buffer is used
902
     by the pe_ILF_make_a_section() function.  */
903
904
  /* PR 18758: Make sure that the data area is sufficiently aligned for
905
     struct coff_section_tdata.  __alignof__ is a gcc extension, hence
906
     the test of GCC_VERSION.  For other compilers we assume 8 byte
907
     alignment.  */
908
0
#if GCC_VERSION >= 3000
909
0
  alignment = __alignof__ (struct coff_section_tdata);
910
#else
911
  alignment = 8;
912
#endif
913
0
  ptr = (bfd_byte *) (((intptr_t) ptr + alignment - 1) & -alignment);
914
915
0
  vars.data = ptr;
916
0
  vars.abfd = abfd;
917
0
  vars.sec_index = 0;
918
0
  vars.magic = magic;
919
920
  /* Create the initial .idata$<n> sections:
921
     [.idata$2:  Import Directory Table -- not needed]
922
     .idata$4:  Import Lookup Table
923
     .idata$5:  Import Address Table
924
925
     Note we do not create a .idata$3 section as this is
926
     created for us by the linker script.  */
927
0
  id4 = pe_ILF_make_a_section (& vars, ".idata$4", SIZEOF_IDATA4, 0);
928
0
  id5 = pe_ILF_make_a_section (& vars, ".idata$5", SIZEOF_IDATA5, 0);
929
0
  if (id4 == NULL || id5 == NULL)
930
0
    goto error_return;
931
932
  /* Fill in the contents of these sections.  */
933
0
  if (import_name_type == IMPORT_ORDINAL)
934
0
    {
935
0
      if (ordinal == 0)
936
  /* See PR 20907 for a reproducer.  */
937
0
  goto error_return;
938
939
#if defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
940
0
      ((unsigned int *) id4->contents)[0] = ordinal;
941
0
      ((unsigned int *) id4->contents)[1] = 0x80000000;
942
0
      ((unsigned int *) id5->contents)[0] = ordinal;
943
0
      ((unsigned int *) id5->contents)[1] = 0x80000000;
944
#else
945
0
      * (unsigned int *) id4->contents = ordinal | 0x80000000;
946
0
      * (unsigned int *) id5->contents = ordinal | 0x80000000;
947
0
#endif
948
0
    }
949
0
  else
950
0
    {
951
0
      char * symbol;
952
0
      unsigned int len;
953
954
      /* Create .idata$6 - the Hint Name Table.  */
955
0
      id6 = pe_ILF_make_a_section (& vars, ".idata$6", SIZEOF_IDATA6, 0);
956
0
      if (id6 == NULL)
957
0
  goto error_return;
958
959
      /* If necessary, trim the import symbol name.  */
960
0
      symbol = symbol_name;
961
962
      /* As used by MS compiler, '_', '@', and '?' are alternative
963
   forms of USER_LABEL_PREFIX, with '?' for c++ mangled names,
964
   '@' used for fastcall (in C),  '_' everywhere else.  Only one
965
   of these is used for a symbol.  We strip this leading char for
966
   IMPORT_NAME_NOPREFIX and IMPORT_NAME_UNDECORATE as per the
967
   PE COFF 6.0 spec (section 8.3, Import Name Type).  */
968
969
0
      if (import_name_type != IMPORT_NAME)
970
0
  {
971
0
    char c = symbol[0];
972
973
    /* Check that we don't remove for targets with empty
974
       USER_LABEL_PREFIX the leading underscore.  */
975
0
    if ((c == '_' && abfd->xvec->symbol_leading_char != 0)
976
0
        || c == '@' || c == '?')
977
0
      symbol++;
978
0
  }
979
980
0
      len = strlen (symbol);
981
0
      if (import_name_type == IMPORT_NAME_UNDECORATE)
982
0
  {
983
    /* Truncate at the first '@'.  */
984
0
    char *at = strchr (symbol, '@');
985
986
0
    if (at != NULL)
987
0
      len = at - symbol;
988
0
  }
989
990
0
      id6->contents[0] = ordinal & 0xff;
991
0
      id6->contents[1] = ordinal >> 8;
992
993
0
      memcpy ((char *) id6->contents + 2, symbol, len);
994
0
      id6->contents[len + 2] = '\0';
995
0
    }
996
997
0
  if (import_name_type != IMPORT_ORDINAL)
998
0
    {
999
0
      pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_RVA, id6);
1000
0
      pe_ILF_save_relocs (&vars, id4);
1001
1002
0
      pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_RVA, id6);
1003
0
      pe_ILF_save_relocs (&vars, id5);
1004
0
    }
1005
1006
  /* Create an import symbol.  */
1007
0
  pe_ILF_make_a_symbol (& vars, "__imp_", symbol_name, id5, 0);
1008
0
  imp_sym   = vars.sym_ptr_ptr - 1;
1009
0
  imp_index = vars.sym_index - 1;
1010
1011
  /* Create extra sections depending upon the type of import we are dealing with.  */
1012
0
  switch (import_type)
1013
0
    {
1014
0
      int i;
1015
1016
0
    case IMPORT_CODE:
1017
      /* CODE functions are special, in that they get a trampoline that
1018
   jumps to the main import symbol.  Create a .text section to hold it.
1019
   First we need to look up its contents in the jump table.  */
1020
0
      for (i = NUM_ENTRIES (jtab); i--;)
1021
0
  {
1022
0
    if (jtab[i].size == 0)
1023
0
      continue;
1024
0
    if (jtab[i].magic == magic)
1025
0
      break;
1026
0
  }
1027
      /* If we did not find a matching entry something is wrong.  */
1028
0
      if (i < 0)
1029
0
  abort ();
1030
1031
      /* Create the .text section.  */
1032
0
      text = pe_ILF_make_a_section (& vars, ".text", jtab[i].size, SEC_CODE);
1033
0
      if (text == NULL)
1034
0
  goto error_return;
1035
1036
      /* Copy in the jump code.  */
1037
0
      memcpy (text->contents, jtab[i].data, jtab[i].size);
1038
1039
      /* Create a reloc for the data in the text section.  */
1040
#ifdef MIPS_ARCH_MAGIC_WINCE
1041
      if (magic == MIPS_ARCH_MAGIC_WINCE)
1042
  {
1043
    pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 0, BFD_RELOC_HI16_S,
1044
              (struct bfd_symbol **) imp_sym,
1045
              imp_index);
1046
    pe_ILF_make_a_reloc (&vars, (bfd_vma) 0, BFD_RELOC_LO16, text);
1047
    pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) 4, BFD_RELOC_LO16,
1048
              (struct bfd_symbol **) imp_sym,
1049
              imp_index);
1050
  }
1051
      else
1052
#endif
1053
#ifdef AMD64MAGIC
1054
0
      if (magic == AMD64MAGIC)
1055
0
  {
1056
0
    pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) jtab[i].offset,
1057
0
              BFD_RELOC_32_PCREL, (asymbol **) imp_sym,
1058
0
              imp_index);
1059
0
  }
1060
0
      else
1061
0
#endif
1062
0
  pe_ILF_make_a_symbol_reloc (&vars, (bfd_vma) jtab[i].offset,
1063
0
            BFD_RELOC_32, (asymbol **) imp_sym,
1064
0
            imp_index);
1065
1066
0
      pe_ILF_save_relocs (& vars, text);
1067
0
      break;
1068
1069
0
    case IMPORT_DATA:
1070
0
      break;
1071
1072
0
    default:
1073
      /* XXX code not yet written.  */
1074
0
      abort ();
1075
0
    }
1076
1077
  /* Now create a symbol describing the imported value.  */
1078
0
  switch (import_type)
1079
0
    {
1080
0
    case IMPORT_CODE:
1081
0
      pe_ILF_make_a_symbol (& vars, "", symbol_name, text,
1082
0
          BSF_NOT_AT_END | BSF_FUNCTION);
1083
1084
0
      break;
1085
1086
0
    case IMPORT_DATA:
1087
      /* Nothing to do here.  */
1088
0
      break;
1089
1090
0
    default:
1091
      /* XXX code not yet written.  */
1092
0
      abort ();
1093
0
    }
1094
1095
  /* Create an import symbol for the DLL, without the .dll suffix.  */
1096
0
  ptr = (bfd_byte *) strrchr (source_dll, '.');
1097
0
  if (ptr)
1098
0
    * ptr = 0;
1099
0
  pe_ILF_make_a_symbol (& vars, "__IMPORT_DESCRIPTOR_", source_dll, NULL, 0);
1100
0
  if (ptr)
1101
0
    * ptr = '.';
1102
1103
  /* Initialise the bfd.  */
1104
0
  memset (& internal_f, 0, sizeof (internal_f));
1105
1106
0
  internal_f.f_magic  = magic;
1107
0
  internal_f.f_symptr = 0;
1108
0
  internal_f.f_nsyms  = 0;
1109
0
  internal_f.f_flags  = F_AR32WR | F_LNNO; /* XXX is this correct ?  */
1110
1111
0
  if (   ! bfd_set_start_address (abfd, (bfd_vma) 0)
1112
0
      || ! bfd_coff_set_arch_mach_hook (abfd, & internal_f))
1113
0
    goto error_return;
1114
1115
0
  if (bfd_coff_mkobject_hook (abfd, (void *) & internal_f, NULL) == NULL)
1116
0
    goto error_return;
1117
1118
0
  obj_pe (abfd) = true;
1119
#ifdef THUMBPEMAGIC
1120
0
  if (vars.magic == THUMBPEMAGIC)
1121
    /* Stop some linker warnings about thumb code not supporting interworking.  */
1122
0
    coff_data (abfd)->flags |= F_INTERWORK | F_INTERWORK_SET;
1123
#endif
1124
1125
  /* Switch from file contents to memory contents.  */
1126
0
  bfd_cache_close (abfd);
1127
1128
0
  abfd->iostream = (void *) vars.bim;
1129
0
  abfd->flags |= BFD_IN_MEMORY | HAS_SYMS;
1130
0
  abfd->iovec = &_bfd_memory_iovec;
1131
0
  abfd->where = 0;
1132
0
  abfd->origin = 0;
1133
0
  abfd->size = 0;
1134
0
  obj_sym_filepos (abfd) = 0;
1135
1136
  /* Point the bfd at the symbol table.  */
1137
0
  obj_symbols (abfd) = vars.sym_cache;
1138
0
  abfd->symcount = vars.sym_index;
1139
1140
0
  obj_raw_syments (abfd) = vars.native_syms;
1141
0
  obj_raw_syment_count (abfd) = vars.sym_index;
1142
1143
0
  obj_coff_external_syms (abfd) = (void *) vars.esym_table;
1144
0
  obj_coff_keep_syms (abfd) = true;
1145
1146
0
  obj_convert (abfd) = vars.sym_table;
1147
0
  obj_conv_table_size (abfd) = vars.sym_index;
1148
1149
0
  obj_coff_strings (abfd) = vars.string_table;
1150
0
  obj_coff_strings_len (abfd) = vars.string_ptr - vars.string_table;
1151
0
  obj_coff_keep_strings (abfd) = true;
1152
1153
0
  return true;
1154
1155
0
 error_return:
1156
0
  free (vars.bim->buffer);
1157
0
  free (vars.bim);
1158
0
  return false;
1159
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-x86_64.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-aarch64.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-ia64.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-arm.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-mcore.c:pe_ILF_build_a_bfd
Unexecuted instantiation: pei-sh.c:pe_ILF_build_a_bfd
1160
1161
/* Cleanup function, returned from check_format hook.  */
1162
1163
static void
1164
pe_ILF_cleanup (bfd *abfd)
1165
0
{
1166
0
  struct bfd_in_memory *bim = abfd->iostream;
1167
0
  free (bim->buffer);
1168
0
  free (bim);
1169
0
  abfd->iostream = NULL;
1170
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_cleanup
Unexecuted instantiation: pei-x86_64.c:pe_ILF_cleanup
Unexecuted instantiation: pei-aarch64.c:pe_ILF_cleanup
Unexecuted instantiation: pei-ia64.c:pe_ILF_cleanup
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_cleanup
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_cleanup
Unexecuted instantiation: pei-arm.c:pe_ILF_cleanup
Unexecuted instantiation: pei-mcore.c:pe_ILF_cleanup
Unexecuted instantiation: pei-sh.c:pe_ILF_cleanup
1171
1172
/* We have detected an Import Library Format archive element.
1173
   Decode the element and return the appropriate target.  */
1174
1175
static bfd_cleanup
1176
pe_ILF_object_p (bfd * abfd)
1177
0
{
1178
0
  bfd_byte    buffer[14];
1179
0
  bfd_byte *    ptr;
1180
0
  char *    symbol_name;
1181
0
  char *    source_dll;
1182
0
  unsigned int    machine;
1183
0
  bfd_size_type   size;
1184
0
  unsigned int    ordinal;
1185
0
  unsigned int    types;
1186
0
  unsigned int    magic;
1187
1188
  /* Upon entry the first six bytes of the ILF header have
1189
     already been read.  Now read the rest of the header.  */
1190
0
  if (bfd_bread (buffer, (bfd_size_type) 14, abfd) != 14)
1191
0
    return NULL;
1192
1193
0
  ptr = buffer;
1194
1195
0
  machine = H_GET_16 (abfd, ptr);
1196
0
  ptr += 2;
1197
1198
  /* Check that the machine type is recognised.  */
1199
0
  magic = 0;
1200
1201
0
  switch (machine)
1202
0
    {
1203
0
    case IMAGE_FILE_MACHINE_UNKNOWN:
1204
0
    case IMAGE_FILE_MACHINE_ALPHA:
1205
0
    case IMAGE_FILE_MACHINE_ALPHA64:
1206
0
    case IMAGE_FILE_MACHINE_IA64:
1207
0
      break;
1208
1209
0
    case IMAGE_FILE_MACHINE_I386:
1210
#ifdef I386MAGIC
1211
0
      magic = I386MAGIC;
1212
#endif
1213
0
      break;
1214
1215
0
    case IMAGE_FILE_MACHINE_AMD64:
1216
#ifdef AMD64MAGIC
1217
0
      magic = AMD64MAGIC;
1218
#endif
1219
0
      break;
1220
1221
0
    case IMAGE_FILE_MACHINE_R3000:
1222
0
    case IMAGE_FILE_MACHINE_R4000:
1223
0
    case IMAGE_FILE_MACHINE_R10000:
1224
1225
0
    case IMAGE_FILE_MACHINE_MIPS16:
1226
0
    case IMAGE_FILE_MACHINE_MIPSFPU:
1227
0
    case IMAGE_FILE_MACHINE_MIPSFPU16:
1228
#ifdef MIPS_ARCH_MAGIC_WINCE
1229
      magic = MIPS_ARCH_MAGIC_WINCE;
1230
#endif
1231
0
      break;
1232
1233
0
    case IMAGE_FILE_MACHINE_SH3:
1234
0
    case IMAGE_FILE_MACHINE_SH4:
1235
#ifdef SH_ARCH_MAGIC_WINCE
1236
0
      magic = SH_ARCH_MAGIC_WINCE;
1237
#endif
1238
0
      break;
1239
1240
0
    case IMAGE_FILE_MACHINE_ARM:
1241
#ifdef ARMPEMAGIC
1242
0
      magic = ARMPEMAGIC;
1243
#endif
1244
0
      break;
1245
1246
0
    case IMAGE_FILE_MACHINE_ARM64:
1247
#ifdef AARCH64MAGIC
1248
0
      magic = AARCH64MAGIC;
1249
#endif
1250
0
      break;
1251
1252
0
    case IMAGE_FILE_MACHINE_LOONGARCH64:
1253
#ifdef LOONGARCH64MAGIC
1254
0
      magic = LOONGARCH64MAGIC;
1255
#endif
1256
0
      break;
1257
1258
0
    case IMAGE_FILE_MACHINE_THUMB:
1259
#ifdef THUMBPEMAGIC
1260
      {
1261
  extern const bfd_target TARGET_LITTLE_SYM;
1262
1263
0
  if (abfd->xvec == & TARGET_LITTLE_SYM)
1264
0
    magic = THUMBPEMAGIC;
1265
      }
1266
#endif
1267
0
      break;
1268
1269
0
    case IMAGE_FILE_MACHINE_POWERPC:
1270
      /* We no longer support PowerPC.  */
1271
0
    default:
1272
0
      _bfd_error_handler
1273
  /* xgettext:c-format */
1274
0
  (_("%pB: unrecognised machine type (0x%x)"
1275
0
     " in Import Library Format archive"),
1276
0
   abfd, machine);
1277
0
      bfd_set_error (bfd_error_malformed_archive);
1278
1279
0
      return NULL;
1280
0
      break;
1281
0
    }
1282
1283
0
  if (magic == 0)
1284
0
    {
1285
0
      _bfd_error_handler
1286
  /* xgettext:c-format */
1287
0
  (_("%pB: recognised but unhandled machine type (0x%x)"
1288
0
     " in Import Library Format archive"),
1289
0
   abfd, machine);
1290
0
      bfd_set_error (bfd_error_wrong_format);
1291
1292
0
      return NULL;
1293
0
    }
1294
1295
  /* We do not bother to check the date.
1296
     date = H_GET_32 (abfd, ptr);  */
1297
0
  ptr += 4;
1298
1299
0
  size = H_GET_32 (abfd, ptr);
1300
0
  ptr += 4;
1301
1302
0
  if (size == 0)
1303
0
    {
1304
0
      _bfd_error_handler
1305
0
  (_("%pB: size field is zero in Import Library Format header"), abfd);
1306
0
      bfd_set_error (bfd_error_malformed_archive);
1307
1308
0
      return NULL;
1309
0
    }
1310
1311
0
  ordinal = H_GET_16 (abfd, ptr);
1312
0
  ptr += 2;
1313
1314
0
  types = H_GET_16 (abfd, ptr);
1315
  /* ptr += 2; */
1316
1317
  /* Now read in the two strings that follow.  */
1318
0
  ptr = (bfd_byte *) _bfd_alloc_and_read (abfd, size, size);
1319
0
  if (ptr == NULL)
1320
0
    return NULL;
1321
1322
0
  symbol_name = (char *) ptr;
1323
  /* See PR 20905 for an example of where the strnlen is necessary.  */
1324
0
  source_dll  = symbol_name + strnlen (symbol_name, size - 1) + 1;
1325
1326
  /* Verify that the strings are null terminated.  */
1327
0
  if (ptr[size - 1] != 0
1328
0
      || (bfd_size_type) ((bfd_byte *) source_dll - ptr) >= size)
1329
0
    {
1330
0
      _bfd_error_handler
1331
0
  (_("%pB: string not null terminated in ILF object file"), abfd);
1332
0
      bfd_set_error (bfd_error_malformed_archive);
1333
0
      bfd_release (abfd, ptr);
1334
0
      return NULL;
1335
0
    }
1336
1337
  /* Now construct the bfd.  */
1338
0
  if (! pe_ILF_build_a_bfd (abfd, magic, symbol_name,
1339
0
          source_dll, ordinal, types))
1340
0
    {
1341
0
      bfd_release (abfd, ptr);
1342
0
      return NULL;
1343
0
    }
1344
1345
0
  return pe_ILF_cleanup;
1346
0
}
Unexecuted instantiation: pei-i386.c:pe_ILF_object_p
Unexecuted instantiation: pei-x86_64.c:pe_ILF_object_p
Unexecuted instantiation: pei-aarch64.c:pe_ILF_object_p
Unexecuted instantiation: pei-ia64.c:pe_ILF_object_p
Unexecuted instantiation: pei-loongarch64.c:pe_ILF_object_p
Unexecuted instantiation: pei-arm-wince.c:pe_ILF_object_p
Unexecuted instantiation: pei-arm.c:pe_ILF_object_p
Unexecuted instantiation: pei-mcore.c:pe_ILF_object_p
Unexecuted instantiation: pei-sh.c:pe_ILF_object_p
1347
1348
static void
1349
pe_bfd_read_buildid (bfd *abfd)
1350
4.18k
{
1351
4.18k
  pe_data_type *pe = pe_data (abfd);
1352
4.18k
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
4.18k
  asection *section;
1354
4.18k
  bfd_byte *data = 0;
1355
4.18k
  bfd_size_type dataoff;
1356
4.18k
  unsigned int i;
1357
4.18k
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
4.18k
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
4.18k
  if (size == 0)
1361
1.64k
    return;
1362
1363
2.54k
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
10.8k
  for (section = abfd->sections; section != NULL; section = section->next)
1367
9.65k
    {
1368
9.65k
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
1.39k
  break;
1370
9.65k
    }
1371
1372
2.54k
  if (section == NULL)
1373
1.14k
    return;
1374
1375
1.39k
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
28
    return;
1377
1378
1.36k
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
1.36k
  if (dataoff >= section->size
1384
1.36k
      || size > section->size - dataoff)
1385
733
    {
1386
733
      _bfd_error_handler
1387
733
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
733
   abfd);
1389
733
      return;
1390
733
    }
1391
1392
  /* Read the whole section. */
1393
636
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
250
    {
1395
250
      free (data);
1396
250
      return;
1397
250
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
9.49k
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
9.36k
    {
1402
9.36k
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
9.36k
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
9.36k
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
9.36k
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
9.36k
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
259
  {
1410
259
    char buffer[256 + 1];
1411
259
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
259
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
259
                (file_ptr) idd.PointerToRawData,
1419
259
                idd.SizeOfData, cvinfo, NULL))
1420
15
      {
1421
15
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
15
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
15
        if (build_id)
1424
15
    {
1425
15
      build_id->size = cvinfo->SignatureLength;
1426
15
      memcpy(build_id->data,  cvinfo->Signature,
1427
15
       cvinfo->SignatureLength);
1428
15
      abfd->build_id = build_id;
1429
15
    }
1430
15
      }
1431
259
    break;
1432
259
  }
1433
9.36k
    }
1434
1435
386
  free (data);
1436
386
}
pei-i386.c:pe_bfd_read_buildid
Line
Count
Source
1350
836
{
1351
836
  pe_data_type *pe = pe_data (abfd);
1352
836
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
836
  asection *section;
1354
836
  bfd_byte *data = 0;
1355
836
  bfd_size_type dataoff;
1356
836
  unsigned int i;
1357
836
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
836
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
836
  if (size == 0)
1361
466
    return;
1362
1363
370
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
1.32k
  for (section = abfd->sections; section != NULL; section = section->next)
1367
1.18k
    {
1368
1.18k
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
226
  break;
1370
1.18k
    }
1371
1372
370
  if (section == NULL)
1373
144
    return;
1374
1375
226
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
5
    return;
1377
1378
221
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
221
  if (dataoff >= section->size
1384
221
      || size > section->size - dataoff)
1385
112
    {
1386
112
      _bfd_error_handler
1387
112
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
112
   abfd);
1389
112
      return;
1390
112
    }
1391
1392
  /* Read the whole section. */
1393
109
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
72
    {
1395
72
      free (data);
1396
72
      return;
1397
72
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
524
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
506
    {
1402
506
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
506
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
506
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
506
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
506
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
19
  {
1410
19
    char buffer[256 + 1];
1411
19
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
19
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
19
                (file_ptr) idd.PointerToRawData,
1419
19
                idd.SizeOfData, cvinfo, NULL))
1420
5
      {
1421
5
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
5
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
5
        if (build_id)
1424
5
    {
1425
5
      build_id->size = cvinfo->SignatureLength;
1426
5
      memcpy(build_id->data,  cvinfo->Signature,
1427
5
       cvinfo->SignatureLength);
1428
5
      abfd->build_id = build_id;
1429
5
    }
1430
5
      }
1431
19
    break;
1432
19
  }
1433
506
    }
1434
1435
37
  free (data);
1436
37
}
pei-x86_64.c:pe_bfd_read_buildid
Line
Count
Source
1350
924
{
1351
924
  pe_data_type *pe = pe_data (abfd);
1352
924
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
924
  asection *section;
1354
924
  bfd_byte *data = 0;
1355
924
  bfd_size_type dataoff;
1356
924
  unsigned int i;
1357
924
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
924
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
924
  if (size == 0)
1361
496
    return;
1362
1363
428
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
3.00k
  for (section = abfd->sections; section != NULL; section = section->next)
1367
2.80k
    {
1368
2.80k
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
226
  break;
1370
2.80k
    }
1371
1372
428
  if (section == NULL)
1373
202
    return;
1374
1375
226
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
7
    return;
1377
1378
219
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
219
  if (dataoff >= section->size
1384
219
      || size > section->size - dataoff)
1385
127
    {
1386
127
      _bfd_error_handler
1387
127
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
127
   abfd);
1389
127
      return;
1390
127
    }
1391
1392
  /* Read the whole section. */
1393
92
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
24
    {
1395
24
      free (data);
1396
24
      return;
1397
24
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
2.51k
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
2.49k
    {
1402
2.49k
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
2.49k
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
2.49k
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
2.49k
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
2.49k
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
50
  {
1410
50
    char buffer[256 + 1];
1411
50
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
50
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
50
                (file_ptr) idd.PointerToRawData,
1419
50
                idd.SizeOfData, cvinfo, NULL))
1420
6
      {
1421
6
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
6
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
6
        if (build_id)
1424
6
    {
1425
6
      build_id->size = cvinfo->SignatureLength;
1426
6
      memcpy(build_id->data,  cvinfo->Signature,
1427
6
       cvinfo->SignatureLength);
1428
6
      abfd->build_id = build_id;
1429
6
    }
1430
6
      }
1431
50
    break;
1432
50
  }
1433
2.49k
    }
1434
1435
68
  free (data);
1436
68
}
pei-aarch64.c:pe_bfd_read_buildid
Line
Count
Source
1350
380
{
1351
380
  pe_data_type *pe = pe_data (abfd);
1352
380
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
380
  asection *section;
1354
380
  bfd_byte *data = 0;
1355
380
  bfd_size_type dataoff;
1356
380
  unsigned int i;
1357
380
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
380
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
380
  if (size == 0)
1361
92
    return;
1362
1363
288
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
1.31k
  for (section = abfd->sections; section != NULL; section = section->next)
1367
1.16k
    {
1368
1.16k
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
135
  break;
1370
1.16k
    }
1371
1372
288
  if (section == NULL)
1373
153
    return;
1374
1375
135
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
3
    return;
1377
1378
132
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
132
  if (dataoff >= section->size
1384
132
      || size > section->size - dataoff)
1385
62
    {
1386
62
      _bfd_error_handler
1387
62
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
62
   abfd);
1389
62
      return;
1390
62
    }
1391
1392
  /* Read the whole section. */
1393
70
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
18
    {
1395
18
      free (data);
1396
18
      return;
1397
18
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
1.81k
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
1.79k
    {
1402
1.79k
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
1.79k
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
1.79k
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
1.79k
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
1.79k
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
38
  {
1410
38
    char buffer[256 + 1];
1411
38
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
38
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
38
                (file_ptr) idd.PointerToRawData,
1419
38
                idd.SizeOfData, cvinfo, NULL))
1420
1
      {
1421
1
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
1
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
1
        if (build_id)
1424
1
    {
1425
1
      build_id->size = cvinfo->SignatureLength;
1426
1
      memcpy(build_id->data,  cvinfo->Signature,
1427
1
       cvinfo->SignatureLength);
1428
1
      abfd->build_id = build_id;
1429
1
    }
1430
1
      }
1431
38
    break;
1432
38
  }
1433
1.79k
    }
1434
1435
52
  free (data);
1436
52
}
pei-ia64.c:pe_bfd_read_buildid
Line
Count
Source
1350
320
{
1351
320
  pe_data_type *pe = pe_data (abfd);
1352
320
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
320
  asection *section;
1354
320
  bfd_byte *data = 0;
1355
320
  bfd_size_type dataoff;
1356
320
  unsigned int i;
1357
320
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
320
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
320
  if (size == 0)
1361
73
    return;
1362
1363
247
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
1.14k
  for (section = abfd->sections; section != NULL; section = section->next)
1367
1.03k
    {
1368
1.03k
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
135
  break;
1370
1.03k
    }
1371
1372
247
  if (section == NULL)
1373
112
    return;
1374
1375
135
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
3
    return;
1377
1378
132
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
132
  if (dataoff >= section->size
1384
132
      || size > section->size - dataoff)
1385
49
    {
1386
49
      _bfd_error_handler
1387
49
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
49
   abfd);
1389
49
      return;
1390
49
    }
1391
1392
  /* Read the whole section. */
1393
83
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
21
    {
1395
21
      free (data);
1396
21
      return;
1397
21
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
1.22k
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
1.21k
    {
1402
1.21k
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
1.21k
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
1.21k
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
1.21k
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
1.21k
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
52
  {
1410
52
    char buffer[256 + 1];
1411
52
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
52
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
52
                (file_ptr) idd.PointerToRawData,
1419
52
                idd.SizeOfData, cvinfo, NULL))
1420
0
      {
1421
0
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
0
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
0
        if (build_id)
1424
0
    {
1425
0
      build_id->size = cvinfo->SignatureLength;
1426
0
      memcpy(build_id->data,  cvinfo->Signature,
1427
0
       cvinfo->SignatureLength);
1428
0
      abfd->build_id = build_id;
1429
0
    }
1430
0
      }
1431
52
    break;
1432
52
  }
1433
1.21k
    }
1434
1435
62
  free (data);
1436
62
}
pei-loongarch64.c:pe_bfd_read_buildid
Line
Count
Source
1350
341
{
1351
341
  pe_data_type *pe = pe_data (abfd);
1352
341
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
341
  asection *section;
1354
341
  bfd_byte *data = 0;
1355
341
  bfd_size_type dataoff;
1356
341
  unsigned int i;
1357
341
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
341
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
341
  if (size == 0)
1361
96
    return;
1362
1363
245
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
876
  for (section = abfd->sections; section != NULL; section = section->next)
1367
769
    {
1368
769
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
138
  break;
1370
769
    }
1371
1372
245
  if (section == NULL)
1373
107
    return;
1374
1375
138
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
2
    return;
1377
1378
136
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
136
  if (dataoff >= section->size
1384
136
      || size > section->size - dataoff)
1385
72
    {
1386
72
      _bfd_error_handler
1387
72
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
72
   abfd);
1389
72
      return;
1390
72
    }
1391
1392
  /* Read the whole section. */
1393
64
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
16
    {
1395
16
      free (data);
1396
16
      return;
1397
16
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
730
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
719
    {
1402
719
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
719
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
719
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
719
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
719
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
37
  {
1410
37
    char buffer[256 + 1];
1411
37
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
37
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
37
                (file_ptr) idd.PointerToRawData,
1419
37
                idd.SizeOfData, cvinfo, NULL))
1420
1
      {
1421
1
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
1
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
1
        if (build_id)
1424
1
    {
1425
1
      build_id->size = cvinfo->SignatureLength;
1426
1
      memcpy(build_id->data,  cvinfo->Signature,
1427
1
       cvinfo->SignatureLength);
1428
1
      abfd->build_id = build_id;
1429
1
    }
1430
1
      }
1431
37
    break;
1432
37
  }
1433
719
    }
1434
1435
48
  free (data);
1436
48
}
pei-arm-wince.c:pe_bfd_read_buildid
Line
Count
Source
1350
338
{
1351
338
  pe_data_type *pe = pe_data (abfd);
1352
338
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
338
  asection *section;
1354
338
  bfd_byte *data = 0;
1355
338
  bfd_size_type dataoff;
1356
338
  unsigned int i;
1357
338
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
338
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
338
  if (size == 0)
1361
110
    return;
1362
1363
228
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
628
  for (section = abfd->sections; section != NULL; section = section->next)
1367
523
    {
1368
523
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
123
  break;
1370
523
    }
1371
1372
228
  if (section == NULL)
1373
105
    return;
1374
1375
123
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
1
    return;
1377
1378
122
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
122
  if (dataoff >= section->size
1384
122
      || size > section->size - dataoff)
1385
73
    {
1386
73
      _bfd_error_handler
1387
73
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
73
   abfd);
1389
73
      return;
1390
73
    }
1391
1392
  /* Read the whole section. */
1393
49
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
19
    {
1395
19
      free (data);
1396
19
      return;
1397
19
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
495
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
481
    {
1402
481
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
481
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
481
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
481
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
481
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
16
  {
1410
16
    char buffer[256 + 1];
1411
16
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
16
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
16
                (file_ptr) idd.PointerToRawData,
1419
16
                idd.SizeOfData, cvinfo, NULL))
1420
0
      {
1421
0
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
0
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
0
        if (build_id)
1424
0
    {
1425
0
      build_id->size = cvinfo->SignatureLength;
1426
0
      memcpy(build_id->data,  cvinfo->Signature,
1427
0
       cvinfo->SignatureLength);
1428
0
      abfd->build_id = build_id;
1429
0
    }
1430
0
      }
1431
16
    break;
1432
16
  }
1433
481
    }
1434
1435
30
  free (data);
1436
30
}
pei-arm.c:pe_bfd_read_buildid
Line
Count
Source
1350
363
{
1351
363
  pe_data_type *pe = pe_data (abfd);
1352
363
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
363
  asection *section;
1354
363
  bfd_byte *data = 0;
1355
363
  bfd_size_type dataoff;
1356
363
  unsigned int i;
1357
363
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
363
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
363
  if (size == 0)
1361
127
    return;
1362
1363
236
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
839
  for (section = abfd->sections; section != NULL; section = section->next)
1367
734
    {
1368
734
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
131
  break;
1370
734
    }
1371
1372
236
  if (section == NULL)
1373
105
    return;
1374
1375
131
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
1
    return;
1377
1378
130
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
130
  if (dataoff >= section->size
1384
130
      || size > section->size - dataoff)
1385
84
    {
1386
84
      _bfd_error_handler
1387
84
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
84
   abfd);
1389
84
      return;
1390
84
    }
1391
1392
  /* Read the whole section. */
1393
46
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
19
    {
1395
19
      free (data);
1396
19
      return;
1397
19
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
481
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
466
    {
1402
466
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
466
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
466
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
466
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
466
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
12
  {
1410
12
    char buffer[256 + 1];
1411
12
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
12
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
12
                (file_ptr) idd.PointerToRawData,
1419
12
                idd.SizeOfData, cvinfo, NULL))
1420
1
      {
1421
1
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
1
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
1
        if (build_id)
1424
1
    {
1425
1
      build_id->size = cvinfo->SignatureLength;
1426
1
      memcpy(build_id->data,  cvinfo->Signature,
1427
1
       cvinfo->SignatureLength);
1428
1
      abfd->build_id = build_id;
1429
1
    }
1430
1
      }
1431
12
    break;
1432
12
  }
1433
466
    }
1434
1435
27
  free (data);
1436
27
}
pei-mcore.c:pe_bfd_read_buildid
Line
Count
Source
1350
372
{
1351
372
  pe_data_type *pe = pe_data (abfd);
1352
372
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
372
  asection *section;
1354
372
  bfd_byte *data = 0;
1355
372
  bfd_size_type dataoff;
1356
372
  unsigned int i;
1357
372
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
372
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
372
  if (size == 0)
1361
90
    return;
1362
1363
282
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
1.07k
  for (section = abfd->sections; section != NULL; section = section->next)
1367
936
    {
1368
936
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
145
  break;
1370
936
    }
1371
1372
282
  if (section == NULL)
1373
137
    return;
1374
1375
145
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
1
    return;
1377
1378
144
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
144
  if (dataoff >= section->size
1384
144
      || size > section->size - dataoff)
1385
74
    {
1386
74
      _bfd_error_handler
1387
74
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
74
   abfd);
1389
74
      return;
1390
74
    }
1391
1392
  /* Read the whole section. */
1393
70
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
33
    {
1395
33
      free (data);
1396
33
      return;
1397
33
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
897
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
884
    {
1402
884
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
884
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
884
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
884
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
884
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
24
  {
1410
24
    char buffer[256 + 1];
1411
24
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
24
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
24
                (file_ptr) idd.PointerToRawData,
1419
24
                idd.SizeOfData, cvinfo, NULL))
1420
0
      {
1421
0
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
0
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
0
        if (build_id)
1424
0
    {
1425
0
      build_id->size = cvinfo->SignatureLength;
1426
0
      memcpy(build_id->data,  cvinfo->Signature,
1427
0
       cvinfo->SignatureLength);
1428
0
      abfd->build_id = build_id;
1429
0
    }
1430
0
      }
1431
24
    break;
1432
24
  }
1433
884
    }
1434
1435
37
  free (data);
1436
37
}
pei-sh.c:pe_bfd_read_buildid
Line
Count
Source
1350
313
{
1351
313
  pe_data_type *pe = pe_data (abfd);
1352
313
  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1353
313
  asection *section;
1354
313
  bfd_byte *data = 0;
1355
313
  bfd_size_type dataoff;
1356
313
  unsigned int i;
1357
313
  bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
1358
313
  bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
1359
1360
313
  if (size == 0)
1361
93
    return;
1362
1363
220
  addr += extra->ImageBase;
1364
1365
  /* Search for the section containing the DebugDirectory.  */
1366
598
  for (section = abfd->sections; section != NULL; section = section->next)
1367
516
    {
1368
516
      if ((addr >= section->vma) && (addr < (section->vma + section->size)))
1369
138
  break;
1370
516
    }
1371
1372
220
  if (section == NULL)
1373
82
    return;
1374
1375
138
  if (!(section->flags & SEC_HAS_CONTENTS))
1376
5
    return;
1377
1378
133
  dataoff = addr - section->vma;
1379
1380
  /* PR 20605 and 22373: Make sure that the data is really there.
1381
     Note - since we are dealing with unsigned quantities we have
1382
     to be careful to check for potential overflows.  */
1383
133
  if (dataoff >= section->size
1384
133
      || size > section->size - dataoff)
1385
80
    {
1386
80
      _bfd_error_handler
1387
80
  (_("%pB: error: debug data ends beyond end of debug directory"),
1388
80
   abfd);
1389
80
      return;
1390
80
    }
1391
1392
  /* Read the whole section. */
1393
53
  if (!bfd_malloc_and_get_section (abfd, section, &data))
1394
28
    {
1395
28
      free (data);
1396
28
      return;
1397
28
    }
1398
1399
  /* Search for a CodeView entry in the DebugDirectory */
1400
818
  for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
1401
804
    {
1402
804
      struct external_IMAGE_DEBUG_DIRECTORY *ext
1403
804
  = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
1404
804
      struct internal_IMAGE_DEBUG_DIRECTORY idd;
1405
1406
804
      _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
1407
1408
804
      if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
1409
11
  {
1410
11
    char buffer[256 + 1];
1411
11
    CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
1412
1413
    /*
1414
      The debug entry doesn't have to have to be in a section, in which
1415
      case AddressOfRawData is 0, so always use PointerToRawData.
1416
    */
1417
11
    if (_bfd_XXi_slurp_codeview_record (abfd,
1418
11
                (file_ptr) idd.PointerToRawData,
1419
11
                idd.SizeOfData, cvinfo, NULL))
1420
1
      {
1421
1
        struct bfd_build_id* build_id = bfd_alloc (abfd,
1422
1
       sizeof (struct bfd_build_id) + cvinfo->SignatureLength);
1423
1
        if (build_id)
1424
1
    {
1425
1
      build_id->size = cvinfo->SignatureLength;
1426
1
      memcpy(build_id->data,  cvinfo->Signature,
1427
1
       cvinfo->SignatureLength);
1428
1
      abfd->build_id = build_id;
1429
1
    }
1430
1
      }
1431
11
    break;
1432
11
  }
1433
804
    }
1434
1435
25
  free (data);
1436
25
}
1437
1438
static bfd_cleanup
1439
pe_bfd_object_p (bfd * abfd)
1440
123k
{
1441
123k
  bfd_byte buffer[6];
1442
123k
  struct external_DOS_hdr dos_hdr;
1443
123k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
123k
  struct internal_filehdr internal_f;
1445
123k
  struct internal_aouthdr internal_a;
1446
123k
  bfd_size_type opt_hdr_size;
1447
123k
  file_ptr offset;
1448
123k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
123k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
123k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
583
    {
1455
583
      if (bfd_get_error () != bfd_error_system_call)
1456
583
  bfd_set_error (bfd_error_wrong_format);
1457
583
      return NULL;
1458
583
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
122k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
122k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
122k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
122k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
122k
   != sizeof (dos_hdr))
1468
17.6k
    {
1469
17.6k
      if (bfd_get_error () != bfd_error_system_call)
1470
17.6k
  bfd_set_error (bfd_error_wrong_format);
1471
17.6k
      return NULL;
1472
17.6k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
105k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
37.3k
    {
1486
37.3k
      bfd_set_error (bfd_error_wrong_format);
1487
37.3k
      return NULL;
1488
37.3k
    }
1489
1490
67.9k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
67.9k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
67.9k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
67.9k
    != sizeof (image_hdr)))
1494
955
    {
1495
955
      if (bfd_get_error () != bfd_error_system_call)
1496
955
  bfd_set_error (bfd_error_wrong_format);
1497
955
      return NULL;
1498
955
    }
1499
1500
67.0k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
1.35k
    {
1502
1.35k
      bfd_set_error (bfd_error_wrong_format);
1503
1.35k
      return NULL;
1504
1.35k
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
65.6k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
65.6k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
65.6k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
55.5k
    {
1513
55.5k
      bfd_set_error (bfd_error_wrong_format);
1514
55.5k
      return NULL;
1515
55.5k
    }
1516
1517
10.1k
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
10.1k
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
10.1k
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
10.1k
  if (opt_hdr_size != 0)
1524
6.00k
    {
1525
6.00k
      bfd_size_type amt = opt_hdr_size;
1526
6.00k
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
6.00k
      if (amt < sizeof (PEAOUTHDR))
1530
5.79k
  amt = sizeof (PEAOUTHDR);
1531
1532
6.00k
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
6.00k
      if (opthdr == NULL)
1534
98
  return NULL;
1535
5.90k
      if (amt > opt_hdr_size)
1536
5.70k
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
5.90k
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
5.90k
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
673
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
673
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
267
#endif
1550
673
  {
1551
673
    bfd_set_error (bfd_error_wrong_format);
1552
673
    return NULL;
1553
673
  }
1554
673
#endif
1555
1556
5.23k
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
5.23k
    || a->SectionAlignment >= 0x80000000)
1558
2.83k
  {
1559
2.83k
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
2.83k
        abfd);
1561
2.83k
    a->SectionAlignment &= -a->SectionAlignment;
1562
2.83k
    if (a->SectionAlignment >= 0x80000000)
1563
18
      a->SectionAlignment = 0x40000000;
1564
2.83k
  }
1565
1566
5.23k
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
5.23k
    || a->FileAlignment > a->SectionAlignment)
1568
3.27k
  {
1569
3.27k
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
3.27k
            abfd);
1571
3.27k
    a->FileAlignment &= -a->FileAlignment;
1572
3.27k
    if (a->FileAlignment > a->SectionAlignment)
1573
2.37k
      a->FileAlignment = a->SectionAlignment;
1574
3.27k
  }
1575
1576
5.23k
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
3.28k
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
673
    }
1579
1580
9.33k
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
9.33k
             (opt_hdr_size != 0
1582
9.33k
        ? &internal_a
1583
9.33k
        : (struct internal_aouthdr *) NULL));
1584
1585
9.33k
  if (result)
1586
4.18k
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
4.18k
      pe_bfd_read_buildid(abfd);
1589
4.18k
    }
1590
1591
9.33k
  return result;
1592
10.1k
}
pei-i386.c:pe_bfd_object_p
Line
Count
Source
1440
11.3k
{
1441
11.3k
  bfd_byte buffer[6];
1442
11.3k
  struct external_DOS_hdr dos_hdr;
1443
11.3k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
11.3k
  struct internal_filehdr internal_f;
1445
11.3k
  struct internal_aouthdr internal_a;
1446
11.3k
  bfd_size_type opt_hdr_size;
1447
11.3k
  file_ptr offset;
1448
11.3k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
11.3k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
11.3k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
53
    {
1455
53
      if (bfd_get_error () != bfd_error_system_call)
1456
53
  bfd_set_error (bfd_error_wrong_format);
1457
53
      return NULL;
1458
53
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
11.3k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
11.3k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
11.3k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
11.3k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
11.3k
   != sizeof (dos_hdr))
1468
1.61k
    {
1469
1.61k
      if (bfd_get_error () != bfd_error_system_call)
1470
1.61k
  bfd_set_error (bfd_error_wrong_format);
1471
1.61k
      return NULL;
1472
1.61k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
9.69k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
1.41k
    {
1486
1.41k
      bfd_set_error (bfd_error_wrong_format);
1487
1.41k
      return NULL;
1488
1.41k
    }
1489
1490
8.27k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
8.27k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
8.27k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
8.27k
    != sizeof (image_hdr)))
1494
32
    {
1495
32
      if (bfd_get_error () != bfd_error_system_call)
1496
32
  bfd_set_error (bfd_error_wrong_format);
1497
32
      return NULL;
1498
32
    }
1499
1500
8.24k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
51
    {
1502
51
      bfd_set_error (bfd_error_wrong_format);
1503
51
      return NULL;
1504
51
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
8.19k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
8.19k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
8.19k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
7.01k
    {
1513
7.01k
      bfd_set_error (bfd_error_wrong_format);
1514
7.01k
      return NULL;
1515
7.01k
    }
1516
1517
1.18k
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
1.18k
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
1.18k
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
1.18k
  if (opt_hdr_size != 0)
1524
667
    {
1525
667
      bfd_size_type amt = opt_hdr_size;
1526
667
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
667
      if (amt < sizeof (PEAOUTHDR))
1530
575
  amt = sizeof (PEAOUTHDR);
1531
1532
667
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
667
      if (opthdr == NULL)
1534
9
  return NULL;
1535
658
      if (amt > opt_hdr_size)
1536
567
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
658
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
658
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
658
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
658
    || a->SectionAlignment >= 0x80000000)
1558
366
  {
1559
366
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
366
        abfd);
1561
366
    a->SectionAlignment &= -a->SectionAlignment;
1562
366
    if (a->SectionAlignment >= 0x80000000)
1563
7
      a->SectionAlignment = 0x40000000;
1564
366
  }
1565
1566
658
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
658
    || a->FileAlignment > a->SectionAlignment)
1568
443
  {
1569
443
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
443
            abfd);
1571
443
    a->FileAlignment &= -a->FileAlignment;
1572
443
    if (a->FileAlignment > a->SectionAlignment)
1573
335
      a->FileAlignment = a->SectionAlignment;
1574
443
  }
1575
1576
658
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
453
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
658
    }
1579
1580
1.17k
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
1.17k
             (opt_hdr_size != 0
1582
1.17k
        ? &internal_a
1583
1.17k
        : (struct internal_aouthdr *) NULL));
1584
1585
1.17k
  if (result)
1586
836
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
836
      pe_bfd_read_buildid(abfd);
1589
836
    }
1590
1591
1.17k
  return result;
1592
1.18k
}
pei-x86_64.c:pe_bfd_object_p
Line
Count
Source
1440
11.3k
{
1441
11.3k
  bfd_byte buffer[6];
1442
11.3k
  struct external_DOS_hdr dos_hdr;
1443
11.3k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
11.3k
  struct internal_filehdr internal_f;
1445
11.3k
  struct internal_aouthdr internal_a;
1446
11.3k
  bfd_size_type opt_hdr_size;
1447
11.3k
  file_ptr offset;
1448
11.3k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
11.3k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
11.3k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
53
    {
1455
53
      if (bfd_get_error () != bfd_error_system_call)
1456
53
  bfd_set_error (bfd_error_wrong_format);
1457
53
      return NULL;
1458
53
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
11.3k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
11.3k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
11.3k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
11.3k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
11.3k
   != sizeof (dos_hdr))
1468
1.61k
    {
1469
1.61k
      if (bfd_get_error () != bfd_error_system_call)
1470
1.61k
  bfd_set_error (bfd_error_wrong_format);
1471
1.61k
      return NULL;
1472
1.61k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
9.71k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
1.41k
    {
1486
1.41k
      bfd_set_error (bfd_error_wrong_format);
1487
1.41k
      return NULL;
1488
1.41k
    }
1489
1490
8.29k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
8.29k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
8.29k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
8.29k
    != sizeof (image_hdr)))
1494
32
    {
1495
32
      if (bfd_get_error () != bfd_error_system_call)
1496
32
  bfd_set_error (bfd_error_wrong_format);
1497
32
      return NULL;
1498
32
    }
1499
1500
8.26k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
51
    {
1502
51
      bfd_set_error (bfd_error_wrong_format);
1503
51
      return NULL;
1504
51
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
8.21k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
8.21k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
8.21k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.90k
    {
1513
6.90k
      bfd_set_error (bfd_error_wrong_format);
1514
6.90k
      return NULL;
1515
6.90k
    }
1516
1517
1.31k
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
1.31k
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
1.31k
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
1.31k
  if (opt_hdr_size != 0)
1524
921
    {
1525
921
      bfd_size_type amt = opt_hdr_size;
1526
921
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
921
      if (amt < sizeof (PEAOUTHDR))
1530
908
  amt = sizeof (PEAOUTHDR);
1531
1532
921
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
921
      if (opthdr == NULL)
1534
11
  return NULL;
1535
910
      if (amt > opt_hdr_size)
1536
898
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
910
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
910
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
910
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
910
    || a->SectionAlignment >= 0x80000000)
1558
437
  {
1559
437
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
437
        abfd);
1561
437
    a->SectionAlignment &= -a->SectionAlignment;
1562
437
    if (a->SectionAlignment >= 0x80000000)
1563
3
      a->SectionAlignment = 0x40000000;
1564
437
  }
1565
1566
910
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
910
    || a->FileAlignment > a->SectionAlignment)
1568
487
  {
1569
487
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
487
            abfd);
1571
487
    a->FileAlignment &= -a->FileAlignment;
1572
487
    if (a->FileAlignment > a->SectionAlignment)
1573
302
      a->FileAlignment = a->SectionAlignment;
1574
487
  }
1575
1576
910
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
501
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
910
    }
1579
1580
1.30k
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
1.30k
             (opt_hdr_size != 0
1582
1.30k
        ? &internal_a
1583
1.30k
        : (struct internal_aouthdr *) NULL));
1584
1585
1.30k
  if (result)
1586
924
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
924
      pe_bfd_read_buildid(abfd);
1589
924
    }
1590
1591
1.30k
  return result;
1592
1.31k
}
pei-aarch64.c:pe_bfd_object_p
Line
Count
Source
1440
10.9k
{
1441
10.9k
  bfd_byte buffer[6];
1442
10.9k
  struct external_DOS_hdr dos_hdr;
1443
10.9k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
10.9k
  struct internal_filehdr internal_f;
1445
10.9k
  struct internal_aouthdr internal_a;
1446
10.9k
  bfd_size_type opt_hdr_size;
1447
10.9k
  file_ptr offset;
1448
10.9k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
10.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
10.9k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
53
    {
1455
53
      if (bfd_get_error () != bfd_error_system_call)
1456
53
  bfd_set_error (bfd_error_wrong_format);
1457
53
      return NULL;
1458
53
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
10.9k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
10.9k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
10.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
10.9k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
10.9k
   != sizeof (dos_hdr))
1468
1.58k
    {
1469
1.58k
      if (bfd_get_error () != bfd_error_system_call)
1470
1.58k
  bfd_set_error (bfd_error_wrong_format);
1471
1.58k
      return NULL;
1472
1.58k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
9.34k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
769
    {
1486
769
      bfd_set_error (bfd_error_wrong_format);
1487
769
      return NULL;
1488
769
    }
1489
1490
8.57k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
8.57k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
8.57k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
8.57k
    != sizeof (image_hdr)))
1494
265
    {
1495
265
      if (bfd_get_error () != bfd_error_system_call)
1496
265
  bfd_set_error (bfd_error_wrong_format);
1497
265
      return NULL;
1498
265
    }
1499
1500
8.31k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
367
    {
1502
367
      bfd_set_error (bfd_error_wrong_format);
1503
367
      return NULL;
1504
367
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
7.94k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
7.94k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
7.94k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.97k
    {
1513
6.97k
      bfd_set_error (bfd_error_wrong_format);
1514
6.97k
      return NULL;
1515
6.97k
    }
1516
1517
973
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
973
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
973
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
973
  if (opt_hdr_size != 0)
1524
692
    {
1525
692
      bfd_size_type amt = opt_hdr_size;
1526
692
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
692
      if (amt < sizeof (PEAOUTHDR))
1530
641
  amt = sizeof (PEAOUTHDR);
1531
1532
692
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
692
      if (opthdr == NULL)
1534
11
  return NULL;
1535
681
      if (amt > opt_hdr_size)
1536
631
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
681
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
681
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
681
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
681
    || a->SectionAlignment >= 0x80000000)
1558
333
  {
1559
333
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
333
        abfd);
1561
333
    a->SectionAlignment &= -a->SectionAlignment;
1562
333
    if (a->SectionAlignment >= 0x80000000)
1563
1
      a->SectionAlignment = 0x40000000;
1564
333
  }
1565
1566
681
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
681
    || a->FileAlignment > a->SectionAlignment)
1568
401
  {
1569
401
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
401
            abfd);
1571
401
    a->FileAlignment &= -a->FileAlignment;
1572
401
    if (a->FileAlignment > a->SectionAlignment)
1573
342
      a->FileAlignment = a->SectionAlignment;
1574
401
  }
1575
1576
681
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
390
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
681
    }
1579
1580
962
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
962
             (opt_hdr_size != 0
1582
962
        ? &internal_a
1583
962
        : (struct internal_aouthdr *) NULL));
1584
1585
962
  if (result)
1586
380
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
380
      pe_bfd_read_buildid(abfd);
1589
380
    }
1590
1591
962
  return result;
1592
973
}
pei-ia64.c:pe_bfd_object_p
Line
Count
Source
1440
1.96k
{
1441
1.96k
  bfd_byte buffer[6];
1442
1.96k
  struct external_DOS_hdr dos_hdr;
1443
1.96k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
1.96k
  struct internal_filehdr internal_f;
1445
1.96k
  struct internal_aouthdr internal_a;
1446
1.96k
  bfd_size_type opt_hdr_size;
1447
1.96k
  file_ptr offset;
1448
1.96k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
1.96k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
1.96k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
0
    {
1455
0
      if (bfd_get_error () != bfd_error_system_call)
1456
0
  bfd_set_error (bfd_error_wrong_format);
1457
0
      return NULL;
1458
0
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
1.96k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
1.96k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
1.96k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
1.96k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
1.96k
   != sizeof (dos_hdr))
1468
0
    {
1469
0
      if (bfd_get_error () != bfd_error_system_call)
1470
0
  bfd_set_error (bfd_error_wrong_format);
1471
0
      return NULL;
1472
0
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
1.96k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
0
    {
1486
0
      bfd_set_error (bfd_error_wrong_format);
1487
0
      return NULL;
1488
0
    }
1489
1490
1.96k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
1.96k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
1.96k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
1.96k
    != sizeof (image_hdr)))
1494
0
    {
1495
0
      if (bfd_get_error () != bfd_error_system_call)
1496
0
  bfd_set_error (bfd_error_wrong_format);
1497
0
      return NULL;
1498
0
    }
1499
1500
1.96k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
0
    {
1502
0
      bfd_set_error (bfd_error_wrong_format);
1503
0
      return NULL;
1504
0
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
1.96k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
1.96k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
1.96k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
1.02k
    {
1513
1.02k
      bfd_set_error (bfd_error_wrong_format);
1514
1.02k
      return NULL;
1515
1.02k
    }
1516
1517
947
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
947
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
947
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
947
  if (opt_hdr_size != 0)
1524
480
    {
1525
480
      bfd_size_type amt = opt_hdr_size;
1526
480
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
480
      if (amt < sizeof (PEAOUTHDR))
1530
458
  amt = sizeof (PEAOUTHDR);
1531
1532
480
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
480
      if (opthdr == NULL)
1534
8
  return NULL;
1535
472
      if (amt > opt_hdr_size)
1536
452
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
472
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
472
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
472
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
472
    || a->SectionAlignment >= 0x80000000)
1558
315
  {
1559
315
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
315
        abfd);
1561
315
    a->SectionAlignment &= -a->SectionAlignment;
1562
315
    if (a->SectionAlignment >= 0x80000000)
1563
1
      a->SectionAlignment = 0x40000000;
1564
315
  }
1565
1566
472
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
472
    || a->FileAlignment > a->SectionAlignment)
1568
360
  {
1569
360
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
360
            abfd);
1571
360
    a->FileAlignment &= -a->FileAlignment;
1572
360
    if (a->FileAlignment > a->SectionAlignment)
1573
147
      a->FileAlignment = a->SectionAlignment;
1574
360
  }
1575
1576
472
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
344
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
472
    }
1579
1580
939
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
939
             (opt_hdr_size != 0
1582
939
        ? &internal_a
1583
939
        : (struct internal_aouthdr *) NULL));
1584
1585
939
  if (result)
1586
320
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
320
      pe_bfd_read_buildid(abfd);
1589
320
    }
1590
1591
939
  return result;
1592
947
}
pei-loongarch64.c:pe_bfd_object_p
Line
Count
Source
1440
10.9k
{
1441
10.9k
  bfd_byte buffer[6];
1442
10.9k
  struct external_DOS_hdr dos_hdr;
1443
10.9k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
10.9k
  struct internal_filehdr internal_f;
1445
10.9k
  struct internal_aouthdr internal_a;
1446
10.9k
  bfd_size_type opt_hdr_size;
1447
10.9k
  file_ptr offset;
1448
10.9k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
10.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
10.9k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
53
    {
1455
53
      if (bfd_get_error () != bfd_error_system_call)
1456
53
  bfd_set_error (bfd_error_wrong_format);
1457
53
      return NULL;
1458
53
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
10.9k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
10.9k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
10.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
10.9k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
10.9k
   != sizeof (dos_hdr))
1468
1.61k
    {
1469
1.61k
      if (bfd_get_error () != bfd_error_system_call)
1470
1.61k
  bfd_set_error (bfd_error_wrong_format);
1471
1.61k
      return NULL;
1472
1.61k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
9.31k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
1.41k
    {
1486
1.41k
      bfd_set_error (bfd_error_wrong_format);
1487
1.41k
      return NULL;
1488
1.41k
    }
1489
1490
7.89k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
7.89k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
7.89k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
7.89k
    != sizeof (image_hdr)))
1494
32
    {
1495
32
      if (bfd_get_error () != bfd_error_system_call)
1496
32
  bfd_set_error (bfd_error_wrong_format);
1497
32
      return NULL;
1498
32
    }
1499
1500
7.86k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
51
    {
1502
51
      bfd_set_error (bfd_error_wrong_format);
1503
51
      return NULL;
1504
51
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
7.81k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
7.81k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
7.81k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.89k
    {
1513
6.89k
      bfd_set_error (bfd_error_wrong_format);
1514
6.89k
      return NULL;
1515
6.89k
    }
1516
1517
915
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
915
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
915
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
915
  if (opt_hdr_size != 0)
1524
652
    {
1525
652
      bfd_size_type amt = opt_hdr_size;
1526
652
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
652
      if (amt < sizeof (PEAOUTHDR))
1530
648
  amt = sizeof (PEAOUTHDR);
1531
1532
652
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
652
      if (opthdr == NULL)
1534
9
  return NULL;
1535
643
      if (amt > opt_hdr_size)
1536
640
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
643
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
643
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
643
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
643
    || a->SectionAlignment >= 0x80000000)
1558
384
  {
1559
384
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
384
        abfd);
1561
384
    a->SectionAlignment &= -a->SectionAlignment;
1562
384
    if (a->SectionAlignment >= 0x80000000)
1563
2
      a->SectionAlignment = 0x40000000;
1564
384
  }
1565
1566
643
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
643
    || a->FileAlignment > a->SectionAlignment)
1568
408
  {
1569
408
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
408
            abfd);
1571
408
    a->FileAlignment &= -a->FileAlignment;
1572
408
    if (a->FileAlignment > a->SectionAlignment)
1573
328
      a->FileAlignment = a->SectionAlignment;
1574
408
  }
1575
1576
643
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
373
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
643
    }
1579
1580
906
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
906
             (opt_hdr_size != 0
1582
906
        ? &internal_a
1583
906
        : (struct internal_aouthdr *) NULL));
1584
1585
906
  if (result)
1586
341
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
341
      pe_bfd_read_buildid(abfd);
1589
341
    }
1590
1591
906
  return result;
1592
915
}
pei-arm-wince.c:pe_bfd_object_p
Line
Count
Source
1440
21.9k
{
1441
21.9k
  bfd_byte buffer[6];
1442
21.9k
  struct external_DOS_hdr dos_hdr;
1443
21.9k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
21.9k
  struct internal_filehdr internal_f;
1445
21.9k
  struct internal_aouthdr internal_a;
1446
21.9k
  bfd_size_type opt_hdr_size;
1447
21.9k
  file_ptr offset;
1448
21.9k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
21.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
21.9k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
106
    {
1455
106
      if (bfd_get_error () != bfd_error_system_call)
1456
106
  bfd_set_error (bfd_error_wrong_format);
1457
106
      return NULL;
1458
106
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
21.8k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
21.8k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
21.8k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
21.8k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
21.8k
   != sizeof (dos_hdr))
1468
3.16k
    {
1469
3.16k
      if (bfd_get_error () != bfd_error_system_call)
1470
3.16k
  bfd_set_error (bfd_error_wrong_format);
1471
3.16k
      return NULL;
1472
3.16k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
18.6k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
10.1k
    {
1486
10.1k
      bfd_set_error (bfd_error_wrong_format);
1487
10.1k
      return NULL;
1488
10.1k
    }
1489
1490
8.57k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
8.57k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
8.57k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
8.57k
    != sizeof (image_hdr)))
1494
265
    {
1495
265
      if (bfd_get_error () != bfd_error_system_call)
1496
265
  bfd_set_error (bfd_error_wrong_format);
1497
265
      return NULL;
1498
265
    }
1499
1500
8.31k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
367
    {
1502
367
      bfd_set_error (bfd_error_wrong_format);
1503
367
      return NULL;
1504
367
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
7.94k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
7.94k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
7.94k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.40k
    {
1513
6.40k
      bfd_set_error (bfd_error_wrong_format);
1514
6.40k
      return NULL;
1515
6.40k
    }
1516
1517
1.53k
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
1.53k
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
1.53k
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
1.53k
  if (opt_hdr_size != 0)
1524
687
    {
1525
687
      bfd_size_type amt = opt_hdr_size;
1526
687
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
687
      if (amt < sizeof (PEAOUTHDR))
1530
678
  amt = sizeof (PEAOUTHDR);
1531
1532
687
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
687
      if (opthdr == NULL)
1534
14
  return NULL;
1535
673
      if (amt > opt_hdr_size)
1536
665
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
673
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
673
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
673
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
673
#ifdef WINCE
1546
673
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
406
  {
1551
406
    bfd_set_error (bfd_error_wrong_format);
1552
406
    return NULL;
1553
406
  }
1554
267
#endif
1555
1556
267
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
267
    || a->SectionAlignment >= 0x80000000)
1558
173
  {
1559
173
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
173
        abfd);
1561
173
    a->SectionAlignment &= -a->SectionAlignment;
1562
173
    if (a->SectionAlignment >= 0x80000000)
1563
1
      a->SectionAlignment = 0x40000000;
1564
173
  }
1565
1566
267
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
267
    || a->FileAlignment > a->SectionAlignment)
1568
248
  {
1569
248
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
248
            abfd);
1571
248
    a->FileAlignment &= -a->FileAlignment;
1572
248
    if (a->FileAlignment > a->SectionAlignment)
1573
180
      a->FileAlignment = a->SectionAlignment;
1574
248
  }
1575
1576
267
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
262
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
267
    }
1579
1580
1.11k
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
1.11k
             (opt_hdr_size != 0
1582
1.11k
        ? &internal_a
1583
1.11k
        : (struct internal_aouthdr *) NULL));
1584
1585
1.11k
  if (result)
1586
338
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
338
      pe_bfd_read_buildid(abfd);
1589
338
    }
1590
1591
1.11k
  return result;
1592
1.53k
}
pei-arm.c:pe_bfd_object_p
Line
Count
Source
1440
21.9k
{
1441
21.9k
  bfd_byte buffer[6];
1442
21.9k
  struct external_DOS_hdr dos_hdr;
1443
21.9k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
21.9k
  struct internal_filehdr internal_f;
1445
21.9k
  struct internal_aouthdr internal_a;
1446
21.9k
  bfd_size_type opt_hdr_size;
1447
21.9k
  file_ptr offset;
1448
21.9k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
21.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
21.9k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
106
    {
1455
106
      if (bfd_get_error () != bfd_error_system_call)
1456
106
  bfd_set_error (bfd_error_wrong_format);
1457
106
      return NULL;
1458
106
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
21.8k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
21.8k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
21.8k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
21.8k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
21.8k
   != sizeof (dos_hdr))
1468
3.16k
    {
1469
3.16k
      if (bfd_get_error () != bfd_error_system_call)
1470
3.16k
  bfd_set_error (bfd_error_wrong_format);
1471
3.16k
      return NULL;
1472
3.16k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
18.6k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
10.1k
    {
1486
10.1k
      bfd_set_error (bfd_error_wrong_format);
1487
10.1k
      return NULL;
1488
10.1k
    }
1489
1490
8.57k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
8.57k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
8.57k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
8.57k
    != sizeof (image_hdr)))
1494
265
    {
1495
265
      if (bfd_get_error () != bfd_error_system_call)
1496
265
  bfd_set_error (bfd_error_wrong_format);
1497
265
      return NULL;
1498
265
    }
1499
1500
8.31k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
367
    {
1502
367
      bfd_set_error (bfd_error_wrong_format);
1503
367
      return NULL;
1504
367
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
7.94k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
7.94k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
7.94k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.40k
    {
1513
6.40k
      bfd_set_error (bfd_error_wrong_format);
1514
6.40k
      return NULL;
1515
6.40k
    }
1516
1517
1.53k
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
1.53k
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
1.53k
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
1.53k
  if (opt_hdr_size != 0)
1524
687
    {
1525
687
      bfd_size_type amt = opt_hdr_size;
1526
687
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
687
      if (amt < sizeof (PEAOUTHDR))
1530
678
  amt = sizeof (PEAOUTHDR);
1531
1532
687
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
687
      if (opthdr == NULL)
1534
14
  return NULL;
1535
673
      if (amt > opt_hdr_size)
1536
665
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
673
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
673
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
673
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
673
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
267
#endif
1550
267
  {
1551
267
    bfd_set_error (bfd_error_wrong_format);
1552
267
    return NULL;
1553
267
  }
1554
406
#endif
1555
1556
406
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
406
    || a->SectionAlignment >= 0x80000000)
1558
216
  {
1559
216
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
216
        abfd);
1561
216
    a->SectionAlignment &= -a->SectionAlignment;
1562
216
    if (a->SectionAlignment >= 0x80000000)
1563
1
      a->SectionAlignment = 0x40000000;
1564
216
  }
1565
1566
406
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
406
    || a->FileAlignment > a->SectionAlignment)
1568
295
  {
1569
295
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
295
            abfd);
1571
295
    a->FileAlignment &= -a->FileAlignment;
1572
295
    if (a->FileAlignment > a->SectionAlignment)
1573
208
      a->FileAlignment = a->SectionAlignment;
1574
295
  }
1575
1576
406
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
286
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
406
    }
1579
1580
1.25k
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
1.25k
             (opt_hdr_size != 0
1582
1.25k
        ? &internal_a
1583
1.25k
        : (struct internal_aouthdr *) NULL));
1584
1585
1.25k
  if (result)
1586
363
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
363
      pe_bfd_read_buildid(abfd);
1589
363
    }
1590
1591
1.25k
  return result;
1592
1.53k
}
pei-mcore.c:pe_bfd_object_p
Line
Count
Source
1440
21.9k
{
1441
21.9k
  bfd_byte buffer[6];
1442
21.9k
  struct external_DOS_hdr dos_hdr;
1443
21.9k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
21.9k
  struct internal_filehdr internal_f;
1445
21.9k
  struct internal_aouthdr internal_a;
1446
21.9k
  bfd_size_type opt_hdr_size;
1447
21.9k
  file_ptr offset;
1448
21.9k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
21.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
21.9k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
106
    {
1455
106
      if (bfd_get_error () != bfd_error_system_call)
1456
106
  bfd_set_error (bfd_error_wrong_format);
1457
106
      return NULL;
1458
106
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
21.8k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
21.8k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
21.8k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
21.8k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
21.8k
   != sizeof (dos_hdr))
1468
3.23k
    {
1469
3.23k
      if (bfd_get_error () != bfd_error_system_call)
1470
3.23k
  bfd_set_error (bfd_error_wrong_format);
1471
3.23k
      return NULL;
1472
3.23k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
18.6k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
10.7k
    {
1486
10.7k
      bfd_set_error (bfd_error_wrong_format);
1487
10.7k
      return NULL;
1488
10.7k
    }
1489
1490
7.89k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
7.89k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
7.89k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
7.89k
    != sizeof (image_hdr)))
1494
32
    {
1495
32
      if (bfd_get_error () != bfd_error_system_call)
1496
32
  bfd_set_error (bfd_error_wrong_format);
1497
32
      return NULL;
1498
32
    }
1499
1500
7.86k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
51
    {
1502
51
      bfd_set_error (bfd_error_wrong_format);
1503
51
      return NULL;
1504
51
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
7.81k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
7.81k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
7.81k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.95k
    {
1513
6.95k
      bfd_set_error (bfd_error_wrong_format);
1514
6.95k
      return NULL;
1515
6.95k
    }
1516
1517
858
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
858
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
858
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
858
  if (opt_hdr_size != 0)
1524
636
    {
1525
636
      bfd_size_type amt = opt_hdr_size;
1526
636
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
636
      if (amt < sizeof (PEAOUTHDR))
1530
634
  amt = sizeof (PEAOUTHDR);
1531
1532
636
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
636
      if (opthdr == NULL)
1534
11
  return NULL;
1535
625
      if (amt > opt_hdr_size)
1536
624
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
625
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
625
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
625
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
625
    || a->SectionAlignment >= 0x80000000)
1558
320
  {
1559
320
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
320
        abfd);
1561
320
    a->SectionAlignment &= -a->SectionAlignment;
1562
320
    if (a->SectionAlignment >= 0x80000000)
1563
1
      a->SectionAlignment = 0x40000000;
1564
320
  }
1565
1566
625
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
625
    || a->FileAlignment > a->SectionAlignment)
1568
377
  {
1569
377
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
377
            abfd);
1571
377
    a->FileAlignment &= -a->FileAlignment;
1572
377
    if (a->FileAlignment > a->SectionAlignment)
1573
313
      a->FileAlignment = a->SectionAlignment;
1574
377
  }
1575
1576
625
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
374
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
625
    }
1579
1580
847
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
847
             (opt_hdr_size != 0
1582
847
        ? &internal_a
1583
847
        : (struct internal_aouthdr *) NULL));
1584
1585
847
  if (result)
1586
372
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
372
      pe_bfd_read_buildid(abfd);
1589
372
    }
1590
1591
847
  return result;
1592
858
}
pei-sh.c:pe_bfd_object_p
Line
Count
Source
1440
10.9k
{
1441
10.9k
  bfd_byte buffer[6];
1442
10.9k
  struct external_DOS_hdr dos_hdr;
1443
10.9k
  struct external_PEI_IMAGE_hdr image_hdr;
1444
10.9k
  struct internal_filehdr internal_f;
1445
10.9k
  struct internal_aouthdr internal_a;
1446
10.9k
  bfd_size_type opt_hdr_size;
1447
10.9k
  file_ptr offset;
1448
10.9k
  bfd_cleanup result;
1449
1450
  /* Detect if this a Microsoft Import Library Format element.  */
1451
  /* First read the beginning of the header.  */
1452
10.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1453
10.9k
      || bfd_bread (buffer, (bfd_size_type) 6, abfd) != 6)
1454
53
    {
1455
53
      if (bfd_get_error () != bfd_error_system_call)
1456
53
  bfd_set_error (bfd_error_wrong_format);
1457
53
      return NULL;
1458
53
    }
1459
1460
  /* Then check the magic and the version (only 0 is supported).  */
1461
10.9k
  if (H_GET_32 (abfd, buffer) == 0xffff0000
1462
10.9k
      && H_GET_16 (abfd, buffer + 4) == 0)
1463
0
    return pe_ILF_object_p (abfd);
1464
1465
10.9k
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1466
10.9k
      || bfd_bread (&dos_hdr, (bfd_size_type) sizeof (dos_hdr), abfd)
1467
10.9k
   != sizeof (dos_hdr))
1468
1.61k
    {
1469
1.61k
      if (bfd_get_error () != bfd_error_system_call)
1470
1.61k
  bfd_set_error (bfd_error_wrong_format);
1471
1.61k
      return NULL;
1472
1.61k
    }
1473
1474
  /* There are really two magic numbers involved; the magic number
1475
     that says this is a NT executable (PEI) and the magic number that
1476
     determines the architecture.  The former is IMAGE_DOS_SIGNATURE, stored in
1477
     the e_magic field.  The latter is stored in the f_magic field.
1478
     If the NT magic number isn't valid, the architecture magic number
1479
     could be mimicked by some other field (specifically, the number
1480
     of relocs in section 3).  Since this routine can only be called
1481
     correctly for a PEI file, check the e_magic number here, and, if
1482
     it doesn't match, clobber the f_magic number so that we don't get
1483
     a false match.  */
1484
9.31k
  if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
1485
1.41k
    {
1486
1.41k
      bfd_set_error (bfd_error_wrong_format);
1487
1.41k
      return NULL;
1488
1.41k
    }
1489
1490
7.89k
  offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
1491
7.89k
  if (bfd_seek (abfd, offset, SEEK_SET) != 0
1492
7.89k
      || (bfd_bread (&image_hdr, (bfd_size_type) sizeof (image_hdr), abfd)
1493
7.89k
    != sizeof (image_hdr)))
1494
32
    {
1495
32
      if (bfd_get_error () != bfd_error_system_call)
1496
32
  bfd_set_error (bfd_error_wrong_format);
1497
32
      return NULL;
1498
32
    }
1499
1500
7.86k
  if (H_GET_32 (abfd, image_hdr.nt_signature) != 0x4550)
1501
51
    {
1502
51
      bfd_set_error (bfd_error_wrong_format);
1503
51
      return NULL;
1504
51
    }
1505
1506
  /* Swap file header, so that we get the location for calling
1507
     real_object_p.  */
1508
7.81k
  bfd_coff_swap_filehdr_in (abfd, &image_hdr, &internal_f);
1509
1510
7.81k
  if (! bfd_coff_bad_format_hook (abfd, &internal_f)
1511
7.81k
      || internal_f.f_opthdr > bfd_coff_aoutsz (abfd))
1512
6.97k
    {
1513
6.97k
      bfd_set_error (bfd_error_wrong_format);
1514
6.97k
      return NULL;
1515
6.97k
    }
1516
1517
837
  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
1518
837
    sizeof (internal_f.pe.dos_message));
1519
1520
  /* Read the optional header, which has variable size.  */
1521
837
  opt_hdr_size = internal_f.f_opthdr;
1522
1523
837
  if (opt_hdr_size != 0)
1524
583
    {
1525
583
      bfd_size_type amt = opt_hdr_size;
1526
583
      bfd_byte * opthdr;
1527
1528
      /* PR 17521 file: 230-131433-0.004.  */
1529
583
      if (amt < sizeof (PEAOUTHDR))
1530
577
  amt = sizeof (PEAOUTHDR);
1531
1532
583
      opthdr = _bfd_alloc_and_read (abfd, amt, opt_hdr_size);
1533
583
      if (opthdr == NULL)
1534
11
  return NULL;
1535
572
      if (amt > opt_hdr_size)
1536
567
  memset (opthdr + opt_hdr_size, 0, amt - opt_hdr_size);
1537
1538
572
      bfd_coff_swap_aouthdr_in (abfd, opthdr, &internal_a);
1539
1540
572
      struct internal_extra_pe_aouthdr *a = &internal_a.pe;
1541
1542
#ifdef ARM
1543
      /* Use Subsystem to distinguish between pei-arm-little and
1544
   pei-arm-wince-little.  */
1545
#ifdef WINCE
1546
      if (a->Subsystem != IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1547
#else
1548
      if (a->Subsystem == IMAGE_SUBSYSTEM_WINDOWS_CE_GUI)
1549
#endif
1550
  {
1551
    bfd_set_error (bfd_error_wrong_format);
1552
    return NULL;
1553
  }
1554
#endif
1555
1556
572
      if ((a->SectionAlignment & -a->SectionAlignment) != a->SectionAlignment
1557
572
    || a->SectionAlignment >= 0x80000000)
1558
295
  {
1559
295
    _bfd_error_handler (_("%pB: adjusting invalid SectionAlignment"),
1560
295
        abfd);
1561
295
    a->SectionAlignment &= -a->SectionAlignment;
1562
295
    if (a->SectionAlignment >= 0x80000000)
1563
1
      a->SectionAlignment = 0x40000000;
1564
295
  }
1565
1566
572
      if ((a->FileAlignment & -a->FileAlignment) != a->FileAlignment
1567
572
    || a->FileAlignment > a->SectionAlignment)
1568
253
  {
1569
253
    _bfd_error_handler (_("%pB: adjusting invalid FileAlignment"),
1570
253
            abfd);
1571
253
    a->FileAlignment &= -a->FileAlignment;
1572
253
    if (a->FileAlignment > a->SectionAlignment)
1573
223
      a->FileAlignment = a->SectionAlignment;
1574
253
  }
1575
1576
572
      if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
1577
298
  _bfd_error_handler (_("%pB: invalid NumberOfRvaAndSizes"), abfd);
1578
572
    }
1579
1580
826
  result = coff_real_object_p (abfd, internal_f.f_nscns, &internal_f,
1581
826
             (opt_hdr_size != 0
1582
826
        ? &internal_a
1583
826
        : (struct internal_aouthdr *) NULL));
1584
1585
826
  if (result)
1586
313
    {
1587
      /* Now the whole header has been processed, see if there is a build-id */
1588
313
      pe_bfd_read_buildid(abfd);
1589
313
    }
1590
1591
826
  return result;
1592
837
}
1593
1594
1.96k
#define coff_object_p pe_bfd_object_p
1595
#endif /* COFF_IMAGE_WITH_PE */