Coverage Report

Created: 2023-06-29 07:03

/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
1.93M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
0
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
1.93M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
0
#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
0
#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
0
#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
0
#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
0
#define H_GET_WORD    H_GET_64
161
0
#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
0
#define H_GET_WORD    H_GET_32
167
0
#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
0
{
179
0
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
0
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
0
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
0
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
0
  if (signed_vma)
185
0
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
0
  else
187
0
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
0
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
0
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
0
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
0
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
0
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
0
    {
194
0
      if (shndx == NULL)
195
0
  return false;
196
0
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
0
    }
198
0
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
0
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
0
  dst->st_target_internal = 0;
201
0
  return true;
202
0
}
Unexecuted instantiation: bfd_elf64_swap_symbol_in
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
0
{
239
0
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
0
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
0
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
0
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
0
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
0
  if (signed_vma)
245
0
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
0
  else
247
0
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
0
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
0
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
0
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
0
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
0
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
0
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
0
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
0
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
0
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
0
}
Unexecuted instantiation: elf64.c:elf_swap_ehdr_in
Unexecuted instantiation: elf32.c:elf_swap_ehdr_in
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
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
270
  /* note that all elements of dst are *arrays of unsigned char* already...  */
271
0
  H_PUT_16 (abfd, src->e_type, dst->e_type);
272
0
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
273
0
  H_PUT_32 (abfd, src->e_version, dst->e_version);
274
0
  if (signed_vma)
275
0
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
276
0
  else
277
0
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
278
0
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
279
0
  H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
280
0
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
281
0
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
282
0
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
283
0
  tmp = src->e_phnum;
284
0
  if (tmp > PN_XNUM)
285
0
    tmp = PN_XNUM;
286
0
  H_PUT_16 (abfd, tmp, dst->e_phnum);
287
0
  H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
288
0
  tmp = src->e_shnum;
289
0
  if (tmp >= (SHN_LORESERVE & 0xffff))
290
0
    tmp = SHN_UNDEF;
291
0
  H_PUT_16 (abfd, tmp, dst->e_shnum);
292
0
  tmp = src->e_shstrndx;
293
0
  if (tmp >= (SHN_LORESERVE & 0xffff))
294
0
    tmp = SHN_XINDEX & 0xffff;
295
0
  H_PUT_16 (abfd, tmp, dst->e_shstrndx);
296
0
}
Unexecuted instantiation: elf64.c:elf_swap_ehdr_out
Unexecuted instantiation: elf32.c:elf_swap_ehdr_out
297
298
/* Translate an ELF section header table entry in external format into an
299
   ELF section header table entry in internal format.  */
300
301
static void
302
elf_swap_shdr_in (bfd *abfd,
303
      const Elf_External_Shdr *src,
304
      Elf_Internal_Shdr *dst)
305
0
{
306
0
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
0
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
0
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
0
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
0
  if (signed_vma)
312
0
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
0
  else
314
0
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
0
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
0
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
317
  /* PR 23657.  Check for invalid section size, in sections with contents.
318
     Note - we do not set an error value here because the contents
319
     of this particular section might not be needed by the consumer.  */
320
0
  if (dst->sh_type != SHT_NOBITS)
321
0
    {
322
0
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
0
      if (filesize != 0
325
0
    && ((ufile_ptr) dst->sh_offset > filesize
326
0
        || dst->sh_size > filesize - dst->sh_offset)
327
0
    && !abfd->read_only)
328
0
  {
329
0
    _bfd_error_handler (_("warning: %pB has a section "
330
0
        "extending past end of file"), abfd);
331
0
    abfd->read_only = 1;
332
0
  }
333
0
    }
334
0
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
0
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
0
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
0
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
0
  dst->bfd_section = NULL;
339
0
  dst->contents = NULL;
340
0
}
Unexecuted instantiation: elf64.c:elf_swap_shdr_in
Unexecuted instantiation: elf32.c:elf_swap_shdr_in
341
342
/* Translate an ELF section header table entry in internal format into an
343
   ELF section header table entry in external format.  */
344
345
static void
346
elf_swap_shdr_out (bfd *abfd,
347
       const Elf_Internal_Shdr *src,
348
       Elf_External_Shdr *dst)
349
0
{
350
  /* note that all elements of dst are *arrays of unsigned char* already...  */
351
0
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
352
0
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
353
0
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
354
0
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
355
0
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
356
0
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
357
0
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
358
0
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
359
0
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
360
0
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
361
0
}
Unexecuted instantiation: elf64.c:elf_swap_shdr_out
Unexecuted instantiation: elf32.c:elf_swap_shdr_out
362
363
/* Translate an ELF program header table entry in external format into an
364
   ELF program header table entry in internal format.  */
365
366
void
367
elf_swap_phdr_in (bfd *abfd,
368
      const Elf_External_Phdr *src,
369
      Elf_Internal_Phdr *dst)
370
0
{
371
0
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
0
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
0
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
0
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
0
  if (signed_vma)
377
0
    {
378
0
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
0
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
0
    }
381
0
  else
382
0
    {
383
0
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
0
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
0
    }
386
0
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
0
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
0
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
0
}
Unexecuted instantiation: bfd_elf64_swap_phdr_in
Unexecuted instantiation: bfd_elf32_swap_phdr_in
390
391
void
392
elf_swap_phdr_out (bfd *abfd,
393
       const Elf_Internal_Phdr *src,
394
       Elf_External_Phdr *dst)
395
0
{
396
0
  const struct elf_backend_data *bed;
397
0
  bfd_vma p_paddr;
398
399
0
  bed = get_elf_backend_data (abfd);
400
0
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
401
402
  /* note that all elements of dst are *arrays of unsigned char* already...  */
403
0
  H_PUT_32 (abfd, src->p_type, dst->p_type);
404
0
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
405
0
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
406
0
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
407
0
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
408
0
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
409
0
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
410
0
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
411
0
}
Unexecuted instantiation: bfd_elf64_swap_phdr_out
Unexecuted instantiation: bfd_elf32_swap_phdr_out
412
413
/* Translate an ELF reloc from external format to internal format.  */
414
void
415
elf_swap_reloc_in (bfd *abfd,
416
       const bfd_byte *s,
417
       Elf_Internal_Rela *dst)
