Coverage Report

Created: 2023-08-28 06:28

/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
46.7M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
0
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
46.7M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
1.44M
#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
111k
#define elf_swap_reloca_in    NAME(bfd_elf,swap_reloca_in)
97
0
#define elf_swap_reloc_out    NAME(bfd_elf,swap_reloc_out)
98
0
#define elf_swap_reloca_out   NAME(bfd_elf,swap_reloca_out)
99
#define elf_swap_symbol_in    NAME(bfd_elf,swap_symbol_in)
100
#define elf_swap_symbol_out   NAME(bfd_elf,swap_symbol_out)
101
1.43M
#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
333k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
1.65M
#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
5
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
5.52M
#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
9.73M
#define H_GET_WORD    H_GET_64
161
421k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
0
#define H_PUT_WORD    H_PUT_32
165
0
#define H_PUT_SIGNED_WORD H_PUT_S32
166
10.7M
#define H_GET_WORD    H_GET_32
167
635k
#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
121k
{
179
121k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
121k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
121k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
121k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
121k
  if (signed_vma)
185
6.17k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
115k
  else
187
115k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
121k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
121k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
121k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
121k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
121k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
274
    {
194
274
      if (shndx == NULL)
195
34
  return false;
196
240
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
240
    }
198
121k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
882
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
121k
  dst->st_target_internal = 0;
201
121k
  return true;
202
121k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
73.3k
{
179
73.3k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
73.3k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
73.3k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
73.3k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
73.3k
  if (signed_vma)
185
1.42k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
71.8k
  else
187
71.8k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
73.3k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
73.3k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
73.3k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
73.3k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
73.3k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
30
    {
194
30
      if (shndx == NULL)
195
30
  return false;
196
0
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
0
    }
198
73.2k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
617
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
73.2k
  dst->st_target_internal = 0;
201
73.2k
  return true;
202
73.3k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
48.5k
{
179
48.5k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
48.5k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
48.5k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
48.5k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
48.5k
  if (signed_vma)
185
4.75k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
43.8k
  else
187
43.8k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
48.5k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
48.5k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
48.5k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
48.5k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
48.5k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
244
    {
194
244
      if (shndx == NULL)
195
4
  return false;
196
240
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
240
    }
198
48.3k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
265
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
48.5k
  dst->st_target_internal = 0;
201
48.5k
  return true;
202
48.5k
}
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
2.05M
{
239
2.05M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
2.05M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
2.05M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
2.05M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
2.05M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
2.05M
  if (signed_vma)
245
225k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
1.83M
  else
247
1.83M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
2.05M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
2.05M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
2.05M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
2.05M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
2.05M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
2.05M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
2.05M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
2.05M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
2.05M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
2.05M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
405k
{
239
405k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
405k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
405k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
405k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
405k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
405k
  if (signed_vma)
245
51.1k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
354k
  else
247
354k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
405k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
405k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
405k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
405k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
405k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
405k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
405k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
405k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
405k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
405k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
1.65M
{
239
1.65M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
1.65M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
1.65M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
1.65M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
1.65M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
1.65M
  if (signed_vma)
245
174k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
1.47M
  else
247
1.47M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
1.65M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
1.65M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
1.65M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
1.65M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
1.65M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
1.65M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
1.65M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
1.65M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
1.65M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
1.65M
}
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
1.03M
{
319
1.03M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
1.03M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
1.03M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
1.03M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
1.03M
  if (signed_vma)
325
408k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
623k
  else
327
623k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
1.03M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
1.03M
  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
1.03M
  if (dst->sh_type != SHT_NOBITS)
334
1.02M
    {
335
1.02M
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
1.02M
      if (filesize != 0
338
1.02M
    && ((ufile_ptr) dst->sh_offset > filesize
339
1.02M
        || dst->sh_size > filesize - dst->sh_offset)
340
1.02M
    && !abfd->read_only)
341
82.7k
  {
342
82.7k
    _bfd_error_handler (_("warning: %pB has a section "
343
82.7k
        "extending past end of file"), abfd);
344
82.7k
    abfd->read_only = 1;
345
82.7k
  }
346
1.02M
    }
347
1.03M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
1.03M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
1.03M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
1.03M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
1.03M
  dst->bfd_section = NULL;
352
1.03M
  dst->contents = NULL;
353
1.03M
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
237k
{
319
237k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
237k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
237k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
237k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
237k
  if (signed_vma)
325
48.0k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
189k
  else
327
189k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
237k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
237k
  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
237k
  if (dst->sh_type != SHT_NOBITS)
334
235k
    {
335
235k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
235k
      if (filesize != 0
338
235k
    && ((ufile_ptr) dst->sh_offset > filesize
339
235k
        || dst->sh_size > filesize - dst->sh_offset)
340
235k
    && !abfd->read_only)
341
39.2k
  {
342
39.2k
    _bfd_error_handler (_("warning: %pB has a section "
343
39.2k
        "extending past end of file"), abfd);
344
39.2k
    abfd->read_only = 1;
345
39.2k
  }
346
235k
    }
347
237k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
237k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
237k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
237k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
237k
  dst->bfd_section = NULL;
352
237k
  dst->contents = NULL;
353
237k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
794k
{
319
794k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
794k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
794k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
794k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
794k
  if (signed_vma)
325
360k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
433k
  else
327
433k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
794k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
794k
  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
794k
  if (dst->sh_type != SHT_NOBITS)
334
791k
    {
335
791k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
791k
      if (filesize != 0
338
791k
    && ((ufile_ptr) dst->sh_offset > filesize
339
791k
        || dst->sh_size > filesize - dst->sh_offset)
340
791k
    && !abfd->read_only)
341
43.5k
  {
342
43.5k
    _bfd_error_handler (_("warning: %pB has a section "
343
43.5k
        "extending past end of file"), abfd);
344
43.5k
    abfd->read_only = 1;
345
43.5k
  }
346
791k
    }
347
794k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
794k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
794k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
794k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
794k
  dst->bfd_section = NULL;
352
794k
  dst->contents = NULL;
353
794k
}
354
355
/* Translate an ELF section header table entry in internal format into an
356
   ELF section header table entry in external format.  */
357
358
static void
359
elf_swap_shdr_out (bfd *abfd,
360
       const Elf_Internal_Shdr *src,
361
       Elf_External_Shdr *dst)
362
0
{
363
  /* note that all elements of dst are *arrays of unsigned char* already...  */
364
0
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
365
0
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
366
0
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
367
0
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
368
0
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
369
0
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
370
0
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
371
0
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
372
0
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
373
0
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
374
0
}
Unexecuted instantiation: elf64.c:elf_swap_shdr_out
Unexecuted instantiation: elf32.c:elf_swap_shdr_out
375
376
/* Translate an ELF program header table entry in external format into an
377
   ELF program header table entry in internal format.  */
378
379
void
380
elf_swap_phdr_in (bfd *abfd,
381
      const Elf_External_Phdr *src,
382
      Elf_Internal_Phdr *dst)
383
1.43M
{
384
1.43M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
1.43M
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
1.43M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
1.43M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
1.43M
  if (signed_vma)
390
152k
    {
391
152k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
152k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
152k
    }
394
1.28M
  else
395
1.28M
    {
396
1.28M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
1.28M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
1.28M
    }
399
1.43M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
1.43M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
1.43M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
1.43M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
383
1.17M
{
384
1.17M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
1.17M
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
1.17M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
1.17M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
1.17M
  if (signed_vma)
390
104k
    {
391
104k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
104k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
104k
    }
394
1.06M
  else
395
1.06M
    {
396
1.06M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
1.06M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
1.06M
    }
399
1.17M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
1.17M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
1.17M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
1.17M
}
bfd_elf32_swap_phdr_in
Line
Count
Source
383
267k
{
384
267k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
267k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
267k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
267k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
267k
  if (signed_vma)
390
47.8k
    {
391
47.8k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
47.8k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
47.8k
    }
394
219k
  else
395
219k
    {
396
219k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
219k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
219k
    }
399
267k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
267k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
267k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
267k
}
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
111k
{
443
111k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
111k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
111k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
111k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
111k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
442
111k
{
443
111k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
111k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
111k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
111k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
111k
}
Unexecuted instantiation: bfd_elf32_swap_reloca_in
448
449
/* Translate an ELF reloc from internal format to external format.  */
450
void
451
elf_swap_reloc_out (bfd *abfd,
452
        const Elf_Internal_Rela *src,
453
        bfd_byte *d)
454
0
{
455
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
456
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
457
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
458
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
459
460
void
461
elf_swap_reloca_out (bfd *abfd,
462
         const Elf_Internal_Rela *src,
463
         bfd_byte *d)
464
0
{
465
0
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
466
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
467
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
468
0
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
469
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_out
Unexecuted instantiation: bfd_elf32_swap_reloca_out
470
471
void
472
elf_swap_dyn_in (bfd *abfd,
473
     const void *p,
474
     Elf_Internal_Dyn *dst)
475
0
{
476
0
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
477
478
0
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
479
0
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
480
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_in
Unexecuted instantiation: bfd_elf32_swap_dyn_in
481
482
void
483
elf_swap_dyn_out (bfd *abfd,
484
      const Elf_Internal_Dyn *src,
485
      void *p)
486
0
{
487
0
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
488
489
0
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
490
0
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
491
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_out
Unexecuted instantiation: bfd_elf32_swap_dyn_out
492

493
/* ELF .o/exec file reading */
494
495
/* Begin processing a given object.
496
497
   First we validate the file by reading in the ELF header and checking
498
   the magic number.  */
499
500
static inline bool
501
elf_file_p (Elf_External_Ehdr *x_ehdrp)
502
43.1M
{
503
43.1M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
43.1M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
43.1M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
43.1M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
43.1M
}
elf64.c:elf_file_p
Line
Count
Source
502
10.3M
{
503
10.3M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
10.3M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
10.3M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
10.3M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
10.3M
}
elf32.c:elf_file_p
Line
Count
Source
502
32.8M
{
503
32.8M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
32.8M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
32.8M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
32.8M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
32.8M
}
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
46.7M
{
520
46.7M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
46.7M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
46.7M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
46.7M
  Elf_Internal_Shdr i_shdr;
524
46.7M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
46.7M
  unsigned int shindex;
526
46.7M
  const struct elf_backend_data *ebd;
527
46.7M
  asection *s;
528
46.7M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
46.7M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
3.59M
    {
534
3.59M
      if (bfd_get_error () != bfd_error_system_call)
535
3.57M
  goto got_wrong_format_error;
536
18.4k
      else
537
18.4k
  goto got_no_match;
538
3.59M
    }
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
43.1M
  if (! elf_file_p (&x_ehdr)
547
43.1M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
43.1M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
39.1M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
4.03M
  switch (x_ehdr.e_ident[EI_DATA])
553
4.03M
    {
554
366k
    case ELFDATA2MSB:   /* Big-endian */
555
366k
      if (! bfd_header_big_endian (abfd))
556
184k
  goto got_wrong_format_error;
557
182k
      break;
558
3.67M
    case ELFDATA2LSB:   /* Little-endian */
559
3.67M
      if (! bfd_header_little_endian (abfd))
560
1.79M
  goto got_wrong_format_error;
561
1.87M
      break;
562
1.87M
    case ELFDATANONE:   /* No data encoding specified */
563
446
    default:      /* Unknown data encoding specified */
564
446
      goto got_wrong_format_error;
565
4.03M
    }
566
567
2.05M
  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
2.05M
  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
2.05M
  i_ehdrp = elf_elfheader (abfd);
577
2.05M
  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
2.05M
  if (i_ehdrp->e_type == ET_CORE)
584
273
    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
2.05M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
273
    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
2.05M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
9.74k
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
2.04M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
91
    goto got_wrong_format_error;
600
601
2.04M
  ebd = get_elf_backend_data (abfd);
602
2.04M
  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
2.04M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
2.04M
      && (ebd->elf_machine_alt1 == 0
609
1.95M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
2.04M
      && (ebd->elf_machine_alt2 == 0
611
1.94M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
2.04M
      && ebd->elf_machine_code != EM_NONE)
613
1.90M
    goto got_wrong_format_error;
614
615
145k
  if (i_ehdrp->e_type == ET_EXEC)
616
5.08k
    abfd->flags |= EXEC_P;
617
139k
  else if (i_ehdrp->e_type == ET_DYN)
618
3.06k
    abfd->flags |= DYNAMIC;
619
620
145k
  if (i_ehdrp->e_phnum > 0)
621
58.2k
    abfd->flags |= D_PAGED;
622
623
145k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
41.3k
    {
625
      /* It's OK if this fails for the generic target.  */
626
41.3k
      if (ebd->elf_machine_code != EM_NONE)
627
234
  goto got_no_match;
628
41.3k
    }
629
630
144k
  if (ebd->elf_machine_code != EM_NONE
631
144k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
144k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
9.69k
    goto got_wrong_format_error;
634
635
135k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
90.7k
    {
637
90.7k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
90.7k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
400
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
90.3k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
1.25k
  goto got_no_match;
647
89.0k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
648
649
      /* If the section count is zero, the actual count is in the first
650
   section header.  */
651
89.0k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
4.99k
  {
653
4.99k
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
4.99k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
4.99k
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
4.99k
        || i_ehdrp->e_shnum  == 0)
657
1.41k
      goto got_wrong_format_error;
658
4.99k
  }
659
660
      /* And similarly for the string table index.  */
661
87.6k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
4.29k
  {
663
4.29k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
4.29k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
4.29k
  }
667
668
      /* And program headers.  */
669
87.6k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
2.17k
  {
671
2.17k
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
2.17k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
2.17k
  }
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
87.6k
      if (i_ehdrp->e_shnum != 1)
679
58.0k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
58.0k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
58.0k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
926
      goto got_wrong_format_error;
684
685
57.0k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
57.0k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
57.0k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
57.0k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
968
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
56.1k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
56.1k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
56.1k
  }
699
87.6k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
130k
  if (i_ehdrp->e_shnum != 0)
704
85.7k
    {
705
85.7k
      Elf_Internal_Shdr *shdrp;
706
85.7k
      unsigned int num_sec;
707
85.7k
      size_t amt;
708
709
85.7k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
85.7k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
85.7k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
85.7k
      num_sec = i_ehdrp->e_shnum;
715
85.7k
      elf_numsections (abfd) = num_sec;
716
85.7k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
85.7k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
85.7k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
85.7k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
85.7k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
85.7k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
1.15M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
1.06M
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
1.02M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
943k
  {
733
943k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
943k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
943k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
4.43k
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
4.43k
        switch (ebd->elf_machine_code)
743
4.43k
    {
744
1.50k
    case EM_386:
745
1.50k
    case EM_IAMCU:
746
2.72k
    case EM_X86_64:
747
2.72k
    case EM_OLD_SPARCV9:
748
2.72k
    case EM_SPARC32PLUS:
749
2.73k
    case EM_SPARCV9:
750
2.73k
    case EM_SPARC:
751
2.73k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
2.73k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
1.86k
        break;
754
      /* Otherwise fall through.  */
755
2.56k
    default:
756
2.56k
      goto got_wrong_format_error;
757
4.43k
    }
758
4.43k
      }
759
760
940k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
940k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
940k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
940k
        && i_shdrp[shindex].sh_info >= num_sec)
764
664
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
940k
    if (i_shdrp[shindex].sh_size != 0
769
940k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
940k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
940k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
104k
       % ebd->minpagesize)
773
104k
      != 0))
774
56.9k
      abfd->flags &= ~D_PAGED;
775
940k
  }
776
777
82.5k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
82.5k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
51.8k
  {
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
51.8k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
51.8k
    if (!abfd->read_only)
788
5.37k
      {
789
5.37k
        _bfd_error_handler
790
5.37k
    (_("warning: %pB has a corrupt string table index"), abfd);
791
5.37k
        abfd->read_only = 1;
792
5.37k
      }
793
51.8k
  }
794
82.5k
    }
795
44.3k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
664
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
126k
  if (i_ehdrp->e_phnum == 0)
800
76.5k
    elf_tdata (abfd)->phdr = NULL;
801
49.7k
  else
802
49.7k
    {
803
49.7k
      Elf_Internal_Phdr *i_phdr;
804
49.7k
      unsigned int i;
805
49.7k
      ufile_ptr filesize;
806
49.7k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
49.7k
      filesize = bfd_get_file_size (abfd);
811
49.7k
      if (filesize != 0
812
49.7k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
2.00k
  goto got_wrong_format_error;
814
47.7k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
47.7k
      elf_tdata (abfd)->phdr
817
47.7k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
47.7k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
47.7k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
523
  goto got_no_match;
822
47.2k
      bool eu_strip_broken_phdrs = false;
823
47.2k
      i_phdr = elf_tdata (abfd)->phdr;
824
1.48M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
1.44M
  {
826
1.44M
    Elf_External_Phdr x_phdr;
827
828
1.44M
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
1.56k
      goto got_no_match;
830
1.43M
    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
1.43M
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
1.08M
      {
835
1.08M
        i_phdr->p_align &= -i_phdr->p_align;
836
1.08M
        if (!abfd->read_only)
837
2.30k
    {
838
2.30k
      _bfd_error_handler (_("warning: %pB has a program header "
839
2.30k
          "with invalid alignment"), abfd);
840
2.30k
      abfd->read_only = 1;
841
2.30k
    }
842
1.08M
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
1.43M
    if (i_phdr->p_filesz != 0
846
1.43M
        && (i_phdr->p_filesz > filesize
847
1.18M
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
1.14M
      eu_strip_broken_phdrs = true;
849
1.43M
  }
850
45.6k
      if (!eu_strip_broken_phdrs
851
45.6k
    && i_ehdrp->e_shoff == 0
852
45.6k
    && i_ehdrp->e_shstrndx == 0)
853
39
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
39
    i_phdr = elf_tdata (abfd)->phdr;
857
129
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
93
      if (i_phdr->p_type == PT_DYNAMIC)
859
3
        {
860
3
    if (i_phdr->p_filesz != 0
861
3
        && !_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
3
    break;
867
3
        }
868
39
  }
869
45.6k
    }
870
871
122k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
30.6k
    {
873
30.6k
      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
30.6k
      num_sec = elf_numsections (abfd);
879
648k
      for (shindex = 1; shindex < num_sec; shindex++)
880
621k
  if (!bfd_section_from_shdr (abfd, shindex))
881
3.66k
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
27.0k
      if (! _bfd_elf_setup_sections (abfd))
885
359
  goto got_wrong_format_error;
886
27.0k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
118k
  if (ebd->elf_backend_object_p)
891
81.3k
    {
892
81.3k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
11.3k
  goto got_wrong_format_error;
894
81.3k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
106k
  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
358k
  for (s = abfd->sections; s != NULL; s = s->next)
902
251k
    {
903
251k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
251k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
251k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
10.7k
  {
907
10.7k
    unsigned long targ_index;
908
10.7k
    asection *targ_sec;
909
910
10.7k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
10.7k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
10.7k
    if (targ_sec != NULL
913
10.7k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
423
      s->flags |= SEC_DEBUGGING;
915
10.7k
  }
916
251k
    }
917
106k
  return _bfd_no_cleanup;
918
919
46.6M
 got_wrong_format_error:
920
46.6M
  bfd_set_error (bfd_error_wrong_format);
921
922
46.6M
 got_no_match:
923
46.6M
  return NULL;
924
46.6M
}
bfd_elf64_object_p
Line
Count
Source
519
11.5M
{
520
11.5M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
11.5M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
11.5M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
11.5M
  Elf_Internal_Shdr i_shdr;
524
11.5M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
11.5M
  unsigned int shindex;
526
11.5M
  const struct elf_backend_data *ebd;
527
11.5M
  asection *s;
528
11.5M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
11.5M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
1.24M
    {
534
1.24M
      if (bfd_get_error () != bfd_error_system_call)
535
1.24M
  goto got_wrong_format_error;
536
4.47k
      else
537
4.47k
  goto got_no_match;
538
1.24M
    }
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
10.3M
  if (! elf_file_p (&x_ehdr)
547
10.3M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
10.3M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
9.57M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
742k
  switch (x_ehdr.e_ident[EI_DATA])
553
742k
    {
554
52.8k
    case ELFDATA2MSB:   /* Big-endian */
555
52.8k
      if (! bfd_header_big_endian (abfd))
556
28.4k
  goto got_wrong_format_error;
557
24.4k
      break;
558
689k
    case ELFDATA2LSB:   /* Little-endian */
559
689k
      if (! bfd_header_little_endian (abfd))
560
308k
  goto got_wrong_format_error;
561
380k
      break;
562
380k
    case ELFDATANONE:   /* No data encoding specified */
563
44
    default:      /* Unknown data encoding specified */
564
44
      goto got_wrong_format_error;
565
742k
    }
566
567
405k
  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
405k
  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
405k
  i_ehdrp = elf_elfheader (abfd);
577
405k
  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
405k
  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
405k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
72
    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
405k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
2.31k
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
402k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
24
    goto got_wrong_format_error;
600
601
402k
  ebd = get_elf_backend_data (abfd);
602
402k
  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
402k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
402k
      && (ebd->elf_machine_alt1 == 0
609
364k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
402k
      && (ebd->elf_machine_alt2 == 0
611
362k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
402k
      && ebd->elf_machine_code != EM_NONE)
613
345k
    goto got_wrong_format_error;
614
615
57.4k
  if (i_ehdrp->e_type == ET_EXEC)
616
3.04k
    abfd->flags |= EXEC_P;
617
54.4k
  else if (i_ehdrp->e_type == ET_DYN)
618
1.83k
    abfd->flags |= DYNAMIC;
619
620
57.4k
  if (i_ehdrp->e_phnum > 0)
621
44.4k
    abfd->flags |= D_PAGED;
622
623
57.4k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
16.6k
    {
625
      /* It's OK if this fails for the generic target.  */
626
16.6k
      if (ebd->elf_machine_code != EM_NONE)
627
0
  goto got_no_match;
628
16.6k
    }
629
630
57.4k
  if (ebd->elf_machine_code != EM_NONE
631
57.4k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
57.4k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
4.66k
    goto got_wrong_format_error;
634
635
52.8k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
43.1k
    {
637
43.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
43.1k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
641
400
  goto got_no_match;
642
643
      /* Read the first section header at index 0, and convert to internal
644
   form.  */
645
42.7k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
566
  goto got_no_match;
647
42.1k
      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
42.1k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
2.42k
  {
653
2.42k
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
2.42k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
2.42k
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
2.42k
        || i_ehdrp->e_shnum  == 0)
657
733
      goto got_wrong_format_error;
658
2.42k
  }
659
660
      /* And similarly for the string table index.  */
661
41.4k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
1.54k
  {
663
1.54k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
1.54k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
1.54k
  }
667
668
      /* And program headers.  */
669
41.4k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
1.09k
  {
671
1.09k
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
1.09k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
1.09k
  }
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
41.4k
      if (i_ehdrp->e_shnum != 1)
679
15.7k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
15.7k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
15.7k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
160
      goto got_wrong_format_error;
684
685
15.5k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
15.5k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
15.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
15.5k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
564
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
15.0k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
15.0k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
15.0k
  }
699
41.4k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
50.3k
  if (i_ehdrp->e_shnum != 0)
704
40.7k
    {
705
40.7k
      Elf_Internal_Shdr *shdrp;
706
40.7k
      unsigned int num_sec;
707
40.7k
      size_t amt;
708
709
40.7k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
40.7k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
40.7k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
40.7k
      num_sec = i_ehdrp->e_shnum;
715
40.7k
      elf_numsections (abfd) = num_sec;
716
40.7k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
40.7k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
40.7k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
40.7k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
40.7k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
40.7k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
298k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
257k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
234k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
195k
  {
733
195k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
195k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
195k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
1.76k
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
1.76k
        switch (ebd->elf_machine_code)
743
1.76k
    {
744
0
    case EM_386:
745
0
    case EM_IAMCU:
746
1.11k
    case EM_X86_64:
747
1.11k
    case EM_OLD_SPARCV9:
748
1.11k
    case EM_SPARC32PLUS:
749
1.12k
    case EM_SPARCV9:
750
1.12k
    case EM_SPARC:
751
1.12k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
1.12k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
435
        break;
754
      /* Otherwise fall through.  */
755
1.33k
    default:
756
1.33k
      goto got_wrong_format_error;
757
1.76k
    }
758
1.76k
      }
759
760
194k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
194k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
194k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
194k
        && i_shdrp[shindex].sh_info >= num_sec)
764
325
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
193k
    if (i_shdrp[shindex].sh_size != 0
769
193k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
193k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
193k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
53.8k
       % ebd->minpagesize)
773
53.8k
      != 0))
774
33.5k
      abfd->flags &= ~D_PAGED;
775
193k
  }
776
777
39.0k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
39.0k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
32.8k
  {
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
32.8k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
32.8k
    if (!abfd->read_only)
788
2.72k
      {
789
2.72k
        _bfd_error_handler
790
2.72k
    (_("warning: %pB has a corrupt string table index"), abfd);
791
2.72k
        abfd->read_only = 1;
792
2.72k
      }
793
32.8k
  }
794
39.0k
    }
795
9.67k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
314
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
48.4k
  if (i_ehdrp->e_phnum == 0)
800
10.4k
    elf_tdata (abfd)->phdr = NULL;
801
37.9k
  else
802
37.9k
    {
803
37.9k
      Elf_Internal_Phdr *i_phdr;
804
37.9k
      unsigned int i;
805
37.9k
      ufile_ptr filesize;
806
37.9k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
37.9k
      filesize = bfd_get_file_size (abfd);
811
37.9k
      if (filesize != 0
812
37.9k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
1.10k
  goto got_wrong_format_error;
814
36.8k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
36.8k
      elf_tdata (abfd)->phdr
817
36.8k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
36.8k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
36.8k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
523
  goto got_no_match;
822
36.3k
      bool eu_strip_broken_phdrs = false;
823
36.3k
      i_phdr = elf_tdata (abfd)->phdr;
824
1.20M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
1.17M
  {
826
1.17M
    Elf_External_Phdr x_phdr;
827
828
1.17M
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
957
      goto got_no_match;
830
1.17M
    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
1.17M
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
922k
      {
835
922k
        i_phdr->p_align &= -i_phdr->p_align;
836
922k
        if (!abfd->read_only)
837
2.16k
    {
838
2.16k
      _bfd_error_handler (_("warning: %pB has a program header "
839
2.16k
          "with invalid alignment"), abfd);
840
2.16k
      abfd->read_only = 1;
841
2.16k
    }
842
922k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
1.17M
    if (i_phdr->p_filesz != 0
846
1.17M
        && (i_phdr->p_filesz > filesize
847
984k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
964k
      eu_strip_broken_phdrs = true;
849
1.17M
  }
850
35.3k
      if (!eu_strip_broken_phdrs
851
35.3k
    && i_ehdrp->e_shoff == 0
852
35.3k
    && i_ehdrp->e_shstrndx == 0)
853
22
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
22
    i_phdr = elf_tdata (abfd)->phdr;
857
57
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
38
      if (i_phdr->p_type == PT_DYNAMIC)
859
3
        {
860
3
    if (i_phdr->p_filesz != 0
861
3
        && !_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
3
    break;
867
3
        }
868
22
  }
869
35.3k
    }
870
871
45.8k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
6.19k
    {
873
6.19k
      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
6.19k
      num_sec = elf_numsections (abfd);
879
128k
      for (shindex = 1; shindex < num_sec; shindex++)
880
124k
  if (!bfd_section_from_shdr (abfd, shindex))
881
2.45k
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
3.74k
      if (! _bfd_elf_setup_sections (abfd))
885
96
  goto got_wrong_format_error;
886
3.74k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
43.2k
  if (ebd->elf_backend_object_p)
891
30.1k
    {
892
30.1k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
237
  goto got_wrong_format_error;
894
30.1k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
43.0k
  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
125k
  for (s = abfd->sections; s != NULL; s = s->next)
902
82.1k
    {
903
82.1k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
82.1k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
82.1k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
4.97k
  {
907
4.97k
    unsigned long targ_index;
908
4.97k
    asection *targ_sec;
909
910
4.97k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
4.97k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
4.97k
    if (targ_sec != NULL
913
4.97k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
184
      s->flags |= SEC_DEBUGGING;
915
4.97k
  }
916
82.1k
    }
917
43.0k
  return _bfd_no_cleanup;
918
919
11.5M
 got_wrong_format_error:
920
11.5M
  bfd_set_error (bfd_error_wrong_format);
921
922
11.5M
 got_no_match:
923
11.5M
  return NULL;
924
11.5M
}
bfd_elf32_object_p
Line
Count
Source
519
35.2M
{
520
35.2M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
35.2M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
35.2M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
35.2M
  Elf_Internal_Shdr i_shdr;
524
35.2M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
35.2M
  unsigned int shindex;
526
35.2M
  const struct elf_backend_data *ebd;
527
35.2M
  asection *s;
528
35.2M
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
35.2M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
2.34M
    {
534
2.34M
      if (bfd_get_error () != bfd_error_system_call)
535
2.33M
  goto got_wrong_format_error;
536
13.9k
      else
537
13.9k
  goto got_no_match;
538
2.34M
    }
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
32.8M
  if (! elf_file_p (&x_ehdr)
547
32.8M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
32.8M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
29.5M
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
3.29M
  switch (x_ehdr.e_ident[EI_DATA])
553
3.29M
    {
554
313k
    case ELFDATA2MSB:   /* Big-endian */
555
313k
      if (! bfd_header_big_endian (abfd))
556
155k
  goto got_wrong_format_error;
557
157k
      break;
558
2.98M
    case ELFDATA2LSB:   /* Little-endian */
559
2.98M
      if (! bfd_header_little_endian (abfd))
560
1.48M
  goto got_wrong_format_error;
561
1.49M
      break;
562
1.49M
    case ELFDATANONE:   /* No data encoding specified */
563
402
    default:      /* Unknown data encoding specified */
564
402
      goto got_wrong_format_error;
565
3.29M
    }
566
567
1.65M
  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
1.65M
  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
1.65M
  i_ehdrp = elf_elfheader (abfd);
577
1.65M
  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
1.65M
  if (i_ehdrp->e_type == ET_CORE)
584
201
    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
1.65M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
201
    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
1.65M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
7.43k
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
1.64M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
67
    goto got_wrong_format_error;
600
601
1.64M
  ebd = get_elf_backend_data (abfd);
602
1.64M
  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
1.64M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
1.64M
      && (ebd->elf_machine_alt1 == 0
609
1.58M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
1.64M
      && (ebd->elf_machine_alt2 == 0
611
1.58M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
1.64M
      && ebd->elf_machine_code != EM_NONE)
613
1.55M
    goto got_wrong_format_error;
614
615
87.5k
  if (i_ehdrp->e_type == ET_EXEC)
616
2.04k
    abfd->flags |= EXEC_P;
617
85.5k
  else if (i_ehdrp->e_type == ET_DYN)
618
1.23k
    abfd->flags |= DYNAMIC;
619
620
87.5k
  if (i_ehdrp->e_phnum > 0)
621
13.7k
    abfd->flags |= D_PAGED;
622
623
87.5k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
24.7k
    {
625
      /* It's OK if this fails for the generic target.  */
626
24.7k
      if (ebd->elf_machine_code != EM_NONE)
627
234
  goto got_no_match;
628
24.7k
    }
629
630
87.3k
  if (ebd->elf_machine_code != EM_NONE
631
87.3k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
87.3k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
5.03k
    goto got_wrong_format_error;
634
635
82.2k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
47.5k
    {
637
47.5k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
47.5k
      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
47.5k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
687
  goto got_no_match;
647
46.9k
      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
46.9k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
2.56k
  {
653
2.56k
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
2.56k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
2.56k
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
2.56k
        || i_ehdrp->e_shnum  == 0)
657
678
      goto got_wrong_format_error;
658
2.56k
  }
659
660
      /* And similarly for the string table index.  */
661
46.2k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
2.75k
  {
663
2.75k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
2.75k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
2.75k
  }
667
668
      /* And program headers.  */
669
46.2k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
1.07k
  {
671
1.07k
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
1.07k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
1.07k
  }
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
46.2k
      if (i_ehdrp->e_shnum != 1)
679
42.2k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
42.2k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
42.2k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
766
      goto got_wrong_format_error;
684
685
41.5k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
41.5k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
41.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
41.5k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
404
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
41.1k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
41.1k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
41.1k
  }
699
46.2k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
79.7k
  if (i_ehdrp->e_shnum != 0)
704
45.0k
    {
705
45.0k
      Elf_Internal_Shdr *shdrp;
706
45.0k
      unsigned int num_sec;
707
45.0k
      size_t amt;
708
709
45.0k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
45.0k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
45.0k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
45.0k
      num_sec = i_ehdrp->e_shnum;
715
45.0k
      elf_numsections (abfd) = num_sec;
716
45.0k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
45.0k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
45.0k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
45.0k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
45.0k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
45.0k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
852k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
807k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
791k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
747k
  {
733
747k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
747k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
747k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
2.66k
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
2.66k
        switch (ebd->elf_machine_code)
743
2.66k
    {
744
1.50k
    case EM_386:
745
1.50k
    case EM_IAMCU:
746
1.60k
    case EM_X86_64:
747
1.60k
    case EM_OLD_SPARCV9:
748
1.60k
    case EM_SPARC32PLUS:
749
1.60k
    case EM_SPARCV9:
750
1.60k
    case EM_SPARC:
751
1.60k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
1.60k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
1.43k
        break;
754
      /* Otherwise fall through.  */
755
1.23k
    default:
756
1.23k
      goto got_wrong_format_error;
757
2.66k
    }
758
2.66k
      }
759
760
746k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
746k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
746k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
746k
        && i_shdrp[shindex].sh_info >= num_sec)
764
339
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
746k
    if (i_shdrp[shindex].sh_size != 0
769
746k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
746k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
746k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
50.3k
       % ebd->minpagesize)
773
50.3k
      != 0))
774
23.3k
      abfd->flags &= ~D_PAGED;
775
746k
  }
776
777
43.4k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
43.4k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
18.9k
  {
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
18.9k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
18.9k
    if (!abfd->read_only)
788
2.64k
      {
789
2.64k
        _bfd_error_handler
790
2.64k
    (_("warning: %pB has a corrupt string table index"), abfd);
791
2.64k
        abfd->read_only = 1;
792
2.64k
      }
793
18.9k
  }
794
43.4k
    }
795
34.7k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
350
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
77.8k
  if (i_ehdrp->e_phnum == 0)
800
66.0k
    elf_tdata (abfd)->phdr = NULL;
801
11.7k
  else
802
11.7k
    {
803
11.7k
      Elf_Internal_Phdr *i_phdr;
804
11.7k
      unsigned int i;
805
11.7k
      ufile_ptr filesize;
806
11.7k
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
11.7k
      filesize = bfd_get_file_size (abfd);
811
11.7k
      if (filesize != 0
812
11.7k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
899
  goto got_wrong_format_error;
814
10.8k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
10.8k
      elf_tdata (abfd)->phdr
817
10.8k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
10.8k
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
10.8k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
0
  goto got_no_match;
822
10.8k
      bool eu_strip_broken_phdrs = false;
823
10.8k
      i_phdr = elf_tdata (abfd)->phdr;
824
278k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
268k
  {
826
268k
    Elf_External_Phdr x_phdr;
827
828
268k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
606
      goto got_no_match;
830
267k
    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
267k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
161k
      {
835
161k
        i_phdr->p_align &= -i_phdr->p_align;
836
161k
        if (!abfd->read_only)
837
135
    {
838
135
      _bfd_error_handler (_("warning: %pB has a program header "
839
135
          "with invalid alignment"), abfd);
840
135
      abfd->read_only = 1;
841
135
    }
842
161k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
267k
    if (i_phdr->p_filesz != 0
846
267k
        && (i_phdr->p_filesz > filesize
847
199k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
181k
      eu_strip_broken_phdrs = true;
849
267k
  }
850
10.2k
      if (!eu_strip_broken_phdrs
851
10.2k
    && i_ehdrp->e_shoff == 0
852
10.2k
    && i_ehdrp->e_shstrndx == 0)
853
17
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
17
    i_phdr = elf_tdata (abfd)->phdr;
857
72
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
55
      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
17
  }
869
10.2k
    }
870
871
76.3k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
24.4k
    {
873
24.4k
      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
24.4k
      num_sec = elf_numsections (abfd);
879
520k
      for (shindex = 1; shindex < num_sec; shindex++)
880
497k
  if (!bfd_section_from_shdr (abfd, shindex))
881
1.20k
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
23.2k
      if (! _bfd_elf_setup_sections (abfd))
885
263
  goto got_wrong_format_error;
886
23.2k
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
74.8k
  if (ebd->elf_backend_object_p)
891
51.1k
    {
892
51.1k
      if (! (*ebd->elf_backend_object_p) (abfd))
893
11.1k
  goto got_wrong_format_error;
894
51.1k
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
63.7k
  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
233k
  for (s = abfd->sections; s != NULL; s = s->next)
902
169k
    {
903
169k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
169k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
169k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
5.79k
  {
907
5.79k
    unsigned long targ_index;
908
5.79k
    asection *targ_sec;
909
910
5.79k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
5.79k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
5.79k
    if (targ_sec != NULL
913
5.79k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
239
      s->flags |= SEC_DEBUGGING;
915
5.79k
  }
916
169k
    }
917
63.7k
  return _bfd_no_cleanup;
918
919
35.1M
 got_wrong_format_error:
920
35.1M
  bfd_set_error (bfd_error_wrong_format);
921
922
35.1M
 got_no_match:
923
35.1M
  return NULL;
924
35.1M
}
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
635
{
1236
635
  Elf_Internal_Shdr *hdr;
1237
635
  Elf_Internal_Shdr *verhdr;
1238
635
  unsigned long symcount; /* Number of external ELF symbols */
1239
635
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
635
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
635
  Elf_Internal_Sym *isym;
1242
635
  Elf_Internal_Sym *isymend;
1243
635
  Elf_Internal_Sym *isymbuf = NULL;
1244
635
  Elf_External_Versym *xver;
1245
635
  Elf_External_Versym *xverbuf = NULL;
1246
635
  const struct elf_backend_data *ebd;
1247
635
  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
635
  if (! dynamic)
1260
553
    {
1261
553
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
553
      verhdr = NULL;
1263
553
    }
1264
82
  else
1265
82
    {
1266
82
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
82
      if (elf_dynversym (abfd) == 0)
1268
26
  verhdr = NULL;
1269
56
      else
1270
56
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
82
      if ((elf_dynverdef (abfd) != 0
1272
82
     && elf_tdata (abfd)->verdef == NULL)
1273
82
    || (elf_dynverref (abfd) != 0
1274
80
        && elf_tdata (abfd)->verref == NULL)
1275
82
    || elf_tdata (abfd)->dt_verdef != NULL
1276
82
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
55
  {
1278
55
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
20
      return -1;
1280
55
  }
1281
82
    }
1282
1283
615
  ebd = get_elf_backend_data (abfd);
1284
615
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
615
  if (symcount == 0)
1286
615
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
615
  if (symcount == 0)
1288
107
    sym = symbase = NULL;
1289
508
  else
1290
508
    {
1291
508
      size_t i;
1292
1293
508
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
508
              NULL, NULL, NULL);
1295
508
      if (isymbuf == NULL)
1296
25
  return -1;
1297
1298
483
      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
483
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
483
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
483
      if (verhdr != NULL
1309
483
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
7
  {
1311
7
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
7
      (_("%pB: version count (%" PRId64 ")"
1314
7
         " does not match symbol count (%ld)"),
1315
7
       abfd,
1316
7
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
7
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
7
    verhdr = NULL;
1322
7
  }
1323
1324
483
      if (verhdr != NULL)
1325
26
  {
1326
26
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
6
      goto error_return;
1328
20
    xverbuf = (Elf_External_Versym *)
1329
20
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
20
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
1
      goto error_return;
1332
20
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
476
      xver = xverbuf;
1336
476
      if (xver != NULL)
1337
19
  ++xver;
1338
476
      isymend = isymbuf + symcount;
1339
476
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
107k
     isym < isymend;
1341
107k
     isym++, sym++, i++)
1342
107k
  {
1343
107k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
107k
    sym->symbol.the_bfd = abfd;
1346
107k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
107k
    else
1350
107k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
107k
    sym->symbol.value = isym->st_value;
1352
1353
107k
    if (isym->st_shndx == SHN_UNDEF)
1354
24.8k
      {
1355
24.8k
        sym->symbol.section = bfd_und_section_ptr;
1356
24.8k
      }
1357
82.1k
    else if (isym->st_shndx == SHN_ABS)
1358
561
      {
1359
561
        sym->symbol.section = bfd_abs_section_ptr;
1360
561
      }
1361
81.6k
    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
81.6k
    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
81.6k
    else
1394
81.6k
      {
1395
81.6k
        sym->symbol.section
1396
81.6k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
81.6k
        if (sym->symbol.section == NULL)
1398
18.5k
    {
1399
      /* This symbol is in a section for which we did not
1400
         create a BFD section.  Just use bfd_abs_section,
1401
         although it is wrong.  FIXME.  Note - there is
1402
         code in elf.c:swap_out_syms that calls
1403
         symbol_section_index() in the elf backend for
1404
         cases like this.  */
1405
18.5k
      sym->symbol.section = bfd_abs_section_ptr;
1406
18.5k
    }
1407
81.6k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
107k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
50.6k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
107k
    switch (ELF_ST_BIND (isym->st_info))
1415
107k
      {
1416
47.0k
      case STB_LOCAL:
1417
47.0k
        sym->symbol.flags |= BSF_LOCAL;
1418
47.0k
        break;
1419
44.6k
      case STB_GLOBAL:
1420
44.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
27.5k
    sym->symbol.flags |= BSF_GLOBAL;
1422
44.6k
        break;
1423
2.81k
      case STB_WEAK:
1424
2.81k
        sym->symbol.flags |= BSF_WEAK;
1425
2.81k
        break;
1426
1.11k
      case STB_GNU_UNIQUE:
1427
1.11k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
1.11k
        break;
1429
107k
      }
1430
1431
107k
    switch (ELF_ST_TYPE (isym->st_info))
1432
107k
      {
1433
12.4k
      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
12.4k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
12.4k
            | BSF_DEBUGGING
1440
12.4k
            | BSF_SECTION_SYM_USED);
1441
12.4k
        break;
1442
1.74k
      case STT_FILE:
1443
1.74k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
1.74k
        break;
1445
31.8k
      case STT_FUNC:
1446
31.8k
        sym->symbol.flags |= BSF_FUNCTION;
1447
31.8k
        break;
1448
1.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
1.41k
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
28.9k
      case STT_OBJECT:
1454
28.9k
        sym->symbol.flags |= BSF_OBJECT;
1455
28.9k
        break;
1456
1.35k
      case STT_TLS:
1457
1.35k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
1.35k
        break;
1459
793
      case STT_RELC:
1460
793
        sym->symbol.flags |= BSF_RELC;
1461
793
        break;
1462
851
      case STT_SRELC:
1463
851
        sym->symbol.flags |= BSF_SRELC;
1464
851
        break;
1465
741
      case STT_GNU_IFUNC:
1466
741
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
741
        break;
1468
107k
      }
1469
1470
107k
    if (dynamic)
1471
29.1k
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
107k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
107k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
107k
    else if (xver != NULL)
1477
27.1k
      {
1478
27.1k
        Elf_Internal_Versym iversym;
1479
1480
27.1k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
27.1k
        sym->version = iversym.vs_vers;
1482
27.1k
        xver++;
1483
27.1k
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
107k
    if (ebd->elf_backend_symbol_processing)
1487
51.2k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
107k
  }
1489
476
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
583
  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
583
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
583
  if (symptrs)
1501
583
    {
1502
583
      long l = symcount;
1503
1504
583
      sym = symbase;
1505
107k
      while (l-- > 0)
1506
107k
  {
1507
107k
    *symptrs++ = &sym->symbol;
1508
107k
    sym++;
1509
107k
  }
1510
583
      *symptrs = 0;   /* Final null pointer */
1511
583
    }
1512
1513
583
  free (xverbuf);
1514
583
  if (hdr->contents != (unsigned char *) isymbuf
1515
583
      && !elf_use_dt_symtab_p (abfd))
1516
476
    free (isymbuf);
1517
583
  return symcount;
1518
1519
7
 error_return:
1520
7
  free (xverbuf);
1521
7
  if (hdr->contents != (unsigned char *) isymbuf
1522
7
      && !elf_use_dt_symtab_p (abfd))
1523
7
    free (isymbuf);
1524
7
  return -1;
1525
615
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1235
580
{
1236
580
  Elf_Internal_Shdr *hdr;
1237
580
  Elf_Internal_Shdr *verhdr;
1238
580
  unsigned long symcount; /* Number of external ELF symbols */
1239
580
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
580
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
580
  Elf_Internal_Sym *isym;
1242
580
  Elf_Internal_Sym *isymend;
1243
580
  Elf_Internal_Sym *isymbuf = NULL;
1244
580
  Elf_External_Versym *xver;
1245
580
  Elf_External_Versym *xverbuf = NULL;
1246
580
  const struct elf_backend_data *ebd;
1247
580
  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
580
  if (! dynamic)
1260
515
    {
1261
515
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
515
      verhdr = NULL;
1263
515
    }
1264
65
  else
1265
65
    {
1266
65
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
65
      if (elf_dynversym (abfd) == 0)
1268
26
  verhdr = NULL;
1269
39
      else
1270
39
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
65
      if ((elf_dynverdef (abfd) != 0
1272
65
     && elf_tdata (abfd)->verdef == NULL)
1273
65
    || (elf_dynverref (abfd) != 0
1274
63
        && elf_tdata (abfd)->verref == NULL)
1275
65
    || elf_tdata (abfd)->dt_verdef != NULL
1276
65
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
38
  {
1278
38
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
19
      return -1;
1280
38
  }
1281
65
    }
1282
1283
561
  ebd = get_elf_backend_data (abfd);
1284
561
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
561
  if (symcount == 0)
1286
561
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
561
  if (symcount == 0)
1288
90
    sym = symbase = NULL;
1289
471
  else
1290
471
    {
1291
471
      size_t i;
1292
1293
471
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
471
              NULL, NULL, NULL);
1295
471
      if (isymbuf == NULL)
1296
22
  return -1;
1297
1298
449
      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
449
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
449
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
449
      if (verhdr != NULL
1309
449
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
2
  {
1311
2
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
2
      (_("%pB: version count (%" PRId64 ")"
1314
2
         " does not match symbol count (%ld)"),
1315
2
       abfd,
1316
2
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
2
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
2
    verhdr = NULL;
1322
2
  }
1323
1324
449
      if (verhdr != NULL)
1325
16
  {
1326
16
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
6
      goto error_return;
1328
10
    xverbuf = (Elf_External_Versym *)
1329
10
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
10
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
1
      goto error_return;
1332
10
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
442
      xver = xverbuf;
1336
442
      if (xver != NULL)
1337
9
  ++xver;
1338
442
      isymend = isymbuf + symcount;
1339
442
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
65.6k
     isym < isymend;
1341
65.1k
     isym++, sym++, i++)
1342
65.1k
  {
1343
65.1k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
65.1k
    sym->symbol.the_bfd = abfd;
1346
65.1k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
65.1k
    else
1350
65.1k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
65.1k
    sym->symbol.value = isym->st_value;
1352
1353
65.1k
    if (isym->st_shndx == SHN_UNDEF)
1354
17.5k
      {
1355
17.5k
        sym->symbol.section = bfd_und_section_ptr;
1356
17.5k
      }
1357
47.5k
    else if (isym->st_shndx == SHN_ABS)
1358
312
      {
1359
312
        sym->symbol.section = bfd_abs_section_ptr;
1360
312
      }
1361
47.2k
    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
47.2k
    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
47.2k
    else
1394
47.2k
      {
1395
47.2k
        sym->symbol.section
1396
47.2k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
47.2k
        if (sym->symbol.section == NULL)
1398
4.52k
    {
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
4.52k
      sym->symbol.section = bfd_abs_section_ptr;
1406
4.52k
    }
1407
47.2k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
65.1k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
13.1k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
65.1k
    switch (ELF_ST_BIND (isym->st_info))
1415
65.1k
      {
1416
36.7k
      case STB_LOCAL:
1417
36.7k
        sym->symbol.flags |= BSF_LOCAL;
1418
36.7k
        break;
1419
24.5k
      case STB_GLOBAL:
1420
24.5k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
12.1k
    sym->symbol.flags |= BSF_GLOBAL;
1422
24.5k
        break;
1423
1.40k
      case STB_WEAK:
1424
1.40k
        sym->symbol.flags |= BSF_WEAK;
1425
1.40k
        break;
1426
64
      case STB_GNU_UNIQUE:
1427
64
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
64
        break;
1429
65.1k
      }
1430
1431
65.1k
    switch (ELF_ST_TYPE (isym->st_info))
1432
65.1k
      {
1433
10.8k
      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
10.8k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
10.8k
            | BSF_DEBUGGING
1440
10.8k
            | BSF_SECTION_SYM_USED);
1441
10.8k
        break;
1442
686
      case STT_FILE:
1443
686
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
686
        break;
1445
12.8k
      case STT_FUNC:
1446
12.8k
        sym->symbol.flags |= BSF_FUNCTION;
1447
12.8k
        break;
1448
529
      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
529
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
21.5k
      case STT_OBJECT:
1454
21.5k
        sym->symbol.flags |= BSF_OBJECT;
1455
21.5k
        break;
1456
672
      case STT_TLS:
1457
672
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
672
        break;
1459
203
      case STT_RELC:
1460
203
        sym->symbol.flags |= BSF_RELC;
1461
203
        break;
1462
178
      case STT_SRELC:
1463
178
        sym->symbol.flags |= BSF_SRELC;
1464
178
        break;
1465
270
      case STT_GNU_IFUNC:
1466
270
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
270
        break;
1468
65.1k
      }
1469
1470
65.1k
    if (dynamic)
1471
13.4k
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
65.1k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
65.1k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
65.1k
    else if (xver != NULL)
1477
12.7k
      {
1478
12.7k
        Elf_Internal_Versym iversym;
1479
1480
12.7k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
12.7k
        sym->version = iversym.vs_vers;
1482
12.7k
        xver++;
1483
12.7k
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
65.1k
    if (ebd->elf_backend_symbol_processing)
1487
48.3k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
65.1k
  }
1489
442
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
532
  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
532
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
532
  if (symptrs)
1501
532
    {
1502
532
      long l = symcount;
1503
1504
532
      sym = symbase;
1505
65.6k
      while (l-- > 0)
1506
65.1k
  {
1507
65.1k
    *symptrs++ = &sym->symbol;
1508
65.1k
    sym++;
1509
65.1k
  }
1510
532
      *symptrs = 0;   /* Final null pointer */
1511
532
    }
1512
1513
532
  free (xverbuf);
1514
532
  if (hdr->contents != (unsigned char *) isymbuf
1515
532
      && !elf_use_dt_symtab_p (abfd))
1516
442
    free (isymbuf);
1517
532
  return symcount;
1518
1519
7
 error_return:
1520
7
  free (xverbuf);
1521
7
  if (hdr->contents != (unsigned char *) isymbuf
1522
7
      && !elf_use_dt_symtab_p (abfd))
1523
7
    free (isymbuf);
1524
7
  return -1;
1525
561
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1235
55
{
1236
55
  Elf_Internal_Shdr *hdr;
1237
55
  Elf_Internal_Shdr *verhdr;
1238
55
  unsigned long symcount; /* Number of external ELF symbols */
1239
55
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
55
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
55
  Elf_Internal_Sym *isym;
1242
55
  Elf_Internal_Sym *isymend;
1243
55
  Elf_Internal_Sym *isymbuf = NULL;
1244
55
  Elf_External_Versym *xver;
1245
55
  Elf_External_Versym *xverbuf = NULL;
1246
55
  const struct elf_backend_data *ebd;
1247
55
  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
55
  if (! dynamic)
1260
38
    {
1261
38
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
38
      verhdr = NULL;
1263
38
    }
1264
17
  else
1265
17
    {
1266
17
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
17
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
17
      else
1270
17
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
17
      if ((elf_dynverdef (abfd) != 0
1272
17
     && elf_tdata (abfd)->verdef == NULL)
1273
17
    || (elf_dynverref (abfd) != 0
1274
17
        && elf_tdata (abfd)->verref == NULL)
1275
17
    || elf_tdata (abfd)->dt_verdef != NULL
1276
17
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
17
  {
1278
17
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
1
      return -1;
1280
17
  }
1281
17
    }
1282
1283
54
  ebd = get_elf_backend_data (abfd);
1284
54
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
54
  if (symcount == 0)
1286
54
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
54
  if (symcount == 0)
1288
17
    sym = symbase = NULL;
1289
37
  else
1290
37
    {
1291
37
      size_t i;
1292
1293
37
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
37
              NULL, NULL, NULL);
1295
37
      if (isymbuf == NULL)
1296
3
  return -1;
1297
1298
34
      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
34
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
34
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
34
      if (verhdr != NULL
1309
34
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
5
  {
1311
5
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
5
      (_("%pB: version count (%" PRId64 ")"
1314
5
         " does not match symbol count (%ld)"),
1315
5
       abfd,
1316
5
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
5
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
5
    verhdr = NULL;
1322
5
  }
1323
1324
34
      if (verhdr != NULL)
1325
10
  {
1326
10
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
10
    xverbuf = (Elf_External_Versym *)
1329
10
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
10
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
10
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
34
      xver = xverbuf;
1336
34
      if (xver != NULL)
1337
10
  ++xver;
1338
34
      isymend = isymbuf + symcount;
1339
34
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
41.9k
     isym < isymend;
1341
41.9k
     isym++, sym++, i++)
1342
41.9k
  {
1343
41.9k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
41.9k
    sym->symbol.the_bfd = abfd;
1346
41.9k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
41.9k
    else
1350
41.9k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
41.9k
    sym->symbol.value = isym->st_value;
1352
1353
41.9k
    if (isym->st_shndx == SHN_UNDEF)
1354
7.30k
      {
1355
7.30k
        sym->symbol.section = bfd_und_section_ptr;
1356
7.30k
      }
1357
34.6k
    else if (isym->st_shndx == SHN_ABS)
1358
249
      {
1359
249
        sym->symbol.section = bfd_abs_section_ptr;
1360
249
      }
1361
34.3k
    else if (isym->st_shndx == SHN_COMMON)
1362
0
      {
1363
0
        sym->symbol.section = bfd_com_section_ptr;
1364
0
        if ((abfd->flags & BFD_PLUGIN) != 0)
1365
0
    {
1366
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1367
1368
0
      if (xc == NULL)
1369
0
        {
1370
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1371
0
          | SEC_EXCLUDE);
1372
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1373
0
          if (xc == NULL)
1374
0
      goto error_return;
1375
0
        }
1376
0
      sym->symbol.section = xc;
1377
0
    }
1378
        /* Elf puts the alignment into the `value' field, and
1379
     the size into the `size' field.  BFD wants to see the
1380
     size in the value field, and doesn't care (at the
1381
     moment) about the alignment.  */
1382
0
        sym->symbol.value = isym->st_size;
1383
0
      }
1384
34.3k
    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
34.3k
    else
1394
34.3k
      {
1395
34.3k
        sym->symbol.section
1396
34.3k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
34.3k
        if (sym->symbol.section == NULL)
1398
14.0k
    {
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
14.0k
      sym->symbol.section = bfd_abs_section_ptr;
1406
14.0k
    }
1407
34.3k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
41.9k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
37.4k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
41.9k
    switch (ELF_ST_BIND (isym->st_info))
1415
41.9k
      {
1416
10.2k
      case STB_LOCAL:
1417
10.2k
        sym->symbol.flags |= BSF_LOCAL;
1418
10.2k
        break;
1419
20.1k
      case STB_GLOBAL:
1420
20.1k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
15.3k
    sym->symbol.flags |= BSF_GLOBAL;
1422
20.1k
        break;
1423
1.40k
      case STB_WEAK:
1424
1.40k
        sym->symbol.flags |= BSF_WEAK;
1425
1.40k
        break;
1426
1.05k
      case STB_GNU_UNIQUE:
1427
1.05k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
1.05k
        break;
1429
41.9k
      }
1430
1431
41.9k
    switch (ELF_ST_TYPE (isym->st_info))
1432
41.9k
      {
1433
1.55k
      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
1.55k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
1.55k
            | BSF_DEBUGGING
1440
1.55k
            | BSF_SECTION_SYM_USED);
1441
1.55k
        break;
1442
1.05k
      case STT_FILE:
1443
1.05k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
1.05k
        break;
1445
19.0k
      case STT_FUNC:
1446
19.0k
        sym->symbol.flags |= BSF_FUNCTION;
1447
19.0k
        break;
1448
884
      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
884
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
7.40k
      case STT_OBJECT:
1454
7.40k
        sym->symbol.flags |= BSF_OBJECT;
1455
7.40k
        break;
1456
685
      case STT_TLS:
1457
685
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
685
        break;
1459
590
      case STT_RELC:
1460
590
        sym->symbol.flags |= BSF_RELC;
1461
590
        break;
1462
673
      case STT_SRELC:
1463
673
        sym->symbol.flags |= BSF_SRELC;
1464
673
        break;
1465
471
      case STT_GNU_IFUNC:
1466
471
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
471
        break;
1468
41.9k
      }
1469
1470
41.9k
    if (dynamic)
1471
15.7k
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
41.9k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
41.9k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
41.9k
    else if (xver != NULL)
1477
14.4k
      {
1478
14.4k
        Elf_Internal_Versym iversym;
1479
1480
14.4k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
14.4k
        sym->version = iversym.vs_vers;
1482
14.4k
        xver++;
1483
14.4k
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
41.9k
    if (ebd->elf_backend_symbol_processing)
1487
2.84k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
41.9k
  }
1489
34
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
51
  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
51
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
51
  if (symptrs)
1501
51
    {
1502
51
      long l = symcount;
1503
1504
51
      sym = symbase;
1505
41.9k
      while (l-- > 0)
1506
41.9k
  {
1507
41.9k
    *symptrs++ = &sym->symbol;
1508
41.9k
    sym++;
1509
41.9k
  }
1510
51
      *symptrs = 0;   /* Final null pointer */
1511
51
    }
1512
1513
51
  free (xverbuf);
1514
51
  if (hdr->contents != (unsigned char *) isymbuf
1515
51
      && !elf_use_dt_symtab_p (abfd))
1516
34
    free (isymbuf);
1517
51
  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
54
}
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
624
{
1539
624
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
624
  void *allocated = NULL;
1541
624
  bfd_byte *native_relocs;
1542
624
  arelent *relent;
1543
624
  unsigned int i;
1544
624
  int entsize;
1545
624
  unsigned int symcount;
1546
1547
624
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
11
    return false;
1549
613
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
613
  if (allocated == NULL)
1551
1
    return false;
1552
1553
612
  native_relocs = (bfd_byte *) allocated;
1554
1555
612
  entsize = rel_hdr->sh_entsize;
1556
612
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
612
        || entsize == sizeof (Elf_External_Rela));
1558
1559
612
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
612
  else
1562
612
    symcount = bfd_get_symcount (abfd);
1563
1564
612
  for (i = 0, relent = relents;
1565
112k
       i < reloc_count;
1566
111k
       i++, relent++, native_relocs += entsize)
1567
111k
    {
1568
111k
      bool res;
1569
111k
      Elf_Internal_Rela rela;
1570
1571
111k
      if (entsize == sizeof (Elf_External_Rela))
1572
111k
  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
111k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
111k
  relent->address = rela.r_offset;
1582
0
      else
1583
0
  relent->address = rela.r_offset - asect->vma;
1584
1585
111k
      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
741
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
110k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
2.25k
  {
1591
2.25k
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
2.25k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
2.25k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
2.25k
    bfd_set_error (bfd_error_bad_value);
1596
2.25k
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
2.25k
  }
1598
108k
      else
1599
108k
  {
1600
108k
    asymbol **ps;
1601
1602
108k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
108k
    relent->sym_ptr_ptr = ps;
1605
108k
  }
1606
1607
111k
      relent->addend = rela.r_addend;
1608
1609
111k
      if ((entsize == sizeof (Elf_External_Rela)
1610
111k
     && ebd->elf_info_to_howto != NULL)
1611
111k
    || ebd->elf_info_to_howto_rel == NULL)
1612
111k
  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
111k
      if (! res || relent->howto == NULL)
1617
36
  goto error_return;
1618
111k
    }
1619
1620
576
  free (allocated);
1621
576
  return true;
1622
1623
36
 error_return:
1624
36
  free (allocated);
1625
36
  return false;
1626
612
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1538
624
{
1539
624
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
624
  void *allocated = NULL;
1541
624
  bfd_byte *native_relocs;
1542
624
  arelent *relent;
1543
624
  unsigned int i;
1544
624
  int entsize;
1545
624
  unsigned int symcount;
1546
1547
624
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
11
    return false;
1549
613
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
613
  if (allocated == NULL)
1551
1
    return false;
1552
1553
612
  native_relocs = (bfd_byte *) allocated;
1554
1555
612
  entsize = rel_hdr->sh_entsize;
1556
612
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
612
        || entsize == sizeof (Elf_External_Rela));
1558
1559
612
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
612
  else
1562
612
    symcount = bfd_get_symcount (abfd);
1563
1564
612
  for (i = 0, relent = relents;
1565
112k
       i < reloc_count;
1566
111k
       i++, relent++, native_relocs += entsize)
1567
111k
    {
1568
111k
      bool res;
1569
111k
      Elf_Internal_Rela rela;
1570
1571
111k
      if (entsize == sizeof (Elf_External_Rela))
1572
111k
  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
111k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
111k
  relent->address = rela.r_offset;
1582
0
      else
1583
0
  relent->address = rela.r_offset - asect->vma;
1584
1585
111k
      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
741
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
110k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
2.25k
  {
1591
2.25k
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
2.25k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
2.25k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
2.25k
    bfd_set_error (bfd_error_bad_value);
1596
2.25k
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
2.25k
  }
1598
108k
      else
1599
108k
  {
1600
108k
    asymbol **ps;
1601
1602
108k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
108k
    relent->sym_ptr_ptr = ps;
1605
108k
  }
1606
1607
111k
      relent->addend = rela.r_addend;
1608
1609
111k
      if ((entsize == sizeof (Elf_External_Rela)
1610
111k
     && ebd->elf_info_to_howto != NULL)
1611
111k
    || ebd->elf_info_to_howto_rel == NULL)
1612
111k
  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
111k
      if (! res || relent->howto == NULL)
1617
36
  goto error_return;
1618
111k
    }
1619
1620
576
  free (allocated);
1621
576
  return true;
1622
1623
36
 error_return:
1624
36
  free (allocated);
1625
36
  return false;
1626
612
}
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
629
{
1636
629
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
629
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
629
  Elf_Internal_Shdr *rel_hdr;
1639
629
  Elf_Internal_Shdr *rel_hdr2;
1640
629
  bfd_size_type reloc_count;
1641
629
  bfd_size_type reloc_count2;
1642
629
  arelent *relents;
1643
629
  size_t amt;
1644
1645
629
  if (asect->relocation != NULL)
1646
1
    return true;
1647
1648
628
  if (! dynamic)
1649
628
    {
1650
628
      if ((asect->flags & SEC_RELOC) == 0
1651
628
    || asect->reloc_count == 0)
1652
4
  return true;
1653
1654
624
      rel_hdr = d->rel.hdr;
1655
624
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
624
      rel_hdr2 = d->rela.hdr;
1657
624
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
624
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
624
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
624
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
624
    }
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
624
  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
624
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
624
  if (relents == NULL)
1688
0
    return false;
1689
1690
624
  if (rel_hdr
1691
624
      && !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
624
  if (rel_hdr2
1698
624
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
624
                rel_hdr2, reloc_count2,
1700
624
                relents + reloc_count,
1701
624
                symbols, dynamic))
1702
48
    return false;
1703
1704
576
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
41
    return false;
1706
1707
535
  asect->relocation = relents;
1708
535
  return true;
1709
576
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1635
629
{
1636
629
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
629
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
629
  Elf_Internal_Shdr *rel_hdr;
1639
629
  Elf_Internal_Shdr *rel_hdr2;
1640
629
  bfd_size_type reloc_count;
1641
629
  bfd_size_type reloc_count2;
1642
629
  arelent *relents;
1643
629
  size_t amt;
1644
1645
629
  if (asect->relocation != NULL)
1646
1
    return true;
1647
1648
628
  if (! dynamic)
1649
628
    {
1650
628
      if ((asect->flags & SEC_RELOC) == 0
1651
628
    || asect->reloc_count == 0)
1652
4
  return true;
1653
1654
624
      rel_hdr = d->rel.hdr;
1655
624
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
624
      rel_hdr2 = d->rela.hdr;
1657
624
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
624
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
624
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
624
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
624
    }
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
624
  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
624
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
624
  if (relents == NULL)
1688
0
    return false;
1689
1690
624
  if (rel_hdr
1691
624
      && !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
624
  if (rel_hdr2
1698
624
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
624
                rel_hdr2, reloc_count2,
1700
624
                relents + reloc_count,
1701
624
                symbols, dynamic))
1702
48
    return false;
1703
1704
576
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
41
    return false;
1706
1707
535
  asect->relocation = relents;
1708
535
  return true;
1709
576
}
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
29
{
2039
29
  return ELF_R_SYM (r_info);
2040
29
}
elf64_r_sym
Line
Count
Source
2038
24
{
2039
24
  return ELF_R_SYM (r_info);
2040
24
}
elf32_r_sym
Line
Count
Source
2038
5
{
2039
5
  return ELF_R_SYM (r_info);
2040
5
}
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
};