Coverage Report

Created: 2023-06-29 07:06

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