Coverage Report

Created: 2023-08-28 06:30

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