418
0
{
419
0
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
420
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
421
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
422
0
  dst->r_addend = 0;
423
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
Unexecuted instantiation: bfd_elf32_swap_reloc_in
424
425
void
426
elf_swap_reloca_in (bfd *abfd,
427
        const bfd_byte *s,
428
        Elf_Internal_Rela *dst)
429
0
{
430
0
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
431
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
432
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
433
0
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
434
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_in
Unexecuted instantiation: bfd_elf32_swap_reloca_in
435
436
/* Translate an ELF reloc from internal format to external format.  */
437
void
438
elf_swap_reloc_out (bfd *abfd,
439
        const Elf_Internal_Rela *src,
440
        bfd_byte *d)
441
0
{
442
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
443
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
444
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
445
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
446
447
void
448
elf_swap_reloca_out (bfd *abfd,
449
         const Elf_Internal_Rela *src,
450
         bfd_byte *d)
451
0
{
452
0
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
453
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
454
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
455
0
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
456
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_out
Unexecuted instantiation: bfd_elf32_swap_reloca_out
457
458
void
459
elf_swap_dyn_in (bfd *abfd,
460
     const void *p,
461
     Elf_Internal_Dyn *dst)
462
0
{
463
0
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
464
465
0
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
466
0
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
467
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_in
Unexecuted instantiation: bfd_elf32_swap_dyn_in
468
469
void
470
elf_swap_dyn_out (bfd *abfd,
471
      const Elf_Internal_Dyn *src,
472
      void *p)
473
0
{
474
0
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
475
476
0
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
477
0
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
478
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_out
Unexecuted instantiation: bfd_elf32_swap_dyn_out
479

480
/* ELF .o/exec file reading */
481
482
/* Begin processing a given object.
483
484
   First we validate the file by reading in the ELF header and checking
485
   the magic number.  */
486
487
static inline bool
488
elf_file_p (Elf_External_Ehdr *x_ehdrp)
489
1.81M
{
490
1.81M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
1.81M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
1.81M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
1.81M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
1.81M
}
elf64.c:elf_file_p
Line
Count
Source
489
428k
{
490
428k
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
428k
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
428k
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
428k
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
428k
}
elf32.c:elf_file_p
Line
Count
Source
489
1.38M
{
490
1.38M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
1.38M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
1.38M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
1.38M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
1.38M
}
495
496
/* Check to see if the file associated with ABFD matches the target vector
497
   that ABFD points to.
498
499
   Note that we may be called several times with the same ABFD, but different
500
   target vectors, most of which will not match.  We have to avoid leaving
501
   any side effects in ABFD, or any data it points to (like tdata), if the
502
   file does not match the target vector.  */
503
504
bfd_cleanup
505
elf_object_p (bfd *abfd)
506
1.93M
{
507
1.93M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
1.93M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
1.93M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
1.93M
  Elf_Internal_Shdr i_shdr;
511
1.93M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
1.93M
  unsigned int shindex;
513
1.93M
  const struct elf_backend_data *ebd;
514
1.93M
  asection *s;
515
1.93M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
1.93M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
114k
    {
521
114k
      if (bfd_get_error () != bfd_error_system_call)
522
114k
  goto got_wrong_format_error;
523
0
      else
524
0
  goto got_no_match;
525
114k
    }
526
527
  /* Now check to see if we have a valid ELF file, and one that BFD can
528
     make use of.  The magic number must match, the address size ('class')
529
     and byte-swapping must match our XVEC entry, and it must have a
530
     section header table (FIXME: See comments re sections at top of this
531
     file).  */
532
533
1.81M
  if (! elf_file_p (&x_ehdr)
534
1.81M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
1.81M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
1.81M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
0
  switch (x_ehdr.e_ident[EI_DATA])
540
0
    {
541
0
    case ELFDATA2MSB:   /* Big-endian */
542
0
      if (! bfd_header_big_endian (abfd))
543
0
  goto got_wrong_format_error;
544
0
      break;
545
0
    case ELFDATA2LSB:   /* Little-endian */
546
0
      if (! bfd_header_little_endian (abfd))
547
0
  goto got_wrong_format_error;
548
0
      break;
549
0
    case ELFDATANONE:   /* No data encoding specified */
550
0
    default:      /* Unknown data encoding specified */
551
0
      goto got_wrong_format_error;
552
0
    }
553
554
0
  target = abfd->xvec;
555
556
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
557
     the tdata pointer in the bfd.  */
558
559
0
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
560
0
    goto got_no_match;
561
562
  /* Now that we know the byte order, swap in the rest of the header */
563
0
  i_ehdrp = elf_elfheader (abfd);
564
0
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
565
#if DEBUG & 1
566
  elf_debug_file (i_ehdrp);
567
#endif
568
569
  /* Reject ET_CORE (header indicates core file, not object file) */
570
0
  if (i_ehdrp->e_type == ET_CORE)
571
0
    goto got_wrong_format_error;
572
573
  /* If this is a relocatable file and there is no section header
574
     table, then we're hosed.  */
575
0
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
0
    goto got_wrong_format_error;
577
578
  /* As a simple sanity check, verify that what BFD thinks is the
579
     size of each section header table entry actually matches the size
580
     recorded in the file, but only if there are any sections.  */
581
0
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
0
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
0
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
0
    goto got_wrong_format_error;
587
588
0
  ebd = get_elf_backend_data (abfd);
589
0
  if (ebd->s->arch_size != ARCH_SIZE)
590
0
    goto got_wrong_format_error;
591
592
  /* Check that the ELF e_machine field matches what this particular
593
     BFD format expects.  */
594
0
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
0
      && (ebd->elf_machine_alt1 == 0
596
0
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
0
      && (ebd->elf_machine_alt2 == 0
598
0
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
0
      && ebd->elf_machine_code != EM_NONE)
600
0
    goto got_wrong_format_error;
601
602
0
  if (i_ehdrp->e_type == ET_EXEC)
603
0
    abfd->flags |= EXEC_P;
604
0
  else if (i_ehdrp->e_type == ET_DYN)
605
0
    abfd->flags |= DYNAMIC;
606
607
0
  if (i_ehdrp->e_phnum > 0)
608
0
    abfd->flags |= D_PAGED;
609
610
0
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
0
    {
612
      /* It's OK if this fails for the generic target.  */
613
0
      if (ebd->elf_machine_code != EM_NONE)
614
0
  goto got_no_match;
615
0
    }
616
617
0
  if (ebd->elf_machine_code != EM_NONE
618
0
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
0
      && ebd->elf_osabi != ELFOSABI_NONE)
620
0
    goto got_wrong_format_error;
621
622
0
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
0
    {
624
0
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
0
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
0
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
0
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
0
  goto got_no_match;
634
0
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
635
636
      /* If the section count is zero, the actual count is in the first
637
   section header.  */
638
0
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
0
  {
640
0
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
0
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
0
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
0
        || i_ehdrp->e_shnum  == 0)
644
0
      goto got_wrong_format_error;
645
0
  }
646
647
      /* And similarly for the string table index.  */
648
0
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
0
  {
650
0
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
0
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
0
  }
654
655
      /* And program headers.  */
656
0
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
0
  {
658
0
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
0
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
0
  }
662
663
      /* Sanity check that we can read all of the section headers.
664
   It ought to be good enough to just read the last one.  */
665
0
      if (i_ehdrp->e_shnum != 1)
666
0
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
0
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
0
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
0
      goto got_wrong_format_error;
671
672
0
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
0
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
0
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
0
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
0
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
0
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
0
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
0
  }
686
0
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
0
  if (i_ehdrp->e_shnum != 0)
691
0
    {
692
0
      Elf_Internal_Shdr *shdrp;
693
0
      unsigned int num_sec;
694
0
      size_t amt;
695
696
0
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
0
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
0
      if (!i_shdrp)
700
0
  goto got_no_match;
701
0
      num_sec = i_ehdrp->e_shnum;
702
0
      elf_numsections (abfd) = num_sec;
703
0
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
0
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
0
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
0
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
0
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
0
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
0
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
0
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
0
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
0
  {
720
0
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
0
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
0
    if (i_shdrp[shindex].sh_link >= num_sec)
726
0
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
0
        switch (ebd->elf_machine_code)
730
0
    {
731
0
    case EM_386:
732
0
    case EM_IAMCU:
733
0
    case EM_X86_64:
734
0
    case EM_OLD_SPARCV9:
735
0
    case EM_SPARC32PLUS:
736
0
    case EM_SPARCV9:
737
0
    case EM_SPARC:
738
0
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
0
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
0
        break;
741
      /* Otherwise fall through.  */
742
0
    default:
743
0
      goto got_wrong_format_error;
744
0
    }
745
0
      }
746
747
0
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
0
         || i_shdrp[shindex].sh_type == SHT_RELA
749
0
         || i_shdrp[shindex].sh_type == SHT_REL)
750
0
        && i_shdrp[shindex].sh_info >= num_sec)
751
0
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
0
    if (i_shdrp[shindex].sh_size != 0
756
0
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
0
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
0
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
0
       % ebd->minpagesize)
760
0
      != 0))
761
0
      abfd->flags &= ~D_PAGED;
762
0
  }
763
764
0
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
0
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
0
  {
767
    /* PR 2257:
768
       We used to just goto got_wrong_format_error here
769
       but there are binaries in existance for which this test
770
       will prevent the binutils from working with them at all.
771
       So we are kind, and reset the string index value to 0
772
       so that at least some processing can be done.  */
773
0
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
0
    if (!abfd->read_only)
775
0
      {
776
0
        _bfd_error_handler
777
0
    (_("warning: %pB has a corrupt string table index"), abfd);
778
0
        abfd->read_only = 1;
779
0
      }
780
0
  }
781
0
    }
782
0
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
0
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
0
  if (i_ehdrp->e_phnum == 0)
787
0
    elf_tdata (abfd)->phdr = NULL;
788
0
  else
789
0
    {
790
0
      Elf_Internal_Phdr *i_phdr;
791
0
      unsigned int i;
792
0
      ufile_ptr filesize;
793
0
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
0
      filesize = bfd_get_file_size (abfd);
798
0
      if (filesize != 0
799
0
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
0
  goto got_wrong_format_error;
801
0
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
0
      elf_tdata (abfd)->phdr
804
0
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
0
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
0
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
0
  goto got_no_match;
809
0
      i_phdr = elf_tdata (abfd)->phdr;
810
0
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
0
  {
812
0
    Elf_External_Phdr x_phdr;
813
814
0
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
0
      goto got_no_match;
816
0
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
817
    /* Too much code in BFD relies on alignment being a power of
818
       two, as required by the ELF spec.  */
819
0
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
0
      {
821
0
        i_phdr->p_align &= -i_phdr->p_align;
822
0
        if (!abfd->read_only)
823
0
    {
824
0
      _bfd_error_handler (_("warning: %pB has a program header "
825
0
          "with invalid alignment"), abfd);
826
0
      abfd->read_only = 1;
827
0
    }
828
0
      }
829
0
  }
830
0
    }
831
832
0
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
0
    {
834
0
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
0
      num_sec = elf_numsections (abfd);
840
0
      for (shindex = 1; shindex < num_sec; shindex++)
841
0
  if (!bfd_section_from_shdr (abfd, shindex))
842
0
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
0
      if (! _bfd_elf_setup_sections (abfd))
846
0
  goto got_wrong_format_error;
847
0
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
0
  if (ebd->elf_backend_object_p)
852
0
    {
853
0
      if (! (*ebd->elf_backend_object_p) (abfd))
854
0
  goto got_wrong_format_error;
855
0
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
0
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
859
860
  /* If we have created any reloc sections that are associated with
861
     debugging sections, mark the reloc sections as debugging as well.  */
862
0
  for (s = abfd->sections; s != NULL; s = s->next)
863
0
    {
864
0
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
0
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
0
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
0
  {
868
0
    unsigned long targ_index;
869
0
    asection *targ_sec;
870
871
0
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
0
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
0
    if (targ_sec != NULL
874
0
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
0
  }
877
0
    }
878
0
  return _bfd_no_cleanup;
879
880
1.93M
 got_wrong_format_error:
881
1.93M
  bfd_set_error (bfd_error_wrong_format);
882
883
1.93M
 got_no_match:
884
1.93M
  return NULL;
885
1.93M
}
bfd_elf64_object_p
Line
Count
Source
506
472k
{
507
472k
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
472k
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
472k
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
472k
  Elf_Internal_Shdr i_shdr;
511
472k
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
472k
  unsigned int shindex;
513
472k
  const struct elf_backend_data *ebd;
514
472k
  asection *s;
515
472k
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
472k
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
43.6k
    {
521
43.6k
      if (bfd_get_error () != bfd_error_system_call)
522
43.6k
  goto got_wrong_format_error;
523
0
      else
524
0
  goto got_no_match;
525
43.6k
    }
526
527
  /* Now check to see if we have a valid ELF file, and one that BFD can
528
     make use of.  The magic number must match, the address size ('class')
529
     and byte-swapping must match our XVEC entry, and it must have a
530
     section header table (FIXME: See comments re sections at top of this
531
     file).  */
532
533
428k
  if (! elf_file_p (&x_ehdr)
534
428k
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
428k
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
428k
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
0
  switch (x_ehdr.e_ident[EI_DATA])
540
0
    {
541
0
    case ELFDATA2MSB:   /* Big-endian */
542
0
      if (! bfd_header_big_endian (abfd))
543
0
  goto got_wrong_format_error;
544
0
      break;
545
0
    case ELFDATA2LSB:   /* Little-endian */
546
0
      if (! bfd_header_little_endian (abfd))
547
0
  goto got_wrong_format_error;
548
0
      break;
549
0
    case ELFDATANONE:   /* No data encoding specified */
550
0
    default:      /* Unknown data encoding specified */
551
0
      goto got_wrong_format_error;
552
0
    }
553
554
0
  target = abfd->xvec;
555
556
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
557
     the tdata pointer in the bfd.  */
558
559
0
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
560
0
    goto got_no_match;
561
562
  /* Now that we know the byte order, swap in the rest of the header */
563
0
  i_ehdrp = elf_elfheader (abfd);
564
0
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
565
#if DEBUG & 1
566
  elf_debug_file (i_ehdrp);
567
#endif
568
569
  /* Reject ET_CORE (header indicates core file, not object file) */
570
0
  if (i_ehdrp->e_type == ET_CORE)
571
0
    goto got_wrong_format_error;
572
573
  /* If this is a relocatable file and there is no section header
574
     table, then we're hosed.  */
575
0
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
0
    goto got_wrong_format_error;
577
578
  /* As a simple sanity check, verify that what BFD thinks is the
579
     size of each section header table entry actually matches the size
580
     recorded in the file, but only if there are any sections.  */
581
0
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
0
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
0
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
0
    goto got_wrong_format_error;
587
588
0
  ebd = get_elf_backend_data (abfd);
589
0
  if (ebd->s->arch_size != ARCH_SIZE)
590
0
    goto got_wrong_format_error;
591
592
  /* Check that the ELF e_machine field matches what this particular
593
     BFD format expects.  */
594
0
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
0
      && (ebd->elf_machine_alt1 == 0
596
0
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
0
      && (ebd->elf_machine_alt2 == 0
598
0
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
0
      && ebd->elf_machine_code != EM_NONE)
600
0
    goto got_wrong_format_error;
601
602
0
  if (i_ehdrp->e_type == ET_EXEC)
603
0
    abfd->flags |= EXEC_P;
604
0
  else if (i_ehdrp->e_type == ET_DYN)
605
0
    abfd->flags |= DYNAMIC;
606
607
0
  if (i_ehdrp->e_phnum > 0)
608
0
    abfd->flags |= D_PAGED;
609
610
0
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
0
    {
612
      /* It's OK if this fails for the generic target.  */
613
0
      if (ebd->elf_machine_code != EM_NONE)
614
0
  goto got_no_match;
615
0
    }
616
617
0
  if (ebd->elf_machine_code != EM_NONE
618
0
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
0
      && ebd->elf_osabi != ELFOSABI_NONE)
620
0
    goto got_wrong_format_error;
621
622
0
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
0
    {
624
0
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
0
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
0
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
0
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
0
  goto got_no_match;
634
0
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
635
636
      /* If the section count is zero, the actual count is in the first
637
   section header.  */
638
0
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
0
  {
640
0
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
0
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
0
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
0
        || i_ehdrp->e_shnum  == 0)
644
0
      goto got_wrong_format_error;
645
0
  }
646
647
      /* And similarly for the string table index.  */
648
0
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
0
  {
650
0
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
0
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
0
  }
654
655
      /* And program headers.  */
656
0
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
0
  {
658
0
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
0
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
0
  }
662
663
      /* Sanity check that we can read all of the section headers.
664
   It ought to be good enough to just read the last one.  */
665
0
      if (i_ehdrp->e_shnum != 1)
666
0
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
0
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
0
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
0
      goto got_wrong_format_error;
671
672
0
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
0
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
0
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
0
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
0
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
0
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
0
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
0
  }
686
0
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
0
  if (i_ehdrp->e_shnum != 0)
691
0
    {
692
0
      Elf_Internal_Shdr *shdrp;
693
0
      unsigned int num_sec;
694
0
      size_t amt;
695
696
0
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
0
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
0
      if (!i_shdrp)
700
0
  goto got_no_match;
701
0
      num_sec = i_ehdrp->e_shnum;
702
0
      elf_numsections (abfd) = num_sec;
703
0
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
0
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
0
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
0
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
0
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
0
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
0
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
0
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
0
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
0
  {
720
0
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
0
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
0
    if (i_shdrp[shindex].sh_link >= num_sec)
726
0
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
0
        switch (ebd->elf_machine_code)
730
0
    {
731
0
    case EM_386:
732
0
    case EM_IAMCU:
733
0
    case EM_X86_64:
734
0
    case EM_OLD_SPARCV9:
735
0
    case EM_SPARC32PLUS:
736
0
    case EM_SPARCV9:
737
0
    case EM_SPARC:
738
0
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
0
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
0
        break;
741
      /* Otherwise fall through.  */
742
0
    default:
743
0
      goto got_wrong_format_error;
744
0
    }
745
0
      }
746
747
0
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
0
         || i_shdrp[shindex].sh_type == SHT_RELA
749
0
         || i_shdrp[shindex].sh_type == SHT_REL)
750
0
        && i_shdrp[shindex].sh_info >= num_sec)
751
0
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
0
    if (i_shdrp[shindex].sh_size != 0
756
0
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
0
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
0
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
0
       % ebd->minpagesize)
760
0
      != 0))
761
0
      abfd->flags &= ~D_PAGED;
762
0
  }
763
764
0
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
0
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
0
  {
767
    /* PR 2257:
768
       We used to just goto got_wrong_format_error here
769
       but there are binaries in existance for which this test
770
       will prevent the binutils from working with them at all.
771
       So we are kind, and reset the string index value to 0
772
       so that at least some processing can be done.  */
773
0
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
0
    if (!abfd->read_only)
775
0
      {
776
0
        _bfd_error_handler
777
0
    (_("warning: %pB has a corrupt string table index"), abfd);
778
0
        abfd->read_only = 1;
779
0
      }
780
0
  }
781
0
    }
782
0
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
0
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
0
  if (i_ehdrp->e_phnum == 0)
787
0
    elf_tdata (abfd)->phdr = NULL;
788
0
  else
789
0
    {
790
0
      Elf_Internal_Phdr *i_phdr;
791
0
      unsigned int i;
792
0
      ufile_ptr filesize;
793
0
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
0
      filesize = bfd_get_file_size (abfd);
798
0
      if (filesize != 0
799
0
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
0
  goto got_wrong_format_error;
801
0
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
0
      elf_tdata (abfd)->phdr
804
0
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
0
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
0
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
0
  goto got_no_match;
809
0
      i_phdr = elf_tdata (abfd)->phdr;
810
0
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
0
  {
812
0
    Elf_External_Phdr x_phdr;
813
814
0
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
0
      goto got_no_match;
816
0
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
817
    /* Too much code in BFD relies on alignment being a power of
818
       two, as required by the ELF spec.  */
819
0
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
0
      {
821
0
        i_phdr->p_align &= -i_phdr->p_align;
822
0
        if (!abfd->read_only)
823
0
    {
824
0
      _bfd_error_handler (_("warning: %pB has a program header "
825
0
          "with invalid alignment"), abfd);
826
0
      abfd->read_only = 1;
827
0
    }
828
0
      }
829
0
  }
830
0
    }
831
832
0
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
0
    {
834
0
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
0
      num_sec = elf_numsections (abfd);
840
0
      for (shindex = 1; shindex < num_sec; shindex++)
841
0
  if (!bfd_section_from_shdr (abfd, shindex))
842
0
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
0
      if (! _bfd_elf_setup_sections (abfd))
846
0
  goto got_wrong_format_error;
847
0
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
0
  if (ebd->elf_backend_object_p)
852
0
    {
853
0
      if (! (*ebd->elf_backend_object_p) (abfd))
854
0
  goto got_wrong_format_error;
855
0
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
0
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
859
860
  /* If we have created any reloc sections that are associated with
861
     debugging sections, mark the reloc sections as debugging as well.  */
862
0
  for (s = abfd->sections; s != NULL; s = s->next)
863
0
    {
864
0
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
0
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
0
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
0
  {
868
0
    unsigned long targ_index;
869
0
    asection *targ_sec;
870
871
0
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
0
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
0
    if (targ_sec != NULL
874
0
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
0
  }
877
0
    }
878
0
  return _bfd_no_cleanup;
879
880
472k
 got_wrong_format_error:
881
472k
  bfd_set_error (bfd_error_wrong_format);
882
883
472k
 got_no_match:
884
472k
  return NULL;
885
472k
}
bfd_elf32_object_p
Line
Count
Source
506
1.46M
{
507
1.46M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
1.46M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
1.46M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
1.46M
  Elf_Internal_Shdr i_shdr;
511
1.46M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
1.46M
  unsigned int shindex;
513
1.46M
  const struct elf_backend_data *ebd;
514
1.46M
  asection *s;
515
1.46M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
1.46M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
70.8k
    {
521
70.8k
      if (bfd_get_error () != bfd_error_system_call)
522
70.8k
  goto got_wrong_format_error;
523
0
      else
524
0
  goto got_no_match;
525
70.8k
    }
526
527
  /* Now check to see if we have a valid ELF file, and one that BFD can
528
     make use of.  The magic number must match, the address size ('class')
529
     and byte-swapping must match our XVEC entry, and it must have a
530
     section header table (FIXME: See comments re sections at top of this
531
     file).  */
532
533
1.38M
  if (! elf_file_p (&x_ehdr)
534
1.38M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
1.38M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
1.38M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
0
  switch (x_ehdr.e_ident[EI_DATA])
540
0
    {
541
0
    case ELFDATA2MSB:   /* Big-endian */
542
0
      if (! bfd_header_big_endian (abfd))
543
0
  goto got_wrong_format_error;
544
0
      break;
545
0
    case ELFDATA2LSB:   /* Little-endian */
546
0
      if (! bfd_header_little_endian (abfd))
547
0
  goto got_wrong_format_error;
548
0
      break;
549
0
    case ELFDATANONE:   /* No data encoding specified */
550
0
    default:      /* Unknown data encoding specified */
551
0
      goto got_wrong_format_error;
552
0
    }
553
554
0
  target = abfd->xvec;
555
556
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
557
     the tdata pointer in the bfd.  */
558
559
0
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
560
0
    goto got_no_match;
561
562
  /* Now that we know the byte order, swap in the rest of the header */
563
0
  i_ehdrp = elf_elfheader (abfd);
564
0
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
565
#if DEBUG & 1
566
  elf_debug_file (i_ehdrp);
567
#endif
568
569
  /* Reject ET_CORE (header indicates core file, not object file) */
570
0
  if (i_ehdrp->e_type == ET_CORE)
571
0
    goto got_wrong_format_error;
572
573
  /* If this is a relocatable file and there is no section header
574
     table, then we're hosed.  */
575
0
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
0
    goto got_wrong_format_error;
577
578
  /* As a simple sanity check, verify that what BFD thinks is the
579
     size of each section header table entry actually matches the size
580
     recorded in the file, but only if there are any sections.  */
581
0
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
0
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
0
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
0
    goto got_wrong_format_error;
587
588
0
  ebd = get_elf_backend_data (abfd);
589
0
  if (ebd->s->arch_size != ARCH_SIZE)
590
0
    goto got_wrong_format_error;
591
592
  /* Check that the ELF e_machine field matches what this particular
593
     BFD format expects.  */
594
0
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
0
      && (ebd->elf_machine_alt1 == 0
596
0
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
0
      && (ebd->elf_machine_alt2 == 0
598
0
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
0
      && ebd->elf_machine_code != EM_NONE)
600
0
    goto got_wrong_format_error;
601
602
0
  if (i_ehdrp->e_type == ET_EXEC)
603
0
    abfd->flags |= EXEC_P;
604
0
  else if (i_ehdrp->e_type == ET_DYN)
605
0
    abfd->flags |= DYNAMIC;
606
607
0
  if (i_ehdrp->e_phnum > 0)
608
0
    abfd->flags |= D_PAGED;
609
610
0
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
0
    {
612
      /* It's OK if this fails for the generic target.  */
613
0
      if (ebd->elf_machine_code != EM_NONE)
614
0
  goto got_no_match;
615
0
    }
616
617
0
  if (ebd->elf_machine_code != EM_NONE
618
0
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
0
      && ebd->elf_osabi != ELFOSABI_NONE)
620
0
    goto got_wrong_format_error;
621
622
0
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
0
    {
624
0
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
0
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
0
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
0
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
0
  goto got_no_match;
634
0
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
635
636
      /* If the section count is zero, the actual count is in the first
637
   section header.  */
638
0
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
0
  {
640
0
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
0
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
0
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
0
        || i_ehdrp->e_shnum  == 0)
644
0
      goto got_wrong_format_error;
645
0
  }
646
647
      /* And similarly for the string table index.  */
648
0
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
0
  {
650
0
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
0
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
0
  }
654
655
      /* And program headers.  */
656
0
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
0
  {
658
0
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
0
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
0
  }
662
663
      /* Sanity check that we can read all of the section headers.
664
   It ought to be good enough to just read the last one.  */
665
0
      if (i_ehdrp->e_shnum != 1)
666
0
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
0
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
0
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
0
      goto got_wrong_format_error;
671
672
0
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
0
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
0
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
0
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
0
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
0
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
0
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
0
  }
686
0
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
0
  if (i_ehdrp->e_shnum != 0)
691
0
    {
692
0
      Elf_Internal_Shdr *shdrp;
693
0
      unsigned int num_sec;
694
0
      size_t amt;
695
696
0
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
0
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
0
      if (!i_shdrp)
700
0
  goto got_no_match;
701
0
      num_sec = i_ehdrp->e_shnum;
702
0
      elf_numsections (abfd) = num_sec;
703
0
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
0
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
0
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
0
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
0
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
0
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
0
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
0
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
0
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
0
  {
720
0
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
0
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
0
    if (i_shdrp[shindex].sh_link >= num_sec)
726
0
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
0
        switch (ebd->elf_machine_code)
730
0
    {
731
0
    case EM_386:
732
0
    case EM_IAMCU:
733
0
    case EM_X86_64:
734
0
    case EM_OLD_SPARCV9:
735
0
    case EM_SPARC32PLUS:
736
0
    case EM_SPARCV9:
737
0
    case EM_SPARC:
738
0
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
0
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
0
        break;
741
      /* Otherwise fall through.  */
742
0
    default:
743
0
      goto got_wrong_format_error;
744
0
    }
745
0
      }
746
747
0
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
0
         || i_shdrp[shindex].sh_type == SHT_RELA
749
0
         || i_shdrp[shindex].sh_type == SHT_REL)
750
0
        && i_shdrp[shindex].sh_info >= num_sec)
751
0
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
0
    if (i_shdrp[shindex].sh_size != 0
756
0
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
0
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
0
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
0
       % ebd->minpagesize)
760
0
      != 0))
761
0
      abfd->flags &= ~D_PAGED;
762
0
  }
763
764
0
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
0
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
0
  {
767
    /* PR 2257:
768
       We used to just goto got_wrong_format_error here
769
       but there are binaries in existance for which this test
770
       will prevent the binutils from working with them at all.
771
       So we are kind, and reset the string index value to 0
772
       so that at least some processing can be done.  */
773
0
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
0
    if (!abfd->read_only)
775
0
      {
776
0
        _bfd_error_handler
777
0
    (_("warning: %pB has a corrupt string table index"), abfd);
778
0
        abfd->read_only = 1;
779
0
      }
780
0
  }
781
0
    }
782
0
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
0
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
0
  if (i_ehdrp->e_phnum == 0)
787
0
    elf_tdata (abfd)->phdr = NULL;
788
0
  else
789
0
    {
790
0
      Elf_Internal_Phdr *i_phdr;
791
0
      unsigned int i;
792
0
      ufile_ptr filesize;
793
0
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
0
      filesize = bfd_get_file_size (abfd);
798
0
      if (filesize != 0
799
0
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
0
  goto got_wrong_format_error;
801
0
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
0
      elf_tdata (abfd)->phdr
804
0
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
0
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
0
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
0
  goto got_no_match;
809
0
      i_phdr = elf_tdata (abfd)->phdr;
810
0
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
0
  {
812
0
    Elf_External_Phdr x_phdr;
813
814
0
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
0
      goto got_no_match;
816
0
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
817
    /* Too much code in BFD relies on alignment being a power of
818
       two, as required by the ELF spec.  */
819
0
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
0
      {
821
0
        i_phdr->p_align &= -i_phdr->p_align;
822
0
        if (!abfd->read_only)
823
0
    {
824
0
      _bfd_error_handler (_("warning: %pB has a program header "
825
0
          "with invalid alignment"), abfd);
826
0
      abfd->read_only = 1;
827
0
    }
828
0
      }
829
0
  }
830
0
    }
831
832
0
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
0
    {
834
0
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
0
      num_sec = elf_numsections (abfd);
840
0
      for (shindex = 1; shindex < num_sec; shindex++)
841
0
  if (!bfd_section_from_shdr (abfd, shindex))
842
0
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
0
      if (! _bfd_elf_setup_sections (abfd))
846
0
  goto got_wrong_format_error;
847
0
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
0
  if (ebd->elf_backend_object_p)
852
0
    {
853
0
      if (! (*ebd->elf_backend_object_p) (abfd))
854
0
  goto got_wrong_format_error;
855
0
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
0
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
859
860
  /* If we have created any reloc sections that are associated with
861
     debugging sections, mark the reloc sections as debugging as well.  */
862
0
  for (s = abfd->sections; s != NULL; s = s->next)
863
0
    {
864
0
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
0
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
0
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
0
  {
868
0
    unsigned long targ_index;
869
0
    asection *targ_sec;
870
871
0
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
0
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
0
    if (targ_sec != NULL
874
0
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
0
  }
877
0
    }
878
0
  return _bfd_no_cleanup;
879
880
1.46M
 got_wrong_format_error:
881
1.46M
  bfd_set_error (bfd_error_wrong_format);
882
883
1.46M
 got_no_match:
884
1.46M
  return NULL;
885
1.46M
}
886

887
/* ELF .o/exec file writing */
888
889
/* Write out the relocs.  */
890
891
void
892
elf_write_relocs (bfd *abfd, asection *sec, void *data)
893
0
{
894
0
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
895
0
  bool *failedp = (bool *) data;
896
0
  Elf_Internal_Shdr *rela_hdr;
897
0
  bfd_vma addr_offset;
898
0
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
899
0
  size_t extsize;
900
0
  bfd_byte *dst_rela;
901
0
  unsigned int idx;
902
0
  asymbol *last_sym;
903
0
  int last_sym_idx;
904
0
  size_t amt;
905
906
  /* If we have already failed, don't do anything.  */
907
0
  if (*failedp)
908
0
    return;
909
910
0
  if ((sec->flags & SEC_RELOC) == 0)
911
0
    return;
912
913
  /* The linker backend writes the relocs out itself, and sets the
914
     reloc_count field to zero to inhibit writing them here.  Also,
915
     sometimes the SEC_RELOC flag gets set even when there aren't any
916
     relocs.  */
917
0
  if (sec->reloc_count == 0)
918
0
    return;
919
920
  /* If we have opened an existing file for update, reloc_count may be
921
     set even though we are not linking.  In that case we have nothing
922
     to do.  */
923
0
  if (sec->orelocation == NULL)
924
0
    return;
925
926
0
  rela_hdr = elf_section_data (sec)->rela.hdr;
927
0
  if (rela_hdr == NULL)
928
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
929
930
0
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
931
0
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
932
0
      || (rela_hdr->contents = bfd_alloc (abfd, amt)) == NULL)
933
0
    {
934
0
      bfd_set_error (bfd_error_no_memory);
935
0
      *failedp = true;
936
0
      return;
937
0
    }
938
939
  /* Figure out whether the relocations are RELA or REL relocations.  */
940
0
  if (rela_hdr->sh_type == SHT_RELA)
941
0
    {
942
0
      swap_out = elf_swap_reloca_out;
943
0
      extsize = sizeof (Elf_External_Rela);
944
0
    }
945
0
  else if (rela_hdr->sh_type == SHT_REL)
946
0
    {
947
0
      swap_out = elf_swap_reloc_out;
948
0
      extsize = sizeof (Elf_External_Rel);
949
0
    }
950
0
  else
951
    /* Every relocation section should be either an SHT_RELA or an
952
       SHT_REL section.  */
953
0
    abort ();
954
955
  /* The address of an ELF reloc is section relative for an object
956
     file, and absolute for an executable file or shared library.
957
     The address of a BFD reloc is always section relative.  */
958
0
  addr_offset = 0;
959
0
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
960
0
    addr_offset = sec->vma;
961
962
  /* orelocation has the data, reloc_count has the count...  */
963
0
  last_sym = 0;
964
0
  last_sym_idx = 0;
965
0
  dst_rela = rela_hdr->contents;
966
967
0
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
968
0
    {
969
0
      Elf_Internal_Rela src_rela;
970
0
      arelent *ptr;
971
0
      asymbol *sym;
972
0
      int n;
973
974
0
      ptr = sec->orelocation[idx];
975
0
      sym = *ptr->sym_ptr_ptr;
976
0
      if (sym == last_sym)
977
0
  n = last_sym_idx;
978
0
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
979
0
  n = STN_UNDEF;
980
0
      else
981
0
  {
982
0
    last_sym = sym;
983
0
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
984
0
    if (n < 0)
985
0
      {
986
0
        *failedp = true;
987
0
        return;
988
0
      }
989
0
    last_sym_idx = n;
990
0
  }
991
992
0
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
993
0
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
994
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
995
0
  {
996
0
    *failedp = true;
997
0
    return;
998
0
  }
999
1000
0
      if (ptr->howto == NULL)
1001
0
  {
1002
0
    *failedp = true;
1003
0
    return;
1004
0
  }
1005
1006
#if defined(BFD64) && ARCH_SIZE == 32
1007
0
      if (rela_hdr->sh_type == SHT_RELA
1008
0
    && ptr->howto->bitsize > 32
1009
0
    && ptr->addend - INT32_MIN > UINT32_MAX)
1010
0
  {
1011
0
    _bfd_error_handler (_("%pB: %pA+%" PRIx64 ": "
1012
0
        "relocation addend %" PRIx64 " too large"),
1013
0
            abfd, sec, (uint64_t) ptr->address,
1014
0
            (uint64_t) ptr->addend);
1015
0
    *failedp = true;
1016
0
    bfd_set_error (bfd_error_bad_value);
1017
0
  }
1018
#endif
1019
1020
0
      src_rela.r_offset = ptr->address + addr_offset;
1021
0
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1022
0
      src_rela.r_addend = ptr->addend;
1023
0
      (*swap_out) (abfd, &src_rela, dst_rela);
1024
0
    }
1025
1026
0
  if (elf_section_data (sec)->has_secondary_relocs
1027
0
      && !bed->write_secondary_relocs (abfd, sec))
1028
0
    {
1029
0
      *failedp = true;
1030
0
      return;
1031
0
    }
1032
0
}
Unexecuted instantiation: bfd_elf64_write_relocs
Unexecuted instantiation: bfd_elf32_write_relocs
1033
1034
/* Write out the program headers.  */
1035
1036
int
1037
elf_write_out_phdrs (bfd *abfd,
1038
         const Elf_Internal_Phdr *phdr,
1039
         unsigned int count)
1040
0
{
1041
0
  while (count--)
1042
0
    {
1043
0
      Elf_External_Phdr extphdr;
1044
1045
0
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1046
0
      if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
1047
0
    != sizeof (Elf_External_Phdr))
1048
0
  return -1;
1049
0
      phdr++;
1050
0
    }
1051
0
  return 0;
1052
0
}
Unexecuted instantiation: bfd_elf64_write_out_phdrs
Unexecuted instantiation: bfd_elf32_write_out_phdrs
1053
1054
/* Write out the section headers and the ELF file header.  */
1055
1056
bool
1057
elf_write_shdrs_and_ehdr (bfd *abfd)
1058
0
{
1059
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1060
0
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1061
0
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1062
0
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1063
0
  unsigned int count;
1064
0
  size_t amt;
1065
1066
0
  i_ehdrp = elf_elfheader (abfd);
1067
0
  i_shdrp = elf_elfsections (abfd);
1068
1069
  /* swap the header before spitting it out...  */
1070
1071
#if DEBUG & 1
1072
  elf_debug_file (i_ehdrp);
1073
#endif
1074
0
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1075
0
  amt = sizeof (x_ehdr);
1076
0
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1077
0
      || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
1078
0
    return false;
1079
1080
  /* Some fields in the first section header handle overflow of ehdr
1081
     fields.  */
1082
0
  if (i_ehdrp->e_phnum >= PN_XNUM)
1083
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1084
0
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1085
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1086
0
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1087
0
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1088
1089
  /* at this point we've concocted all the ELF sections...  */
1090
0
  if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*x_shdrp), &amt))
1091
0
    {
1092
0
      bfd_set_error (bfd_error_no_memory);
1093
0
      return false;
1094
0
    }
1095
0
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1096
0
  if (!x_shdrp)
1097
0
    return false;
1098
1099
0
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1100
0
    {
1101
#if DEBUG & 2
1102
      elf_debug_section (count, *i_shdrp);
1103
#endif
1104
0
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1105
0
    }
1106
0
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1107
0
  if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1108
0
      || bfd_bwrite (x_shdrp, amt, abfd) != amt)
1109
0
    return false;
1110
1111
  /* need to dump the string table too...  */
1112
1113
0
  return true;
1114
0
}
Unexecuted instantiation: bfd_elf64_write_shdrs_and_ehdr
Unexecuted instantiation: bfd_elf32_write_shdrs_and_ehdr
1115
1116
bool
1117
elf_checksum_contents (bfd *abfd,
1118
           void (*process) (const void *, size_t, void *),
1119
           void *arg)
