Coverage Report

Created: 2023-08-28 06:25

/src/binutils-gdb/bfd/elfcode.h
Line
Count
Source (jump to first uncovered line)
1
/* ELF executable support for BFD.
2
   Copyright (C) 1991-2023 Free Software Foundation, Inc.
3
4
   Written by Fred Fish @ Cygnus Support, from information published
5
   in "UNIX System V Release 4, Programmers Guide: ANSI C and
6
   Programming Support Tools".  Sufficient support for gdb.
7
8
   Rewritten by Mark Eichin @ Cygnus Support, from information
9
   published in "System V Application Binary Interface", chapters 4
10
   and 5, as well as the various "Processor Supplement" documents
11
   derived from it. Added support for assembler and other object file
12
   utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
13
   Meissner (Open Software Foundation), and Peter Hoogenboom (University
14
   of Utah) to finish and extend this.
15
16
   This file is part of BFD, the Binary File Descriptor library.
17
18
   This program is free software; you can redistribute it and/or modify
19
   it under the terms of the GNU General Public License as published by
20
   the Free Software Foundation; either version 3 of the License, or
21
   (at your option) any later version.
22
23
   This program is distributed in the hope that it will be useful,
24
   but WITHOUT ANY WARRANTY; without even the implied warranty of
25
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
   GNU General Public License for more details.
27
28
   You should have received a copy of the GNU General Public License
29
   along with this program; if not, write to the Free Software
30
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
31
   MA 02110-1301, USA.  */
32
33
34
/* Problems and other issues to resolve.
35
36
   (1)  BFD expects there to be some fixed number of "sections" in
37
  the object file.  I.E. there is a "section_count" variable in the
38
  bfd structure which contains the number of sections.  However, ELF
39
  supports multiple "views" of a file.  In particular, with current
40
  implementations, executable files typically have two tables, a
41
  program header table and a section header table, both of which
42
  partition the executable.
43
44
  In ELF-speak, the "linking view" of the file uses the section header
45
  table to access "sections" within the file, and the "execution view"
46
  uses the program header table to access "segments" within the file.
47
  "Segments" typically may contain all the data from one or more
48
  "sections".
49
50
  Note that the section header table is optional in ELF executables,
51
  but it is this information that is most useful to gdb.  If the
52
  section header table is missing, then gdb should probably try
53
  to make do with the program header table.  (FIXME)
54
55
   (2)  The code in this file is compiled twice, once in 32-bit mode and
56
  once in 64-bit mode.  More of it should be made size-independent
57
  and moved into elf.c.
58
59
   (3)  ELF section symbols are handled rather sloppily now.  This should
60
  be cleaned up, and ELF section symbols reconciled with BFD section
61
  symbols.
62
63
   (4)  We need a published spec for 64-bit ELF.  We've got some stuff here
64
  that we're using for SPARC V9 64-bit chips, but don't assume that
65
  it's cast in stone.
66
 */
67
68
#include "sysdep.h"
69
#include "bfd.h"
70
#include "libiberty.h"
71
#include "bfdlink.h"
72
#include "libbfd.h"
73
#include "elf-bfd.h"
74
#include "libiberty.h"
75
76
/* Renaming structures, typedefs, macros and functions to be size-specific.  */
77
20.5M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
0
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
20.5M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
647k
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
0
#define Elf_External_Rela NAME(Elf,External_Rela)
83
0
#define Elf_External_Dyn  NAME(Elf,External_Dyn)
84
85
#define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command)
86
#define elf_core_file_failing_signal  NAME(bfd_elf,core_file_failing_signal)
87
#define elf_core_file_matches_executable_p \
88
  NAME(bfd_elf,core_file_matches_executable_p)
89
#define elf_core_file_pid   NAME(bfd_elf,core_file_pid)
90
#define elf_object_p      NAME(bfd_elf,object_p)
91
#define elf_core_file_p     NAME(bfd_elf,core_file_p)
92
#define elf_get_symtab_upper_bound  NAME(bfd_elf,get_symtab_upper_bound)
93
#define elf_get_dynamic_symtab_upper_bound \
94
  NAME(bfd_elf,get_dynamic_symtab_upper_bound)
95
0
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
0
#define elf_swap_reloca_in    NAME(bfd_elf,swap_reloca_in)
97
0
#define elf_swap_reloc_out    NAME(bfd_elf,swap_reloc_out)
98
0
#define elf_swap_reloca_out   NAME(bfd_elf,swap_reloca_out)
99
#define elf_swap_symbol_in    NAME(bfd_elf,swap_symbol_in)
100
#define elf_swap_symbol_out   NAME(bfd_elf,swap_symbol_out)
101
647k
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
0
#define elf_swap_phdr_out   NAME(bfd_elf,swap_phdr_out)
103
#define elf_swap_dyn_in     NAME(bfd_elf,swap_dyn_in)
104
#define elf_swap_dyn_out    NAME(bfd_elf,swap_dyn_out)
105
#define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound)
106
#define elf_canonicalize_reloc    NAME(bfd_elf,canonicalize_reloc)
107
#define elf_slurp_symbol_table    NAME(bfd_elf,slurp_symbol_table)
108
#define elf_canonicalize_symtab   NAME(bfd_elf,canonicalize_symtab)
109
#define elf_canonicalize_dynamic_symtab \
110
  NAME(bfd_elf,canonicalize_dynamic_symtab)
111
#define elf_get_synthetic_symtab \
112
  NAME(bfd_elf,get_synthetic_symtab)
113
#define elf_make_empty_symbol   NAME(bfd_elf,make_empty_symbol)
114
#define elf_get_symbol_info   NAME(bfd_elf,get_symbol_info)
115
#define elf_get_lineno      NAME(bfd_elf,get_lineno)
116
#define elf_set_arch_mach   NAME(bfd_elf,set_arch_mach)
117
#define elf_find_nearest_line   NAME(bfd_elf,find_nearest_line)
118
#define elf_sizeof_headers    NAME(bfd_elf,sizeof_headers)
119
#define elf_set_section_contents  NAME(bfd_elf,set_section_contents)
120
#define elf_no_info_to_howto    NAME(bfd_elf,no_info_to_howto)
121
#define elf_no_info_to_howto_rel  NAME(bfd_elf,no_info_to_howto_rel)
122
#define elf_find_section    NAME(bfd_elf,find_section)
123
#define elf_write_shdrs_and_ehdr  NAME(bfd_elf,write_shdrs_and_ehdr)
124
#define elf_write_out_phdrs   NAME(bfd_elf,write_out_phdrs)
125
#define elf_checksum_contents   NAME(bfd_elf,checksum_contents)
126
#define elf_write_relocs    NAME(bfd_elf,write_relocs)
127
#define elf_slurp_reloc_table   NAME(bfd_elf,slurp_reloc_table)
128
129
#if ARCH_SIZE == 64
130
0
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
0
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
587k
#define ELFCLASS  ELFCLASS64
134
#define FILE_ALIGN  8
135
#define LOG_FILE_ALIGN  3
136
#endif
137
#if ARCH_SIZE == 32
138
0
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
139
0
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
1.78M
#define ELFCLASS  ELFCLASS32
142
#define FILE_ALIGN  4
143
#define LOG_FILE_ALIGN  2
144
#endif
145
146
#if DEBUG & 2
147
static void elf_debug_section (int, Elf_Internal_Shdr *);
148
#endif
149
#if DEBUG & 1
150
static void elf_debug_file (Elf_Internal_Ehdr *);
151
#endif
152

153
/* Structure swapping routines */
154
155
/* Should perhaps use put_offset, put_word, etc.  For now, the two versions
156
   can be handled by explicitly specifying 32 bits or "the long type".  */
157
#if ARCH_SIZE == 64
158
0
#define H_PUT_WORD    H_PUT_64
159
0
#define H_PUT_SIGNED_WORD H_PUT_S64
160
1.05M
#define H_GET_WORD    H_GET_64
161
44.3k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
0
#define H_PUT_WORD    H_PUT_32
165
0
#define H_PUT_SIGNED_WORD H_PUT_S32
166
4.32M
#define H_GET_WORD    H_GET_32
167
58.5k
#define H_GET_SIGNED_WORD H_GET_S32
168
#endif
169
170
/* Translate an ELF symbol in external format into an ELF symbol in internal
171
   format.  */
172
173
bool
174
elf_swap_symbol_in (bfd *abfd,
175
        const void *psrc,
176
        const void *pshn,
177
        Elf_Internal_Sym *dst)
