Coverage Report

Created: 2023-08-28 06:25

/src/binutils-gdb/bfd/elfcode.h
Line
Count
Source (jump to first uncovered line)
1
/* ELF executable support for BFD.
2
   Copyright (C) 1991-2023 Free Software Foundation, Inc.
3
4
   Written by Fred Fish @ Cygnus Support, from information published
5
   in "UNIX System V Release 4, Programmers Guide: ANSI C and
6
   Programming Support Tools".  Sufficient support for gdb.
7
8
   Rewritten by Mark Eichin @ Cygnus Support, from information
9
   published in "System V Application Binary Interface", chapters 4
10
   and 5, as well as the various "Processor Supplement" documents
11
   derived from it. Added support for assembler and other object file
12
   utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
13
   Meissner (Open Software Foundation), and Peter Hoogenboom (University
14
   of Utah) to finish and extend this.
15
16
   This file is part of BFD, the Binary File Descriptor library.
17
18
   This program is free software; you can redistribute it and/or modify
19
   it under the terms of the GNU General Public License as published by
20
   the Free Software Foundation; either version 3 of the License, or
21
   (at your option) any later version.
22
23
   This program is distributed in the hope that it will be useful,
24
   but WITHOUT ANY WARRANTY; without even the implied warranty of
25
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
   GNU General Public License for more details.
27
28
   You should have received a copy of the GNU General Public License
29
   along with this program; if not, write to the Free Software
30
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
31
   MA 02110-1301, USA.  */
32
33
34
/* Problems and other issues to resolve.
35
36
   (1)  BFD expects there to be some fixed number of "sections" in
37
  the object file.  I.E. there is a "section_count" variable in the
38
  bfd structure which contains the number of sections.  However, ELF
39
  supports multiple "views" of a file.  In particular, with current
40
  implementations, executable files typically have two tables, a
41
  program header table and a section header table, both of which
42
  partition the executable.
43
44
  In ELF-speak, the "linking view" of the file uses the section header
45
  table to access "sections" within the file, and the "execution view"
46
  uses the program header table to access "segments" within the file.
47
  "Segments" typically may contain all the data from one or more
48
  "sections".
49
50
  Note that the section header table is optional in ELF executables,
51
  but it is this information that is most useful to gdb.  If the
52
  section header table is missing, then gdb should probably try
53
  to make do with the program header table.  (FIXME)
54
55
   (2)  The code in this file is compiled twice, once in 32-bit mode and
56
  once in 64-bit mode.  More of it should be made size-independent
57
  and moved into elf.c.
58
59
   (3)  ELF section symbols are handled rather sloppily now.  This should
60
  be cleaned up, and ELF section symbols reconciled with BFD section
61
  symbols.
62
63
   (4)  We need a published spec for 64-bit ELF.  We've got some stuff here
64
  that we're using for SPARC V9 64-bit chips, but don't assume that
65
  it's cast in stone.
66
 */
67
68
#include "sysdep.h"
69
#include "bfd.h"
70
#include "libiberty.h"
71
#include "bfdlink.h"
72
#include "libbfd.h"
73
#include "elf-bfd.h"
74
#include "libiberty.h"
75
76
/* Renaming structures, typedefs, macros and functions to be size-specific.  */
77
2.58M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
0
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
2.58M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
28.2k
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
0
#define Elf_External_Rela NAME(Elf,External_Rela)
83
0
#define Elf_External_Dyn  NAME(Elf,External_Dyn)
84
85
#define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command)
86
#define elf_core_file_failing_signal  NAME(bfd_elf,core_file_failing_signal)
87
#define elf_core_file_matches_executable_p \
88
  NAME(bfd_elf,core_file_matches_executable_p)
89
#define elf_core_file_pid   NAME(bfd_elf,core_file_pid)
90
#define elf_object_p      NAME(bfd_elf,object_p)
91
#define elf_core_file_p     NAME(bfd_elf,core_file_p)
92
#define elf_get_symtab_upper_bound  NAME(bfd_elf,get_symtab_upper_bound)
93
#define elf_get_dynamic_symtab_upper_bound \
94
  NAME(bfd_elf,get_dynamic_symtab_upper_bound)
95
0
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
311k
#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
28.1k
#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
917k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
106k
#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
10
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
417k
#define ELFCLASS  ELFCLASS32
142
#define FILE_ALIGN  4
143
#define LOG_FILE_ALIGN  2
144
#endif
145
146
#if DEBUG & 2
147
static void elf_debug_section (int, Elf_Internal_Shdr *);
148
#endif
149
#if DEBUG & 1
150
static void elf_debug_file (Elf_Internal_Ehdr *);
151
#endif
152

153
/* Structure swapping routines */
154
155
/* Should perhaps use put_offset, put_word, etc.  For now, the two versions
156
   can be handled by explicitly specifying 32 bits or "the long type".  */