1120
0
{
1121
0
  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1122
0
  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1123
0
  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1124
0
  unsigned int count, num;
1125
1126
0
  {
1127
0
    Elf_External_Ehdr x_ehdr;
1128
0
    Elf_Internal_Ehdr i_ehdr;
1129
1130
0
    i_ehdr = *i_ehdrp;
1131
0
    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1132
0
    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1133
0
    (*process) (&x_ehdr, sizeof x_ehdr, arg);
1134
0
  }
1135
1136
0
  num = i_ehdrp->e_phnum;
1137
0
  for (count = 0; count < num; count++)
1138
0
    {
1139
0
      Elf_External_Phdr x_phdr;
1140
0
      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1141
0
      (*process) (&x_phdr, sizeof x_phdr, arg);
1142
0
    }
1143
1144
0
  num = elf_numsections (abfd);
1145
0
  for (count = 0; count < num; count++)
1146
0
    {
1147
0
      Elf_Internal_Shdr i_shdr;
1148
0
      Elf_External_Shdr x_shdr;
1149
0
      bfd_byte *contents, *free_contents;
1150
1151
0
      i_shdr = *i_shdrp[count];
1152
0
      i_shdr.sh_offset = 0;
1153
1154
0
      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1155
0
      (*process) (&x_shdr, sizeof x_shdr, arg);
1156
1157
      /* Process the section's contents, if it has some.
1158
   PR ld/12451: Read them in if necessary.  */
1159
0
      if (i_shdr.sh_type == SHT_NOBITS)
1160
0
  continue;
1161
0
      free_contents = NULL;
1162
0
      contents = i_shdr.contents;
1163
0
      if (contents == NULL)
1164
0
  {
1165
0
    asection *sec;
1166
1167
0
    sec = bfd_section_from_elf_index (abfd, count);
1168
0
    if (sec != NULL)
1169
0
      {
1170
0
        contents = sec->contents;
1171
0
        if (contents == NULL)
1172
0
    {
1173
      /* Force rereading from file.  */
1174
0
      sec->flags &= ~SEC_IN_MEMORY;
1175
0
      if (!bfd_malloc_and_get_section (abfd, sec, &free_contents))
1176
0
        continue;
1177
0
      contents = free_contents;
1178
0
    }
1179
0
      }
1180
0
  }
1181
0
      if (contents != NULL)
1182
0
  {
1183
0
    (*process) (contents, i_shdr.sh_size, arg);
1184
0
    free (free_contents);
1185
0
  }
1186
0
    }
1187
1188
0
  return true;
1189
0
}
Unexecuted instantiation: bfd_elf64_checksum_contents
Unexecuted instantiation: bfd_elf32_checksum_contents
1190
1191
long
1192
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic)
1193
0
{
1194
0
  Elf_Internal_Shdr *hdr;
1195
0
  Elf_Internal_Shdr *verhdr;
1196
0
  unsigned long symcount; /* Number of external ELF symbols */
1197
0
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
0
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
0
  Elf_Internal_Sym *isym;
1200
0
  Elf_Internal_Sym *isymend;
1201
0
  Elf_Internal_Sym *isymbuf = NULL;
1202
0
  Elf_External_Versym *xver;
1203
0
  Elf_External_Versym *xverbuf = NULL;
1204
0
  const struct elf_backend_data *ebd;
1205
0
  size_t amt;
1206
1207
  /* Read each raw ELF symbol, converting from external ELF form to
1208
     internal ELF form, and then using the information to create a
1209
     canonical bfd symbol table entry.
1210
1211
     Note that we allocate the initial bfd canonical symbol buffer
1212
     based on a one-to-one mapping of the ELF symbols to canonical
1213
     symbols.  We actually use all the ELF symbols, so there will be no
1214
     space left over at the end.  When we have all the symbols, we
1215
     build the caller's pointer vector.  */
1216
1217
0
  if (! dynamic)
1218
0
    {
1219
0
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
0
      verhdr = NULL;
1221
0
    }
1222
0
  else
1223
0
    {
1224
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1225
0
      if (elf_dynversym (abfd) == 0)
1226
0
  verhdr = NULL;
1227
0
      else
1228
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1229
0
      if ((elf_dynverdef (abfd) != 0
1230
0
     && elf_tdata (abfd)->verdef == NULL)
1231
0
    || (elf_dynverref (abfd) != 0
1232
0
        && elf_tdata (abfd)->verref == NULL))
1233
0
  {
1234
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1235
0
      return -1;
1236
0
  }
1237
0
    }
1238
1239
0
  ebd = get_elf_backend_data (abfd);
1240
0
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
0
  if (symcount == 0)
1242
0
    sym = symbase = NULL;
1243
0
  else
1244
0
    {
1245
0
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
0
              NULL, NULL, NULL);
1247
0
      if (isymbuf == NULL)
1248
0
  return -1;
1249
1250
0
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1251
0
  {
1252
0
    bfd_set_error (bfd_error_file_too_big);
1253
0
    goto error_return;
1254
0
  }
1255
0
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
0
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
0
      if (verhdr != NULL
1261
0
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1262
0
  {
1263
0
    _bfd_error_handler
1264
      /* xgettext:c-format */
1265
0
      (_("%pB: version count (%" PRId64 ")"
1266
0
         " does not match symbol count (%ld)"),
1267
0
       abfd,
1268
0
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1269
0
       symcount);
1270
1271
    /* Slurp in the symbols without the version information,
1272
       since that is more helpful than just quitting.  */
1273
0
    verhdr = NULL;
1274
0
  }
1275
1276
0
      if (verhdr != NULL)
1277
0
  {
1278
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1279
0
      goto error_return;
1280
0
    xverbuf = (Elf_External_Versym *)
1281
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1282
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1283
0
      goto error_return;
1284
0
  }
1285
1286
      /* Skip first symbol, which is a null dummy.  */
1287
0
      xver = xverbuf;
1288
0
      if (xver != NULL)
1289
0
  ++xver;
1290
0
      isymend = isymbuf + symcount;
1291
0
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
0
  {
1293
0
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
0
    sym->symbol.the_bfd = abfd;
1296
0
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
0
    sym->symbol.value = isym->st_value;
1298
1299
0
    if (isym->st_shndx == SHN_UNDEF)
1300
0
      {
1301
0
        sym->symbol.section = bfd_und_section_ptr;
1302
0
      }
1303
0
    else if (isym->st_shndx == SHN_ABS)
1304
0
      {
1305
0
        sym->symbol.section = bfd_abs_section_ptr;
1306
0
      }
1307
0
    else if (isym->st_shndx == SHN_COMMON)
1308
0
      {
1309
0
        sym->symbol.section = bfd_com_section_ptr;
1310
0
        if ((abfd->flags & BFD_PLUGIN) != 0)
1311
0
    {
1312
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1313
1314
0
      if (xc == NULL)
1315
0
        {
1316
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1317
0
          | SEC_EXCLUDE);
1318
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1319
0
          if (xc == NULL)
1320
0
      goto error_return;
1321
0
        }
1322
0
      sym->symbol.section = xc;
1323
0
    }
1324
        /* Elf puts the alignment into the `value' field, and
1325
     the size into the `size' field.  BFD wants to see the
1326
     size in the value field, and doesn't care (at the
1327
     moment) about the alignment.  */
1328
0
        sym->symbol.value = isym->st_size;
1329
0
      }
1330
0
    else
1331
0
      {
1332
0
        sym->symbol.section
1333
0
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
0
        if (sym->symbol.section == NULL)
1335
0
    {
1336
      /* This symbol is in a section for which we did not
1337
         create a BFD section.  Just use bfd_abs_section,
1338
         although it is wrong.  FIXME.  Note - there is
1339
         code in elf.c:swap_out_syms that calls
1340
         symbol_section_index() in the elf backend for
1341
         cases like this.  */
1342
0
      sym->symbol.section = bfd_abs_section_ptr;
1343
0
    }
1344
0
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
0
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
0
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
0
    switch (ELF_ST_BIND (isym->st_info))
1352
0
      {
1353
0
      case STB_LOCAL:
1354
0
        sym->symbol.flags |= BSF_LOCAL;
1355
0
        break;
1356
0
      case STB_GLOBAL:
1357
0
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
0
    sym->symbol.flags |= BSF_GLOBAL;
1359
0
        break;
1360
0
      case STB_WEAK:
1361
0
        sym->symbol.flags |= BSF_WEAK;
1362
0
        break;
1363
0
      case STB_GNU_UNIQUE:
1364
0
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
0
        break;
1366
0
      }
1367
1368
0
    switch (ELF_ST_TYPE (isym->st_info))
1369
0
      {
1370
0
      case STT_SECTION:
1371
        /* Mark the input section symbol as used since it may be
1372
           used for relocation and section group.
1373
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1374
     be cleared by objcopy for non-relocatable inputs.  */
1375
0
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
0
            | BSF_DEBUGGING
1377
0
            | BSF_SECTION_SYM_USED);
1378
0
        break;
1379
0
      case STT_FILE:
1380
0
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
0
        break;
1382
0
      case STT_FUNC:
1383
0
        sym->symbol.flags |= BSF_FUNCTION;
1384
0
        break;
1385
0
      case STT_COMMON:
1386
        /* FIXME: Do we have to put the size field into the value field
1387
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1388
0
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
0
      case STT_OBJECT:
1391
0
        sym->symbol.flags |= BSF_OBJECT;
1392
0
        break;
1393
0
      case STT_TLS:
1394
0
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
0
        break;
1396
0
      case STT_RELC:
1397
0
        sym->symbol.flags |= BSF_RELC;
1398
0
        break;
1399
0
      case STT_SRELC:
1400
0
        sym->symbol.flags |= BSF_SRELC;
1401
0
        break;
1402
0
      case STT_GNU_IFUNC:
1403
0
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
0
        break;
1405
0
      }
1406
1407
0
    if (dynamic)
1408
0
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
0
    if (xver != NULL)
1411
0
      {
1412
0
        Elf_Internal_Versym iversym;
1413
1414
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1415
0
        sym->version = iversym.vs_vers;
1416
0
        xver++;
1417
0
      }
1418
1419
    /* Do some backend-specific processing on this symbol.  */
1420
0
    if (ebd->elf_backend_symbol_processing)
1421
0
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
0
  }
1423
0
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
0
  if (ebd->elf_backend_symbol_table_processing)
1427
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1428
1429
  /* We rely on the zalloc to clear out the final symbol entry.  */
1430
1431
0
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
0
  if (symptrs)
1435
0
    {
1436
0
      long l = symcount;
1437
1438
0
      sym = symbase;
1439
0
      while (l-- > 0)
1440
0
  {
1441
0
    *symptrs++ = &sym->symbol;
1442
0
    sym++;
1443
0
  }
1444
0
      *symptrs = 0;   /* Final null pointer */
1445
0
    }
1446
1447
0
  free (xverbuf);
1448
0
  if (hdr->contents != (unsigned char *) isymbuf)
1449
0
    free (isymbuf);
1450
0
  return symcount;
1451
1452
0
 error_return:
1453
0
  free (xverbuf);
1454
0
  if (hdr->contents != (unsigned char *) isymbuf)
1455
0
    free (isymbuf);
1456
0
  return -1;
1457
0
}
Unexecuted instantiation: bfd_elf64_slurp_symbol_table
Unexecuted instantiation: bfd_elf32_slurp_symbol_table
1458
1459
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1460
   them.  */
1461
1462
static bool
1463
elf_slurp_reloc_table_from_section (bfd *abfd,
1464
            asection *asect,
1465
            Elf_Internal_Shdr *rel_hdr,
1466
            bfd_size_type reloc_count,
1467
            arelent *relents,
1468
            asymbol **symbols,
1469
            bool dynamic)
1470
0
{
1471
0
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1472
0
  void *allocated = NULL;
1473
0
  bfd_byte *native_relocs;
1474
0
  arelent *relent;
1475
0
  unsigned int i;
1476
0
  int entsize;
1477
0
  unsigned int symcount;
1478
1479
0
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1480
0
    return false;
1481
0
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1482
0
  if (allocated == NULL)
1483
0
    return false;
1484
1485
0
  native_relocs = (bfd_byte *) allocated;
1486
1487
0
  entsize = rel_hdr->sh_entsize;
1488
0
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1489
0
        || entsize == sizeof (Elf_External_Rela));
1490
1491
0
  if (dynamic)
1492
0
    symcount = bfd_get_dynamic_symcount (abfd);
1493
0
  else
1494
0
    symcount = bfd_get_symcount (abfd);
1495
1496
0
  for (i = 0, relent = relents;
1497
0
       i < reloc_count;
1498
0
       i++, relent++, native_relocs += entsize)
1499
0
    {
1500
0
      bool res;
1501
0
      Elf_Internal_Rela rela;
1502
1503
0
      if (entsize == sizeof (Elf_External_Rela))
1504
0
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1505
0
      else
1506
0
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1507
1508
      /* The address of an ELF reloc is section relative for an object
1509
   file, and absolute for an executable file or shared library.
1510
   The address of a normal BFD reloc is always section relative,
1511
   and the address of a dynamic reloc is absolute..  */
1512
0
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1513
0
  relent->address = rela.r_offset;
1514
0
      else
1515
0
  relent->address = rela.r_offset - asect->vma;
1516
1517
0
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1518
  /* FIXME: This and the error case below mean that we have a
1519
     symbol on relocs that is not elf_symbol_type.  */
1520
0
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1521
0
      else if (ELF_R_SYM (rela.r_info) > symcount)
1522
0
  {
1523
0
    _bfd_error_handler
1524
      /* xgettext:c-format */
1525
0
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1526
0
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1527
0
    bfd_set_error (bfd_error_bad_value);
1528
0
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1529
0
  }
1530
0
      else
1531
0
  {
1532
0
    asymbol **ps;
1533
1534
0
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1535
1536
0
    relent->sym_ptr_ptr = ps;
1537
0
  }
1538
1539
0
      relent->addend = rela.r_addend;
1540
1541
0
      if ((entsize == sizeof (Elf_External_Rela)
1542
0
     && ebd->elf_info_to_howto != NULL)
1543
0
    || ebd->elf_info_to_howto_rel == NULL)
1544
0
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1545
0
      else
1546
0
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1547
1548
0
      if (! res || relent->howto == NULL)
1549
0
  goto error_return;
1550
0
    }
1551
1552
0
  free (allocated);
1553
0
  return true;
1554
1555
0
 error_return:
1556
0
  free (allocated);
1557
0
  return false;
1558
0
}
Unexecuted instantiation: elf64.c:elf_slurp_reloc_table_from_section
Unexecuted instantiation: elf32.c:elf_slurp_reloc_table_from_section
1559
1560
/* Read in and swap the external relocs.  */
1561
1562
bool
1563
elf_slurp_reloc_table (bfd *abfd,
1564
           asection *asect,
1565
           asymbol **symbols,
1566
           bool dynamic)