178
17.2k
{
179
17.2k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
17.2k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
17.2k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
17.2k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
17.2k
  if (signed_vma)
185
167
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
17.0k
  else
187
17.0k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
17.2k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
17.2k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
17.2k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
17.2k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
17.2k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
19
    {
194
19
      if (shndx == NULL)
195
10
  return false;
196
9
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
9
    }
198
17.2k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
105
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
17.2k
  dst->st_target_internal = 0;
201
17.2k
  return true;
202
17.2k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
17.2k
{
179
17.2k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
17.2k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
17.2k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
17.2k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
17.2k
  if (signed_vma)
185
167
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
17.0k
  else
187
17.0k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
17.2k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
17.2k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
17.2k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
17.2k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
17.2k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
19
    {
194
19
      if (shndx == NULL)
195
10
  return false;
196
9
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
9
    }
198
17.2k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
105
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
17.2k
  dst->st_target_internal = 0;
201
17.2k
  return true;
202
17.2k
}
Unexecuted instantiation: bfd_elf32_swap_symbol_in
203
204
/* Translate an ELF symbol in internal format into an ELF symbol in external
205
   format.  */
206
207
void
208
elf_swap_symbol_out (bfd *abfd,
209
         const Elf_Internal_Sym *src,
210
         void *cdst,
211
         void *shndx)
212
0
{
213
0
  unsigned int tmp;
214
0
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
0
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
0
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
0
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
0
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
0
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
0
  tmp = src->st_shndx;
221
0
  if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
222
0
    {
223
0
      if (shndx == NULL)
224
0
  abort ();
225
0
      H_PUT_32 (abfd, tmp, shndx);
226
0
      tmp = SHN_XINDEX & 0xffff;
227
0
    }
228
0
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
0
}
Unexecuted instantiation: bfd_elf64_swap_symbol_out
Unexecuted instantiation: bfd_elf32_swap_symbol_out
230
231
/* Translate an ELF file header in external format into an ELF file header in
232
   internal format.  */
233
234
static void
235
elf_swap_ehdr_in (bfd *abfd,
236
      const Elf_External_Ehdr *src,
237
      Elf_Internal_Ehdr *dst)
238
431k
{
239
431k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
431k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
431k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
431k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
431k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
431k
  if (signed_vma)
245
52.4k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
378k
  else
247
378k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
431k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
431k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
431k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
431k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
431k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
431k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
431k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
431k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
431k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
431k
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
251k
{
239
251k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
251k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
251k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
251k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
251k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
251k
  if (signed_vma)
245
33.2k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
218k
  else
247
218k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
251k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
251k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
251k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
251k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
251k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
251k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
251k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
251k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
251k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
251k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
179k
{
239
179k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
179k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
179k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
179k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
179k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
179k
  if (signed_vma)
245
19.1k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
160k
  else
247
160k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
179k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
179k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
179k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
179k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
179k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
179k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
179k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
179k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
179k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
179k
}
258
259
/* Translate an ELF file header in internal format into an ELF file header in
260
   external format.  */
261
262
static void
263
elf_swap_ehdr_out (bfd *abfd,
264
       const Elf_Internal_Ehdr *src,
265
       Elf_External_Ehdr *dst)
266
0
{
267
0
  unsigned int tmp;
268
0
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
0
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
0
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
0
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
0
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
0
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
0
  if (signed_vma)
276
0
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
0
  else
278
0
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
0
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
0
  if (no_section_header)
281
0
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
0
  else
283
0
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
0
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
0
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
0
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
0
  tmp = src->e_phnum;
288
0
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
0
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
0
  if (no_section_header)
292
0
    {
293
0
      H_PUT_16 (abfd, 0, dst->e_shentsize);
294
0
      H_PUT_16 (abfd, 0, dst->e_shnum);
295
0
      H_PUT_16 (abfd, 0, dst->e_shstrndx);
296
0
    }
297
0
  else
298
0
    {
299
0
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
0
      tmp = src->e_shnum;
301
0
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
0
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
0
      tmp = src->e_shstrndx;
305
0
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
0
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
0
    }
309
0
}
Unexecuted instantiation: elf64.c:elf_swap_ehdr_out
Unexecuted instantiation: elf32.c:elf_swap_ehdr_out
310
311
/* Translate an ELF section header table entry in external format into an
312
   ELF section header table entry in internal format.  */
313
314
static void
315
elf_swap_shdr_in (bfd *abfd,
316
      const Elf_External_Shdr *src,
317
      Elf_Internal_Shdr *dst)
318
45.8k
{
319
45.8k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
45.8k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
45.8k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
45.8k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
45.8k
  if (signed_vma)
325
10.9k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
34.9k
  else
327
34.9k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
45.8k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
45.8k
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
330
  /* PR 23657.  Check for invalid section size, in sections with contents.
331
     Note - we do not set an error value here because the contents
332
     of this particular section might not be needed by the consumer.  */
333
45.8k
  if (dst->sh_type != SHT_NOBITS)
334
45.1k
    {
335
45.1k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
45.1k
      if (filesize != 0
338
45.1k
    && ((ufile_ptr) dst->sh_offset > filesize
339
45.1k
        || dst->sh_size > filesize - dst->sh_offset)
340
45.1k
    && !abfd->read_only)
341
13.9k
  {
342
13.9k
    _bfd_error_handler (_("warning: %pB has a section "
343
13.9k
        "extending past end of file"), abfd);
344
13.9k
    abfd->read_only = 1;
345
13.9k
  }
346
45.1k
    }
347
45.8k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
45.8k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
45.8k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
45.8k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
45.8k
  dst->bfd_section = NULL;
352
45.8k
  dst->contents = NULL;
353
45.8k
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
42.0k
{
319
42.0k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
42.0k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
42.0k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
42.0k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
42.0k
  if (signed_vma)
325
10.1k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
31.9k
  else
327
31.9k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
42.0k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
42.0k
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
330
  /* PR 23657.  Check for invalid section size, in sections with contents.
331
     Note - we do not set an error value here because the contents
332
     of this particular section might not be needed by the consumer.  */
333
42.0k
  if (dst->sh_type != SHT_NOBITS)
334
41.3k
    {
335
41.3k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
41.3k
      if (filesize != 0
338
41.3k
    && ((ufile_ptr) dst->sh_offset > filesize
339
41.3k
        || dst->sh_size > filesize - dst->sh_offset)
340
41.3k
    && !abfd->read_only)
341
13.2k
  {
342
13.2k
    _bfd_error_handler (_("warning: %pB has a section "
343
13.2k
        "extending past end of file"), abfd);
344
13.2k
    abfd->read_only = 1;
345
13.2k
  }
346
41.3k
    }
347
42.0k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
42.0k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
42.0k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
42.0k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
42.0k
  dst->bfd_section = NULL;
352
42.0k
  dst->contents = NULL;
353
42.0k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
3.84k
{
319
3.84k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
3.84k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
3.84k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
3.84k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
3.84k
  if (signed_vma)
325
800
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
3.04k
  else
327
3.04k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
3.84k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
3.84k
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
330
  /* PR 23657.  Check for invalid section size, in sections with contents.
331
     Note - we do not set an error value here because the contents
332
     of this particular section might not be needed by the consumer.  */
333
3.84k
  if (dst->sh_type != SHT_NOBITS)
334
3.76k
    {
335
3.76k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
3.76k
      if (filesize != 0
338
3.76k
    && ((ufile_ptr) dst->sh_offset > filesize
339
3.76k
        || dst->sh_size > filesize - dst->sh_offset)
340
3.76k
    && !abfd->read_only)
341
718
  {
342
718
    _bfd_error_handler (_("warning: %pB has a section "
343
718
        "extending past end of file"), abfd);
344
718
    abfd->read_only = 1;
345
718
  }
346
3.76k
    }
347
3.84k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
3.84k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
3.84k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
3.84k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
3.84k
  dst->bfd_section = NULL;
352
3.84k
  dst->contents = NULL;
353
3.84k
}
354
355
/* Translate an ELF section header table entry in internal format into an
356
   ELF section header table entry in external format.  */
357
358
static void
359
elf_swap_shdr_out (bfd *abfd,
360
       const Elf_Internal_Shdr *src,
361
       Elf_External_Shdr *dst)
362
0
{
363
  /* note that all elements of dst are *arrays of unsigned char* already...  */
364
0
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
365
0
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
366
0
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
367
0
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
368
0
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
369
0
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
370
0
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
371
0
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
372
0
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
373
0
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
374
0
}
Unexecuted instantiation: elf64.c:elf_swap_shdr_out
Unexecuted instantiation: elf32.c:elf_swap_shdr_out
375
376
/* Translate an ELF program header table entry in external format into an
377
   ELF program header table entry in internal format.  */
378
379
void
380
elf_swap_phdr_in (bfd *abfd,
381
      const Elf_External_Phdr *src,
382
      Elf_Internal_Phdr *dst)
383
647k
{
384
647k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
647k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
647k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
647k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
647k
  if (signed_vma)
390
19.6k
    {
391
19.6k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
19.6k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
19.6k
    }
394
627k
  else
395
627k
    {
396
627k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
627k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
627k
    }
399
647k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
647k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
647k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
647k
}
bfd_elf64_swap_phdr_in
Line
Count
Source
383
10.0k
{
384
10.0k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
10.0k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
10.0k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
10.0k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
10.0k
  if (signed_vma)
390
388
    {
391
388
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
388
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
388
    }
394
9.63k
  else
395
9.63k
    {
396
9.63k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
9.63k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
9.63k
    }
399
10.0k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
10.0k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
10.0k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
10.0k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
383
637k
{
384
637k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
637k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
637k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
637k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
637k
  if (signed_vma)
390
19.2k
    {
391
19.2k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
19.2k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
19.2k
    }
394
618k
  else
395
618k
    {
396
618k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
618k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
618k
    }
399
637k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
637k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
637k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
637k
}
403
404
void
405
elf_swap_phdr_out (bfd *abfd,
406
       const Elf_Internal_Phdr *src,
407
       Elf_External_Phdr *dst)
408
0
{
409
0
  const struct elf_backend_data *bed;
410
0
  bfd_vma p_paddr;
411
412
0
  bed = get_elf_backend_data (abfd);
413
0
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
414
415
  /* note that all elements of dst are *arrays of unsigned char* already...  */
416
0
  H_PUT_32 (abfd, src->p_type, dst->p_type);
417
0
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
418
0
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
419
0
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
420
0
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
421
0
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
422
0
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
423
0
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
424
0
}
Unexecuted instantiation: bfd_elf64_swap_phdr_out
Unexecuted instantiation: bfd_elf32_swap_phdr_out
425
426
/* Translate an ELF reloc from external format to internal format.  */
427
void
428
elf_swap_reloc_in (bfd *abfd,
429
       const bfd_byte *s,
430
       Elf_Internal_Rela *dst)
431
0
{
432
0
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
433
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
434
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
435
0
  dst->r_addend = 0;
436
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
Unexecuted instantiation: bfd_elf32_swap_reloc_in
437
438
void
439
elf_swap_reloca_in (bfd *abfd,
440
        const bfd_byte *s,
441
        Elf_Internal_Rela *dst)
442
0
{
443
0
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
0
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_in
Unexecuted instantiation: bfd_elf32_swap_reloca_in
448
449
/* Translate an ELF reloc from internal format to external format.  */
450
void
451
elf_swap_reloc_out (bfd *abfd,
452
        const Elf_Internal_Rela *src,
453
        bfd_byte *d)
454
0
{
455
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
456
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
457
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
458
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
459
460
void
461
elf_swap_reloca_out (bfd *abfd,
462
         const Elf_Internal_Rela *src,
463
         bfd_byte *d)
464
0
{
465
0
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
466
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
467
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
468
0
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
469
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_out
Unexecuted instantiation: bfd_elf32_swap_reloca_out
470
471
void
472
elf_swap_dyn_in (bfd *abfd,
473
     const void *p,
474
     Elf_Internal_Dyn *dst)
475
0
{
476
0
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
477
478
0
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
479
0
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
480
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_in
Unexecuted instantiation: bfd_elf32_swap_dyn_in
481
482
void
483
elf_swap_dyn_out (bfd *abfd,
484
      const Elf_Internal_Dyn *src,
485
      void *p)
486
0
{
487
0
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
488
489
0
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
490
0
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
491
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_out
Unexecuted instantiation: bfd_elf32_swap_dyn_out
492

493
/* ELF .o/exec file reading */
494
495
/* Begin processing a given object.
496
497
   First we validate the file by reading in the ELF header and checking
498
   the magic number.  */
499
500
static inline bool
501
elf_file_p (Elf_External_Ehdr *x_ehdrp)
502
19.9M
{
503
19.9M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
19.9M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
19.9M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
19.9M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
19.9M
}
elf64.c:elf_file_p
Line
Count
Source
502
4.92M
{
503
4.92M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
4.92M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
4.92M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
4.92M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
4.92M
}
elf32.c:elf_file_p
Line
Count
Source
502
15.0M
{
503
15.0M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
15.0M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
15.0M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
15.0M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
15.0M
}
508
509
/* Check to see if the file associated with ABFD matches the target vector
510
   that ABFD points to.
511
512
   Note that we may be called several times with the same ABFD, but different
513
   target vectors, most of which will not match.  We have to avoid leaving
514
   any side effects in ABFD, or any data it points to (like tdata), if the
515
   file does not match the target vector.  */
516
517
bfd_cleanup
518
elf_object_p (bfd *abfd)
519
20.5M
{
520
20.5M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
20.5M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
20.5M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
20.5M
  Elf_Internal_Shdr i_shdr;
524
20.5M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
20.5M
  unsigned int shindex;
526
20.5M
  const struct elf_backend_data *ebd;
527
20.5M
  asection *s;
528
20.5M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
20.5M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
515k
    {
534
515k
      if (bfd_get_error () != bfd_error_system_call)
535
509k
  goto got_wrong_format_error;
536
5.33k
      else
537
5.33k
  goto got_no_match;
538
515k
    }
539
540
  /* Now check to see if we have a valid ELF file, and one that BFD can
541
     make use of.  The magic number must match, the address size ('class')
542
     and byte-swapping must match our XVEC entry, and it must have a
543
     section header table (FIXME: See comments re sections at top of this
544
     file).  */
545
546
19.9M
  if (! elf_file_p (&x_ehdr)
547
19.9M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
19.9M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
19.1M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
830k
  switch (x_ehdr.e_ident[EI_DATA])
553
830k
    {
554
129k
    case ELFDATA2MSB:   /* Big-endian */
555
129k
      if (! bfd_header_big_endian (abfd))
556
67.9k
  goto got_wrong_format_error;
557
61.7k
      break;
558
698k
    case ELFDATA2LSB:   /* Little-endian */
559
698k
      if (! bfd_header_little_endian (abfd))
560
328k
  goto got_wrong_format_error;
561
369k
      break;
562
369k
    case ELFDATANONE:   /* No data encoding specified */
563
2.13k
    default:      /* Unknown data encoding specified */
564
2.13k
      goto got_wrong_format_error;
565
830k
    }
566
567
431k
  target = abfd->xvec;
568
569
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
570
     the tdata pointer in the bfd.  */
571
572
431k
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
573
0
    goto got_no_match;
574
575
  /* Now that we know the byte order, swap in the rest of the header */
576
431k
  i_ehdrp = elf_elfheader (abfd);
577
431k
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
578
#if DEBUG & 1
579
  elf_debug_file (i_ehdrp);
580
#endif
581
582
  /* Reject ET_CORE (header indicates core file, not object file) */
583
431k
  if (i_ehdrp->e_type == ET_CORE)
584
496
    goto got_wrong_format_error;
585
586
  /* If this is a relocatable file and there is no section header
587
     table, then we're hosed.  */
588
430k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
372
    goto got_wrong_format_error;
590
591
  /* As a simple sanity check, verify that what BFD thinks is the
592
     size of each section header table entry actually matches the size
593
     recorded in the file, but only if there are any sections.  */
594
430k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
698
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
429k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
174
    goto got_wrong_format_error;
600
601
429k
  ebd = get_elf_backend_data (abfd);
602
429k
  if (ebd->s->arch_size != ARCH_SIZE)
603
0
    goto got_wrong_format_error;
604
605
  /* Check that the ELF e_machine field matches what this particular
606
     BFD format expects.  */
607
429k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
429k
      && (ebd->elf_machine_alt1 == 0
609
396k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
429k
      && (ebd->elf_machine_alt2 == 0
611
395k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
429k
      && ebd->elf_machine_code != EM_NONE)
613
383k
    goto got_wrong_format_error;
614
615
46.4k
  if (i_ehdrp->e_type == ET_EXEC)
616
176
    abfd->flags |= EXEC_P;
617
46.2k
  else if (i_ehdrp->e_type == ET_DYN)
618
960
    abfd->flags |= DYNAMIC;
619
620
46.4k
  if (i_ehdrp->e_phnum > 0)
621
10.9k
    abfd->flags |= D_PAGED;
622
623
46.4k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
13.8k
    {
625
      /* It's OK if this fails for the generic target.  */
626
13.8k
      if (ebd->elf_machine_code != EM_NONE)
627
538
  goto got_no_match;
628
13.8k
    }
629
630
45.9k
  if (ebd->elf_machine_code != EM_NONE
631
45.9k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
45.9k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
8.68k
    goto got_wrong_format_error;
634
635
37.2k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
22.1k
    {
637
22.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
22.1k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
886
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
21.2k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
1.21k
  goto got_no_match;
647
20.0k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
648
649
      /* If the section count is zero, the actual count is in the first
650
   section header.  */
651
20.0k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
11.0k
  {
653
11.0k
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
11.0k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
11.0k
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
11.0k
        || i_ehdrp->e_shnum  == 0)
657
3.57k
      goto got_wrong_format_error;
658
11.0k
  }
659
660
      /* And similarly for the string table index.  */
661
16.4k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
2.83k
  {
663
2.83k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
2.83k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
2.83k
  }
667
668
      /* And program headers.  */
669
16.4k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
212
  {
671
212
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
212
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
212
  }
675
676
      /* Sanity check that we can read all of the section headers.
677
   It ought to be good enough to just read the last one.  */
678
16.4k
      if (i_ehdrp->e_shnum != 1)
679
6.62k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
6.62k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
6.62k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
1.02k
      goto got_wrong_format_error;
684
685
5.59k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
5.59k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
5.59k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
5.59k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
1.88k
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
3.71k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
3.71k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
3.71k
  }
699
16.4k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
28.6k
  if (i_ehdrp->e_shnum != 0)
704
13.5k
    {
705
13.5k
      Elf_Internal_Shdr *shdrp;
706
13.5k
      unsigned int num_sec;
707
13.5k
      size_t amt;
708
709
13.5k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
13.5k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
13.5k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
13.5k
      num_sec = i_ehdrp->e_shnum;
715
13.5k
      elf_numsections (abfd) = num_sec;
716
13.5k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
13.5k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
13.5k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
13.5k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
13.5k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
13.5k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
54.2k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
40.6k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
38.1k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
25.8k
  {
733
25.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
25.8k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
25.8k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
1.38k
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
1.38k
        switch (ebd->elf_machine_code)
743
1.38k
    {
744
44
    case EM_386:
745
46
    case EM_IAMCU:
746
708
    case EM_X86_64:
747
708
    case EM_OLD_SPARCV9:
748
708
    case EM_SPARC32PLUS:
749
870
    case EM_SPARCV9:
750
900
    case EM_SPARC:
751
900
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
900
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
136
        break;
754
      /* Otherwise fall through.  */
755
1.24k
    default:
756
1.24k
      goto got_wrong_format_error;
757
1.38k
    }
758
1.38k
      }
759
760
24.5k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
24.5k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
24.5k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
24.5k
        && i_shdrp[shindex].sh_info >= num_sec)
764
58
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
24.5k
    if (i_shdrp[shindex].sh_size != 0
769
24.5k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
24.5k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
24.5k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
1.62k
       % ebd->minpagesize)
773
1.62k
      != 0))
774
688
      abfd->flags &= ~D_PAGED;
775
24.5k
  }
776
777
12.2k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
12.2k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
10.2k
  {
780
    /* PR 2257:
781
       We used to just goto got_wrong_format_error here
782
       but there are binaries in existance for which this test
783
       will prevent the binutils from working with them at all.
784
       So we are kind, and reset the string index value to 0
785
       so that at least some processing can be done.  */
786
10.2k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
10.2k
    if (!abfd->read_only)
788
5.19k
      {
789
5.19k
        _bfd_error_handler
790
5.19k
    (_("warning: %pB has a corrupt string table index"), abfd);
791
5.19k
        abfd->read_only = 1;
792
5.19k
      }
793
10.2k
  }
794
12.2k
    }
795
15.0k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
254
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
27.1k
  if (i_ehdrp->e_phnum == 0)
800
20.1k
    elf_tdata (abfd)->phdr = NULL;
801
6.99k
  else
802
6.99k
    {
803
6.99k
      Elf_Internal_Phdr *i_phdr;
804
6.99k
      unsigned int i;
805
6.99k
      ufile_ptr filesize;
806
6.99k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
6.99k
      filesize = bfd_get_file_size (abfd);
811
6.99k
      if (filesize != 0
812
6.99k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
1.10k
  goto got_wrong_format_error;
814
5.89k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
5.89k
      elf_tdata (abfd)->phdr
817
5.89k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
5.89k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
5.89k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
18
  goto got_no_match;
822
5.87k
      bool eu_strip_broken_phdrs = false;
823
5.87k
      i_phdr = elf_tdata (abfd)->phdr;
824
653k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
647k
  {
826
647k
    Elf_External_Phdr x_phdr;
827
828
647k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
184
      goto got_no_match;
830
647k
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
831
    /* Too much code in BFD relies on alignment being a power of
832
       two, as required by the ELF spec.  */
833
647k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
221k
      {
835
221k
        i_phdr->p_align &= -i_phdr->p_align;
836
221k
        if (!abfd->read_only)
837
5.36k
    {
838
5.36k
      _bfd_error_handler (_("warning: %pB has a program header "
839
5.36k
          "with invalid alignment"), abfd);
840
5.36k
      abfd->read_only = 1;
841
5.36k
    }
842
221k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
647k
    if (i_phdr->p_filesz != 0
846
647k
        && (i_phdr->p_filesz > filesize
847
227k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
223k
      eu_strip_broken_phdrs = true;
849
647k
  }
850
5.69k
      if (!eu_strip_broken_phdrs
851
5.69k
    && i_ehdrp->e_shoff == 0
852
5.69k
    && i_ehdrp->e_shstrndx == 0)
853
2.70k
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
2.70k
    i_phdr = elf_tdata (abfd)->phdr;
857
5.75k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
3.04k
      if (i_phdr->p_type == PT_DYNAMIC)
859
0
        {
860
0
    if (i_phdr->p_filesz != 0
861
0
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
0
                  elf_tdata (abfd)->phdr,
863
0
                  i_ehdrp->e_phnum,
864
0
                  filesize))
865
0
      goto got_no_match;
866
0
    break;
867
0
        }
868
2.70k
  }
869
5.69k
    }
870
871
25.8k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
1.94k
    {
873
1.94k
      unsigned int num_sec;
874
875
      /* Once all of the section headers have been read and converted, we
876
   can start processing them.  Note that the first section header is
877
   a dummy placeholder entry, so we ignore it.  */
878
1.94k
      num_sec = elf_numsections (abfd);
879
18.1k
      for (shindex = 1; shindex < num_sec; shindex++)
880
17.0k
  if (!bfd_section_from_shdr (abfd, shindex))
881
806
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
1.13k
      if (! _bfd_elf_setup_sections (abfd))
885
110
  goto got_wrong_format_error;
886
1.13k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
24.8k
  if (ebd->elf_backend_object_p)
891
14.7k
    {
892
14.7k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
1.39k
  goto got_wrong_format_error;
894
14.7k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
23.5k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
898
899
  /* If we have created any reloc sections that are associated with
900
     debugging sections, mark the reloc sections as debugging as well.  */
901
26.2k
  for (s = abfd->sections; s != NULL; s = s->next)
902
2.78k
    {
903
2.78k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
2.78k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
2.78k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
26
  {
907
26
    unsigned long targ_index;
908
26
    asection *targ_sec;
909
910
26
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
26
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
26
    if (targ_sec != NULL
913
26
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
26
  }
916
2.78k
    }
917
23.5k
  return _bfd_no_cleanup;
918
919
20.4M
 got_wrong_format_error:
920
20.4M
  bfd_set_error (bfd_error_wrong_format);
921
922
20.4M
 got_no_match:
923
20.4M
  return NULL;
924
20.4M
}
bfd_elf64_object_p
Line
Count
Source
519
5.07M
{
520
5.07M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
5.07M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
5.07M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
5.07M
  Elf_Internal_Shdr i_shdr;
524
5.07M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
5.07M
  unsigned int shindex;
526
5.07M
  const struct elf_backend_data *ebd;
527
5.07M
  asection *s;
528
5.07M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
5.07M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
145k
    {
534
145k
      if (bfd_get_error () != bfd_error_system_call)
535
144k
  goto got_wrong_format_error;
536
1.31k
      else
537
1.31k
  goto got_no_match;
538
145k
    }
539
540
  /* Now check to see if we have a valid ELF file, and one that BFD can
541
     make use of.  The magic number must match, the address size ('class')
542
     and byte-swapping must match our XVEC entry, and it must have a
543
     section header table (FIXME: See comments re sections at top of this
544
     file).  */
545
546
4.92M
  if (! elf_file_p (&x_ehdr)
547
4.92M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
4.92M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
4.45M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
470k
  switch (x_ehdr.e_ident[EI_DATA])
553
470k
    {
554
72.3k
    case ELFDATA2MSB:   /* Big-endian */
555
72.3k
      if (! bfd_header_big_endian (abfd))
556
39.3k
  goto got_wrong_format_error;
557
33.0k
      break;
558
397k
    case ELFDATA2LSB:   /* Little-endian */
559
397k
      if (! bfd_header_little_endian (abfd))
560
179k
  goto got_wrong_format_error;
561
218k
      break;
562
218k
    case ELFDATANONE:   /* No data encoding specified */
563
526
    default:      /* Unknown data encoding specified */
564
526
      goto got_wrong_format_error;
565
470k
    }
566
567
251k
  target = abfd->xvec;
568
569
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
570
     the tdata pointer in the bfd.  */
571
572
251k
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
573
0
    goto got_no_match;
574
575
  /* Now that we know the byte order, swap in the rest of the header */
576
251k
  i_ehdrp = elf_elfheader (abfd);
577
251k
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
578
#if DEBUG & 1
579
  elf_debug_file (i_ehdrp);
580
#endif
581
582
  /* Reject ET_CORE (header indicates core file, not object file) */
583
251k
  if (i_ehdrp->e_type == ET_CORE)
584
94
    goto got_wrong_format_error;
585
586
  /* If this is a relocatable file and there is no section header
587
     table, then we're hosed.  */
588
251k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
238
    goto got_wrong_format_error;
590
591
  /* As a simple sanity check, verify that what BFD thinks is the
592
     size of each section header table entry actually matches the size
593
     recorded in the file, but only if there are any sections.  */
594
251k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
296
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
251k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
40
    goto got_wrong_format_error;
600
601
251k
  ebd = get_elf_backend_data (abfd);
602
251k
  if (ebd->s->arch_size != ARCH_SIZE)
603
0
    goto got_wrong_format_error;
604
605
  /* Check that the ELF e_machine field matches what this particular
606
     BFD format expects.  */
607
251k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
251k
      && (ebd->elf_machine_alt1 == 0
609
226k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
251k
      && (ebd->elf_machine_alt2 == 0
611
225k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
251k
      && ebd->elf_machine_code != EM_NONE)
613
215k
    goto got_wrong_format_error;
614
615
35.5k
  if (i_ehdrp->e_type == ET_EXEC)
616
90
    abfd->flags |= EXEC_P;
617
35.4k
  else if (i_ehdrp->e_type == ET_DYN)
618
908
    abfd->flags |= DYNAMIC;
619
620
35.5k
  if (i_ehdrp->e_phnum > 0)
621
6.39k
    abfd->flags |= D_PAGED;
622
623
35.5k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
10.6k
    {
625
      /* It's OK if this fails for the generic target.  */
626
10.6k
      if (ebd->elf_machine_code != EM_NONE)
627
0
  goto got_no_match;
628
10.6k
    }
629
630
35.5k
  if (ebd->elf_machine_code != EM_NONE
631
35.5k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
35.5k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
7.20k
    goto got_wrong_format_error;
634
635
28.3k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
20.4k
    {
637
20.4k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
20.4k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
886
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
19.5k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
1.14k
  goto got_no_match;
647
18.3k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
648
649
      /* If the section count is zero, the actual count is in the first
650
   section header.  */
651
18.3k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
9.37k
  {
653
9.37k
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
9.37k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
9.37k
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
9.37k
        || i_ehdrp->e_shnum  == 0)
657
3.51k
      goto got_wrong_format_error;
658
9.37k
  }
659
660
      /* And similarly for the string table index.  */
661
14.8k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
2.72k
  {
663
2.72k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
2.72k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
2.72k
  }
667
668
      /* And program headers.  */
669
14.8k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
50
  {
671
50
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
50
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
50
  }
675
676
      /* Sanity check that we can read all of the section headers.
677
   It ought to be good enough to just read the last one.  */
678
14.8k
      if (i_ehdrp->e_shnum != 1)
679
5.94k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
5.94k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
5.94k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
880
      goto got_wrong_format_error;
684
685
5.06k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
5.06k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
5.06k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
5.06k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
1.73k
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
3.32k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
3.32k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
3.32k
  }
699
14.8k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
20.1k
  if (i_ehdrp->e_shnum != 0)
704
12.2k
    {
705
12.2k
      Elf_Internal_Shdr *shdrp;
706
12.2k
      unsigned int num_sec;
707
12.2k
      size_t amt;
708
709
12.2k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
12.2k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
12.2k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
12.2k
      num_sec = i_ehdrp->e_shnum;
715
12.2k
      elf_numsections (abfd) = num_sec;
716
12.2k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
12.2k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
12.2k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
12.2k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
12.2k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
12.2k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
48.7k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
36.5k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
34.8k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
23.6k
  {
733
23.6k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
23.6k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
23.6k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
1.17k
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
1.17k
        switch (ebd->elf_machine_code)
743
1.17k
    {
744
0
    case EM_386:
745
0
    case EM_IAMCU:
746
648
    case EM_X86_64:
747
648
    case EM_OLD_SPARCV9:
748
648
    case EM_SPARC32PLUS:
749
810
    case EM_SPARCV9:
750
810
    case EM_SPARC:
751
810
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
810
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
112
        break;
754
      /* Otherwise fall through.  */
755
1.06k
    default:
756
1.06k
      goto got_wrong_format_error;
757
1.17k
    }
758
1.17k
      }
759
760
22.6k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
22.6k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
22.6k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
22.6k
        && i_shdrp[shindex].sh_info >= num_sec)
764
36
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
22.5k
    if (i_shdrp[shindex].sh_size != 0
769
22.5k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
22.5k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
22.5k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
1.41k
       % ebd->minpagesize)
773
1.41k
      != 0))
774
548
      abfd->flags &= ~D_PAGED;
775
22.5k
  }
776
777
11.1k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
11.1k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
9.16k
  {
780
    /* PR 2257:
781
       We used to just goto got_wrong_format_error here
782
       but there are binaries in existance for which this test
783
       will prevent the binutils from working with them at all.
784
       So we are kind, and reset the string index value to 0
785
       so that at least some processing can be done.  */
786
9.16k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
9.16k
    if (!abfd->read_only)
788
4.29k
      {
789
4.29k
        _bfd_error_handler
790
4.29k
    (_("warning: %pB has a corrupt string table index"), abfd);
791
4.29k
        abfd->read_only = 1;
792
4.29k
      }
793
9.16k
  }
794
11.1k
    }
795
7.93k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
224
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
18.8k
  if (i_ehdrp->e_phnum == 0)
800
14.7k
    elf_tdata (abfd)->phdr = NULL;
801
4.12k
  else
802
4.12k
    {
803
4.12k
      Elf_Internal_Phdr *i_phdr;
804
4.12k
      unsigned int i;
805
4.12k
      ufile_ptr filesize;
806
4.12k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
4.12k
      filesize = bfd_get_file_size (abfd);
811
4.12k
      if (filesize != 0
812
4.12k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
964
  goto got_wrong_format_error;
814
3.15k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
3.15k
      elf_tdata (abfd)->phdr
817
3.15k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
3.15k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
3.15k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
18
  goto got_no_match;
822
3.14k
      bool eu_strip_broken_phdrs = false;
823
3.14k
      i_phdr = elf_tdata (abfd)->phdr;
824
13.1k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
10.1k
  {
826
10.1k
    Elf_External_Phdr x_phdr;
827
828
10.1k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
98
      goto got_no_match;
830
10.0k
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
831
    /* Too much code in BFD relies on alignment being a power of
832
       two, as required by the ELF spec.  */
833
10.0k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
6.21k
      {
835
6.21k
        i_phdr->p_align &= -i_phdr->p_align;
836
6.21k
        if (!abfd->read_only)
837
2.83k
    {
838
2.83k
      _bfd_error_handler (_("warning: %pB has a program header "
839
2.83k
          "with invalid alignment"), abfd);
840
2.83k
      abfd->read_only = 1;
841
2.83k
    }
842
6.21k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
10.0k
    if (i_phdr->p_filesz != 0
846
10.0k
        && (i_phdr->p_filesz > filesize
847
3.80k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
3.63k
      eu_strip_broken_phdrs = true;
849
10.0k
  }
850
3.04k
      if (!eu_strip_broken_phdrs
851
3.04k
    && i_ehdrp->e_shoff == 0
852
3.04k
    && i_ehdrp->e_shstrndx == 0)
853
2.68k
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
2.68k
    i_phdr = elf_tdata (abfd)->phdr;
857
5.61k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
2.93k
      if (i_phdr->p_type == PT_DYNAMIC)
859
0
        {
860
0
    if (i_phdr->p_filesz != 0
861
0
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
0
                  elf_tdata (abfd)->phdr,
863
0
                  i_ehdrp->e_phnum,
864
0
                  filesize))
865
0
      goto got_no_match;
866
0
    break;
867
0
        }
868
2.68k
  }
869
3.04k
    }
870
871
17.7k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
1.94k
    {
873
1.94k
      unsigned int num_sec;
874
875
      /* Once all of the section headers have been read and converted, we
876
   can start processing them.  Note that the first section header is
877
   a dummy placeholder entry, so we ignore it.  */
878
1.94k
      num_sec = elf_numsections (abfd);
879
18.1k
      for (shindex = 1; shindex < num_sec; shindex++)
880
17.0k
  if (!bfd_section_from_shdr (abfd, shindex))
881
806
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
1.13k
      if (! _bfd_elf_setup_sections (abfd))
885
110
  goto got_wrong_format_error;
886
1.13k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
16.8k
  if (ebd->elf_backend_object_p)
891
9.15k
    {
892
9.15k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
4
  goto got_wrong_format_error;
894
9.15k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
16.8k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
898
899
  /* If we have created any reloc sections that are associated with
900
     debugging sections, mark the reloc sections as debugging as well.  */
901
19.6k
  for (s = abfd->sections; s != NULL; s = s->next)
902
2.78k
    {
903
2.78k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
2.78k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
2.78k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
26
  {
907
26
    unsigned long targ_index;
908
26
    asection *targ_sec;
909
910
26
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
26
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
26
    if (targ_sec != NULL
913
26
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
26
  }
916
2.78k
    }
917
16.8k
  return _bfd_no_cleanup;
918
919
5.04M
 got_wrong_format_error:
920
5.04M
  bfd_set_error (bfd_error_wrong_format);
921
922
5.05M
 got_no_match:
923
5.05M
  return NULL;
924
5.04M
}
bfd_elf32_object_p
Line
Count
Source
519
15.4M
{
520
15.4M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
15.4M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
15.4M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
15.4M
  Elf_Internal_Shdr i_shdr;
524
15.4M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
15.4M
  unsigned int shindex;
526
15.4M
  const struct elf_backend_data *ebd;
527
15.4M
  asection *s;
528
15.4M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
15.4M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
369k
    {
534
369k
      if (bfd_get_error () != bfd_error_system_call)
535
365k
  goto got_wrong_format_error;
536
4.02k
      else
537
4.02k
  goto got_no_match;
538
369k
    }
539
540
  /* Now check to see if we have a valid ELF file, and one that BFD can
541
     make use of.  The magic number must match, the address size ('class')
542
     and byte-swapping must match our XVEC entry, and it must have a
543
     section header table (FIXME: See comments re sections at top of this
544
     file).  */
545
546
15.0M
  if (! elf_file_p (&x_ehdr)
547
15.0M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
15.0M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
14.7M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
359k
  switch (x_ehdr.e_ident[EI_DATA])
553
359k
    {
554
57.4k
    case ELFDATA2MSB:   /* Big-endian */
555
57.4k
      if (! bfd_header_big_endian (abfd))
556
28.6k
  goto got_wrong_format_error;
557
28.7k
      break;
558
300k
    case ELFDATA2LSB:   /* Little-endian */
559
300k
      if (! bfd_header_little_endian (abfd))
560
149k
  goto got_wrong_format_error;
561
150k
      break;
562
150k
    case ELFDATANONE:   /* No data encoding specified */
563
1.60k
    default:      /* Unknown data encoding specified */
564
1.60k
      goto got_wrong_format_error;
565
359k
    }
566
567
179k
  target = abfd->xvec;
568
569
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
570
     the tdata pointer in the bfd.  */
571
572
179k
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
573
0
    goto got_no_match;
574
575
  /* Now that we know the byte order, swap in the rest of the header */
576
179k
  i_ehdrp = elf_elfheader (abfd);
577
179k
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
578
#if DEBUG & 1
579
  elf_debug_file (i_ehdrp);
580
#endif
581
582
  /* Reject ET_CORE (header indicates core file, not object file) */
583
179k
  if (i_ehdrp->e_type == ET_CORE)
584
402
    goto got_wrong_format_error;
585
586
  /* If this is a relocatable file and there is no section header
587
     table, then we're hosed.  */
588
179k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
134
    goto got_wrong_format_error;
590
591
  /* As a simple sanity check, verify that what BFD thinks is the
592
     size of each section header table entry actually matches the size
593
     recorded in the file, but only if there are any sections.  */
594
179k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
402
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
178k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
134
    goto got_wrong_format_error;
600
601
178k
  ebd = get_elf_backend_data (abfd);
602
178k
  if (ebd->s->arch_size != ARCH_SIZE)
603
0
    goto got_wrong_format_error;
604
605
  /* Check that the ELF e_machine field matches what this particular
606
     BFD format expects.  */
607
178k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
178k
      && (ebd->elf_machine_alt1 == 0
609
170k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
178k
      && (ebd->elf_machine_alt2 == 0
611
170k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
178k
      && ebd->elf_machine_code != EM_NONE)
613
167k
    goto got_wrong_format_error;
614
615
10.9k
  if (i_ehdrp->e_type == ET_EXEC)
616
86
    abfd->flags |= EXEC_P;
617
10.8k
  else if (i_ehdrp->e_type == ET_DYN)
618
52
    abfd->flags |= DYNAMIC;
619
620
10.9k
  if (i_ehdrp->e_phnum > 0)
621
4.51k
    abfd->flags |= D_PAGED;
622
623
10.9k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
3.20k
    {
625
      /* It's OK if this fails for the generic target.  */
626
3.20k
      if (ebd->elf_machine_code != EM_NONE)
627
538
  goto got_no_match;
628
3.20k
    }
629
630
10.3k
  if (ebd->elf_machine_code != EM_NONE
631
10.3k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
10.3k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
1.47k
    goto got_wrong_format_error;
634
635
8.89k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
1.74k
    {
637
1.74k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
1.74k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
0
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
1.74k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
66
  goto got_no_match;
647
1.68k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
648
649
      /* If the section count is zero, the actual count is in the first
650
   section header.  */
651
1.68k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
1.67k
  {
653
1.67k
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
1.67k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
1.67k
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
1.67k
        || i_ehdrp->e_shnum  == 0)
657
60
      goto got_wrong_format_error;
658
1.67k
  }
659
660
      /* And similarly for the string table index.  */
661
1.62k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
108
  {
663
108
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
108
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
108
  }
667
668
      /* And program headers.  */
669
1.62k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
162
  {
671
162
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
162
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
162
  }
675
676
      /* Sanity check that we can read all of the section headers.
677
   It ought to be good enough to just read the last one.  */
678
1.62k
      if (i_ehdrp->e_shnum != 1)
679
682
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
682
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
682
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
146
      goto got_wrong_format_error;
684
685
536
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
536
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
536
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
536
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
144
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
392
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
392
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
392
  }
699
1.62k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
8.48k
  if (i_ehdrp->e_shnum != 0)
704
1.33k
    {
705
1.33k
      Elf_Internal_Shdr *shdrp;
706
1.33k
      unsigned int num_sec;
707
1.33k
      size_t amt;
708
709
1.33k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
1.33k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
1.33k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
1.33k
      num_sec = i_ehdrp->e_shnum;
715
1.33k
      elf_numsections (abfd) = num_sec;
716
1.33k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
1.33k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
1.33k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
1.33k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
1.33k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
1.33k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
5.47k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
4.14k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
3.28k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
2.15k
  {
733
2.15k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
2.15k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
2.15k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
206
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
206
        switch (ebd->elf_machine_code)
743
206
    {
744
44
    case EM_386:
745
46
    case EM_IAMCU:
746
60
    case EM_X86_64:
747
60
    case EM_OLD_SPARCV9:
748
60
    case EM_SPARC32PLUS:
749
60
    case EM_SPARCV9:
750
90
    case EM_SPARC:
751
90
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
90
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
24
        break;
754
      /* Otherwise fall through.  */
755
182
    default:
756
182
      goto got_wrong_format_error;
757
206
    }
758
206
      }
759
760
1.97k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
1.97k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
1.97k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
1.97k
        && i_shdrp[shindex].sh_info >= num_sec)
764
22
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
1.95k
    if (i_shdrp[shindex].sh_size != 0
769
1.95k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
1.95k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
1.95k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
204
       % ebd->minpagesize)
773
204
      != 0))
774
140
      abfd->flags &= ~D_PAGED;
775
1.95k
  }
776
777
1.12k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
1.12k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
1.08k
  {
780
    /* PR 2257:
781
       We used to just goto got_wrong_format_error here
782
       but there are binaries in existance for which this test
783
       will prevent the binutils from working with them at all.
784
       So we are kind, and reset the string index value to 0
785
       so that at least some processing can be done.  */
786
1.08k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
1.08k
    if (!abfd->read_only)
788
906
      {
789
906
        _bfd_error_handler
790
906
    (_("warning: %pB has a corrupt string table index"), abfd);
791
906
        abfd->read_only = 1;
792
906
      }
793
1.08k
  }
794
1.12k
    }
795
7.14k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
30
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
8.24k
  if (i_ehdrp->e_phnum == 0)
800
5.37k
    elf_tdata (abfd)->phdr = NULL;
801
2.87k
  else
802
2.87k
    {
803
2.87k
      Elf_Internal_Phdr *i_phdr;
804
2.87k
      unsigned int i;
805
2.87k
      ufile_ptr filesize;
806
2.87k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
2.87k
      filesize = bfd_get_file_size (abfd);
811
2.87k
      if (filesize != 0
812
2.87k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
138
  goto got_wrong_format_error;
814
2.73k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
2.73k
      elf_tdata (abfd)->phdr
817
2.73k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
2.73k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
2.73k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
0
  goto got_no_match;
822
2.73k
      bool eu_strip_broken_phdrs = false;
823
2.73k
      i_phdr = elf_tdata (abfd)->phdr;
824
640k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
637k
  {
826
637k
    Elf_External_Phdr x_phdr;
827
828
637k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
86
      goto got_no_match;
830
637k
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
831
    /* Too much code in BFD relies on alignment being a power of
832
       two, as required by the ELF spec.  */
833
637k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
215k
      {
835
215k
        i_phdr->p_align &= -i_phdr->p_align;
836
215k
        if (!abfd->read_only)
837
2.53k
    {
838
2.53k
      _bfd_error_handler (_("warning: %pB has a program header "
839
2.53k
          "with invalid alignment"), abfd);
840
2.53k
      abfd->read_only = 1;
841
2.53k
    }
842
215k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
637k
    if (i_phdr->p_filesz != 0
846
637k
        && (i_phdr->p_filesz > filesize
847
223k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
219k
      eu_strip_broken_phdrs = true;
849
637k
  }
850
2.64k
      if (!eu_strip_broken_phdrs
851
2.64k
    && i_ehdrp->e_shoff == 0
852
2.64k
    && i_ehdrp->e_shstrndx == 0)
853
24
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
24
    i_phdr = elf_tdata (abfd)->phdr;
857
138
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
114
      if (i_phdr->p_type == PT_DYNAMIC)
859
0
        {
860
0
    if (i_phdr->p_filesz != 0
861
0
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
0
                  elf_tdata (abfd)->phdr,
863
0
                  i_ehdrp->e_phnum,
864
0
                  filesize))
865
0
      goto got_no_match;
866
0
    break;
867
0
        }
868
24
  }
869
2.64k
    }
870
871
8.02k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
0
    {
873
0
      unsigned int num_sec;
874
875
      /* Once all of the section headers have been read and converted, we
876
   can start processing them.  Note that the first section header is
877
   a dummy placeholder entry, so we ignore it.  */
878
0
      num_sec = elf_numsections (abfd);
879
0
      for (shindex = 1; shindex < num_sec; shindex++)
880
0
  if (!bfd_section_from_shdr (abfd, shindex))
881
0
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
0
      if (! _bfd_elf_setup_sections (abfd))
885
0
  goto got_wrong_format_error;
886
0
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
8.02k
  if (ebd->elf_backend_object_p)
891
5.60k
    {
892
5.60k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
1.38k
  goto got_wrong_format_error;
894
5.60k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
6.63k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
898
899
  /* If we have created any reloc sections that are associated with
900
     debugging sections, mark the reloc sections as debugging as well.  */
901
6.63k
  for (s = abfd->sections; s != NULL; s = s->next)
902
0
    {
903
0
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
0
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
0
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
0
  {
907
0
    unsigned long targ_index;
908
0
    asection *targ_sec;
909
910
0
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
0
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
0
    if (targ_sec != NULL
913
0
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
0
  }
916
0
    }
917
6.63k
  return _bfd_no_cleanup;
918
919
15.4M
 got_wrong_format_error:
920
15.4M
  bfd_set_error (bfd_error_wrong_format);
921
922
15.4M
 got_no_match:
923
15.4M
  return NULL;
924
15.4M
}
925

926
/* ELF .o/exec file writing */
927
928
/* Write out the relocs.  */
929
930
void
931
elf_write_relocs (bfd *abfd, asection *sec, void *data)
932
0
{
933
0
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
934
0
  bool *failedp = (bool *) data;
935
0
  Elf_Internal_Shdr *rela_hdr;
936
0
  bfd_vma addr_offset;
937
0
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
938
0
  size_t extsize;
939
0
  bfd_byte *dst_rela;
940
0
  unsigned int idx;
941
0
  asymbol *last_sym;
942
0
  int last_sym_idx;
943
0
  size_t amt;
944
945
  /* If we have already failed, don't do anything.  */
946
0
  if (*failedp)
947
0
    return;
948
949
0
  if ((sec->flags & SEC_RELOC) == 0)
950
0
    return;
951
952
  /* The linker backend writes the relocs out itself, and sets the
953
     reloc_count field to zero to inhibit writing them here.  Also,
954
     sometimes the SEC_RELOC flag gets set even when there aren't any
955
     relocs.  */
956
0
  if (sec->reloc_count == 0)
957
0
    return;
958
959
  /* If we have opened an existing file for update, reloc_count may be
960
     set even though we are not linking.  In that case we have nothing
961
     to do.  */
962
0
  if (sec->orelocation == NULL)
963
0
    return;
964
965
0
  rela_hdr = elf_section_data (sec)->rela.hdr;
966
0
  if (rela_hdr == NULL)
967
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
968
969
0
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
970
0
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
971
0
      || (rela_hdr->contents = bfd_alloc (abfd, amt)) == NULL)
972
0
    {
973
0
      bfd_set_error (bfd_error_no_memory);
974
0
      *failedp = true;
975
0
      return;
976
0
    }
977
978
  /* Figure out whether the relocations are RELA or REL relocations.  */
979
0
  if (rela_hdr->sh_type == SHT_RELA)
980
0
    {
981
0
      swap_out = elf_swap_reloca_out;
982
0
      extsize = sizeof (Elf_External_Rela);
983
0
    }
984
0
  else if (rela_hdr->sh_type == SHT_REL)
985
0
    {
986
0
      swap_out = elf_swap_reloc_out;
987
0
      extsize = sizeof (Elf_External_Rel);
988
0
    }
989
0
  else
990
    /* Every relocation section should be either an SHT_RELA or an
991
       SHT_REL section.  */
992
0
    abort ();
993
994
  /* The address of an ELF reloc is section relative for an object
995
     file, and absolute for an executable file or shared library.
996
     The address of a BFD reloc is always section relative.  */
997
0
  addr_offset = 0;
998
0
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
999
0
    addr_offset = sec->vma;
1000
1001
  /* orelocation has the data, reloc_count has the count...  */
1002
0
  last_sym = 0;
1003
0
  last_sym_idx = 0;
1004
0
  dst_rela = rela_hdr->contents;
1005
1006
0
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1007
0
    {
1008
0
      Elf_Internal_Rela src_rela;
1009
0
      arelent *ptr;
1010
0
      asymbol *sym;
1011
0
      int n;
1012
1013
0
      ptr = sec->orelocation[idx];
1014
0
      sym = *ptr->sym_ptr_ptr;
1015
0
      if (sym == last_sym)
1016
0
  n = last_sym_idx;
1017
0
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
1018
0
  n = STN_UNDEF;
1019
0
      else
1020
0
  {
1021
0
    last_sym = sym;
1022
0
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1023
0
    if (n < 0)
1024
0
      {
1025
0
        *failedp = true;
1026
0
        return;
1027
0
      }
1028
0
    last_sym_idx = n;
1029
0
  }
1030
1031
0
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1032
0
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
1033
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
1034
0
  {
1035
0
    *failedp = true;
1036
0
    return;
1037
0
  }
1038
1039
0
      if (ptr->howto == NULL)
1040
0
  {
1041
0
    *failedp = true;
1042
0
    return;
1043
0
  }
1044
1045
#if defined(BFD64) && ARCH_SIZE == 32
1046
0
      if (rela_hdr->sh_type == SHT_RELA
1047
0
    && ptr->howto->bitsize > 32
1048
0
    && ptr->addend - INT32_MIN > UINT32_MAX)
1049
0
  {
1050
0
    _bfd_error_handler (_("%pB: %pA+%" PRIx64 ": "
1051
0
        "relocation addend %" PRIx64 " too large"),
1052
0
            abfd, sec, (uint64_t) ptr->address,
1053
0
            (uint64_t) ptr->addend);
1054
0
    *failedp = true;
1055
0
    bfd_set_error (bfd_error_bad_value);
1056
0
  }
1057
#endif
1058
1059
0
      src_rela.r_offset = ptr->address + addr_offset;
1060
0
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1061
0
      src_rela.r_addend = ptr->addend;
1062
0
      (*swap_out) (abfd, &src_rela, dst_rela);
1063
0
    }
1064
1065
0
  if (elf_section_data (sec)->has_secondary_relocs
1066
0
      && !bed->write_secondary_relocs (abfd, sec))
1067
0
    {
1068
0
      *failedp = true;
1069
0
      return;
1070
0
    }
1071
0
}
Unexecuted instantiation: bfd_elf64_write_relocs
Unexecuted instantiation: bfd_elf32_write_relocs
1072
1073
/* Write out the program headers.  */
1074
1075
int
1076
elf_write_out_phdrs (bfd *abfd,
1077
         const Elf_Internal_Phdr *phdr,
1078
         unsigned int count)
1079
0
{
1080
0
  while (count--)
1081
0
    {
1082
0
      Elf_External_Phdr extphdr;
1083
1084
0
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1085
0
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1086
0
    != sizeof (Elf_External_Phdr))
1087
0
  return -1;
1088
0
      phdr++;
1089
0
    }
1090
0
  return 0;
1091
0
}
Unexecuted instantiation: bfd_elf64_write_out_phdrs
Unexecuted instantiation: bfd_elf32_write_out_phdrs
1092
1093
/* Write out the section headers and the ELF file header.  */
1094
1095
bool
1096
elf_write_shdrs_and_ehdr (bfd *abfd)
1097
0
{
1098
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1099
0
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1100
0
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1101
0
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1102
0
  unsigned int count;
1103
0
  size_t amt;
1104
1105
0
  i_ehdrp = elf_elfheader (abfd);
1106
0
  i_shdrp = elf_elfsections (abfd);
1107
1108
  /* swap the header before spitting it out...  */
1109
1110
#if DEBUG & 1
1111
  elf_debug_file (i_ehdrp);
1112
#endif
1113
0
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1114
0
  amt = sizeof (x_ehdr);
1115
0
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1116
0
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1117
0
    return false;
1118
1119
0
  if ((abfd->flags & BFD_NO_SECTION_HEADER) != 0)
1120
0
    return true;
1121
1122
  /* Some fields in the first section header handle overflow of ehdr
1123
     fields.  */
1124
0
  if (i_ehdrp->e_phnum >= PN_XNUM)
1125
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1126
0
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1127
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1128
0
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1129
0
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1130
1131
  /* at this point we've concocted all the ELF sections...  */
1132
0
  if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*x_shdrp), &amt))
1133
0
    {
1134
0
      bfd_set_error (bfd_error_no_memory);
1135
0
      return false;
1136
0
    }
1137
0
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1138
0
  if (!x_shdrp)
1139
0
    return false;
1140
1141
0
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1142
0
    {
1143
#if DEBUG & 2
1144
      elf_debug_section (count, *i_shdrp);
1145
#endif
1146
0
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1147
0
    }
1148
0
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1149
0
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1150
0
      || bfd_write (x_shdrp, amt, abfd) != amt)
1151
0
    return false;
1152
1153
  /* need to dump the string table too...  */
1154
1155
0
  return true;
1156
0
}
Unexecuted instantiation: bfd_elf64_write_shdrs_and_ehdr
Unexecuted instantiation: bfd_elf32_write_shdrs_and_ehdr
1157
1158
bool
1159
elf_checksum_contents (bfd *abfd,
1160
           void (*process) (const void *, size_t, void *),
1161
           void *arg)
1162
0
{
1163
0
  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1164
0
  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1165
0
  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1166
0
  unsigned int count, num;
1167
1168
0
  {
1169
0
    Elf_External_Ehdr x_ehdr;
1170
0
    Elf_Internal_Ehdr i_ehdr;
1171
1172
0
    i_ehdr = *i_ehdrp;
1173
0
    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1174
0
    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1175
0
    (*process) (&x_ehdr, sizeof x_ehdr, arg);
1176
0
  }
1177
1178
0
  num = i_ehdrp->e_phnum;
1179
0
  for (count = 0; count < num; count++)
1180
0
    {
1181
0
      Elf_External_Phdr x_phdr;
1182
0
      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1183
0
      (*process) (&x_phdr, sizeof x_phdr, arg);
1184
0
    }
1185
1186
0
  num = elf_numsections (abfd);
1187
0
  for (count = 0; count < num; count++)
1188
0
    {
1189
0
      Elf_Internal_Shdr i_shdr;
1190
0
      Elf_External_Shdr x_shdr;
1191
0
      bfd_byte *contents, *free_contents;
1192
1193
0
      i_shdr = *i_shdrp[count];
1194
0
      i_shdr.sh_offset = 0;
1195
1196
0
      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1197
0
      (*process) (&x_shdr, sizeof x_shdr, arg);
1198
1199
      /* Process the section's contents, if it has some.
1200
   PR ld/12451: Read them in if necessary.  */
1201
0
      if (i_shdr.sh_type == SHT_NOBITS)
1202
0
  continue;
1203
0
      free_contents = NULL;
1204
0
      contents = i_shdr.contents;
1205
0
      if (contents == NULL)
1206
0
  {
1207
0
    asection *sec;
1208
1209
0
    sec = bfd_section_from_elf_index (abfd, count);
1210
0
    if (sec != NULL)
1211
0
      {
1212
0
        contents = sec->contents;
1213
0
        if (contents == NULL)
1214
0
    {
1215
      /* Force rereading from file.  */
1216
0
      sec->flags &= ~SEC_IN_MEMORY;
1217
0
      if (!bfd_malloc_and_get_section (abfd, sec, &free_contents))
1218
0
        continue;
1219
0
      contents = free_contents;
1220
0
    }
1221
0
      }
1222
0
  }
1223
0
      if (contents != NULL)
1224
0
  {
1225
0
    (*process) (contents, i_shdr.sh_size, arg);
1226
0
    free (free_contents);
1227
0
  }
1228
0
    }
1229
1230
0
  return true;
1231
0
}
Unexecuted instantiation: bfd_elf64_checksum_contents
Unexecuted instantiation: bfd_elf32_checksum_contents
1232
1233
long
1234
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic)
1235
93
{
1236
93
  Elf_Internal_Shdr *hdr;
1237
93
  Elf_Internal_Shdr *verhdr;
1238
93
  unsigned long symcount; /* Number of external ELF symbols */
1239
93
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
93
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
93
  Elf_Internal_Sym *isym;
1242
93
  Elf_Internal_Sym *isymend;
1243
93
  Elf_Internal_Sym *isymbuf = NULL;
1244
93
  Elf_External_Versym *xver;
1245
93
  Elf_External_Versym *xverbuf = NULL;
1246
93
  const struct elf_backend_data *ebd;
1247
93
  size_t amt;
1248
1249
  /* Read each raw ELF symbol, converting from external ELF form to
1250
     internal ELF form, and then using the information to create a
1251
     canonical bfd symbol table entry.
1252
1253
     Note that we allocate the initial bfd canonical symbol buffer
1254
     based on a one-to-one mapping of the ELF symbols to canonical
1255
     symbols.  We actually use all the ELF symbols, so there will be no
1256
     space left over at the end.  When we have all the symbols, we
1257
     build the caller's pointer vector.  */
1258
1259
93
  if (! dynamic)
1260
93
    {
1261
93
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
93
      verhdr = NULL;
1263
93
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
93
  ebd = get_elf_backend_data (abfd);
1284
93
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
93
  if (symcount == 0)
1286
93
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
93
  if (symcount == 0)
1288
2
    sym = symbase = NULL;
1289
91
  else
1290
91
    {
1291
91
      size_t i;
1292
1293
91
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
91
              NULL, NULL, NULL);
1295
91
      if (isymbuf == NULL)
1296
0
  return -1;
1297
1298
91
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1299
0
  {
1300
0
    bfd_set_error (bfd_error_file_too_big);
1301
0
    goto error_return;
1302
0
  }
1303
91
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
91
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
91
      if (verhdr != NULL
1309
91
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
0
  {
1311
0
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
0
      (_("%pB: version count (%" PRId64 ")"
1314
0
         " does not match symbol count (%ld)"),
1315
0
       abfd,
1316
0
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
0
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
0
    verhdr = NULL;
1322
0
  }
1323
1324
91
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
91
      xver = xverbuf;
1336
91
      if (xver != NULL)
1337
0
  ++xver;
1338
91
      isymend = isymbuf + symcount;
1339
91
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
17.1k
     isym < isymend;
1341
17.0k
     isym++, sym++, i++)
1342
17.0k
  {
1343
17.0k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
17.0k
    sym->symbol.the_bfd = abfd;
1346
17.0k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
17.0k
    else
1350
17.0k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
17.0k
    sym->symbol.value = isym->st_value;
1352
1353
17.0k
    if (isym->st_shndx == SHN_UNDEF)
1354
6.55k
      {
1355
6.55k
        sym->symbol.section = bfd_und_section_ptr;
1356
6.55k
      }
1357
10.5k
    else if (isym->st_shndx == SHN_ABS)
1358
8
      {
1359
8
        sym->symbol.section = bfd_abs_section_ptr;
1360
8
      }
1361
10.5k
    else if (isym->st_shndx == SHN_COMMON)
1362
7
      {
1363
7
        sym->symbol.section = bfd_com_section_ptr;
1364
7
        if ((abfd->flags & BFD_PLUGIN) != 0)
1365
0
    {
1366
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1367
1368
0
      if (xc == NULL)
1369
0
        {
1370
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1371
0
          | SEC_EXCLUDE);
1372
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1373
0
          if (xc == NULL)
1374
0
      goto error_return;
1375
0
        }
1376
0
      sym->symbol.section = xc;
1377
0
    }
1378
        /* Elf puts the alignment into the `value' field, and
1379
     the size into the `size' field.  BFD wants to see the
1380
     size in the value field, and doesn't care (at the
1381
     moment) about the alignment.  */
1382
7
        sym->symbol.value = isym->st_size;
1383
7
      }
1384
10.5k
    else if (elf_use_dt_symtab_p (abfd))
1385
0
      {
1386
0
        asection *sec;
1387
0
        sec = _bfd_elf_get_section_from_dynamic_symbol (abfd,
1388
0
                    isym);
1389
0
        if (sec == NULL)
1390
0
    goto error_return;
1391
0
        sym->symbol.section = sec;
1392
0
      }
1393
10.5k
    else
1394
10.5k
      {
1395
10.5k
        sym->symbol.section
1396
10.5k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
10.5k
        if (sym->symbol.section == NULL)
1398
10.5k
    {
1399
      /* This symbol is in a section for which we did not
1400
         create a BFD section.  Just use bfd_abs_section,
1401
         although it is wrong.  FIXME.  Note - there is
1402
         code in elf.c:swap_out_syms that calls
1403
         symbol_section_index() in the elf backend for
1404
         cases like this.  */
1405
10.5k
      sym->symbol.section = bfd_abs_section_ptr;
1406
10.5k
    }
1407
10.5k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
17.0k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
118
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
17.0k
    switch (ELF_ST_BIND (isym->st_info))
1415
17.0k
      {
1416
7.71k
      case STB_LOCAL:
1417
7.71k
        sym->symbol.flags |= BSF_LOCAL;
1418
7.71k
        break;
1419
417
      case STB_GLOBAL:
1420
417
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
386
    sym->symbol.flags |= BSF_GLOBAL;
1422
417
        break;
1423
786
      case STB_WEAK:
1424
786
        sym->symbol.flags |= BSF_WEAK;
1425
786
        break;
1426
1.66k
      case STB_GNU_UNIQUE:
1427
1.66k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
1.66k
        break;
1429
17.0k
      }
1430
1431
17.0k
    switch (ELF_ST_TYPE (isym->st_info))
1432
17.0k
      {
1433
494
      case STT_SECTION:
1434
        /* Mark the input section symbol as used since it may be
1435
           used for relocation and section group.
1436
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1437
     be cleared by objcopy for non-relocatable inputs.  */
1438
494
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
494
            | BSF_DEBUGGING
1440
494
            | BSF_SECTION_SYM_USED);
1441
494
        break;
1442
621
      case STT_FILE:
1443
621
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
621
        break;
1445
830
      case STT_FUNC:
1446
830
        sym->symbol.flags |= BSF_FUNCTION;
1447
830
        break;
1448
525
      case STT_COMMON:
1449
        /* FIXME: Do we have to put the size field into the value field
1450
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1451
525
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
1.25k
      case STT_OBJECT:
1454
1.25k
        sym->symbol.flags |= BSF_OBJECT;
1455
1.25k
        break;
1456
773
      case STT_TLS:
1457
773
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
773
        break;
1459
1.11k
      case STT_RELC:
1460
1.11k
        sym->symbol.flags |= BSF_RELC;
1461
1.11k
        break;
1462
445
      case STT_SRELC:
1463
445
        sym->symbol.flags |= BSF_SRELC;
1464
445
        break;
1465
1.71k
      case STT_GNU_IFUNC:
1466
1.71k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
1.71k
        break;
1468
17.0k
      }
1469
1470
17.0k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
17.0k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
17.0k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
17.0k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
17.0k
    if (ebd->elf_backend_symbol_processing)
1487
261
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
17.0k
  }
1489
91
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
93
  if (ebd->elf_backend_symbol_table_processing)
1493
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1494
1495
  /* We rely on the zalloc to clear out the final symbol entry.  */
1496
1497
93
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
93
  if (symptrs)
1501
93
    {
1502
93
      long l = symcount;
1503
1504
93
      sym = symbase;
1505
17.1k
      while (l-- > 0)
1506
17.0k
  {
1507
17.0k
    *symptrs++ = &sym->symbol;
1508
17.0k
    sym++;
1509
17.0k
  }
1510
93
      *symptrs = 0;   /* Final null pointer */
1511
93
    }
1512
1513
93
  free (xverbuf);
1514
93
  if (hdr->contents != (unsigned char *) isymbuf
1515
93
      && !elf_use_dt_symtab_p (abfd))
1516
91
    free (isymbuf);
1517
93
  return symcount;
1518
1519
0
 error_return:
1520
0
  free (xverbuf);
1521
0
  if (hdr->contents != (unsigned char *) isymbuf
1522
0
      && !elf_use_dt_symtab_p (abfd))
1523
0
    free (isymbuf);
1524
0
  return -1;
1525
93
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1235
93
{
1236
93
  Elf_Internal_Shdr *hdr;
1237
93
  Elf_Internal_Shdr *verhdr;
1238
93
  unsigned long symcount; /* Number of external ELF symbols */
1239
93
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
93
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
93
  Elf_Internal_Sym *isym;
1242
93
  Elf_Internal_Sym *isymend;
1243
93
  Elf_Internal_Sym *isymbuf = NULL;
1244
93
  Elf_External_Versym *xver;
1245
93
  Elf_External_Versym *xverbuf = NULL;
1246
93
  const struct elf_backend_data *ebd;
1247
93
  size_t amt;
1248
1249
  /* Read each raw ELF symbol, converting from external ELF form to
1250
     internal ELF form, and then using the information to create a
1251
     canonical bfd symbol table entry.
1252
1253
     Note that we allocate the initial bfd canonical symbol buffer
1254
     based on a one-to-one mapping of the ELF symbols to canonical
1255
     symbols.  We actually use all the ELF symbols, so there will be no
1256
     space left over at the end.  When we have all the symbols, we
1257
     build the caller's pointer vector.  */
1258
1259
93
  if (! dynamic)
1260
93
    {
1261
93
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
93
      verhdr = NULL;
1263
93
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
93
  ebd = get_elf_backend_data (abfd);
1284
93
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
93
  if (symcount == 0)
1286
93
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
93
  if (symcount == 0)
1288
2
    sym = symbase = NULL;
1289
91
  else
1290
91
    {
1291
91
      size_t i;
1292
1293
91
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
91
              NULL, NULL, NULL);
1295
91
      if (isymbuf == NULL)
1296
0
  return -1;
1297
1298
91
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1299
0
  {
1300
0
    bfd_set_error (bfd_error_file_too_big);
1301
0
    goto error_return;
1302
0
  }
1303
91
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
91
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
91
      if (verhdr != NULL
1309
91
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
0
  {
1311
0
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
0
      (_("%pB: version count (%" PRId64 ")"
1314
0
         " does not match symbol count (%ld)"),
1315
0
       abfd,
1316
0
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
0
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
0
    verhdr = NULL;
1322
0
  }
1323
1324
91
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
91
      xver = xverbuf;
1336
91
      if (xver != NULL)
1337
0
  ++xver;
1338
91
      isymend = isymbuf + symcount;
1339
91
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
17.1k
     isym < isymend;
1341
17.0k
     isym++, sym++, i++)
1342
17.0k
  {
1343
17.0k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
17.0k
    sym->symbol.the_bfd = abfd;
1346
17.0k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
17.0k
    else
1350
17.0k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
17.0k
    sym->symbol.value = isym->st_value;
1352
1353
17.0k
    if (isym->st_shndx == SHN_UNDEF)
1354
6.55k
      {
1355
6.55k
        sym->symbol.section = bfd_und_section_ptr;
1356
6.55k
      }
1357
10.5k
    else if (isym->st_shndx == SHN_ABS)
1358
8
      {
1359
8
        sym->symbol.section = bfd_abs_section_ptr;
1360
8
      }
1361
10.5k
    else if (isym->st_shndx == SHN_COMMON)
1362
7
      {
1363
7
        sym->symbol.section = bfd_com_section_ptr;
1364
7
        if ((abfd->flags & BFD_PLUGIN) != 0)
1365
0
    {
1366
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1367
1368
0
      if (xc == NULL)
1369
0
        {
1370
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1371
0
          | SEC_EXCLUDE);
1372
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1373
0
          if (xc == NULL)
1374
0
      goto error_return;
1375
0
        }
1376
0
      sym->symbol.section = xc;
1377
0
    }
1378
        /* Elf puts the alignment into the `value' field, and
1379
     the size into the `size' field.  BFD wants to see the
1380
     size in the value field, and doesn't care (at the
1381
     moment) about the alignment.  */
1382
7
        sym->symbol.value = isym->st_size;
1383
7
      }
1384
10.5k
    else if (elf_use_dt_symtab_p (abfd))
1385
0
      {
1386
0
        asection *sec;
1387
0
        sec = _bfd_elf_get_section_from_dynamic_symbol (abfd,
1388
0
                    isym);
1389
0
        if (sec == NULL)
1390
0
    goto error_return;
1391
0
        sym->symbol.section = sec;
1392
0
      }
1393
10.5k
    else
1394
10.5k
      {
1395
10.5k
        sym->symbol.section
1396
10.5k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
10.5k
        if (sym->symbol.section == NULL)
1398
10.5k
    {
1399
      /* This symbol is in a section for which we did not
1400
         create a BFD section.  Just use bfd_abs_section,
1401
         although it is wrong.  FIXME.  Note - there is
1402
         code in elf.c:swap_out_syms that calls
1403
         symbol_section_index() in the elf backend for
1404
         cases like this.  */
1405
10.5k
      sym->symbol.section = bfd_abs_section_ptr;
1406
10.5k
    }
1407
10.5k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
17.0k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
118
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
17.0k
    switch (ELF_ST_BIND (isym->st_info))
1415
17.0k
      {
1416
7.71k
      case STB_LOCAL:
1417
7.71k
        sym->symbol.flags |= BSF_LOCAL;
1418
7.71k
        break;
1419
417
      case STB_GLOBAL:
1420
417
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
386
    sym->symbol.flags |= BSF_GLOBAL;
1422
417
        break;
1423
786
      case STB_WEAK:
1424
786
        sym->symbol.flags |= BSF_WEAK;
1425
786
        break;
1426
1.66k
      case STB_GNU_UNIQUE:
1427
1.66k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
1.66k
        break;
1429
17.0k
      }
1430
1431
17.0k
    switch (ELF_ST_TYPE (isym->st_info))
1432
17.0k
      {
1433
494
      case STT_SECTION:
1434
        /* Mark the input section symbol as used since it may be
1435
           used for relocation and section group.
1436
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1437
     be cleared by objcopy for non-relocatable inputs.  */
1438
494
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
494
            | BSF_DEBUGGING
1440
494
            | BSF_SECTION_SYM_USED);
1441
494
        break;
1442
621
      case STT_FILE:
1443
621
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
621
        break;
1445
830
      case STT_FUNC:
1446
830
        sym->symbol.flags |= BSF_FUNCTION;
1447
830
        break;
1448
525
      case STT_COMMON:
1449
        /* FIXME: Do we have to put the size field into the value field
1450
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1451
525
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
1.25k
      case STT_OBJECT:
1454
1.25k
        sym->symbol.flags |= BSF_OBJECT;
1455
1.25k
        break;
1456
773
      case STT_TLS:
1457
773
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
773
        break;
1459
1.11k
      case STT_RELC:
1460
1.11k
        sym->symbol.flags |= BSF_RELC;
1461
1.11k
        break;
1462
445
      case STT_SRELC:
1463
445
        sym->symbol.flags |= BSF_SRELC;
1464
445
        break;
1465
1.71k
      case STT_GNU_IFUNC:
1466
1.71k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
1.71k
        break;
1468
17.0k
      }
1469
1470
17.0k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
17.0k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
17.0k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
17.0k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
17.0k
    if (ebd->elf_backend_symbol_processing)
1487
261
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
17.0k
  }
1489
91
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
93
  if (ebd->elf_backend_symbol_table_processing)
1493
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1494
1495
  /* We rely on the zalloc to clear out the final symbol entry.  */
1496
1497
93
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
93
  if (symptrs)
1501
93
    {
1502
93
      long l = symcount;
1503
1504
93
      sym = symbase;
1505
17.1k
      while (l-- > 0)
1506
17.0k
  {
1507
17.0k
    *symptrs++ = &sym->symbol;
1508
17.0k
    sym++;
1509
17.0k
  }
1510
93
      *symptrs = 0;   /* Final null pointer */
1511
93
    }
1512
1513
93
  free (xverbuf);
1514
93
  if (hdr->contents != (unsigned char *) isymbuf
1515
93
      && !elf_use_dt_symtab_p (abfd))
1516
91
    free (isymbuf);
1517
93
  return symcount;
1518
1519
0
 error_return:
1520
0
  free (xverbuf);
1521
0
  if (hdr->contents != (unsigned char *) isymbuf
1522
0
      && !elf_use_dt_symtab_p (abfd))
1523
0
    free (isymbuf);
1524
0
  return -1;
1525
93
}
Unexecuted instantiation: bfd_elf32_slurp_symbol_table
1526
1527
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1528
   them.  */
1529
1530
static bool
1531
elf_slurp_reloc_table_from_section (bfd *abfd,
1532
            asection *asect,
1533
            Elf_Internal_Shdr *rel_hdr,
1534
            bfd_size_type reloc_count,
1535
            arelent *relents,
1536
            asymbol **symbols,
1537
            bool dynamic)
1538
0
{
1539
0
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
0
  void *allocated = NULL;
1541
0
  bfd_byte *native_relocs;
1542
0
  arelent *relent;
1543
0
  unsigned int i;
1544
0
  int entsize;
1545
0
  unsigned int symcount;
1546
1547
0
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
0
    return false;
1549
0
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
0
  if (allocated == NULL)
1551
0
    return false;
1552
1553
0
  native_relocs = (bfd_byte *) allocated;
1554
1555
0
  entsize = rel_hdr->sh_entsize;
1556
0
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
0
        || entsize == sizeof (Elf_External_Rela));
1558
1559
0
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
0
  else
1562
0
    symcount = bfd_get_symcount (abfd);
1563
1564
0
  for (i = 0, relent = relents;
1565
0
       i < reloc_count;
1566
0
       i++, relent++, native_relocs += entsize)
1567
0
    {
1568
0
      bool res;
1569
0
      Elf_Internal_Rela rela;
1570
1571
0
      if (entsize == sizeof (Elf_External_Rela))
1572
0
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1573
0
      else
1574
0
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1575
1576
      /* The address of an ELF reloc is section relative for an object
1577
   file, and absolute for an executable file or shared library.
1578
   The address of a normal BFD reloc is always section relative,
1579
   and the address of a dynamic reloc is absolute..  */
1580
0
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
0
  relent->address = rela.r_offset;
1582
0
      else
1583
0
  relent->address = rela.r_offset - asect->vma;
1584
1585
0
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1586
  /* FIXME: This and the error case below mean that we have a
1587
     symbol on relocs that is not elf_symbol_type.  */
1588
0
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
0
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
0
  {
1591
0
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
0
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
0
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
0
    bfd_set_error (bfd_error_bad_value);
1596
0
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
0
  }
1598
0
      else
1599
0
  {
1600
0
    asymbol **ps;
1601
1602
0
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
0
    relent->sym_ptr_ptr = ps;
1605
0
  }
1606
1607
0
      relent->addend = rela.r_addend;
1608
1609
0
      if ((entsize == sizeof (Elf_External_Rela)
1610
0
     && ebd->elf_info_to_howto != NULL)
1611
0
    || ebd->elf_info_to_howto_rel == NULL)
1612
0
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1613
0
      else
1614
0
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1615
1616
0
      if (! res || relent->howto == NULL)
1617
0
  goto error_return;
1618
0
    }
1619
1620
0
  free (allocated);
1621
0
  return true;
1622
1623
0
 error_return:
1624
0
  free (allocated);
1625
0
  return false;
1626
0
}
Unexecuted instantiation: elf64.c:elf_slurp_reloc_table_from_section
Unexecuted instantiation: elf32.c:elf_slurp_reloc_table_from_section
1627
1628
/* Read in and swap the external relocs.  */
1629
1630
bool
1631
elf_slurp_reloc_table (bfd *abfd,
1632
           asection *asect,
1633
           asymbol **symbols,
1634
           bool dynamic)
1635
0
{
1636
0
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
0
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
0
  Elf_Internal_Shdr *rel_hdr;
1639
0
  Elf_Internal_Shdr *rel_hdr2;
1640
0
  bfd_size_type reloc_count;
1641
0
  bfd_size_type reloc_count2;
1642
0
  arelent *relents;
1643
0
  size_t amt;
1644
1645
0
  if (asect->relocation != NULL)
1646
0
    return true;
1647
1648
0
  if (! dynamic)
1649
0
    {
1650
0
      if ((asect->flags & SEC_RELOC) == 0
1651
0
    || asect->reloc_count == 0)
1652
0
  return true;
1653
1654
0
      rel_hdr = d->rel.hdr;
1655
0
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
0
      rel_hdr2 = d->rela.hdr;
1657
0
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
0
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
0
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
0
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
0
    }
1666
0
  else
1667
0
    {
1668
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1669
   case because relocations against this section may use the
1670
   dynamic symbol table, and in that case bfd_section_from_shdr
1671
   in elf.c does not update the RELOC_COUNT.  */
1672
0
      if (asect->size == 0)
1673
0
  return true;
1674
1675
0
      rel_hdr = &d->this_hdr;
1676
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1677
0
      rel_hdr2 = NULL;
1678
0
      reloc_count2 = 0;
1679
0
    }
1680
1681
0
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1682
0
    {
1683
0
      bfd_set_error (bfd_error_file_too_big);
1684
0
      return false;
1685
0
    }
1686
0
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
0
  if (relents == NULL)
1688
0
    return false;
1689
1690
0
  if (rel_hdr
1691
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1692
0
                rel_hdr, reloc_count,
1693
0
                relents,
1694
0
                symbols, dynamic))
1695
0
    return false;
1696
1697
0
  if (rel_hdr2
1698
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
0
                rel_hdr2, reloc_count2,
1700
0
                relents + reloc_count,
1701
0
                symbols, dynamic))
1702
0
    return false;
1703
1704
0
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
0
    return false;
1706
1707
0
  asect->relocation = relents;
1708
0
  return true;
1709
0
}
Unexecuted instantiation: bfd_elf64_slurp_reloc_table
Unexecuted instantiation: bfd_elf32_slurp_reloc_table
1710
1711
#if DEBUG & 2
1712
static void
1713
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1714
{
1715
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1716
     hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1717
     (long) hdr);
1718
  fprintf (stderr,
1719
     "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1720
     (long) hdr->sh_name,
1721
     (long) hdr->sh_type,
1722
     (long) hdr->sh_flags);
1723
  fprintf (stderr,
1724
     "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1725
     (long) hdr->sh_addr,
1726
     (long) hdr->sh_offset,
1727
     (long) hdr->sh_size);
1728
  fprintf (stderr,
1729
     "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1730
     (long) hdr->sh_link,
1731
     (long) hdr->sh_info,
1732
     (long) hdr->sh_addralign);
1733
  fprintf (stderr, "sh_entsize   = %ld\n",
1734
     (long) hdr->sh_entsize);
1735
  fflush (stderr);
1736
}
1737
#endif
1738
1739
#if DEBUG & 1
1740
static void
1741
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1742
{
1743
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1744
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1745
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1746
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1747
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1748
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1749
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1750
}
1751
#endif
1752

1753
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1754
   reconstruct an ELF file by reading the segments out of remote
1755
   memory based on the ELF file header at EHDR_VMA and the ELF program
1756
   headers it points to.  If non-zero, SIZE is the known extent of the
1757
   object.  If not null, *LOADBASEP is filled in with the difference
1758
   between the VMAs from which the segments were read, and the VMAs
1759
   the file headers (and hence BFD's idea of each section's VMA) put
1760
   them at.
1761
1762
   The function TARGET_READ_MEMORY is called to copy LEN bytes from
1763
   the remote memory at target address VMA into the local buffer at
1764
   MYADDR; it should return zero on success or an `errno' code on
1765
   failure.  TEMPL must be a BFD for a target with the word size and
1766
   byte order found in the remote memory.  */
1767
1768
bfd *
1769
NAME(_bfd_elf,bfd_from_remote_memory)
1770
  (bfd *templ,
1771
   bfd_vma ehdr_vma    /* Bytes.  */,
1772
   bfd_size_type size  /* Octets.  */,
1773
   bfd_vma *loadbasep  /* Bytes.  */,
1774
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1775
                          /* (Bytes  ,           , octets       ).  */
1776
0
{
1777
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1778
0
  Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1779
0
  Elf_External_Phdr *x_phdrs;
1780
0
  Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
1781
0
  bfd *nbfd;
1782
0
  struct bfd_in_memory *bim;
1783
0
  bfd_byte *contents;
1784
0
  int err;
1785
0
  unsigned int i;
1786
0
  bfd_vma high_offset;
1787
0
  bfd_vma shdr_end;
1788
0
  bfd_vma loadbase;  /* Bytes.  */
1789
0
  size_t amt;
1790
0
  unsigned int opb = bfd_octets_per_byte (templ, NULL);
1791
1792
  /* Read in the ELF header in external format.  */
1793
0
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1794
0
  if (err)
1795
0
    {
1796
0
      bfd_set_error (bfd_error_system_call);
1797
0
      errno = err;
1798
0
      return NULL;
1799
0
    }
1800
1801
  /* Now check to see if we have a valid ELF file, and one that BFD can
1802
     make use of.  The magic number must match, the address size ('class')
1803
     and byte-swapping must match our XVEC entry.  */
1804
1805
0
  if (! elf_file_p (&x_ehdr)
1806
0
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1807
0
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1808
0
    {
1809
0
      bfd_set_error (bfd_error_wrong_format);
1810
0
      return NULL;
1811
0
    }
1812
1813
  /* Check that file's byte order matches xvec's */
1814
0
  switch (x_ehdr.e_ident[EI_DATA])
1815
0
    {
1816
0
    case ELFDATA2MSB:   /* Big-endian */
1817
0
      if (! bfd_header_big_endian (templ))
1818
0
  {
1819
0
    bfd_set_error (bfd_error_wrong_format);
1820
0
    return NULL;
1821
0
  }
1822
0
      break;
1823
0
    case ELFDATA2LSB:   /* Little-endian */
1824
0
      if (! bfd_header_little_endian (templ))
1825
0
  {
1826
0
    bfd_set_error (bfd_error_wrong_format);
1827
0
    return NULL;
1828
0
  }
1829
0
      break;
1830
0
    case ELFDATANONE:   /* No data encoding specified */
1831
0
    default:      /* Unknown data encoding specified */
1832
0
      bfd_set_error (bfd_error_wrong_format);
1833
0
      return NULL;
1834
0
    }
1835
1836
0
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1837
1838
  /* The file header tells where to find the program headers.
1839
     These are what we use to actually choose what to read.  */
1840
1841
0
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1842
0
    {
1843
0
      bfd_set_error (bfd_error_wrong_format);
1844
0
      return NULL;
1845
0
    }
1846
1847
0
  if (_bfd_mul_overflow (i_ehdr.e_phnum,
1848
0
       sizeof (*x_phdrs) + sizeof (*i_phdrs), &amt))
1849
0
    {
1850
0
      bfd_set_error (bfd_error_file_too_big);
1851
0
      return NULL;
1852
0
    }
1853
0
  x_phdrs = (Elf_External_Phdr *) bfd_malloc (amt);
1854
0
  if (x_phdrs == NULL)
1855
0
    return NULL;
1856
0
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1857
0
          i_ehdr.e_phnum * sizeof x_phdrs[0]);
1858
0
  if (err)
1859
0
    {
1860
0
      free (x_phdrs);
1861
0
      bfd_set_error (bfd_error_system_call);
1862
0
      errno = err;
1863
0
      return NULL;
1864
0
    }
1865
0
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1866
1867
0
  high_offset = 0;
1868
0
  loadbase = 0;
1869
0
  first_phdr = NULL;
1870
0
  last_phdr = NULL;
1871
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1872
0
    {
1873
0
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1874
0
      if (i_phdrs[i].p_type == PT_LOAD)
1875
0
  {
1876
0
    bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
1877
1878
0
    if (segment_end > high_offset)
1879
0
      {
1880
0
        high_offset = segment_end;
1881
0
        last_phdr = &i_phdrs[i];
1882
0
      }
1883
1884
    /* If this program header covers offset zero, where the file
1885
       header sits, then we can figure out the loadbase.  */
1886
0
    if (first_phdr == NULL)
1887
0
      {
1888
0
        bfd_vma p_offset = i_phdrs[i].p_offset;  /* Octets.  */
1889
0
        bfd_vma p_vaddr = i_phdrs[i].p_vaddr;    /* Octets.  */
1890
1891
0
        if (i_phdrs[i].p_align > 1)
1892
0
    {
1893
0
      p_offset &= -(i_phdrs[i].p_align * opb);
1894
0
      p_vaddr &= -(i_phdrs[i].p_align * opb);
1895
0
    }
1896
0
        if (p_offset == 0)
1897
0
    {
1898
0
      loadbase = ehdr_vma - p_vaddr / opb;
1899
0
      first_phdr = &i_phdrs[i];
1900
0
    }
1901
0
      }
1902
0
  }
1903
0
    }
1904
0
  if (high_offset == 0)
1905
0
    {
1906
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1907
0
      free (x_phdrs);
1908
0
      bfd_set_error (bfd_error_wrong_format);
1909
0
      return NULL;
1910
0
    }
1911
1912
0
  shdr_end = 0;
1913
0
  if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
1914
0
    {
1915
0
      shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1916
1917
0
      if (last_phdr->p_filesz != last_phdr->p_memsz)
1918
0
  {
1919
    /* If the last PT_LOAD header has a bss area then ld.so will
1920
       have cleared anything past p_filesz, zapping the section
1921
       headers.  */
1922
0
  }
1923
0
      else if (size >= shdr_end)
1924
0
  high_offset = size;
1925
0
      else
1926
0
  {
1927
0
    bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
1928
0
    bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
1929
1930
    /* Assume we loaded full pages, allowing us to sometimes see
1931
       section headers.  */
1932
0
    if (page_size > 1 && shdr_end > segment_end)
1933
0
      {
1934
0
        bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
1935
1936
0
        if (page_end >= shdr_end)
1937
    /* Whee, section headers covered.  */
1938
0
    high_offset = shdr_end;
1939
0
      }
1940
0
  }
1941
0
    }
1942
1943
  /* Now we know the size of the whole image we want read in.  */
1944
0
  contents = (bfd_byte *) bfd_zmalloc (high_offset);
1945
0
  if (contents == NULL)
1946
0
    {
1947
0
      free (x_phdrs);
1948
0
      return NULL;
1949
0
    }
1950
1951
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1952
0
    if (i_phdrs[i].p_type == PT_LOAD)
1953
0
      {
1954
0
  bfd_vma start = i_phdrs[i].p_offset;         /* Octets.  */
1955
0
  bfd_vma end = start + i_phdrs[i].p_filesz;   /* Octets.  */
1956
0
  bfd_vma vaddr = i_phdrs[i].p_vaddr;          /* Octets.  */
1957
1958
  /* Extend the beginning of the first pt_load to cover file
1959
     header and program headers, if we proved earlier that its
1960
     aligned offset is 0.  */
1961
0
  if (first_phdr == &i_phdrs[i])
1962
0
    {
1963
0
      vaddr -= start;
1964
0
      start = 0;
1965
0
    }
1966
  /* Extend the end of the last pt_load to cover section headers.  */
1967
0
  if (last_phdr == &i_phdrs[i])
1968
0
    end = high_offset;
1969
0
  err = target_read_memory (loadbase + vaddr / opb,
1970
0
          contents + start, end - start);
1971
0
  if (err)
1972
0
    {
1973
0
      free (x_phdrs);
1974
0
      free (contents);
1975
0
      bfd_set_error (bfd_error_system_call);
1976
0
      errno = err;
1977
0
      return NULL;
1978
0
    }
1979
0
      }
1980
0
  free (x_phdrs);
1981
1982
  /* If the segments visible in memory didn't include the section headers,
1983
     then clear them from the file header.  */
1984
0
  if (high_offset < shdr_end)
1985
0
    {
1986
0
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1987
0
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1988
0
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1989
0
    }
1990
1991
  /* This will normally have been in the first PT_LOAD segment.  But it
1992
     conceivably could be missing, and we might have just changed it.  */
1993
0
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1994
1995
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1996
0
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1997
0
  if (bim == NULL)
1998
0
    {
1999
0
      free (contents);
2000
0
      return NULL;
2001
0
    }
2002
0
  nbfd = _bfd_new_bfd ();
2003
0
  if (nbfd == NULL
2004
0
      || !bfd_set_filename (nbfd, "<in-memory>"))
2005
0
    {
2006
0
      free (bim);
2007
0
      free (contents);
2008
0
      return NULL;
2009
0
    }
2010
0
  nbfd->xvec = templ->xvec;
2011
0
  bim->size = high_offset;
2012
0
  bim->buffer = contents;
2013
0
  nbfd->iostream = bim;
2014
0
  nbfd->flags = BFD_IN_MEMORY;
2015
0
  nbfd->iovec = &_bfd_memory_iovec;
2016
0
  nbfd->origin = 0;
2017
0
  nbfd->direction = read_direction;
2018
0
  nbfd->mtime = time (NULL);
2019
0
  nbfd->mtime_set = true;
2020
2021
0
  if (loadbasep)
2022
0
    *loadbasep = loadbase;
2023
0
  return nbfd;
2024
0
}
Unexecuted instantiation: _bfd_elf64_bfd_from_remote_memory
Unexecuted instantiation: _bfd_elf32_bfd_from_remote_memory
2025
2026
/* Function for ELF_R_INFO.  */
2027
2028
bfd_vma
2029
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
2030
0
{
2031
0
  return ELF_R_INFO (sym, type);
2032
0
}
Unexecuted instantiation: elf64_r_info
Unexecuted instantiation: elf32_r_info
2033
2034
/* Function for ELF_R_SYM.  */
2035
2036
bfd_vma
2037
NAME(elf,r_sym) (bfd_vma r_info)
2038
0
{
2039
0
  return ELF_R_SYM (r_info);
2040
0
}
Unexecuted instantiation: elf64_r_sym
Unexecuted instantiation: elf32_r_sym
2041

2042
#include "elfcore.h"
2043

2044
/* Size-dependent data and functions.  */
2045
const struct elf_size_info NAME(_bfd_elf,size_info) = {
2046
  sizeof (Elf_External_Ehdr),
2047
  sizeof (Elf_External_Phdr),
2048
  sizeof (Elf_External_Shdr),
2049
  sizeof (Elf_External_Rel),
2050
  sizeof (Elf_External_Rela),
2051
  sizeof (Elf_External_Sym),
2052
  sizeof (Elf_External_Dyn),
2053
  sizeof (Elf_External_Note),
2054
  4,
2055
  1,
2056
  ARCH_SIZE, LOG_FILE_ALIGN,
2057
  ELFCLASS, EV_CURRENT,
2058
  elf_write_out_phdrs,
2059
  elf_write_shdrs_and_ehdr,
2060
  elf_checksum_contents,
2061
  elf_write_relocs,
2062
  elf_swap_symbol_in,
2063
  elf_swap_symbol_out,
2064
  elf_slurp_reloc_table,
2065
  elf_slurp_symbol_table,
2066
  elf_swap_dyn_in,
2067
  elf_swap_dyn_out,
2068
  elf_swap_reloc_in,
2069
  elf_swap_reloc_out,
2070
  elf_swap_reloca_in,
2071
  elf_swap_reloca_out
2072
};