157
#if ARCH_SIZE == 64
158
0
#define H_PUT_WORD    H_PUT_64
159
0
#define H_PUT_SIGNED_WORD H_PUT_S64
160
1.81M
#define H_GET_WORD    H_GET_64
161
330k
#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
828k
#define H_GET_WORD    H_GET_32
167
13.4k
#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
367k
{
179
367k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
367k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
367k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
367k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
367k
  if (signed_vma)
185
5.58k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
362k
  else
187
362k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
367k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
367k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
367k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
367k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
367k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
4.22k
    {
194
4.22k
      if (shndx == NULL)
195
26
  return false;
196
4.20k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
4.20k
    }
198
363k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
10.3k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
367k
  dst->st_target_internal = 0;
201
367k
  return true;
202
367k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
222k
{
179
222k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
222k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
222k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
222k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
222k
  if (signed_vma)
185
4.35k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
218k
  else
187
218k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
222k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
222k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
222k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
222k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
222k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
4.21k
    {
194
4.21k
      if (shndx == NULL)
195
17
  return false;
196
4.19k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
4.19k
    }
198
218k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
2.73k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
222k
  dst->st_target_internal = 0;
201
222k
  return true;
202
222k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
144k
{
179
144k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
144k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
144k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
144k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
144k
  if (signed_vma)
185
1.23k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
143k
  else
187
143k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
144k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
144k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
144k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
144k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
144k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
15
    {
194
15
      if (shndx == NULL)
195
9
  return false;
196
6
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
6
    }
198
144k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
7.60k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
144k
  dst->st_target_internal = 0;
201
144k
  return true;
202
144k
}
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
137k
{
239
137k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
137k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
137k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
137k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
137k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
137k
  if (signed_vma)
245
15.1k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
121k
  else
247
121k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
137k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
137k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
137k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
137k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
137k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
137k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
137k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
137k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
137k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
137k
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
33.0k
{
239
33.0k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
33.0k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
33.0k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
33.0k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
33.0k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
33.0k
  if (signed_vma)
245
4.28k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
28.7k
  else
247
28.7k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
33.0k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
33.0k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
33.0k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
33.0k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
33.0k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
33.0k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
33.0k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
33.0k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
33.0k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
33.0k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
104k
{
239
104k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
104k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
104k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
104k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
104k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
104k
  if (signed_vma)
245
10.8k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
93.1k
  else
247
93.1k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
104k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
104k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
104k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
104k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
104k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
104k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
104k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
104k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
104k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
104k
}
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
122k
{
319
122k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
122k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
122k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
122k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
122k
  if (signed_vma)
325
9.82k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
112k
  else
327
112k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
122k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
122k
  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
122k
  if (dst->sh_type != SHT_NOBITS)
334
120k
    {
335
120k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
120k
      if (filesize != 0
338
120k
    && ((ufile_ptr) dst->sh_offset > filesize
339
120k
        || dst->sh_size > filesize - dst->sh_offset)
340
120k
    && !abfd->read_only)
341
3.37k
  {
342
3.37k
    _bfd_error_handler (_("warning: %pB has a section "
343
3.37k
        "extending past end of file"), abfd);
344
3.37k
    abfd->read_only = 1;
345
3.37k
  }
346
120k
    }
347
122k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
122k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
122k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
122k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
122k
  dst->bfd_section = NULL;
352
122k
  dst->contents = NULL;
353
122k
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
100k
{
319
100k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
100k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
100k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
100k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
100k
  if (signed_vma)
325
9.12k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
91.4k
  else
327
91.4k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
100k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
100k
  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
100k
  if (dst->sh_type != SHT_NOBITS)
334
99.5k
    {
335
99.5k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
99.5k
      if (filesize != 0
338
99.5k
    && ((ufile_ptr) dst->sh_offset > filesize
339
99.5k
        || dst->sh_size > filesize - dst->sh_offset)
340
99.5k
    && !abfd->read_only)
341
2.79k
  {
342
2.79k
    _bfd_error_handler (_("warning: %pB has a section "
343
2.79k
        "extending past end of file"), abfd);
344
2.79k
    abfd->read_only = 1;
345
2.79k
  }
346
99.5k
    }
347
100k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
100k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
100k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
100k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
100k
  dst->bfd_section = NULL;
352
100k
  dst->contents = NULL;
353
100k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
21.5k
{
319
21.5k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
21.5k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
21.5k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
21.5k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
21.5k
  if (signed_vma)
325
704
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
20.8k
  else
327
20.8k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
21.5k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
21.5k
  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
21.5k
  if (dst->sh_type != SHT_NOBITS)
334
20.9k
    {
335
20.9k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
20.9k
      if (filesize != 0
338
20.9k
    && ((ufile_ptr) dst->sh_offset > filesize
339
20.9k
        || dst->sh_size > filesize - dst->sh_offset)
340
20.9k
    && !abfd->read_only)
341
585
  {
342
585
    _bfd_error_handler (_("warning: %pB has a section "
343
585
        "extending past end of file"), abfd);
344
585
    abfd->read_only = 1;
345
585
  }
346
20.9k
    }
347
21.5k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
21.5k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
21.5k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
21.5k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
21.5k
  dst->bfd_section = NULL;
352
21.5k
  dst->contents = NULL;
353
21.5k
}
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
28.1k
{
384
28.1k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
28.1k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
28.1k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
28.1k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
28.1k
  if (signed_vma)
390
615
    {
391
615
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
615
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
615
    }
394
27.5k
  else
395
27.5k
    {
396
27.5k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
27.5k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
27.5k
    }
399
28.1k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
28.1k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
28.1k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
28.1k
}
bfd_elf64_swap_phdr_in
Line
Count
Source
383
10.1k
{
384
10.1k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
10.1k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
10.1k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
10.1k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
10.1k
  if (signed_vma)
390
301
    {
391
301
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
301
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
301
    }
394
9.80k
  else
395
9.80k
    {
396
9.80k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
9.80k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
9.80k
    }
399
10.1k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
10.1k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
10.1k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
10.1k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
383
18.0k
{
384
18.0k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
18.0k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
18.0k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
18.0k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
18.0k
  if (signed_vma)
390
314
    {
391
314
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
314
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
314
    }
394
17.7k
  else
395
17.7k
    {
396
17.7k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
17.7k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
17.7k
    }
399
18.0k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
18.0k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
18.0k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
18.0k
}
403
404
void
405
elf_swap_phdr_out (bfd *abfd,
406
       const Elf_Internal_Phdr *src,
407
       Elf_External_Phdr *dst)
408
0
{
409
0
  const struct elf_backend_data *bed;
410
0
  bfd_vma p_paddr;
411
412
0
  bed = get_elf_backend_data (abfd);
413
0
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
414
415
  /* note that all elements of dst are *arrays of unsigned char* already...  */
416
0
  H_PUT_32 (abfd, src->p_type, dst->p_type);
417
0
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
418
0
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
419
0
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
420
0
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
421
0
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
422
0
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
423
0
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
424
0
}
Unexecuted instantiation: bfd_elf64_swap_phdr_out
Unexecuted instantiation: bfd_elf32_swap_phdr_out
425
426
/* Translate an ELF reloc from external format to internal format.  */
427
void
428
elf_swap_reloc_in (bfd *abfd,
429
       const bfd_byte *s,
430
       Elf_Internal_Rela *dst)
431
0
{
432
0
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
433
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
434
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
435
0
  dst->r_addend = 0;
436
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
Unexecuted instantiation: bfd_elf32_swap_reloc_in
437
438
void
439
elf_swap_reloca_in (bfd *abfd,
440
        const bfd_byte *s,
441
        Elf_Internal_Rela *dst)
442
311k
{
443
311k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
311k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
311k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
311k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
311k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
442
311k
{
443
311k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
311k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
311k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
311k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
311k
}
Unexecuted instantiation: bfd_elf32_swap_reloca_in
448
449
/* Translate an ELF reloc from internal format to external format.  */
450
void
451
elf_swap_reloc_out (bfd *abfd,
452
        const Elf_Internal_Rela *src,
453
        bfd_byte *d)
454
0
{
455
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
456
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
457
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
458
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
459
460
void
461
elf_swap_reloca_out (bfd *abfd,
462
         const Elf_Internal_Rela *src,
463
         bfd_byte *d)
464
0
{
465
0
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
466
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
467
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
468
0
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
469
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_out
Unexecuted instantiation: bfd_elf32_swap_reloca_out
470
471
void
472
elf_swap_dyn_in (bfd *abfd,
473
     const void *p,
474
     Elf_Internal_Dyn *dst)
475
1.23k
{
476
1.23k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
477
478
1.23k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
479
1.23k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
480
1.23k
}
Unexecuted instantiation: bfd_elf64_swap_dyn_in
bfd_elf32_swap_dyn_in
Line
Count
Source
475
1.23k
{
476
1.23k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
477
478
1.23k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
479
1.23k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
480
1.23k
}
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
2.21M
{
503
2.21M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
2.21M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
2.21M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
2.21M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
2.21M
}
elf64.c:elf_file_p
Line
Count
Source
502
504k
{
503
504k
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
504k
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
504k
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
504k
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
504k
}
elf32.c:elf_file_p
Line
Count
Source
502
1.70M
{
503
1.70M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
1.70M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
1.70M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
1.70M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
1.70M
}
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
2.58M
{
520
2.58M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
2.58M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
2.58M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
2.58M
  Elf_Internal_Shdr i_shdr;
524
2.58M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
2.58M
  unsigned int shindex;
526
2.58M
  const struct elf_backend_data *ebd;
527
2.58M
  asection *s;
528
2.58M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
2.58M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
368k
    {
534
368k
      if (bfd_get_error () != bfd_error_system_call)
535
368k
  goto got_wrong_format_error;
536
356
      else
537
356
  goto got_no_match;
538
368k
    }
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
2.21M
  if (! elf_file_p (&x_ehdr)
547
2.21M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
2.21M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
1.93M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
279k
  switch (x_ehdr.e_ident[EI_DATA])
553
279k
    {
554
39.3k
    case ELFDATA2MSB:   /* Big-endian */
555
39.3k
      if (! bfd_header_big_endian (abfd))
556
20.2k
  goto got_wrong_format_error;
557
19.1k
      break;
558
230k
    case ELFDATA2LSB:   /* Little-endian */
559
230k
      if (! bfd_header_little_endian (abfd))
560
112k
  goto got_wrong_format_error;
561
117k
      break;
562
117k
    case ELFDATANONE:   /* No data encoding specified */
563
9.78k
    default:      /* Unknown data encoding specified */
564
9.78k
      goto got_wrong_format_error;
565
279k
    }
566
567
137k
  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
137k
  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
137k
  i_ehdrp = elf_elfheader (abfd);
577
137k
  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
137k
  if (i_ehdrp->e_type == ET_CORE)
584
1.54k
    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
135k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
1.89k
    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
133k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
37.9k
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
95.6k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
91
    goto got_wrong_format_error;
600
601
95.5k
  ebd = get_elf_backend_data (abfd);
602
95.5k
  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
95.5k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
95.5k
      && (ebd->elf_machine_alt1 == 0
609
90.2k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
95.5k
      && (ebd->elf_machine_alt2 == 0
611
90.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
95.5k
      && ebd->elf_machine_code != EM_NONE)
613
88.1k
    goto got_wrong_format_error;
614
615
7.33k
  if (i_ehdrp->e_type == ET_EXEC)
616
2.02k
    abfd->flags |= EXEC_P;
617
5.30k
  else if (i_ehdrp->e_type == ET_DYN)
618
292
    abfd->flags |= DYNAMIC;
619
620
7.33k
  if (i_ehdrp->e_phnum > 0)
621
2.50k
    abfd->flags |= D_PAGED;
622
623
7.33k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
2.17k
    {
625
      /* It's OK if this fails for the generic target.  */
626
2.17k
      if (ebd->elf_machine_code != EM_NONE)
627
1
  goto got_no_match;
628
2.17k
    }
629
630
7.32k
  if (ebd->elf_machine_code != EM_NONE
631
7.32k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
7.32k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
1.21k
    goto got_wrong_format_error;
634
635
6.11k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
5.10k
    {
637
5.10k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
5.10k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
232
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
4.87k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
648
  goto got_no_match;
647
4.22k
      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
4.22k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
684
  {
653
684
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
684
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
684
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
684
        || i_ehdrp->e_shnum  == 0)
657
120
      goto got_wrong_format_error;
658
684
  }
659
660
      /* And similarly for the string table index.  */
661
4.10k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
96
  {
663
96
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
96
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
96
  }
667
668
      /* And program headers.  */
669
4.10k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
54
  {
671
54
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
54
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
54
  }
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
4.10k
      if (i_ehdrp->e_shnum != 1)
679
4.05k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
4.05k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
4.05k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
118
      goto got_wrong_format_error;
684
685
3.93k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
3.93k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
3.93k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
3.93k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
133
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
3.80k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
3.80k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
3.80k
  }
699
4.10k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
4.86k
  if (i_ehdrp->e_shnum != 0)
704
3.85k
    {
705
3.85k
      Elf_Internal_Shdr *shdrp;
706
3.85k
      unsigned int num_sec;
707
3.85k
      size_t amt;
708
709
3.85k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
3.85k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
3.85k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
3.85k
      num_sec = i_ehdrp->e_shnum;
715
3.85k
      elf_numsections (abfd) = num_sec;
716
3.85k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
3.85k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
3.85k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
3.85k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
3.85k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
3.85k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
135k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
131k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
121k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
117k
  {
733
117k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
117k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
117k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
1.05k
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
1.05k
        switch (ebd->elf_machine_code)
743
1.05k
    {
744
12
    case EM_386:
745
14
    case EM_IAMCU:
746
771
    case EM_X86_64:
747
771
    case EM_OLD_SPARCV9:
748
771
    case EM_SPARC32PLUS:
749
783
    case EM_SPARCV9:
750
813
    case EM_SPARC:
751
813
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
813
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
665
        break;
754
      /* Otherwise fall through.  */
755
385
    default:
756
385
      goto got_wrong_format_error;
757
1.05k
    }
758
1.05k
      }
759
760
117k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
117k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
117k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
117k
        && i_shdrp[shindex].sh_info >= num_sec)
764
61
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
117k
    if (i_shdrp[shindex].sh_size != 0
769
117k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
117k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
117k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
44.6k
       % ebd->minpagesize)
773
44.6k
      != 0))
774
23.5k
      abfd->flags &= ~D_PAGED;
775
117k
  }
776
777
3.40k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
3.40k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
182
  {
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
182
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
182
    if (!abfd->read_only)
788
36
      {
789
36
        _bfd_error_handler
790
36
    (_("warning: %pB has a corrupt string table index"), abfd);
791
36
        abfd->read_only = 1;
792
36
      }
793
182
  }
794
3.40k
    }
795
1.01k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
47
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
4.37k
  if (i_ehdrp->e_phnum == 0)
800
2.87k
    elf_tdata (abfd)->phdr = NULL;
801
1.50k
  else
802
1.50k
    {
803
1.50k
      Elf_Internal_Phdr *i_phdr;
804
1.50k
      unsigned int i;
805
1.50k
      ufile_ptr filesize;
806
1.50k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
1.50k
      filesize = bfd_get_file_size (abfd);
811
1.50k
      if (filesize != 0
812
1.50k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
61
  goto got_wrong_format_error;
814
1.44k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
1.44k
      elf_tdata (abfd)->phdr
817
1.44k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
1.44k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
1.44k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
10
  goto got_no_match;
822
1.43k
      bool eu_strip_broken_phdrs = false;
823
1.43k
      i_phdr = elf_tdata (abfd)->phdr;
824
29.5k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
28.2k
  {
826
28.2k
    Elf_External_Phdr x_phdr;
827
828
28.2k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
86
      goto got_no_match;
830
28.1k
    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
28.1k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
16.9k
      {
835
16.9k
        i_phdr->p_align &= -i_phdr->p_align;
836
16.9k
        if (!abfd->read_only)
837
623
    {
838
623
      _bfd_error_handler (_("warning: %pB has a program header "
839
623
          "with invalid alignment"), abfd);
840
623
      abfd->read_only = 1;
841
623
    }
842
16.9k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
28.1k
    if (i_phdr->p_filesz != 0
846
28.1k
        && (i_phdr->p_filesz > filesize
847
22.9k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
15.1k
      eu_strip_broken_phdrs = true;
849
28.1k
  }
850
1.34k
      if (!eu_strip_broken_phdrs
851
1.34k
    && i_ehdrp->e_shoff == 0
852
1.34k
    && i_ehdrp->e_shstrndx == 0)
853
96
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
96
    i_phdr = elf_tdata (abfd)->phdr;
857
544
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
525
      if (i_phdr->p_type == PT_DYNAMIC)
859
77
        {
860
77
    if (i_phdr->p_filesz != 0
861
77
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
60
                  elf_tdata (abfd)->phdr,
863
60
                  i_ehdrp->e_phnum,
864
60
                  filesize))
865
60
      goto got_no_match;
866
17
    break;
867
77
        }
868
96
  }
869
1.34k
    }
870
871
4.15k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
3.22k
    {
873
3.22k
      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
3.22k
      num_sec = elf_numsections (abfd);
879
93.6k
      for (shindex = 1; shindex < num_sec; shindex++)
880
91.5k
  if (!bfd_section_from_shdr (abfd, shindex))
881
1.14k
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
2.08k
      if (! _bfd_elf_setup_sections (abfd))
885
125
  goto got_wrong_format_error;
886
2.08k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
2.89k
  if (ebd->elf_backend_object_p)
891
1.80k
    {
892
1.80k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
94
  goto got_wrong_format_error;
894
1.80k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
2.79k
  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
52.7k
  for (s = abfd->sections; s != NULL; s = s->next)
902
50.0k
    {
903
50.0k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
50.0k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
50.0k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
1.74k
  {
907
1.74k
    unsigned long targ_index;
908
1.74k
    asection *targ_sec;
909
910
1.74k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
1.74k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
1.74k
    if (targ_sec != NULL
913
1.74k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
66
      s->flags |= SEC_DEBUGGING;
915
1.74k
  }
916
50.0k
    }
917
2.79k
  return _bfd_no_cleanup;
918
919
2.57M
 got_wrong_format_error:
920
2.57M
  bfd_set_error (bfd_error_wrong_format);
921
922
2.57M
 got_no_match:
923
2.57M
  return NULL;
924
2.57M
}
bfd_elf64_object_p
Line
Count
Source
519
638k
{
520
638k
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
638k
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
638k
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
638k
  Elf_Internal_Shdr i_shdr;
524
638k
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
638k
  unsigned int shindex;
526
638k
  const struct elf_backend_data *ebd;
527
638k
  asection *s;
528
638k
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
638k
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
134k
    {
534
134k
      if (bfd_get_error () != bfd_error_system_call)
535
134k
  goto got_wrong_format_error;
536
88
      else
537
88
  goto got_no_match;
538
134k
    }
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
504k
  if (! elf_file_p (&x_ehdr)
547
504k
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
504k
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
441k
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
62.2k
  switch (x_ehdr.e_ident[EI_DATA])
553
62.2k
    {
554
13.1k
    case ELFDATA2MSB:   /* Big-endian */
555
13.1k
      if (! bfd_header_big_endian (abfd))
556
7.17k
  goto got_wrong_format_error;
557
5.99k
      break;
558
48.9k
    case ELFDATA2LSB:   /* Little-endian */
559
48.9k
      if (! bfd_header_little_endian (abfd))
560
21.9k
  goto got_wrong_format_error;
561
27.0k
      break;
562
27.0k
    case ELFDATANONE:   /* No data encoding specified */
563
132
    default:      /* Unknown data encoding specified */
564
132
      goto got_wrong_format_error;
565
62.2k
    }
566
567
33.0k
  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
33.0k
  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
33.0k
  i_ehdrp = elf_elfheader (abfd);
577
33.0k
  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
33.0k
  if (i_ehdrp->e_type == ET_CORE)
584
72
    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
32.9k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
1.62k
    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
31.3k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
3.48k
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
27.8k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
24
    goto got_wrong_format_error;
600
601
27.8k
  ebd = get_elf_backend_data (abfd);
602
27.8k
  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
27.8k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
27.8k
      && (ebd->elf_machine_alt1 == 0
609
24.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
27.8k
      && (ebd->elf_machine_alt2 == 0
611
24.0k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
27.8k
      && ebd->elf_machine_code != EM_NONE)
613
22.9k
    goto got_wrong_format_error;
614
615
4.87k
  if (i_ehdrp->e_type == ET_EXEC)
616
1.27k
    abfd->flags |= EXEC_P;
617
3.60k
  else if (i_ehdrp->e_type == ET_DYN)
618
214
    abfd->flags |= DYNAMIC;
619
620
4.87k
  if (i_ehdrp->e_phnum > 0)
621
1.26k
    abfd->flags |= D_PAGED;
622
623
4.87k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
1.16k
    {
625
      /* It's OK if this fails for the generic target.  */
626
1.16k
      if (ebd->elf_machine_code != EM_NONE)
627
0
  goto got_no_match;
628
1.16k
    }
629
630
4.87k
  if (ebd->elf_machine_code != EM_NONE
631
4.87k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
4.87k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
1.07k
    goto got_wrong_format_error;
634
635
3.79k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
3.51k
    {
637
3.51k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
3.51k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
232
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
3.28k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
161
  goto got_no_match;
647
3.12k
      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
3.12k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
154
  {
653
154
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
154
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
154
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
154
        || i_ehdrp->e_shnum  == 0)
657
78
      goto got_wrong_format_error;
658
154
  }
659
660
      /* And similarly for the string table index.  */
661
3.04k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
8
  {
663
8
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
8
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
8
  }
667
668
      /* And program headers.  */
669
3.04k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
13
  {
671
13
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
13
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
13
  }
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
3.04k
      if (i_ehdrp->e_shnum != 1)
679
3.02k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
3.02k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
3.02k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
28
      goto got_wrong_format_error;
684
685
2.99k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
2.99k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
2.99k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
2.99k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
81
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
2.91k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
2.91k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
2.91k
  }
699
3.04k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
3.21k
  if (i_ehdrp->e_shnum != 0)
704
2.93k
    {
705
2.93k
      Elf_Internal_Shdr *shdrp;
706
2.93k
      unsigned int num_sec;
707
2.93k
      size_t amt;
708
709
2.93k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
2.93k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
2.93k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
2.93k
      num_sec = i_ehdrp->e_shnum;
715
2.93k
      elf_numsections (abfd) = num_sec;
716
2.93k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
2.93k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
2.93k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
2.93k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
2.93k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
2.93k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
108k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
105k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
100k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
97.4k
  {
733
97.4k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
97.4k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
97.4k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
922
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
922
        switch (ebd->elf_machine_code)
743
922
    {
744
0
    case EM_386:
745
0
    case EM_IAMCU:
746
756
    case EM_X86_64:
747
756
    case EM_OLD_SPARCV9:
748
756
    case EM_SPARC32PLUS:
749
768
    case EM_SPARCV9:
750
768
    case EM_SPARC:
751
768
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
768
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
662
        break;
754
      /* Otherwise fall through.  */
755
260
    default:
756
260
      goto got_wrong_format_error;
757
922
    }
758
922
      }
759
760
97.2k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
97.2k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
97.2k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
97.2k
        && i_shdrp[shindex].sh_info >= num_sec)
764
41
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
97.1k
    if (i_shdrp[shindex].sh_size != 0
769
97.1k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
97.1k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
97.1k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
32.5k
       % ebd->minpagesize)
773
32.5k
      != 0))
774
23.4k
      abfd->flags &= ~D_PAGED;
775
97.1k
  }
776
777
2.63k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
2.63k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
79
  {
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
79
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
79
    if (!abfd->read_only)
788
23
      {
789
23
        _bfd_error_handler
790
23
    (_("warning: %pB has a corrupt string table index"), abfd);
791
23
        abfd->read_only = 1;
792
23
      }
793
79
  }
794
2.63k
    }
795
282
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
11
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
2.90k
  if (i_ehdrp->e_phnum == 0)
800
2.28k
    elf_tdata (abfd)->phdr = NULL;
801
624
  else
802
624
    {
803
624
      Elf_Internal_Phdr *i_phdr;
804
624
      unsigned int i;
805
624
      ufile_ptr filesize;
806
624
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
624
      filesize = bfd_get_file_size (abfd);
811
624
      if (filesize != 0
812
624
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
18
  goto got_wrong_format_error;
814
606
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
606
      elf_tdata (abfd)->phdr
817
606
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
606
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
606
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
10
  goto got_no_match;
822
596
      bool eu_strip_broken_phdrs = false;
823
596
      i_phdr = elf_tdata (abfd)->phdr;
824
10.6k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
10.1k
  {
826
10.1k
    Elf_External_Phdr x_phdr;
827
828
10.1k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
33
      goto got_no_match;
830
10.1k
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
831
    /* Too much code in BFD relies on alignment being a power of
832
       two, as required by the ELF spec.  */
833
10.1k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
4.96k
      {
835
4.96k
        i_phdr->p_align &= -i_phdr->p_align;
836
4.96k
        if (!abfd->read_only)
837
184
    {
838
184
      _bfd_error_handler (_("warning: %pB has a program header "
839
184
          "with invalid alignment"), abfd);
840
184
      abfd->read_only = 1;
841
184
    }
842
4.96k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
10.1k
    if (i_phdr->p_filesz != 0
846
10.1k
        && (i_phdr->p_filesz > filesize
847
7.84k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
4.65k
      eu_strip_broken_phdrs = true;
849
10.1k
  }
850
563
      if (!eu_strip_broken_phdrs
851
563
    && i_ehdrp->e_shoff == 0
852
563
    && i_ehdrp->e_shstrndx == 0)
853
6
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
6
    i_phdr = elf_tdata (abfd)->phdr;
857
12
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
6
      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
6
  }
869
563
    }
870
871
2.84k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
2.55k
    {
873
2.55k
      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
2.55k
      num_sec = elf_numsections (abfd);
879
73.5k
      for (shindex = 1; shindex < num_sec; shindex++)
880
72.1k
  if (!bfd_section_from_shdr (abfd, shindex))
881
1.08k
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
1.47k
      if (! _bfd_elf_setup_sections (abfd))
885
118
  goto got_wrong_format_error;
886
1.47k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
1.64k
  if (ebd->elf_backend_object_p)
891
1.11k
    {
892
1.11k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
3
  goto got_wrong_format_error;
894
1.11k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
1.64k
  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
34.3k
  for (s = abfd->sections; s != NULL; s = s->next)
902
32.7k
    {
903
32.7k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
32.7k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
32.7k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
763
  {
907
763
    unsigned long targ_index;
908
763
    asection *targ_sec;
909
910
763
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
763
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
763
    if (targ_sec != NULL
913
763
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
66
      s->flags |= SEC_DEBUGGING;
915
763
  }
916
32.7k
    }
917
1.64k
  return _bfd_no_cleanup;
918
919
635k
 got_wrong_format_error:
920
635k
  bfd_set_error (bfd_error_wrong_format);
921
922
636k
 got_no_match:
923
636k
  return NULL;
924
635k
}
bfd_elf32_object_p
Line
Count
Source
519
1.94M
{
520
1.94M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
1.94M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
1.94M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
1.94M
  Elf_Internal_Shdr i_shdr;
524
1.94M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
1.94M
  unsigned int shindex;
526
1.94M
  const struct elf_backend_data *ebd;
527
1.94M
  asection *s;
528
1.94M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
1.94M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
234k
    {
534
234k
      if (bfd_get_error () != bfd_error_system_call)
535
234k
  goto got_wrong_format_error;
536
268
      else
537
268
  goto got_no_match;
538
234k
    }
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.70M
  if (! elf_file_p (&x_ehdr)
547
1.70M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
1.70M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
1.48M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
217k
  switch (x_ehdr.e_ident[EI_DATA])
553
217k
    {
554
26.2k
    case ELFDATA2MSB:   /* Big-endian */
555
26.2k
      if (! bfd_header_big_endian (abfd))
556
13.0k
  goto got_wrong_format_error;
557
13.1k
      break;
558
181k
    case ELFDATA2LSB:   /* Little-endian */
559
181k
      if (! bfd_header_little_endian (abfd))
560
90.7k
  goto got_wrong_format_error;
561
90.8k
      break;
562
90.8k
    case ELFDATANONE:   /* No data encoding specified */
563
9.64k
    default:      /* Unknown data encoding specified */
564
9.64k
      goto got_wrong_format_error;
565
217k
    }
566
567
104k
  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
104k
  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
104k
  i_ehdrp = elf_elfheader (abfd);
577
104k
  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
104k
  if (i_ehdrp->e_type == ET_CORE)
584
1.47k
    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
102k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
268
    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
102k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
34.5k
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
67.7k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
67
    goto got_wrong_format_error;
600
601
67.7k
  ebd = get_elf_backend_data (abfd);
602
67.7k
  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
67.7k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
67.7k
      && (ebd->elf_machine_alt1 == 0
609
66.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
67.7k
      && (ebd->elf_machine_alt2 == 0
611
66.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
67.7k
      && ebd->elf_machine_code != EM_NONE)
613
65.2k
    goto got_wrong_format_error;
614
615
2.45k
  if (i_ehdrp->e_type == ET_EXEC)
616
749
    abfd->flags |= EXEC_P;
617
1.70k
  else if (i_ehdrp->e_type == ET_DYN)
618
78
    abfd->flags |= DYNAMIC;
619
620
2.45k
  if (i_ehdrp->e_phnum > 0)
621
1.24k
    abfd->flags |= D_PAGED;
622
623
2.45k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
1.00k
    {
625
      /* It's OK if this fails for the generic target.  */
626
1.00k
      if (ebd->elf_machine_code != EM_NONE)
627
1
  goto got_no_match;
628
1.00k
    }
629
630
2.45k
  if (ebd->elf_machine_code != EM_NONE
631
2.45k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
2.45k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
132
    goto got_wrong_format_error;
634
635
2.32k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
1.58k
    {
637
1.58k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
1.58k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
0
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
1.58k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
487
  goto got_no_match;
647
1.10k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
648
649
      /* If the section count is zero, the actual count is in the first
650
   section header.  */
651
1.10k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
530
  {
653
530
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
530
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
530
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
530
        || i_ehdrp->e_shnum  == 0)
657
42
      goto got_wrong_format_error;
658
530
  }
659
660
      /* And similarly for the string table index.  */
661
1.06k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
88
  {
663
88
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
88
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
88
  }
667
668
      /* And program headers.  */
669
1.06k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
41
  {
671
41
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
41
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
41
  }
675
676
      /* Sanity check that we can read all of the section headers.
677
   It ought to be good enough to just read the last one.  */
678
1.06k
      if (i_ehdrp->e_shnum != 1)
679
1.03k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
1.03k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
1.03k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
90
      goto got_wrong_format_error;
684
685
940
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
940
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
940
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
940
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
52
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
888
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
888
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
888
  }
699
1.06k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
1.65k
  if (i_ehdrp->e_shnum != 0)
704
918
    {
705
918
      Elf_Internal_Shdr *shdrp;
706
918
      unsigned int num_sec;
707
918
      size_t amt;
708
709
918
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
918
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
918
      if (!i_shdrp)
713
0
  goto got_no_match;
714
918
      num_sec = i_ehdrp->e_shnum;
715
918
      elf_numsections (abfd) = num_sec;
716
918
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
918
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
918
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
918
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
918
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
918
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
26.3k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
25.4k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
21.1k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
20.4k
  {
733
20.4k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
20.4k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
20.4k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
128
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
128
        switch (ebd->elf_machine_code)
743
128
    {
744
12
    case EM_386:
745
14
    case EM_IAMCU:
746
15
    case EM_X86_64:
747
15
    case EM_OLD_SPARCV9:
748
15
    case EM_SPARC32PLUS:
749
15
    case EM_SPARCV9:
750
45
    case EM_SPARC:
751
45
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
45
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
3
        break;
754
      /* Otherwise fall through.  */
755
125
    default:
756
125
      goto got_wrong_format_error;
757
128
    }
758
128
      }
759
760
20.2k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
20.2k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
20.2k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
20.2k
        && i_shdrp[shindex].sh_info >= num_sec)
764
20
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
20.2k
    if (i_shdrp[shindex].sh_size != 0
769
20.2k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
20.2k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
20.2k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
12.0k
       % ebd->minpagesize)
773
12.0k
      != 0))
774
72
      abfd->flags &= ~D_PAGED;
775
20.2k
  }
776
777
773
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
773
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
103
  {
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
103
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
103
    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
103
  }
794
773
    }
795
734
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
36
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
1.47k
  if (i_ehdrp->e_phnum == 0)
800
590
    elf_tdata (abfd)->phdr = NULL;
801
881
  else
802
881
    {
803
881
      Elf_Internal_Phdr *i_phdr;
804
881
      unsigned int i;
805
881
      ufile_ptr filesize;
806
881
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
881
      filesize = bfd_get_file_size (abfd);
811
881
      if (filesize != 0
812
881
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
43
  goto got_wrong_format_error;
814
838
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
838
      elf_tdata (abfd)->phdr
817
838
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
838
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
838
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
0
  goto got_no_match;
822
838
      bool eu_strip_broken_phdrs = false;
823
838
      i_phdr = elf_tdata (abfd)->phdr;
824
18.8k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
18.1k
  {
826
18.1k
    Elf_External_Phdr x_phdr;
827
828
18.1k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
53
      goto got_no_match;
830
18.0k
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
831
    /* Too much code in BFD relies on alignment being a power of
832
       two, as required by the ELF spec.  */
833
18.0k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
11.9k
      {
835
11.9k
        i_phdr->p_align &= -i_phdr->p_align;
836
11.9k
        if (!abfd->read_only)
837
439
    {
838
439
      _bfd_error_handler (_("warning: %pB has a program header "
839
439
          "with invalid alignment"), abfd);
840
439
      abfd->read_only = 1;
841
439
    }
842
11.9k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
18.0k
    if (i_phdr->p_filesz != 0
846
18.0k
        && (i_phdr->p_filesz > filesize
847
15.1k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
10.4k
      eu_strip_broken_phdrs = true;
849
18.0k
  }
850
785
      if (!eu_strip_broken_phdrs
851
785
    && i_ehdrp->e_shoff == 0
852
785
    && i_ehdrp->e_shstrndx == 0)
853
90
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
90
    i_phdr = elf_tdata (abfd)->phdr;
857
532
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
519
      if (i_phdr->p_type == PT_DYNAMIC)
859
77
        {
860
77
    if (i_phdr->p_filesz != 0
861
77
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
60
                  elf_tdata (abfd)->phdr,
863
60
                  i_ehdrp->e_phnum,
864
60
                  filesize))
865
60
      goto got_no_match;
866
17
    break;
867
77
        }
868
90
  }
869
785
    }
870
871
1.31k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
670
    {
873
670
      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
670
      num_sec = elf_numsections (abfd);
879
20.0k
      for (shindex = 1; shindex < num_sec; shindex++)
880
19.4k
  if (!bfd_section_from_shdr (abfd, shindex))
881
59
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
611
      if (! _bfd_elf_setup_sections (abfd))
885
7
  goto got_wrong_format_error;
886
611
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
1.24k
  if (ebd->elf_backend_object_p)
891
696
    {
892
696
      if (! (*ebd->elf_backend_object_p) (abfd))
893
91
  goto got_wrong_format_error;
894
696
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
1.15k
  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
18.4k
  for (s = abfd->sections; s != NULL; s = s->next)
902
17.2k
    {
903
17.2k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
17.2k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
17.2k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
978
  {
907
978
    unsigned long targ_index;
908
978
    asection *targ_sec;
909
910
978
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
978
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
978
    if (targ_sec != NULL
913
978
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
978
  }
916
17.2k
    }
917
1.15k
  return _bfd_no_cleanup;
918
919
1.94M
 got_wrong_format_error:
920
1.94M
  bfd_set_error (bfd_error_wrong_format);
921
922
1.94M
 got_no_match:
923
1.94M
  return NULL;
924
1.94M
}
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
1.80k
{
1236
1.80k
  Elf_Internal_Shdr *hdr;
1237
1.80k
  Elf_Internal_Shdr *verhdr;
1238
1.80k
  unsigned long symcount; /* Number of external ELF symbols */
1239
1.80k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
1.80k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
1.80k
  Elf_Internal_Sym *isym;
1242
1.80k
  Elf_Internal_Sym *isymend;
1243
1.80k
  Elf_Internal_Sym *isymbuf = NULL;
1244
1.80k
  Elf_External_Versym *xver;
1245
1.80k
  Elf_External_Versym *xverbuf = NULL;
1246
1.80k
  const struct elf_backend_data *ebd;
1247
1.80k
  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
1.80k
  if (! dynamic)
1260
1.80k
    {
1261
1.80k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
1.80k
      verhdr = NULL;
1263
1.80k
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
1.80k
  ebd = get_elf_backend_data (abfd);
1284
1.80k
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
1.80k
  if (symcount == 0)
1286
1.80k
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
1.80k
  if (symcount == 0)
1288
23
    sym = symbase = NULL;
1289
1.78k
  else
1290
1.78k
    {
1291
1.78k
      size_t i;
1292
1293
1.78k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
1.78k
              NULL, NULL, NULL);
1295
1.78k
      if (isymbuf == NULL)
1296
32
  return -1;
1297
1298
1.75k
      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
1.75k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
1.75k
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
1.75k
      if (verhdr != NULL
1309
1.75k
    && 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
1.75k
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
1.75k
      xver = xverbuf;
1336
1.75k
      if (xver != NULL)
1337
0
  ++xver;
1338
1.75k
      isymend = isymbuf + symcount;
1339
1.75k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
362k
     isym < isymend;
1341
360k
     isym++, sym++, i++)
1342
360k
  {
1343
360k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
360k
    sym->symbol.the_bfd = abfd;
1346
360k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
360k
    else
1350
360k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
360k
    sym->symbol.value = isym->st_value;
1352
1353
360k
    if (isym->st_shndx == SHN_UNDEF)
1354
129k
      {
1355
129k
        sym->symbol.section = bfd_und_section_ptr;
1356
129k
      }
1357
231k
    else if (isym->st_shndx == SHN_ABS)
1358
8.78k
      {
1359
8.78k
        sym->symbol.section = bfd_abs_section_ptr;
1360
8.78k
      }
1361
222k
    else if (isym->st_shndx == SHN_COMMON)
1362
36
      {
1363
36
        sym->symbol.section = bfd_com_section_ptr;
1364
36
        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
36
        sym->symbol.value = isym->st_size;
1383
36
      }
1384
222k
    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
222k
    else
1394
222k
      {
1395
222k
        sym->symbol.section
1396
222k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
222k
        if (sym->symbol.section == NULL)
1398
108k
    {
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
108k
      sym->symbol.section = bfd_abs_section_ptr;
1406
108k
    }
1407
222k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
360k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
218k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
360k
    switch (ELF_ST_BIND (isym->st_info))
1415
360k
      {
1416
224k
      case STB_LOCAL:
1417
224k
        sym->symbol.flags |= BSF_LOCAL;
1418
224k
        break;
1419
62.8k
      case STB_GLOBAL:
1420
62.8k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
28.2k
    sym->symbol.flags |= BSF_GLOBAL;
1422
62.8k
        break;
1423
10.4k
      case STB_WEAK:
1424
10.4k
        sym->symbol.flags |= BSF_WEAK;
1425
10.4k
        break;
1426
2.61k
      case STB_GNU_UNIQUE:
1427
2.61k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
2.61k
        break;
1429
360k
      }
1430
1431
360k
    switch (ELF_ST_TYPE (isym->st_info))
1432
360k
      {
1433
33.0k
      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
33.0k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
33.0k
            | BSF_DEBUGGING
1440
33.0k
            | BSF_SECTION_SYM_USED);
1441
33.0k
        break;
1442
15.4k
      case STT_FILE:
1443
15.4k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
15.4k
        break;
1445
60.5k
      case STT_FUNC:
1446
60.5k
        sym->symbol.flags |= BSF_FUNCTION;
1447
60.5k
        break;
1448
6.41k
      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
6.41k
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
56.8k
      case STT_OBJECT:
1454
56.8k
        sym->symbol.flags |= BSF_OBJECT;
1455
56.8k
        break;
1456
3.45k
      case STT_TLS:
1457
3.45k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
3.45k
        break;
1459
4.89k
      case STT_RELC:
1460
4.89k
        sym->symbol.flags |= BSF_RELC;
1461
4.89k
        break;
1462
3.98k
      case STT_SRELC:
1463
3.98k
        sym->symbol.flags |= BSF_SRELC;
1464
3.98k
        break;
1465
4.17k
      case STT_GNU_IFUNC:
1466
4.17k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
4.17k
        break;
1468
360k
      }
1469
1470
360k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
360k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
360k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
360k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
360k
    if (ebd->elf_backend_symbol_processing)
1487
215k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
360k
  }
1489
1.75k
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
1.77k
  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
1.77k
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
1.77k
  if (symptrs)
1501
1.77k
    {
1502
1.77k
      long l = symcount;
1503
1504
1.77k
      sym = symbase;
1505
362k
      while (l-- > 0)
1506
360k
  {
1507
360k
    *symptrs++ = &sym->symbol;
1508
360k
    sym++;
1509
360k
  }
1510
1.77k
      *symptrs = 0;   /* Final null pointer */
1511
1.77k
    }
1512
1513
1.77k
  free (xverbuf);
1514
1.77k
  if (hdr->contents != (unsigned char *) isymbuf
1515
1.77k
      && !elf_use_dt_symtab_p (abfd))
1516
1.75k
    free (isymbuf);
1517
1.77k
  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
1.80k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1235
1.58k
{
1236
1.58k
  Elf_Internal_Shdr *hdr;
1237
1.58k
  Elf_Internal_Shdr *verhdr;
1238
1.58k
  unsigned long symcount; /* Number of external ELF symbols */
1239
1.58k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
1.58k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
1.58k
  Elf_Internal_Sym *isym;
1242
1.58k
  Elf_Internal_Sym *isymend;
1243
1.58k
  Elf_Internal_Sym *isymbuf = NULL;
1244
1.58k
  Elf_External_Versym *xver;
1245
1.58k
  Elf_External_Versym *xverbuf = NULL;
1246
1.58k
  const struct elf_backend_data *ebd;
1247
1.58k
  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
1.58k
  if (! dynamic)
1260
1.58k
    {
1261
1.58k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
1.58k
      verhdr = NULL;
1263
1.58k
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
1.58k
  ebd = get_elf_backend_data (abfd);
1284
1.58k
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
1.58k
  if (symcount == 0)
1286
1.58k
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
1.58k
  if (symcount == 0)
1288
17
    sym = symbase = NULL;
1289
1.56k
  else
1290
1.56k
    {
1291
1.56k
      size_t i;
1292
1293
1.56k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
1.56k
              NULL, NULL, NULL);
1295
1.56k
      if (isymbuf == NULL)
1296
23
  return -1;
1297
1298
1.54k
      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
1.54k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
1.54k
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
1.54k
      if (verhdr != NULL
1309
1.54k
    && 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
1.54k
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
1.54k
      xver = xverbuf;
1336
1.54k
      if (xver != NULL)
1337
0
  ++xver;
1338
1.54k
      isymend = isymbuf + symcount;
1339
1.54k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
218k
     isym < isymend;
1341
217k
     isym++, sym++, i++)
1342
217k
  {
1343
217k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
217k
    sym->symbol.the_bfd = abfd;
1346
217k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
217k
    else
1350
217k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
217k
    sym->symbol.value = isym->st_value;
1352
1353
217k
    if (isym->st_shndx == SHN_UNDEF)
1354
104k
      {
1355
104k
        sym->symbol.section = bfd_und_section_ptr;
1356
104k
      }
1357
113k
    else if (isym->st_shndx == SHN_ABS)
1358
1.42k
      {
1359
1.42k
        sym->symbol.section = bfd_abs_section_ptr;
1360
1.42k
      }
1361
111k
    else if (isym->st_shndx == SHN_COMMON)
1362
32
      {
1363
32
        sym->symbol.section = bfd_com_section_ptr;
1364
32
        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
32
        sym->symbol.value = isym->st_size;
1383
32
      }
1384
111k
    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
111k
    else
1394
111k
      {
1395
111k
        sym->symbol.section
1396
111k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
111k
        if (sym->symbol.section == NULL)
1398
54.3k
    {
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
54.3k
      sym->symbol.section = bfd_abs_section_ptr;
1406
54.3k
    }
1407
111k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
217k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
87.7k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
217k
    switch (ELF_ST_BIND (isym->st_info))
1415
217k
      {
1416
155k
      case STB_LOCAL:
1417
155k
        sym->symbol.flags |= BSF_LOCAL;
1418
155k
        break;
1419
25.1k
      case STB_GLOBAL:
1420
25.1k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
5.55k
    sym->symbol.flags |= BSF_GLOBAL;
1422
25.1k
        break;
1423
5.88k
      case STB_WEAK:
1424
5.88k
        sym->symbol.flags |= BSF_WEAK;
1425
5.88k
        break;
1426
1.86k
      case STB_GNU_UNIQUE:
1427
1.86k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
1.86k
        break;
1429
217k
      }
1430
1431
217k
    switch (ELF_ST_TYPE (isym->st_info))
1432
217k
      {
1433
24.2k
      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
24.2k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
24.2k
            | BSF_DEBUGGING
1440
24.2k
            | BSF_SECTION_SYM_USED);
1441
24.2k
        break;
1442
4.78k
      case STT_FILE:
1443
4.78k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
4.78k
        break;
1445
11.7k
      case STT_FUNC:
1446
11.7k
        sym->symbol.flags |= BSF_FUNCTION;
1447
11.7k
        break;
1448
2.59k
      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
2.59k
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
30.4k
      case STT_OBJECT:
1454
30.4k
        sym->symbol.flags |= BSF_OBJECT;
1455
30.4k
        break;
1456
1.77k
      case STT_TLS:
1457
1.77k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
1.77k
        break;
1459
2.24k
      case STT_RELC:
1460
2.24k
        sym->symbol.flags |= BSF_RELC;
1461
2.24k
        break;
1462
2.09k
      case STT_SRELC:
1463
2.09k
        sym->symbol.flags |= BSF_SRELC;
1464
2.09k
        break;
1465
2.80k
      case STT_GNU_IFUNC:
1466
2.80k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
2.80k
        break;
1468
217k
      }
1469
1470
217k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
217k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
217k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
217k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
217k
    if (ebd->elf_backend_symbol_processing)
1487
196k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
217k
  }
1489
1.54k
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
1.56k
  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
1.56k
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
1.56k
  if (symptrs)
1501
1.56k
    {
1502
1.56k
      long l = symcount;
1503
1504
1.56k
      sym = symbase;
1505
218k
      while (l-- > 0)
1506
217k
  {
1507
217k
    *symptrs++ = &sym->symbol;
1508
217k
    sym++;
1509
217k
  }
1510
1.56k
      *symptrs = 0;   /* Final null pointer */
1511
1.56k
    }
1512
1513
1.56k
  free (xverbuf);
1514
1.56k
  if (hdr->contents != (unsigned char *) isymbuf
1515
1.56k
      && !elf_use_dt_symtab_p (abfd))
1516
1.54k
    free (isymbuf);
1517
1.56k
  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
1.58k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1235
225
{
1236
225
  Elf_Internal_Shdr *hdr;
1237
225
  Elf_Internal_Shdr *verhdr;
1238
225
  unsigned long symcount; /* Number of external ELF symbols */
1239
225
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
225
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
225
  Elf_Internal_Sym *isym;
1242
225
  Elf_Internal_Sym *isymend;
1243
225
  Elf_Internal_Sym *isymbuf = NULL;
1244
225
  Elf_External_Versym *xver;
1245
225
  Elf_External_Versym *xverbuf = NULL;
1246
225
  const struct elf_backend_data *ebd;
1247
225
  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
225
  if (! dynamic)
1260
225
    {
1261
225
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
225
      verhdr = NULL;
1263
225
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
225
  ebd = get_elf_backend_data (abfd);
1284
225
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
225
  if (symcount == 0)
1286
225
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
225
  if (symcount == 0)
1288
6
    sym = symbase = NULL;
1289
219
  else
1290
219
    {
1291
219
      size_t i;
1292
1293
219
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
219
              NULL, NULL, NULL);
1295
219
      if (isymbuf == NULL)
1296
9
  return -1;
1297
1298
210
      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
210
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
210
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
210
      if (verhdr != NULL
1309
210
    && 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
210
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
210
      xver = xverbuf;
1336
210
      if (xver != NULL)
1337
0
  ++xver;
1338
210
      isymend = isymbuf + symcount;
1339
210
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
143k
     isym < isymend;
1341
143k
     isym++, sym++, i++)
1342
143k
  {
1343
143k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
143k
    sym->symbol.the_bfd = abfd;
1346
143k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
143k
    else
1350
143k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
143k
    sym->symbol.value = isym->st_value;
1352
1353
143k
    if (isym->st_shndx == SHN_UNDEF)
1354
25.2k
      {
1355
25.2k
        sym->symbol.section = bfd_und_section_ptr;
1356
25.2k
      }
1357
118k
    else if (isym->st_shndx == SHN_ABS)
1358
7.35k
      {
1359
7.35k
        sym->symbol.section = bfd_abs_section_ptr;
1360
7.35k
      }
1361
111k
    else if (isym->st_shndx == SHN_COMMON)
1362
4
      {
1363
4
        sym->symbol.section = bfd_com_section_ptr;
1364
4
        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
4
        sym->symbol.value = isym->st_size;
1383
4
      }
1384
111k
    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
111k
    else
1394
111k
      {
1395
111k
        sym->symbol.section
1396
111k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
111k
        if (sym->symbol.section == NULL)
1398
53.8k
    {
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
53.8k
      sym->symbol.section = bfd_abs_section_ptr;
1406
53.8k
    }
1407
111k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
143k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
130k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
143k
    switch (ELF_ST_BIND (isym->st_info))
1415
143k
      {
1416
69.3k
      case STB_LOCAL:
1417
69.3k
        sym->symbol.flags |= BSF_LOCAL;
1418
69.3k
        break;
1419
37.6k
      case STB_GLOBAL:
1420
37.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
22.7k
    sym->symbol.flags |= BSF_GLOBAL;
1422
37.6k
        break;
1423
4.58k
      case STB_WEAK:
1424
4.58k
        sym->symbol.flags |= BSF_WEAK;
1425
4.58k
        break;
1426
752
      case STB_GNU_UNIQUE:
1427
752
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
752
        break;
1429
143k
      }
1430
1431
143k
    switch (ELF_ST_TYPE (isym->st_info))
1432
143k
      {
1433
8.78k
      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
8.78k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
8.78k
            | BSF_DEBUGGING
1440
8.78k
            | BSF_SECTION_SYM_USED);
1441
8.78k
        break;
1442
10.6k
      case STT_FILE:
1443
10.6k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
10.6k
        break;
1445
48.7k
      case STT_FUNC:
1446
48.7k
        sym->symbol.flags |= BSF_FUNCTION;
1447
48.7k
        break;
1448
3.82k
      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
3.82k
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
26.3k
      case STT_OBJECT:
1454
26.3k
        sym->symbol.flags |= BSF_OBJECT;
1455
26.3k
        break;
1456
1.68k
      case STT_TLS:
1457
1.68k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
1.68k
        break;
1459
2.64k
      case STT_RELC:
1460
2.64k
        sym->symbol.flags |= BSF_RELC;
1461
2.64k
        break;
1462
1.89k
      case STT_SRELC:
1463
1.89k
        sym->symbol.flags |= BSF_SRELC;
1464
1.89k
        break;
1465
1.37k
      case STT_GNU_IFUNC:
1466
1.37k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
1.37k
        break;
1468
143k
      }
1469
1470
143k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
143k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
143k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
143k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
143k
    if (ebd->elf_backend_symbol_processing)
1487
18.5k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
143k
  }
1489
210
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
216
  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
216
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
216
  if (symptrs)
1501
216
    {
1502
216
      long l = symcount;
1503
1504
216
      sym = symbase;
1505
143k
      while (l-- > 0)
1506
143k
  {
1507
143k
    *symptrs++ = &sym->symbol;
1508
143k
    sym++;
1509
143k
  }
1510
216
      *symptrs = 0;   /* Final null pointer */
1511
216
    }
1512
1513
216
  free (xverbuf);
1514
216
  if (hdr->contents != (unsigned char *) isymbuf
1515
216
      && !elf_use_dt_symtab_p (abfd))
1516
210
    free (isymbuf);
1517
216
  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
225
}
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
8.77k
{
1539
8.77k
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
8.77k
  void *allocated = NULL;
1541
8.77k
  bfd_byte *native_relocs;
1542
8.77k
  arelent *relent;
1543
8.77k
  unsigned int i;
1544
8.77k
  int entsize;
1545
8.77k
  unsigned int symcount;
1546
1547
8.77k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
170
    return false;
1549
8.60k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
8.60k
  if (allocated == NULL)
1551
162
    return false;
1552
1553
8.44k
  native_relocs = (bfd_byte *) allocated;
1554
1555
8.44k
  entsize = rel_hdr->sh_entsize;
1556
8.44k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
8.44k
        || entsize == sizeof (Elf_External_Rela));
1558
1559
8.44k
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
8.44k
  else
1562
8.44k
    symcount = bfd_get_symcount (abfd);
1563
1564
8.44k
  for (i = 0, relent = relents;
1565
319k
       i < reloc_count;
1566
310k
       i++, relent++, native_relocs += entsize)
1567
311k
    {
1568
311k
      bool res;
1569
311k
      Elf_Internal_Rela rela;
1570
1571
311k
      if (entsize == sizeof (Elf_External_Rela))
1572
311k
  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
311k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
309k
  relent->address = rela.r_offset;
1582
1.94k
      else
1583
1.94k
  relent->address = rela.r_offset - asect->vma;
1584
1585
311k
      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
8.79k
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
302k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
12.0k
  {
1591
12.0k
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
12.0k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
12.0k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
12.0k
    bfd_set_error (bfd_error_bad_value);
1596
12.0k
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
12.0k
  }
1598
290k
      else
1599
290k
  {
1600
290k
    asymbol **ps;
1601
1602
290k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
290k
    relent->sym_ptr_ptr = ps;
1605
290k
  }
1606
1607
311k
      relent->addend = rela.r_addend;
1608
1609
311k
      if ((entsize == sizeof (Elf_External_Rela)
1610
311k
     && ebd->elf_info_to_howto != NULL)
1611
311k
    || ebd->elf_info_to_howto_rel == NULL)
1612
311k
  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
311k
      if (! res || relent->howto == NULL)
1617
810
  goto error_return;
1618
311k
    }
1619
1620
7.63k
  free (allocated);
1621
7.63k
  return true;
1622
1623
810
 error_return:
1624
810
  free (allocated);
1625
810
  return false;
1626
8.44k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1538
8.77k
{
1539
8.77k
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
8.77k
  void *allocated = NULL;
1541
8.77k
  bfd_byte *native_relocs;
1542
8.77k
  arelent *relent;
1543
8.77k
  unsigned int i;
1544
8.77k
  int entsize;
1545
8.77k
  unsigned int symcount;
1546
1547
8.77k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
170
    return false;
1549
8.60k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
8.60k
  if (allocated == NULL)
1551
162
    return false;
1552
1553
8.44k
  native_relocs = (bfd_byte *) allocated;
1554
1555
8.44k
  entsize = rel_hdr->sh_entsize;
1556
8.44k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
8.44k
        || entsize == sizeof (Elf_External_Rela));
1558
1559
8.44k
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
8.44k
  else
1562
8.44k
    symcount = bfd_get_symcount (abfd);
1563
1564
8.44k
  for (i = 0, relent = relents;
1565
319k
       i < reloc_count;
1566
310k
       i++, relent++, native_relocs += entsize)
1567
311k
    {
1568
311k
      bool res;
1569
311k
      Elf_Internal_Rela rela;
1570
1571
311k
      if (entsize == sizeof (Elf_External_Rela))
1572
311k
  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
311k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
309k
  relent->address = rela.r_offset;
1582
1.94k
      else
1583
1.94k
  relent->address = rela.r_offset - asect->vma;
1584
1585
311k
      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
8.79k
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
302k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
12.0k
  {
1591
12.0k
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
12.0k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
12.0k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
12.0k
    bfd_set_error (bfd_error_bad_value);
1596
12.0k
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
12.0k
  }
1598
290k
      else
1599
290k
  {
1600
290k
    asymbol **ps;
1601
1602
290k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
290k
    relent->sym_ptr_ptr = ps;
1605
290k
  }
1606
1607
311k
      relent->addend = rela.r_addend;
1608
1609
311k
      if ((entsize == sizeof (Elf_External_Rela)
1610
311k
     && ebd->elf_info_to_howto != NULL)
1611
311k
    || ebd->elf_info_to_howto_rel == NULL)
1612
311k
  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
311k
      if (! res || relent->howto == NULL)
1617
810
  goto error_return;
1618
311k
    }
1619
1620
7.63k
  free (allocated);
1621
7.63k
  return true;
1622
1623
810
 error_return:
1624
810
  free (allocated);
1625
810
  return false;
1626
8.44k
}
Unexecuted instantiation: elf32.c:elf_slurp_reloc_table_from_section
1627
1628
/* Read in and swap the external relocs.  */
1629
1630
bool
1631
elf_slurp_reloc_table (bfd *abfd,
1632
           asection *asect,
1633
           asymbol **symbols,
1634
           bool dynamic)
1635
9.43k
{
1636
9.43k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
9.43k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
9.43k
  Elf_Internal_Shdr *rel_hdr;
1639
9.43k
  Elf_Internal_Shdr *rel_hdr2;
1640
9.43k
  bfd_size_type reloc_count;
1641
9.43k
  bfd_size_type reloc_count2;
1642
9.43k
  arelent *relents;
1643
9.43k
  size_t amt;
1644
1645
9.43k
  if (asect->relocation != NULL)
1646
612
    return true;
1647
1648
8.82k
  if (! dynamic)
1649
8.82k
    {
1650
8.82k
      if ((asect->flags & SEC_RELOC) == 0
1651
8.82k
    || asect->reloc_count == 0)
1652
48
  return true;
1653
1654
8.77k
      rel_hdr = d->rel.hdr;
1655
8.77k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
8.77k
      rel_hdr2 = d->rela.hdr;
1657
8.77k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
8.77k
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
8.77k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
8.77k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
8.77k
    }
1666
0
  else
1667
0
    {
1668
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1669
   case because relocations against this section may use the
1670
   dynamic symbol table, and in that case bfd_section_from_shdr
1671
   in elf.c does not update the RELOC_COUNT.  */
1672
0
      if (asect->size == 0)
1673
0
  return true;
1674
1675
0
      rel_hdr = &d->this_hdr;
1676
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1677
0
      rel_hdr2 = NULL;
1678
0
      reloc_count2 = 0;
1679
0
    }
1680
1681
8.77k
  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
8.77k
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
8.77k
  if (relents == NULL)
1688
0
    return false;
1689
1690
8.77k
  if (rel_hdr
1691
8.77k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1692
0
                rel_hdr, reloc_count,
1693
0
                relents,
1694
0
                symbols, dynamic))
1695
0
    return false;
1696
1697
8.77k
  if (rel_hdr2
1698
8.77k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
8.77k
                rel_hdr2, reloc_count2,
1700
8.77k
                relents + reloc_count,
1701
8.77k
                symbols, dynamic))
1702
1.14k
    return false;
1703
1704
7.63k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
158
    return false;
1706
1707
7.47k
  asect->relocation = relents;
1708
7.47k
  return true;
1709
7.63k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1635
9.43k
{
1636
9.43k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
9.43k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
9.43k
  Elf_Internal_Shdr *rel_hdr;
1639
9.43k
  Elf_Internal_Shdr *rel_hdr2;
1640
9.43k
  bfd_size_type reloc_count;
1641
9.43k
  bfd_size_type reloc_count2;
1642
9.43k
  arelent *relents;
1643
9.43k
  size_t amt;
1644
1645
9.43k
  if (asect->relocation != NULL)
1646
612
    return true;
1647
1648
8.82k
  if (! dynamic)
1649
8.82k
    {
1650
8.82k
      if ((asect->flags & SEC_RELOC) == 0
1651
8.82k
    || asect->reloc_count == 0)
1652
48
  return true;
1653
1654
8.77k
      rel_hdr = d->rel.hdr;
1655
8.77k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
8.77k
      rel_hdr2 = d->rela.hdr;
1657
8.77k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
8.77k
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
8.77k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
8.77k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
8.77k
    }
1666
0
  else
1667
0
    {
1668
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1669
   case because relocations against this section may use the
1670
   dynamic symbol table, and in that case bfd_section_from_shdr
1671
   in elf.c does not update the RELOC_COUNT.  */
1672
0
      if (asect->size == 0)
1673
0
  return true;
1674
1675
0
      rel_hdr = &d->this_hdr;
1676
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1677
0
      rel_hdr2 = NULL;
1678
0
      reloc_count2 = 0;
1679
0
    }
1680
1681
8.77k
  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
8.77k
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
8.77k
  if (relents == NULL)
1688
0
    return false;
1689
1690
8.77k
  if (rel_hdr
1691
8.77k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1692
0
                rel_hdr, reloc_count,
1693
0
                relents,
1694
0
                symbols, dynamic))
1695
0
    return false;
1696
1697
8.77k
  if (rel_hdr2
1698
8.77k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
8.77k
                rel_hdr2, reloc_count2,
1700
8.77k
                relents + reloc_count,
1701
8.77k
                symbols, dynamic))
1702
1.14k
    return false;
1703
1704
7.63k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
158
    return false;
1706
1707
7.47k
  asect->relocation = relents;
1708
7.47k
  return true;
1709
7.63k
}
Unexecuted instantiation: bfd_elf32_slurp_reloc_table
1710
1711
#if DEBUG & 2
1712
static void
1713
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1714
{
1715
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1716
     hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1717
     (long) hdr);
1718
  fprintf (stderr,
1719
     "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1720
     (long) hdr->sh_name,
1721
     (long) hdr->sh_type,
1722
     (long) hdr->sh_flags);
1723
  fprintf (stderr,
1724
     "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1725
     (long) hdr->sh_addr,
1726
     (long) hdr->sh_offset,
1727
     (long) hdr->sh_size);
1728
  fprintf (stderr,
1729
     "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1730
     (long) hdr->sh_link,
1731
     (long) hdr->sh_info,
1732
     (long) hdr->sh_addralign);
1733
  fprintf (stderr, "sh_entsize   = %ld\n",
1734
     (long) hdr->sh_entsize);
1735
  fflush (stderr);
1736
}
1737
#endif
1738
1739
#if DEBUG & 1
1740
static void
1741
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1742
{
1743
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1744
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1745
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1746
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1747
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1748
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1749
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1750
}
1751
#endif
1752

1753
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1754
   reconstruct an ELF file by reading the segments out of remote
1755
   memory based on the ELF file header at EHDR_VMA and the ELF program
1756
   headers it points to.  If non-zero, SIZE is the known extent of the
1757
   object.  If not null, *LOADBASEP is filled in with the difference
1758
   between the VMAs from which the segments were read, and the VMAs
1759
   the file headers (and hence BFD's idea of each section's VMA) put
1760
   them at.
1761
1762
   The function TARGET_READ_MEMORY is called to copy LEN bytes from
1763
   the remote memory at target address VMA into the local buffer at
1764
   MYADDR; it should return zero on success or an `errno' code on
1765
   failure.  TEMPL must be a BFD for a target with the word size and
1766
   byte order found in the remote memory.  */
1767
1768
bfd *
1769
NAME(_bfd_elf,bfd_from_remote_memory)
1770
  (bfd *templ,
1771
   bfd_vma ehdr_vma    /* Bytes.  */,
1772
   bfd_size_type size  /* Octets.  */,
1773
   bfd_vma *loadbasep  /* Bytes.  */,
1774
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1775
                          /* (Bytes  ,           , octets       ).  */
1776
0
{
1777
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1778
0
  Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1779
0
  Elf_External_Phdr *x_phdrs;
1780
0
  Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
1781
0
  bfd *nbfd;
1782
0
  struct bfd_in_memory *bim;
1783
0
  bfd_byte *contents;
1784
0
  int err;
1785
0
  unsigned int i;
1786
0
  bfd_vma high_offset;
1787
0
  bfd_vma shdr_end;
1788
0
  bfd_vma loadbase;  /* Bytes.  */
1789
0
  size_t amt;
1790
0
  unsigned int opb = bfd_octets_per_byte (templ, NULL);
1791
1792
  /* Read in the ELF header in external format.  */
1793
0
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1794
0
  if (err)
1795
0
    {
1796
0
      bfd_set_error (bfd_error_system_call);
1797
0
      errno = err;
1798
0
      return NULL;
1799
0
    }
1800
1801
  /* Now check to see if we have a valid ELF file, and one that BFD can
1802
     make use of.  The magic number must match, the address size ('class')
1803
     and byte-swapping must match our XVEC entry.  */
1804
1805
0
  if (! elf_file_p (&x_ehdr)
1806
0
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1807
0
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1808
0
    {
1809
0
      bfd_set_error (bfd_error_wrong_format);
1810
0
      return NULL;
1811
0
    }
1812
1813
  /* Check that file's byte order matches xvec's */
1814
0
  switch (x_ehdr.e_ident[EI_DATA])
1815
0
    {
1816
0
    case ELFDATA2MSB:   /* Big-endian */
1817
0
      if (! bfd_header_big_endian (templ))
1818
0
  {
1819
0
    bfd_set_error (bfd_error_wrong_format);
1820
0
    return NULL;
1821
0
  }
1822
0
      break;
1823
0
    case ELFDATA2LSB:   /* Little-endian */
1824
0
      if (! bfd_header_little_endian (templ))
1825
0
  {
1826
0
    bfd_set_error (bfd_error_wrong_format);
1827
0
    return NULL;
1828
0
  }
1829
0
      break;
1830
0
    case ELFDATANONE:   /* No data encoding specified */
1831
0
    default:      /* Unknown data encoding specified */
1832
0
      bfd_set_error (bfd_error_wrong_format);
1833
0
      return NULL;
1834
0
    }
1835
1836
0
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1837
1838
  /* The file header tells where to find the program headers.
1839
     These are what we use to actually choose what to read.  */
1840
1841
0
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1842
0
    {
1843
0
      bfd_set_error (bfd_error_wrong_format);
1844
0
      return NULL;
1845
0
    }
1846
1847
0
  if (_bfd_mul_overflow (i_ehdr.e_phnum,
1848
0
       sizeof (*x_phdrs) + sizeof (*i_phdrs), &amt))
1849
0
    {
1850
0
      bfd_set_error (bfd_error_file_too_big);
1851
0
      return NULL;
1852
0
    }
1853
0
  x_phdrs = (Elf_External_Phdr *) bfd_malloc (amt);
1854
0
  if (x_phdrs == NULL)
1855
0
    return NULL;
1856
0
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1857
0
          i_ehdr.e_phnum * sizeof x_phdrs[0]);
1858
0
  if (err)
1859
0
    {
1860
0
      free (x_phdrs);
1861
0
      bfd_set_error (bfd_error_system_call);
1862
0
      errno = err;
1863
0
      return NULL;
1864
0
    }
1865
0
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1866
1867
0
  high_offset = 0;
1868
0
  loadbase = 0;
1869
0
  first_phdr = NULL;
1870
0
  last_phdr = NULL;
1871
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1872
0
    {
1873
0
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1874
0
      if (i_phdrs[i].p_type == PT_LOAD)
1875
0
  {
1876
0
    bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
1877
1878
0
    if (segment_end > high_offset)
1879
0
      {
1880
0
        high_offset = segment_end;
1881
0
        last_phdr = &i_phdrs[i];
1882
0
      }
1883
1884
    /* If this program header covers offset zero, where the file
1885
       header sits, then we can figure out the loadbase.  */
1886
0
    if (first_phdr == NULL)
1887
0
      {
1888
0
        bfd_vma p_offset = i_phdrs[i].p_offset;  /* Octets.  */
1889
0
        bfd_vma p_vaddr = i_phdrs[i].p_vaddr;    /* Octets.  */
1890
1891
0
        if (i_phdrs[i].p_align > 1)
1892
0
    {
1893
0
      p_offset &= -(i_phdrs[i].p_align * opb);
1894
0
      p_vaddr &= -(i_phdrs[i].p_align * opb);
1895
0
    }
1896
0
        if (p_offset == 0)
1897
0
    {
1898
0
      loadbase = ehdr_vma - p_vaddr / opb;
1899
0
      first_phdr = &i_phdrs[i];
1900
0
    }
1901
0
      }
1902
0
  }
1903
0
    }
1904
0
  if (high_offset == 0)
1905
0
    {
1906
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1907
0
      free (x_phdrs);
1908
0
      bfd_set_error (bfd_error_wrong_format);
1909
0
      return NULL;
1910
0
    }
1911
1912
0
  shdr_end = 0;
1913
0
  if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
1914
0
    {
1915
0
      shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1916
1917
0
      if (last_phdr->p_filesz != last_phdr->p_memsz)
1918
0
  {
1919
    /* If the last PT_LOAD header has a bss area then ld.so will
1920
       have cleared anything past p_filesz, zapping the section
1921
       headers.  */
1922
0
  }
1923
0
      else if (size >= shdr_end)
1924
0
  high_offset = size;
1925
0
      else
1926
0
  {
1927
0
    bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
1928
0
    bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
1929
1930
    /* Assume we loaded full pages, allowing us to sometimes see
1931
       section headers.  */
1932
0
    if (page_size > 1 && shdr_end > segment_end)
1933
0
      {
1934
0
        bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
1935
1936
0
        if (page_end >= shdr_end)
1937
    /* Whee, section headers covered.  */
1938
0
    high_offset = shdr_end;
1939
0
      }
1940
0
  }
1941
0
    }
1942
1943
  /* Now we know the size of the whole image we want read in.  */
1944
0
  contents = (bfd_byte *) bfd_zmalloc (high_offset);
1945
0
  if (contents == NULL)
1946
0
    {
1947
0
      free (x_phdrs);
1948
0
      return NULL;
1949
0
    }
1950
1951
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1952
0
    if (i_phdrs[i].p_type == PT_LOAD)
1953
0
      {
1954
0
  bfd_vma start = i_phdrs[i].p_offset;         /* Octets.  */
1955
0
  bfd_vma end = start + i_phdrs[i].p_filesz;   /* Octets.  */
1956
0
  bfd_vma vaddr = i_phdrs[i].p_vaddr;          /* Octets.  */
1957
1958
  /* Extend the beginning of the first pt_load to cover file
1959
     header and program headers, if we proved earlier that its
1960
     aligned offset is 0.  */
1961
0
  if (first_phdr == &i_phdrs[i])
1962
0
    {
1963
0
      vaddr -= start;
1964
0
      start = 0;
1965
0
    }
1966
  /* Extend the end of the last pt_load to cover section headers.  */
1967
0
  if (last_phdr == &i_phdrs[i])
1968
0
    end = high_offset;
1969
0
  err = target_read_memory (loadbase + vaddr / opb,
1970
0
          contents + start, end - start);
1971
0
  if (err)
1972
0
    {
1973
0
      free (x_phdrs);
1974
0
      free (contents);
1975
0
      bfd_set_error (bfd_error_system_call);
1976
0
      errno = err;
1977
0
      return NULL;
1978
0
    }
1979
0
      }
1980
0
  free (x_phdrs);
1981
1982
  /* If the segments visible in memory didn't include the section headers,
1983
     then clear them from the file header.  */
1984
0
  if (high_offset < shdr_end)
1985
0
    {
1986
0
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1987
0
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1988
0
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1989
0
    }
1990
1991
  /* This will normally have been in the first PT_LOAD segment.  But it
1992
     conceivably could be missing, and we might have just changed it.  */
1993
0
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1994
1995
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1996
0
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1997
0
  if (bim == NULL)
1998
0
    {
1999
0
      free (contents);
2000
0
      return NULL;
2001
0
    }
2002
0
  nbfd = _bfd_new_bfd ();
2003
0
  if (nbfd == NULL
2004
0
      || !bfd_set_filename (nbfd, "<in-memory>"))
2005
0
    {
2006
0
      free (bim);
2007
0
      free (contents);
2008
0
      return NULL;
2009
0
    }
2010
0
  nbfd->xvec = templ->xvec;
2011
0
  bim->size = high_offset;
2012
0
  bim->buffer = contents;
2013
0
  nbfd->iostream = bim;
2014
0
  nbfd->flags = BFD_IN_MEMORY;
2015
0
  nbfd->iovec = &_bfd_memory_iovec;
2016
0
  nbfd->origin = 0;
2017
0
  nbfd->direction = read_direction;
2018
0
  nbfd->mtime = time (NULL);
2019
0
  nbfd->mtime_set = true;
2020
2021
0
  if (loadbasep)
2022
0
    *loadbasep = loadbase;
2023
0
  return nbfd;
2024
0
}
Unexecuted instantiation: _bfd_elf64_bfd_from_remote_memory
Unexecuted instantiation: _bfd_elf32_bfd_from_remote_memory
2025
2026
/* Function for ELF_R_INFO.  */
2027
2028
bfd_vma
2029
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
2030
0
{
2031
0
  return ELF_R_INFO (sym, type);
2032
0
}
Unexecuted instantiation: elf64_r_info
Unexecuted instantiation: elf32_r_info
2033
2034
/* Function for ELF_R_SYM.  */
2035
2036
bfd_vma
2037
NAME(elf,r_sym) (bfd_vma r_info)
2038
640
{
2039
640
  return ELF_R_SYM (r_info);
2040
640
}
elf64_r_sym
Line
Count
Source
2038
630
{
2039
630
  return ELF_R_SYM (r_info);
2040
630
}
elf32_r_sym
Line
Count
Source
2038
10
{
2039
10
  return ELF_R_SYM (r_info);
2040
10
}
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
};