1567
0
{
1568
0
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1569
0
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1570
0
  Elf_Internal_Shdr *rel_hdr;
1571
0
  Elf_Internal_Shdr *rel_hdr2;
1572
0
  bfd_size_type reloc_count;
1573
0
  bfd_size_type reloc_count2;
1574
0
  arelent *relents;
1575
0
  size_t amt;
1576
1577
0
  if (asect->relocation != NULL)
1578
0
    return true;
1579
1580
0
  if (! dynamic)
1581
0
    {
1582
0
      if ((asect->flags & SEC_RELOC) == 0
1583
0
    || asect->reloc_count == 0)
1584
0
  return true;
1585
1586
0
      rel_hdr = d->rel.hdr;
1587
0
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1588
0
      rel_hdr2 = d->rela.hdr;
1589
0
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1590
1591
      /* PR 17512: file: 0b4f81b7.  */
1592
0
      if (asect->reloc_count != reloc_count + reloc_count2)
1593
0
  return false;
1594
0
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1595
0
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1596
1597
0
    }
1598
0
  else
1599
0
    {
1600
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1601
   case because relocations against this section may use the
1602
   dynamic symbol table, and in that case bfd_section_from_shdr
1603
   in elf.c does not update the RELOC_COUNT.  */
1604
0
      if (asect->size == 0)
1605
0
  return true;
1606
1607
0
      rel_hdr = &d->this_hdr;
1608
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1609
0
      rel_hdr2 = NULL;
1610
0
      reloc_count2 = 0;
1611
0
    }
1612
1613
0
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1614
0
    {
1615
0
      bfd_set_error (bfd_error_file_too_big);
1616
0
      return false;
1617
0
    }
1618
0
  relents = (arelent *) bfd_alloc (abfd, amt);
1619
0
  if (relents == NULL)
1620
0
    return false;
1621
1622
0
  if (rel_hdr
1623
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1624
0
                rel_hdr, reloc_count,
1625
0
                relents,
1626
0
                symbols, dynamic))
1627
0
    return false;
1628
1629
0
  if (rel_hdr2
1630
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1631
0
                rel_hdr2, reloc_count2,
1632
0
                relents + reloc_count,
1633
0
                symbols, dynamic))
1634
0
    return false;
1635
1636
0
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1637
0
    return false;
1638
1639
0
  asect->relocation = relents;
1640
0
  return true;
1641
0
}
Unexecuted instantiation: bfd_elf64_slurp_reloc_table
Unexecuted instantiation: bfd_elf32_slurp_reloc_table
1642
1643
#if DEBUG & 2
1644
static void
1645
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1646
{
1647
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1648
     hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1649
     (long) hdr);
1650
  fprintf (stderr,
1651
     "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1652
     (long) hdr->sh_name,
1653
     (long) hdr->sh_type,
1654
     (long) hdr->sh_flags);
1655
  fprintf (stderr,
1656
     "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1657
     (long) hdr->sh_addr,
1658
     (long) hdr->sh_offset,
1659
     (long) hdr->sh_size);
1660
  fprintf (stderr,
1661
     "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1662
     (long) hdr->sh_link,
1663
     (long) hdr->sh_info,
1664
     (long) hdr->sh_addralign);
1665
  fprintf (stderr, "sh_entsize   = %ld\n",
1666
     (long) hdr->sh_entsize);
1667
  fflush (stderr);
1668
}
1669
#endif
1670
1671
#if DEBUG & 1
1672
static void
1673
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1674
{
1675
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1676
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1677
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1678
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1679
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1680
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1681
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1682
}
1683
#endif
1684

1685
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1686
   reconstruct an ELF file by reading the segments out of remote
1687
   memory based on the ELF file header at EHDR_VMA and the ELF program
1688
   headers it points to.  If non-zero, SIZE is the known extent of the
1689
   object.  If not null, *LOADBASEP is filled in with the difference
1690
   between the VMAs from which the segments were read, and the VMAs
1691
   the file headers (and hence BFD's idea of each section's VMA) put
1692
   them at.
1693
1694
   The function TARGET_READ_MEMORY is called to copy LEN bytes from
1695
   the remote memory at target address VMA into the local buffer at
1696
   MYADDR; it should return zero on success or an `errno' code on
1697
   failure.  TEMPL must be a BFD for a target with the word size and
1698
   byte order found in the remote memory.  */
1699
1700
bfd *
1701
NAME(_bfd_elf,bfd_from_remote_memory)
1702
  (bfd *templ,
1703
   bfd_vma ehdr_vma    /* Bytes.  */,
1704
   bfd_size_type size  /* Octets.  */,
1705
   bfd_vma *loadbasep  /* Bytes.  */,
1706
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1707
                          /* (Bytes  ,           , octets       ).  */
1708
0
{
1709
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1710
0
  Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1711
0
  Elf_External_Phdr *x_phdrs;
1712
0
  Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
1713
0
  bfd *nbfd;
1714
0
  struct bfd_in_memory *bim;
1715
0
  bfd_byte *contents;
1716
0
  int err;
1717
0
  unsigned int i;
1718
0
  bfd_vma high_offset;
1719
0
  bfd_vma shdr_end;
1720
0
  bfd_vma loadbase;  /* Bytes.  */
1721
0
  size_t amt;
1722
0
  unsigned int opb = bfd_octets_per_byte (templ, NULL);
1723
1724
  /* Read in the ELF header in external format.  */
1725
0
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1726
0
  if (err)
1727
0
    {
1728
0
      bfd_set_error (bfd_error_system_call);
1729
0
      errno = err;
1730
0
      return NULL;
1731
0
    }
1732
1733
  /* Now check to see if we have a valid ELF file, and one that BFD can
1734
     make use of.  The magic number must match, the address size ('class')
1735
     and byte-swapping must match our XVEC entry.  */
1736
1737
0
  if (! elf_file_p (&x_ehdr)
1738
0
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1739
0
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1740
0
    {
1741
0
      bfd_set_error (bfd_error_wrong_format);
1742
0
      return NULL;
1743
0
    }
1744
1745
  /* Check that file's byte order matches xvec's */
1746
0
  switch (x_ehdr.e_ident[EI_DATA])
1747
0
    {
1748
0
    case ELFDATA2MSB:   /* Big-endian */
1749
0
      if (! bfd_header_big_endian (templ))
1750
0
  {
1751
0
    bfd_set_error (bfd_error_wrong_format);
1752
0
    return NULL;
1753
0
  }
1754
0
      break;
1755
0
    case ELFDATA2LSB:   /* Little-endian */
1756
0
      if (! bfd_header_little_endian (templ))
1757
0
  {
1758
0
    bfd_set_error (bfd_error_wrong_format);
1759
0
    return NULL;
1760
0
  }
1761
0
      break;
1762
0
    case ELFDATANONE:   /* No data encoding specified */
1763
0
    default:      /* Unknown data encoding specified */
1764
0
      bfd_set_error (bfd_error_wrong_format);
1765
0
      return NULL;
1766
0
    }
1767
1768
0
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1769
1770
  /* The file header tells where to find the program headers.
1771
     These are what we use to actually choose what to read.  */
1772
1773
0
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1774
0
    {
1775
0
      bfd_set_error (bfd_error_wrong_format);
1776
0
      return NULL;
1777
0
    }
1778
1779
0
  if (_bfd_mul_overflow (i_ehdr.e_phnum,
1780
0
       sizeof (*x_phdrs) + sizeof (*i_phdrs), &amt))
1781
0
    {
1782
0
      bfd_set_error (bfd_error_file_too_big);
1783
0
      return NULL;
1784
0
    }
1785
0
  x_phdrs = (Elf_External_Phdr *) bfd_malloc (amt);
1786
0
  if (x_phdrs == NULL)
1787
0
    return NULL;
1788
0
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1789
0
          i_ehdr.e_phnum * sizeof x_phdrs[0]);
1790
0
  if (err)
1791
0
    {
1792
0
      free (x_phdrs);
1793
0
      bfd_set_error (bfd_error_system_call);
1794
0
      errno = err;
1795
0
      return NULL;
1796
0
    }
1797
0
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1798
1799
0
  high_offset = 0;
1800
0
  loadbase = 0;
1801
0
  first_phdr = NULL;
1802
0
  last_phdr = NULL;
1803
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1804
0
    {
1805
0
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1806
0
      if (i_phdrs[i].p_type == PT_LOAD)
1807
0
  {
1808
0
    bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
1809
1810
0
    if (segment_end > high_offset)
1811
0
      {
1812
0
        high_offset = segment_end;
1813
0
        last_phdr = &i_phdrs[i];
1814
0
      }
1815
1816
    /* If this program header covers offset zero, where the file
1817
       header sits, then we can figure out the loadbase.  */
1818
0
    if (first_phdr == NULL)
1819
0
      {
1820
0
        bfd_vma p_offset = i_phdrs[i].p_offset;  /* Octets.  */
1821
0
        bfd_vma p_vaddr = i_phdrs[i].p_vaddr;    /* Octets.  */
1822
1823
0
        if (i_phdrs[i].p_align > 1)
1824
0
    {
1825
0
      p_offset &= -(i_phdrs[i].p_align * opb);
1826
0
      p_vaddr &= -(i_phdrs[i].p_align * opb);
1827
0
    }
1828
0
        if (p_offset == 0)
1829
0
    {
1830
0
      loadbase = ehdr_vma - p_vaddr / opb;
1831
0
      first_phdr = &i_phdrs[i];
1832
0
    }
1833
0
      }
1834
0
  }
1835
0
    }
1836
0
  if (high_offset == 0)
1837
0
    {
1838
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1839
0
      free (x_phdrs);
1840
0
      bfd_set_error (bfd_error_wrong_format);
1841
0
      return NULL;
1842
0
    }
1843
1844
0
  shdr_end = 0;
1845
0
  if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
1846
0
    {
1847
0
      shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1848
1849
0
      if (last_phdr->p_filesz != last_phdr->p_memsz)
1850
0
  {
1851
    /* If the last PT_LOAD header has a bss area then ld.so will
1852
       have cleared anything past p_filesz, zapping the section
1853
       headers.  */
1854
0
  }
1855
0
      else if (size >= shdr_end)
1856
0
  high_offset = size;
1857
0
      else
1858
0
  {
1859
0
    bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
1860
0
    bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
1861
1862
    /* Assume we loaded full pages, allowing us to sometimes see
1863
       section headers.  */
1864
0
    if (page_size > 1 && shdr_end > segment_end)
1865
0
      {
1866
0
        bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
1867
1868
0
        if (page_end >= shdr_end)
1869
    /* Whee, section headers covered.  */
1870
0
    high_offset = shdr_end;
1871
0
      }
1872
0
  }
1873
0
    }
1874
1875
  /* Now we know the size of the whole image we want read in.  */
1876
0
  contents = (bfd_byte *) bfd_zmalloc (high_offset);
1877
0
  if (contents == NULL)
1878
0
    {
1879
0
      free (x_phdrs);
1880
0
      return NULL;
1881
0
    }
1882
1883
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1884
0
    if (i_phdrs[i].p_type == PT_LOAD)
1885
0
      {
1886
0
  bfd_vma start = i_phdrs[i].p_offset;         /* Octets.  */
1887
0
  bfd_vma end = start + i_phdrs[i].p_filesz;   /* Octets.  */
1888
0
  bfd_vma vaddr = i_phdrs[i].p_vaddr;          /* Octets.  */
1889
1890
  /* Extend the beginning of the first pt_load to cover file
1891
     header and program headers, if we proved earlier that its
1892
     aligned offset is 0.  */
1893
0
  if (first_phdr == &i_phdrs[i])
1894
0
    {
1895
0
      vaddr -= start;
1896
0
      start = 0;
1897
0
    }
1898
  /* Extend the end of the last pt_load to cover section headers.  */
1899
0
  if (last_phdr == &i_phdrs[i])
1900
0
    end = high_offset;
1901
0
  err = target_read_memory (loadbase + vaddr / opb,
1902
0
          contents + start, end - start);
1903
0
  if (err)
1904
0
    {
1905
0
      free (x_phdrs);
1906
0
      free (contents);
1907
0
      bfd_set_error (bfd_error_system_call);
1908
0
      errno = err;
1909
0
      return NULL;
1910
0
    }
1911
0
      }
1912
0
  free (x_phdrs);
1913
1914
  /* If the segments visible in memory didn't include the section headers,
1915
     then clear them from the file header.  */
1916
0
  if (high_offset < shdr_end)
1917
0
    {
1918
0
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1919
0
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1920
0
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1921
0
    }
1922
1923
  /* This will normally have been in the first PT_LOAD segment.  But it
1924
     conceivably could be missing, and we might have just changed it.  */
1925
0
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1926
1927
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1928
0
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1929
0
  if (bim == NULL)
1930
0
    {
1931
0
      free (contents);
1932
0
      return NULL;
1933
0
    }
1934
0
  nbfd = _bfd_new_bfd ();
1935
0
  if (nbfd == NULL
1936
0
      || !bfd_set_filename (nbfd, "<in-memory>"))
1937
0
    {
1938
0
      free (bim);
1939
0
      free (contents);
1940
0
      return NULL;
1941
0
    }
1942
0
  nbfd->xvec = templ->xvec;
1943
0
  bim->size = high_offset;
1944
0
  bim->buffer = contents;
1945
0
  nbfd->iostream = bim;
1946
0
  nbfd->flags = BFD_IN_MEMORY;
1947
0
  nbfd->iovec = &_bfd_memory_iovec;
1948
0
  nbfd->origin = 0;
1949
0
  nbfd->direction = read_direction;
1950
0
  nbfd->mtime = time (NULL);
1951
0
  nbfd->mtime_set = true;
1952
1953
0
  if (loadbasep)
1954
0
    *loadbasep = loadbase;
1955
0
  return nbfd;
1956
0
}
Unexecuted instantiation: _bfd_elf64_bfd_from_remote_memory
Unexecuted instantiation: _bfd_elf32_bfd_from_remote_memory
1957
1958
/* Function for ELF_R_INFO.  */
1959
1960
bfd_vma
1961
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
1962
0
{
1963
0
  return ELF_R_INFO (sym, type);
1964
0
}
Unexecuted instantiation: elf64_r_info
Unexecuted instantiation: elf32_r_info
1965
1966
/* Function for ELF_R_SYM.  */
1967
1968
bfd_vma
1969
NAME(elf,r_sym) (bfd_vma r_info)
1970
0
{
1971
0
  return ELF_R_SYM (r_info);
1972
0
}
Unexecuted instantiation: elf64_r_sym
Unexecuted instantiation: elf32_r_sym
1973

1974
#include "elfcore.h"
1975

1976
/* Size-dependent data and functions.  */
1977
const struct elf_size_info NAME(_bfd_elf,size_info) = {
1978
  sizeof (Elf_External_Ehdr),
1979
  sizeof (Elf_External_Phdr),
1980
  sizeof (Elf_External_Shdr),
1981
  sizeof (Elf_External_Rel),
1982
  sizeof (Elf_External_Rela),
1983
  sizeof (Elf_External_Sym),
1984
  sizeof (Elf_External_Dyn),
1985
  sizeof (Elf_External_Note),
1986
  4,
1987
  1,
1988
  ARCH_SIZE, LOG_FILE_ALIGN,
1989
  ELFCLASS, EV_CURRENT,
1990
  elf_write_out_phdrs,
1991
  elf_write_shdrs_and_ehdr,
1992
  elf_checksum_contents,
1993
  elf_write_relocs,
1994
  elf_swap_symbol_in,
1995
  elf_swap_symbol_out,
1996
  elf_slurp_reloc_table,
1997
  elf_slurp_symbol_table,
1998
  elf_swap_dyn_in,
1999
  elf_swap_dyn_out,
2000
  elf_swap_reloc_in,
2001
  elf_swap_reloc_out,
2002
  elf_swap_reloca_in,
2003
  elf_swap_reloca_out
2004
};