Coverage Report

Created: 2023-06-29 07:05

/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
20.3M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
0
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
20.3M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
346k
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
0
#define Elf_External_Rela NAME(Elf,External_Rela)
83
0
#define Elf_External_Dyn  NAME(Elf,External_Dyn)
84
85
#define elf_core_file_failing_command NAME(bfd_elf,core_file_failing_command)
86
#define elf_core_file_failing_signal  NAME(bfd_elf,core_file_failing_signal)
87
#define elf_core_file_matches_executable_p \
88
  NAME(bfd_elf,core_file_matches_executable_p)
89
#define elf_core_file_pid   NAME(bfd_elf,core_file_pid)
90
#define elf_object_p      NAME(bfd_elf,object_p)
91
#define elf_core_file_p     NAME(bfd_elf,core_file_p)
92
#define elf_get_symtab_upper_bound  NAME(bfd_elf,get_symtab_upper_bound)
93
#define elf_get_dynamic_symtab_upper_bound \
94
  NAME(bfd_elf,get_dynamic_symtab_upper_bound)
95
0
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
0
#define elf_swap_reloca_in    NAME(bfd_elf,swap_reloca_in)
97
0
#define elf_swap_reloc_out    NAME(bfd_elf,swap_reloc_out)
98
0
#define elf_swap_reloca_out   NAME(bfd_elf,swap_reloca_out)
99
#define elf_swap_symbol_in    NAME(bfd_elf,swap_symbol_in)
100
#define elf_swap_symbol_out   NAME(bfd_elf,swap_symbol_out)
101
346k
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
0
#define elf_swap_phdr_out   NAME(bfd_elf,swap_phdr_out)
103
#define elf_swap_dyn_in     NAME(bfd_elf,swap_dyn_in)
104
#define elf_swap_dyn_out    NAME(bfd_elf,swap_dyn_out)
105
#define elf_get_reloc_upper_bound NAME(bfd_elf,get_reloc_upper_bound)
106
#define elf_canonicalize_reloc    NAME(bfd_elf,canonicalize_reloc)
107
#define elf_slurp_symbol_table    NAME(bfd_elf,slurp_symbol_table)
108
#define elf_canonicalize_symtab   NAME(bfd_elf,canonicalize_symtab)
109
#define elf_canonicalize_dynamic_symtab \
110
  NAME(bfd_elf,canonicalize_dynamic_symtab)
111
#define elf_get_synthetic_symtab \
112
  NAME(bfd_elf,get_synthetic_symtab)
113
#define elf_make_empty_symbol   NAME(bfd_elf,make_empty_symbol)
114
#define elf_get_symbol_info   NAME(bfd_elf,get_symbol_info)
115
#define elf_get_lineno      NAME(bfd_elf,get_lineno)
116
#define elf_set_arch_mach   NAME(bfd_elf,set_arch_mach)
117
#define elf_find_nearest_line   NAME(bfd_elf,find_nearest_line)
118
#define elf_sizeof_headers    NAME(bfd_elf,sizeof_headers)
119
#define elf_set_section_contents  NAME(bfd_elf,set_section_contents)
120
#define elf_no_info_to_howto    NAME(bfd_elf,no_info_to_howto)
121
#define elf_no_info_to_howto_rel  NAME(bfd_elf,no_info_to_howto_rel)
122
#define elf_find_section    NAME(bfd_elf,find_section)
123
#define elf_write_shdrs_and_ehdr  NAME(bfd_elf,write_shdrs_and_ehdr)
124
#define elf_write_out_phdrs   NAME(bfd_elf,write_out_phdrs)
125
#define elf_checksum_contents   NAME(bfd_elf,checksum_contents)
126
#define elf_write_relocs    NAME(bfd_elf,write_relocs)
127
#define elf_slurp_reloc_table   NAME(bfd_elf,slurp_reloc_table)
128
129
#if ARCH_SIZE == 64
130
0
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
0
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
610k
#define ELFCLASS  ELFCLASS64
134
#define FILE_ALIGN  8
135
#define LOG_FILE_ALIGN  3
136
#endif
137
#if ARCH_SIZE == 32
138
0
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
139
0
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
1.87M
#define ELFCLASS  ELFCLASS32
142
#define FILE_ALIGN  4
143
#define LOG_FILE_ALIGN  2
144
#endif
145
146
#if DEBUG & 2
147
static void elf_debug_section (int, Elf_Internal_Shdr *);
148
#endif
149
#if DEBUG & 1
150
static void elf_debug_file (Elf_Internal_Ehdr *);
151
#endif
152

153
/* Structure swapping routines */
154
155
/* Should perhaps use put_offset, put_word, etc.  For now, the two versions
156
   can be handled by explicitly specifying 32 bits or "the long type".  */
157
#if ARCH_SIZE == 64
158
0
#define H_PUT_WORD    H_PUT_64
159
0
#define H_PUT_SIGNED_WORD H_PUT_S64
160
1.12M
#define H_GET_WORD    H_GET_64
161
51.1k
#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
2.52M
#define H_GET_WORD    H_GET_32
167
58.4k
#define H_GET_SIGNED_WORD H_GET_S32
168
#endif
169
170
/* Translate an ELF symbol in external format into an ELF symbol in internal
171
   format.  */
172
173
bool
174
elf_swap_symbol_in (bfd *abfd,
175
        const void *psrc,
176
        const void *pshn,
177
        Elf_Internal_Sym *dst)
178
17.9k
{
179
17.9k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
17.9k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
17.9k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
17.9k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
17.9k
  if (signed_vma)
185
186
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
17.8k
  else
187
17.8k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
17.9k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
17.9k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
17.9k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
17.9k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
17.9k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
21
    {
194
21
      if (shndx == NULL)
195
10
  return false;
196
11
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
11
    }
198
17.9k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
108
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
17.9k
  dst->st_target_internal = 0;
201
17.9k
  return true;
202
17.9k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
17.9k
{
179
17.9k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
17.9k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
17.9k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
17.9k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
17.9k
  if (signed_vma)
185
186
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
17.8k
  else
187
17.8k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
17.9k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
17.9k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
17.9k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
17.9k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
17.9k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
21
    {
194
21
      if (shndx == NULL)
195
10
  return false;
196
11
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
11
    }
198
17.9k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
108
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
17.9k
  dst->st_target_internal = 0;
201
17.9k
  return true;
202
17.9k
}
Unexecuted instantiation: bfd_elf32_swap_symbol_in
203
204
/* Translate an ELF symbol in internal format into an ELF symbol in external
205
   format.  */
206
207
void
208
elf_swap_symbol_out (bfd *abfd,
209
         const Elf_Internal_Sym *src,
210
         void *cdst,
211
         void *shndx)
212
0
{
213
0
  unsigned int tmp;
214
0
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
0
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
0
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
0
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
0
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
0
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
0
  tmp = src->st_shndx;
221
0
  if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
222
0
    {
223
0
      if (shndx == NULL)
224
0
  abort ();
225
0
      H_PUT_32 (abfd, tmp, shndx);
226
0
      tmp = SHN_XINDEX & 0xffff;
227
0
    }
228
0
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
0
}
Unexecuted instantiation: bfd_elf64_swap_symbol_out
Unexecuted instantiation: bfd_elf32_swap_symbol_out
230
231
/* Translate an ELF file header in external format into an ELF file header in
232
   internal format.  */
233
234
static void
235
elf_swap_ehdr_in (bfd *abfd,
236
      const Elf_External_Ehdr *src,
237
      Elf_Internal_Ehdr *dst)
238
442k
{
239
442k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
442k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
442k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
442k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
442k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
442k
  if (signed_vma)
245
55.7k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
386k
  else
247
386k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
442k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
442k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
442k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
442k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
442k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
442k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
442k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
442k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
442k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
442k
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
262k
{
239
262k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
262k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
262k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
262k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
262k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
262k
  if (signed_vma)
245
36.3k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
225k
  else
247
225k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
262k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
262k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
262k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
262k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
262k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
262k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
262k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
262k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
262k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
262k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
179k
{
239
179k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
179k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
179k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
179k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
179k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
179k
  if (signed_vma)
245
19.4k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
160k
  else
247
160k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
179k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
179k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
179k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
179k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
179k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
179k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
179k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
179k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
179k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
179k
}
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
52.9k
{
306
52.9k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
52.9k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
52.9k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
52.9k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
52.9k
  if (signed_vma)
312
13.3k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
39.5k
  else
314
39.5k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
52.9k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
52.9k
  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
52.9k
  if (dst->sh_type != SHT_NOBITS)
321
52.0k
    {
322
52.0k
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
52.0k
      if (filesize != 0
325
52.0k
    && ((ufile_ptr) dst->sh_offset > filesize
326
52.0k
        || dst->sh_size > filesize - dst->sh_offset)
327
52.0k
    && !abfd->read_only)
328
15.7k
  {
329
15.7k
    _bfd_error_handler (_("warning: %pB has a section "
330
15.7k
        "extending past end of file"), abfd);
331
15.7k
    abfd->read_only = 1;
332
15.7k
  }
333
52.0k
    }
334
52.9k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
52.9k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
52.9k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
52.9k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
52.9k
  dst->bfd_section = NULL;
339
52.9k
  dst->contents = NULL;
340
52.9k
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
305
48.2k
{
306
48.2k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
48.2k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
48.2k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
48.2k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
48.2k
  if (signed_vma)
312
12.3k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
35.9k
  else
314
35.9k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
48.2k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
48.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
48.2k
  if (dst->sh_type != SHT_NOBITS)
321
47.5k
    {
322
47.5k
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
47.5k
      if (filesize != 0
325
47.5k
    && ((ufile_ptr) dst->sh_offset > filesize
326
47.5k
        || dst->sh_size > filesize - dst->sh_offset)
327
47.5k
    && !abfd->read_only)
328
14.9k
  {
329
14.9k
    _bfd_error_handler (_("warning: %pB has a section "
330
14.9k
        "extending past end of file"), abfd);
331
14.9k
    abfd->read_only = 1;
332
14.9k
  }
333
47.5k
    }
334
48.2k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
48.2k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
48.2k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
48.2k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
48.2k
  dst->bfd_section = NULL;
339
48.2k
  dst->contents = NULL;
340
48.2k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
305
4.68k
{
306
4.68k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
4.68k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
4.68k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
4.68k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
4.68k
  if (signed_vma)
312
1.02k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
3.66k
  else
314
3.66k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
4.68k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
4.68k
  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
4.68k
  if (dst->sh_type != SHT_NOBITS)
321
4.53k
    {
322
4.53k
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
4.53k
      if (filesize != 0
325
4.53k
    && ((ufile_ptr) dst->sh_offset > filesize
326
4.53k
        || dst->sh_size > filesize - dst->sh_offset)
327
4.53k
    && !abfd->read_only)
328
804
  {
329
804
    _bfd_error_handler (_("warning: %pB has a section "
330
804
        "extending past end of file"), abfd);
331
804
    abfd->read_only = 1;
332
804
  }
333
4.53k
    }
334
4.68k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
4.68k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
4.68k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
4.68k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
4.68k
  dst->bfd_section = NULL;
339
4.68k
  dst->contents = NULL;
340
4.68k
}
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
346k
{
371
346k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
346k
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
346k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
346k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
346k
  if (signed_vma)
377
20.1k
    {
378
20.1k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
20.1k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
20.1k
    }
381
326k
  else
382
326k
    {
383
326k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
326k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
326k
    }
386
346k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
346k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
346k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
346k
}
bfd_elf64_swap_phdr_in
Line
Count
Source
370
10.9k
{
371
10.9k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
10.9k
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
10.9k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
10.9k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
10.9k
  if (signed_vma)
377
1.12k
    {
378
1.12k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
1.12k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
1.12k
    }
381
9.81k
  else
382
9.81k
    {
383
9.81k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
9.81k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
9.81k
    }
386
10.9k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
10.9k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
10.9k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
10.9k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
370
335k
{
371
335k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
335k
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
335k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
335k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
335k
  if (signed_vma)
377
19.0k
    {
378
19.0k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
19.0k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
19.0k
    }
381
316k
  else
382
316k
    {
383
316k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
316k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
316k
    }
386
335k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
335k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
335k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
335k
}
390
391
void
392
elf_swap_phdr_out (bfd *abfd,
393
       const Elf_Internal_Phdr *src,
394
       Elf_External_Phdr *dst)
395
0
{
396
0
  const struct elf_backend_data *bed;
397
0
  bfd_vma p_paddr;
398
399
0
  bed = get_elf_backend_data (abfd);
400
0
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
401
402
  /* note that all elements of dst are *arrays of unsigned char* already...  */
403
0
  H_PUT_32 (abfd, src->p_type, dst->p_type);
404
0
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
405
0
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
406
0
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
407
0
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
408
0
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
409
0
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
410
0
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
411
0
}
Unexecuted instantiation: bfd_elf64_swap_phdr_out
Unexecuted instantiation: bfd_elf32_swap_phdr_out
412
413
/* Translate an ELF reloc from external format to internal format.  */
414
void
415
elf_swap_reloc_in (bfd *abfd,
416
       const bfd_byte *s,
417
       Elf_Internal_Rela *dst)
418
0
{
419
0
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
420
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
421
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
422
0
  dst->r_addend = 0;
423
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
Unexecuted instantiation: bfd_elf32_swap_reloc_in
424
425
void
426
elf_swap_reloca_in (bfd *abfd,
427
        const bfd_byte *s,
428
        Elf_Internal_Rela *dst)
429
0
{
430
0
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
431
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
432
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
433
0
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
434
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_in
Unexecuted instantiation: bfd_elf32_swap_reloca_in
435
436
/* Translate an ELF reloc from internal format to external format.  */
437
void
438
elf_swap_reloc_out (bfd *abfd,
439
        const Elf_Internal_Rela *src,
440
        bfd_byte *d)
441
0
{
442
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
443
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
444
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
445
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
446
447
void
448
elf_swap_reloca_out (bfd *abfd,
449
         const Elf_Internal_Rela *src,
450
         bfd_byte *d)
451
0
{
452
0
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
453
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
454
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
455
0
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
456
0
}
Unexecuted instantiation: bfd_elf64_swap_reloca_out
Unexecuted instantiation: bfd_elf32_swap_reloca_out
457
458
void
459
elf_swap_dyn_in (bfd *abfd,
460
     const void *p,
461
     Elf_Internal_Dyn *dst)
462
0
{
463
0
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
464
465
0
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
466
0
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
467
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_in
Unexecuted instantiation: bfd_elf32_swap_dyn_in
468
469
void
470
elf_swap_dyn_out (bfd *abfd,
471
      const Elf_Internal_Dyn *src,
472
      void *p)
473
0
{
474
0
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
475
476
0
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
477
0
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
478
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_out
Unexecuted instantiation: bfd_elf32_swap_dyn_out
479

480
/* ELF .o/exec file reading */
481
482
/* Begin processing a given object.
483
484
   First we validate the file by reading in the ELF header and checking
485
   the magic number.  */
486
487
static inline bool
488
elf_file_p (Elf_External_Ehdr *x_ehdrp)
489
19.8M
{
490
19.8M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
19.8M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
19.8M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
19.8M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
19.8M
}
elf64.c:elf_file_p
Line
Count
Source
489
4.82M
{
490
4.82M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
4.82M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
4.82M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
4.82M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
4.82M
}
elf32.c:elf_file_p
Line
Count
Source
489
14.9M
{
490
14.9M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
14.9M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
14.9M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
14.9M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
14.9M
}
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
20.3M
{
507
20.3M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
20.3M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
20.3M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
20.3M
  Elf_Internal_Shdr i_shdr;
511
20.3M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
20.3M
  unsigned int shindex;
513
20.3M
  const struct elf_backend_data *ebd;
514
20.3M
  asection *s;
515
20.3M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
20.3M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
579k
    {
521
579k
      if (bfd_get_error () != bfd_error_system_call)
522
538k
  goto got_wrong_format_error;
523
40.6k
      else
524
40.6k
  goto got_no_match;
525
579k
    }
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
19.8M
  if (! elf_file_p (&x_ehdr)
534
19.8M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
19.8M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
18.9M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
856k
  switch (x_ehdr.e_ident[EI_DATA])
540
856k
    {
541
126k
    case ELFDATA2MSB:   /* Big-endian */
542
126k
      if (! bfd_header_big_endian (abfd))
543
65.2k
  goto got_wrong_format_error;
544
61.5k
      break;
545
727k
    case ELFDATA2LSB:   /* Little-endian */
546
727k
      if (! bfd_header_little_endian (abfd))
547
347k
  goto got_wrong_format_error;
548
380k
      break;
549
380k
    case ELFDATANONE:   /* No data encoding specified */
550
2.11k
    default:      /* Unknown data encoding specified */
551
2.11k
      goto got_wrong_format_error;
552
856k
    }
553
554
442k
  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
442k
  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
442k
  i_ehdrp = elf_elfheader (abfd);
564
442k
  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
442k
  if (i_ehdrp->e_type == ET_CORE)
571
624
    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
441k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
270
    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
441k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
744
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
440k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
174
    goto got_wrong_format_error;
587
588
440k
  ebd = get_elf_backend_data (abfd);
589
440k
  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
440k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
440k
      && (ebd->elf_machine_alt1 == 0
596
405k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
440k
      && (ebd->elf_machine_alt2 == 0
598
404k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
440k
      && ebd->elf_machine_code != EM_NONE)
600
391k
    goto got_wrong_format_error;
601
602
48.3k
  if (i_ehdrp->e_type == ET_EXEC)
603
222
    abfd->flags |= EXEC_P;
604
48.1k
  else if (i_ehdrp->e_type == ET_DYN)
605
1.09k
    abfd->flags |= DYNAMIC;
606
607
48.3k
  if (i_ehdrp->e_phnum > 0)
608
12.0k
    abfd->flags |= D_PAGED;
609
610
48.3k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
14.3k
    {
612
      /* It's OK if this fails for the generic target.  */
613
14.3k
      if (ebd->elf_machine_code != EM_NONE)
614
264
  goto got_no_match;
615
14.3k
    }
616
617
48.0k
  if (ebd->elf_machine_code != EM_NONE
618
48.0k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
48.0k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
8.64k
    goto got_wrong_format_error;
621
622
39.4k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
23.9k
    {
624
23.9k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
23.9k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
918
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
22.9k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
1.24k
  goto got_no_match;
634
21.7k
      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
21.7k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
10.0k
  {
640
10.0k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
10.0k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
10.0k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
10.0k
        || i_ehdrp->e_shnum  == 0)
644
2.78k
      goto got_wrong_format_error;
645
10.0k
  }
646
647
      /* And similarly for the string table index.  */
648
18.9k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
3.04k
  {
650
3.04k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
3.04k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
3.04k
  }
654
655
      /* And program headers.  */
656
18.9k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
242
  {
658
242
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
242
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
242
  }
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
18.9k
      if (i_ehdrp->e_shnum != 1)
666
6.44k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
6.44k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
6.44k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
992
      goto got_wrong_format_error;
671
672
5.45k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
5.45k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
5.45k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
5.45k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
1.07k
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
4.38k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
4.38k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
4.38k
  }
686
18.9k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
32.4k
  if (i_ehdrp->e_shnum != 0)
691
16.9k
    {
692
16.9k
      Elf_Internal_Shdr *shdrp;
693
16.9k
      unsigned int num_sec;
694
16.9k
      size_t amt;
695
696
16.9k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
16.9k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
16.9k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
16.9k
      num_sec = i_ehdrp->e_shnum;
702
16.9k
      elf_numsections (abfd) = num_sec;
703
16.9k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
16.9k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
16.9k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
16.9k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
16.9k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
16.9k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
66.5k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
49.5k
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
46.7k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
31.1k
  {
720
31.1k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
31.1k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
31.1k
    if (i_shdrp[shindex].sh_link >= num_sec)
726
1.49k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
1.49k
        switch (ebd->elf_machine_code)
730
1.49k
    {
731
44
    case EM_386:
732
46
    case EM_IAMCU:
733
752
    case EM_X86_64:
734
752
    case EM_OLD_SPARCV9:
735
752
    case EM_SPARC32PLUS:
736
952
    case EM_SPARCV9:
737
976
    case EM_SPARC:
738
976
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
976
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
188
        break;
741
      /* Otherwise fall through.  */
742
1.31k
    default:
743
1.31k
      goto got_wrong_format_error;
744
1.49k
    }
745
1.49k
      }
746
747
29.8k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
29.8k
         || i_shdrp[shindex].sh_type == SHT_RELA
749
29.8k
         || i_shdrp[shindex].sh_type == SHT_REL)
750
29.8k
        && i_shdrp[shindex].sh_info >= num_sec)
751
72
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
29.8k
    if (i_shdrp[shindex].sh_size != 0
756
29.8k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
29.8k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
29.8k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
2.10k
       % ebd->minpagesize)
760
2.10k
      != 0))
761
838
      abfd->flags &= ~D_PAGED;
762
29.8k
  }
763
764
15.5k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
15.5k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
13.1k
  {
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
13.1k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
13.1k
    if (!abfd->read_only)
775
5.08k
      {
776
5.08k
        _bfd_error_handler
777
5.08k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
5.08k
        abfd->read_only = 1;
779
5.08k
      }
780
13.1k
  }
781
15.5k
    }
782
15.5k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
246
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
30.8k
  if (i_ehdrp->e_phnum == 0)
787
22.7k
    elf_tdata (abfd)->phdr = NULL;
788
8.03k
  else
789
8.03k
    {
790
8.03k
      Elf_Internal_Phdr *i_phdr;
791
8.03k
      unsigned int i;
792
8.03k
      ufile_ptr filesize;
793
8.03k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
8.03k
      filesize = bfd_get_file_size (abfd);
798
8.03k
      if (filesize != 0
799
8.03k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
1.08k
  goto got_wrong_format_error;
801
6.94k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
6.94k
      elf_tdata (abfd)->phdr
804
6.94k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
6.94k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
6.94k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
18
  goto got_no_match;
809
6.92k
      i_phdr = elf_tdata (abfd)->phdr;
810
353k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
346k
  {
812
346k
    Elf_External_Phdr x_phdr;
813
814
346k
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
192
      goto got_no_match;
816
346k
    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
346k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
216k
      {
821
216k
        i_phdr->p_align &= -i_phdr->p_align;
822
216k
        if (!abfd->read_only)
823
6.15k
    {
824
6.15k
      _bfd_error_handler (_("warning: %pB has a program header "
825
6.15k
          "with invalid alignment"), abfd);
826
6.15k
      abfd->read_only = 1;
827
6.15k
    }
828
216k
      }
829
346k
  }
830
6.92k
    }
831
832
29.5k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
2.27k
    {
834
2.27k
      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
2.27k
      num_sec = elf_numsections (abfd);
840
22.1k
      for (shindex = 1; shindex < num_sec; shindex++)
841
20.7k
  if (!bfd_section_from_shdr (abfd, shindex))
842
876
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
1.39k
      if (! _bfd_elf_setup_sections (abfd))
846
108
  goto got_wrong_format_error;
847
1.39k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
28.5k
  if (ebd->elf_backend_object_p)
852
17.2k
    {
853
17.2k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
1.38k
  goto got_wrong_format_error;
855
17.2k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
27.1k
  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
30.9k
  for (s = abfd->sections; s != NULL; s = s->next)
863
3.79k
    {
864
3.79k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
3.79k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
3.79k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
38
  {
868
38
    unsigned long targ_index;
869
38
    asection *targ_sec;
870
871
38
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
38
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
38
    if (targ_sec != NULL
874
38
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
38
  }
877
3.79k
    }
878
27.1k
  return _bfd_no_cleanup;
879
880
20.3M
 got_wrong_format_error:
881
20.3M
  bfd_set_error (bfd_error_wrong_format);
882
883
20.3M
 got_no_match:
884
20.3M
  return NULL;
885
20.3M
}
bfd_elf64_object_p
Line
Count
Source
506
4.98M
{
507
4.98M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
4.98M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
4.98M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
4.98M
  Elf_Internal_Shdr i_shdr;
511
4.98M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
4.98M
  unsigned int shindex;
513
4.98M
  const struct elf_backend_data *ebd;
514
4.98M
  asection *s;
515
4.98M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
4.98M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
159k
    {
521
159k
      if (bfd_get_error () != bfd_error_system_call)
522
149k
  goto got_wrong_format_error;
523
9.77k
      else
524
9.77k
  goto got_no_match;
525
159k
    }
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
4.82M
  if (! elf_file_p (&x_ehdr)
534
4.82M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
4.82M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
4.32M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
494k
  switch (x_ehdr.e_ident[EI_DATA])
540
494k
    {
541
65.8k
    case ELFDATA2MSB:   /* Big-endian */
542
65.8k
      if (! bfd_header_big_endian (abfd))
543
35.0k
  goto got_wrong_format_error;
544
30.7k
      break;
545
428k
    case ELFDATA2LSB:   /* Little-endian */
546
428k
      if (! bfd_header_little_endian (abfd))
547
197k
  goto got_wrong_format_error;
548
231k
      break;
549
231k
    case ELFDATANONE:   /* No data encoding specified */
550
514
    default:      /* Unknown data encoding specified */
551
514
      goto got_wrong_format_error;
552
494k
    }
553
554
262k
  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
262k
  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
262k
  i_ehdrp = elf_elfheader (abfd);
564
262k
  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
262k
  if (i_ehdrp->e_type == ET_CORE)
571
90
    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
261k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
138
    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
261k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
344
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
261k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
40
    goto got_wrong_format_error;
587
588
261k
  ebd = get_elf_backend_data (abfd);
589
261k
  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
261k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
261k
      && (ebd->elf_machine_alt1 == 0
596
235k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
261k
      && (ebd->elf_machine_alt2 == 0
598
234k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
261k
      && ebd->elf_machine_code != EM_NONE)
600
224k
    goto got_wrong_format_error;
601
602
37.0k
  if (i_ehdrp->e_type == ET_EXEC)
603
92
    abfd->flags |= EXEC_P;
604
37.0k
  else if (i_ehdrp->e_type == ET_DYN)
605
1.04k
    abfd->flags |= DYNAMIC;
606
607
37.0k
  if (i_ehdrp->e_phnum > 0)
608
7.88k
    abfd->flags |= D_PAGED;
609
610
37.0k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
11.4k
    {
612
      /* It's OK if this fails for the generic target.  */
613
11.4k
      if (ebd->elf_machine_code != EM_NONE)
614
0
  goto got_no_match;
615
11.4k
    }
616
617
37.0k
  if (ebd->elf_machine_code != EM_NONE
618
37.0k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
37.0k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
7.19k
    goto got_wrong_format_error;
621
622
29.9k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
22.1k
    {
624
22.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
22.1k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
918
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
21.2k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
1.17k
  goto got_no_match;
634
20.0k
      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
20.0k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
8.32k
  {
640
8.32k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
8.32k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
8.32k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
8.32k
        || i_ehdrp->e_shnum  == 0)
644
2.71k
      goto got_wrong_format_error;
645
8.32k
  }
646
647
      /* And similarly for the string table index.  */
648
17.3k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
2.93k
  {
650
2.93k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
2.93k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
2.93k
  }
654
655
      /* And program headers.  */
656
17.3k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
32
  {
658
32
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
32
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
32
  }
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
17.3k
      if (i_ehdrp->e_shnum != 1)
666
5.69k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
5.69k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
5.69k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
854
      goto got_wrong_format_error;
671
672
4.83k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
4.83k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
4.83k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
4.83k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
948
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
3.89k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
3.89k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
3.89k
  }
686
17.3k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
23.2k
  if (i_ehdrp->e_shnum != 0)
691
15.5k
    {
692
15.5k
      Elf_Internal_Shdr *shdrp;
693
15.5k
      unsigned int num_sec;
694
15.5k
      size_t amt;
695
696
15.5k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
15.5k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
15.5k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
15.5k
      num_sec = i_ehdrp->e_shnum;
702
15.5k
      elf_numsections (abfd) = num_sec;
703
15.5k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
15.5k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
15.5k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
15.5k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
15.5k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
15.5k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
60.0k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
44.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
42.6k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
28.2k
  {
720
28.2k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
28.2k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
28.2k
    if (i_shdrp[shindex].sh_link >= num_sec)
726
1.25k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
1.25k
        switch (ebd->elf_machine_code)
730
1.25k
    {
731
0
    case EM_386:
732
0
    case EM_IAMCU:
733
692
    case EM_X86_64:
734
692
    case EM_OLD_SPARCV9:
735
692
    case EM_SPARC32PLUS:
736
892
    case EM_SPARCV9:
737
892
    case EM_SPARC:
738
892
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
892
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
164
        break;
741
      /* Otherwise fall through.  */
742
1.09k
    default:
743
1.09k
      goto got_wrong_format_error;
744
1.25k
    }
745
1.25k
      }
746
747
27.1k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
27.1k
         || i_shdrp[shindex].sh_type == SHT_RELA
749
27.1k
         || i_shdrp[shindex].sh_type == SHT_REL)
750
27.1k
        && i_shdrp[shindex].sh_info >= num_sec)
751
34
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
27.0k
    if (i_shdrp[shindex].sh_size != 0
756
27.0k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
27.0k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
27.0k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
1.80k
       % ebd->minpagesize)
760
1.80k
      != 0))
761
628
      abfd->flags &= ~D_PAGED;
762
27.0k
  }
763
764
14.3k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
14.3k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
12.0k
  {
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
12.0k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
12.0k
    if (!abfd->read_only)
775
4.24k
      {
776
4.24k
        _bfd_error_handler
777
4.24k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
4.24k
        abfd->read_only = 1;
779
4.24k
      }
780
12.0k
  }
781
14.3k
    }
782
7.76k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
218
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
21.9k
  if (i_ehdrp->e_phnum == 0)
787
16.6k
    elf_tdata (abfd)->phdr = NULL;
788
5.26k
  else
789
5.26k
    {
790
5.26k
      Elf_Internal_Phdr *i_phdr;
791
5.26k
      unsigned int i;
792
5.26k
      ufile_ptr filesize;
793
5.26k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
5.26k
      filesize = bfd_get_file_size (abfd);
798
5.26k
      if (filesize != 0
799
5.26k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
944
  goto got_wrong_format_error;
801
4.31k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
4.31k
      elf_tdata (abfd)->phdr
804
4.31k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
4.31k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
4.31k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
18
  goto got_no_match;
809
4.30k
      i_phdr = elf_tdata (abfd)->phdr;
810
15.2k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
11.0k
  {
812
11.0k
    Elf_External_Phdr x_phdr;
813
814
11.0k
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
106
      goto got_no_match;
816
10.9k
    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
10.9k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
6.87k
      {
821
6.87k
        i_phdr->p_align &= -i_phdr->p_align;
822
6.87k
        if (!abfd->read_only)
823
3.78k
    {
824
3.78k
      _bfd_error_handler (_("warning: %pB has a program header "
825
3.78k
          "with invalid alignment"), abfd);
826
3.78k
      abfd->read_only = 1;
827
3.78k
    }
828
6.87k
      }
829
10.9k
  }
830
4.30k
    }
831
832
20.8k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
2.27k
    {
834
2.27k
      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
2.27k
      num_sec = elf_numsections (abfd);
840
22.1k
      for (shindex = 1; shindex < num_sec; shindex++)
841
20.7k
  if (!bfd_section_from_shdr (abfd, shindex))
842
876
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
1.39k
      if (! _bfd_elf_setup_sections (abfd))
846
108
  goto got_wrong_format_error;
847
1.39k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
19.8k
  if (ebd->elf_backend_object_p)
852
11.0k
    {
853
11.0k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
4
  goto got_wrong_format_error;
855
11.0k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
19.8k
  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
23.6k
  for (s = abfd->sections; s != NULL; s = s->next)
863
3.79k
    {
864
3.79k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
3.79k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
3.79k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
38
  {
868
38
    unsigned long targ_index;
869
38
    asection *targ_sec;
870
871
38
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
38
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
38
    if (targ_sec != NULL
874
38
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
38
  }
877
3.79k
    }
878
19.8k
  return _bfd_no_cleanup;
879
880
4.94M
 got_wrong_format_error:
881
4.94M
  bfd_set_error (bfd_error_wrong_format);
882
883
4.96M
 got_no_match:
884
4.96M
  return NULL;
885
4.94M
}
bfd_elf32_object_p
Line
Count
Source
506
15.4M
{
507
15.4M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
15.4M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
15.4M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
15.4M
  Elf_Internal_Shdr i_shdr;
511
15.4M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
15.4M
  unsigned int shindex;
513
15.4M
  const struct elf_backend_data *ebd;
514
15.4M
  asection *s;
515
15.4M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
15.4M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
419k
    {
521
419k
      if (bfd_get_error () != bfd_error_system_call)
522
388k
  goto got_wrong_format_error;
523
30.8k
      else
524
30.8k
  goto got_no_match;
525
419k
    }
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
14.9M
  if (! elf_file_p (&x_ehdr)
534
14.9M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
14.9M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
14.6M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
361k
  switch (x_ehdr.e_ident[EI_DATA])
540
361k
    {
541
61.0k
    case ELFDATA2MSB:   /* Big-endian */
542
61.0k
      if (! bfd_header_big_endian (abfd))
543
30.2k
  goto got_wrong_format_error;
544
30.7k
      break;
545
299k
    case ELFDATA2LSB:   /* Little-endian */
546
299k
      if (! bfd_header_little_endian (abfd))
547
149k
  goto got_wrong_format_error;
548
149k
      break;
549
149k
    case ELFDATANONE:   /* No data encoding specified */
550
1.59k
    default:      /* Unknown data encoding specified */
551
1.59k
      goto got_wrong_format_error;
552
361k
    }
553
554
179k
  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
179k
  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
179k
  i_ehdrp = elf_elfheader (abfd);
564
179k
  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
179k
  if (i_ehdrp->e_type == ET_CORE)
571
534
    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
179k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
132
    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
179k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
400
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
178k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
134
    goto got_wrong_format_error;
587
588
178k
  ebd = get_elf_backend_data (abfd);
589
178k
  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
178k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
178k
      && (ebd->elf_machine_alt1 == 0
596
170k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
178k
      && (ebd->elf_machine_alt2 == 0
598
169k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
178k
      && ebd->elf_machine_code != EM_NONE)
600
167k
    goto got_wrong_format_error;
601
602
11.2k
  if (i_ehdrp->e_type == ET_EXEC)
603
130
    abfd->flags |= EXEC_P;
604
11.1k
  else if (i_ehdrp->e_type == ET_DYN)
605
52
    abfd->flags |= DYNAMIC;
606
607
11.2k
  if (i_ehdrp->e_phnum > 0)
608
4.15k
    abfd->flags |= D_PAGED;
609
610
11.2k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
2.96k
    {
612
      /* It's OK if this fails for the generic target.  */
613
2.96k
      if (ebd->elf_machine_code != EM_NONE)
614
264
  goto got_no_match;
615
2.96k
    }
616
617
10.9k
  if (ebd->elf_machine_code != EM_NONE
618
10.9k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
10.9k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
1.44k
    goto got_wrong_format_error;
621
622
9.53k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
1.78k
    {
624
1.78k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
1.78k
      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
1.78k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
78
  goto got_no_match;
634
1.70k
      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.70k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
1.69k
  {
640
1.69k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
1.69k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
1.69k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
1.69k
        || i_ehdrp->e_shnum  == 0)
644
64
      goto got_wrong_format_error;
645
1.69k
  }
646
647
      /* And similarly for the string table index.  */
648
1.64k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
110
  {
650
110
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
110
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
110
  }
654
655
      /* And program headers.  */
656
1.64k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
210
  {
658
210
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
210
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
210
  }
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.64k
      if (i_ehdrp->e_shnum != 1)
666
756
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
756
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
756
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
138
      goto got_wrong_format_error;
671
672
618
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
618
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
618
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
618
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
122
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
496
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
496
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
496
  }
686
1.64k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
9.13k
  if (i_ehdrp->e_shnum != 0)
691
1.38k
    {
692
1.38k
      Elf_Internal_Shdr *shdrp;
693
1.38k
      unsigned int num_sec;
694
1.38k
      size_t amt;
695
696
1.38k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
1.38k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
1.38k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
1.38k
      num_sec = i_ehdrp->e_shnum;
702
1.38k
      elf_numsections (abfd) = num_sec;
703
1.38k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
1.38k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
1.38k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
1.38k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
1.38k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
1.38k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
6.48k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
5.10k
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
4.10k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
2.97k
  {
720
2.97k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
2.97k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
2.97k
    if (i_shdrp[shindex].sh_link >= num_sec)
726
240
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
240
        switch (ebd->elf_machine_code)
730
240
    {
731
44
    case EM_386:
732
46
    case EM_IAMCU:
733
60
    case EM_X86_64:
734
60
    case EM_OLD_SPARCV9:
735
60
    case EM_SPARC32PLUS:
736
60
    case EM_SPARCV9:
737
84
    case EM_SPARC:
738
84
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
84
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
24
        break;
741
      /* Otherwise fall through.  */
742
216
    default:
743
216
      goto got_wrong_format_error;
744
240
    }
745
240
      }
746
747
2.76k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
2.76k
         || i_shdrp[shindex].sh_type == SHT_RELA
749
2.76k
         || i_shdrp[shindex].sh_type == SHT_REL)
750
2.76k
        && i_shdrp[shindex].sh_info >= num_sec)
751
38
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
2.72k
    if (i_shdrp[shindex].sh_size != 0
756
2.72k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
2.72k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
2.72k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
308
       % ebd->minpagesize)
760
308
      != 0))
761
210
      abfd->flags &= ~D_PAGED;
762
2.72k
  }
763
764
1.12k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
1.12k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
1.07k
  {
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
1.07k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
1.07k
    if (!abfd->read_only)
775
840
      {
776
840
        _bfd_error_handler
777
840
    (_("warning: %pB has a corrupt string table index"), abfd);
778
840
        abfd->read_only = 1;
779
840
      }
780
1.07k
  }
781
1.12k
    }
782
7.75k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
28
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
8.85k
  if (i_ehdrp->e_phnum == 0)
787
6.08k
    elf_tdata (abfd)->phdr = NULL;
788
2.76k
  else
789
2.76k
    {
790
2.76k
      Elf_Internal_Phdr *i_phdr;
791
2.76k
      unsigned int i;
792
2.76k
      ufile_ptr filesize;
793
2.76k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
2.76k
      filesize = bfd_get_file_size (abfd);
798
2.76k
      if (filesize != 0
799
2.76k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
140
  goto got_wrong_format_error;
801
2.62k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
2.62k
      elf_tdata (abfd)->phdr
804
2.62k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
2.62k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
2.62k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
0
  goto got_no_match;
809
2.62k
      i_phdr = elf_tdata (abfd)->phdr;
810
338k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
335k
  {
812
335k
    Elf_External_Phdr x_phdr;
813
814
335k
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
86
      goto got_no_match;
816
335k
    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
335k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
209k
      {
821
209k
        i_phdr->p_align &= -i_phdr->p_align;
822
209k
        if (!abfd->read_only)
823
2.37k
    {
824
2.37k
      _bfd_error_handler (_("warning: %pB has a program header "
825
2.37k
          "with invalid alignment"), abfd);
826
2.37k
      abfd->read_only = 1;
827
2.37k
    }
828
209k
      }
829
335k
  }
830
2.62k
    }
831
832
8.62k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
0
    {
834
0
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
0
      num_sec = elf_numsections (abfd);
840
0
      for (shindex = 1; shindex < num_sec; shindex++)
841
0
  if (!bfd_section_from_shdr (abfd, shindex))
842
0
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
0
      if (! _bfd_elf_setup_sections (abfd))
846
0
  goto got_wrong_format_error;
847
0
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
8.62k
  if (ebd->elf_backend_object_p)
852
6.18k
    {
853
6.18k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
1.38k
  goto got_wrong_format_error;
855
6.18k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
7.24k
  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
7.24k
  for (s = abfd->sections; s != NULL; s = s->next)
863
0
    {
864
0
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
0
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
0
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
0
  {
868
0
    unsigned long targ_index;
869
0
    asection *targ_sec;
870
871
0
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
0
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
0
    if (targ_sec != NULL
874
0
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
0
  }
877
0
    }
878
7.24k
  return _bfd_no_cleanup;
879
880
15.3M
 got_wrong_format_error:
881
15.3M
  bfd_set_error (bfd_error_wrong_format);
882
883
15.3M
 got_no_match:
884
15.3M
  return NULL;
885
15.3M
}
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
105
{
1194
105
  Elf_Internal_Shdr *hdr;
1195
105
  Elf_Internal_Shdr *verhdr;
1196
105
  unsigned long symcount; /* Number of external ELF symbols */
1197
105
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
105
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
105
  Elf_Internal_Sym *isym;
1200
105
  Elf_Internal_Sym *isymend;
1201
105
  Elf_Internal_Sym *isymbuf = NULL;
1202
105
  Elf_External_Versym *xver;
1203
105
  Elf_External_Versym *xverbuf = NULL;
1204
105
  const struct elf_backend_data *ebd;
1205
105
  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
105
  if (! dynamic)
1218
105
    {
1219
105
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
105
      verhdr = NULL;
1221
105
    }
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
105
  ebd = get_elf_backend_data (abfd);
1240
105
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
105
  if (symcount == 0)
1242
4
    sym = symbase = NULL;
1243
101
  else
1244
101
    {
1245
101
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
101
              NULL, NULL, NULL);
1247
101
      if (isymbuf == NULL)
1248
0
  return -1;
1249
1250
101
      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
101
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
101
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
101
      if (verhdr != NULL
1261
101
    && 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
101
      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
101
      xver = xverbuf;
1288
101
      if (xver != NULL)
1289
0
  ++xver;
1290
101
      isymend = isymbuf + symcount;
1291
17.9k
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
17.8k
  {
1293
17.8k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
17.8k
    sym->symbol.the_bfd = abfd;
1296
17.8k
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
17.8k
    sym->symbol.value = isym->st_value;
1298
1299
17.8k
    if (isym->st_shndx == SHN_UNDEF)
1300
5.71k
      {
1301
5.71k
        sym->symbol.section = bfd_und_section_ptr;
1302
5.71k
      }
1303
12.1k
    else if (isym->st_shndx == SHN_ABS)
1304
9
      {
1305
9
        sym->symbol.section = bfd_abs_section_ptr;
1306
9
      }
1307
12.1k
    else if (isym->st_shndx == SHN_COMMON)
1308
6
      {
1309
6
        sym->symbol.section = bfd_com_section_ptr;
1310
6
        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
6
        sym->symbol.value = isym->st_size;
1329
6
      }
1330
12.1k
    else
1331
12.1k
      {
1332
12.1k
        sym->symbol.section
1333
12.1k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
12.1k
        if (sym->symbol.section == NULL)
1335
12.1k
    {
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
12.1k
      sym->symbol.section = bfd_abs_section_ptr;
1343
12.1k
    }
1344
12.1k
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
17.8k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
101
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
17.8k
    switch (ELF_ST_BIND (isym->st_info))
1352
17.8k
      {
1353
6.80k
      case STB_LOCAL:
1354
6.80k
        sym->symbol.flags |= BSF_LOCAL;
1355
6.80k
        break;
1356
578
      case STB_GLOBAL:
1357
578
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
546
    sym->symbol.flags |= BSF_GLOBAL;
1359
578
        break;
1360
1.01k
      case STB_WEAK:
1361
1.01k
        sym->symbol.flags |= BSF_WEAK;
1362
1.01k
        break;
1363
1.46k
      case STB_GNU_UNIQUE:
1364
1.46k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
1.46k
        break;
1366
17.8k
      }
1367
1368
17.8k
    switch (ELF_ST_TYPE (isym->st_info))
1369
17.8k
      {
1370
606
      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
606
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
606
            | BSF_DEBUGGING
1377
606
            | BSF_SECTION_SYM_USED);
1378
606
        break;
1379
815
      case STT_FILE:
1380
815
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
815
        break;
1382
996
      case STT_FUNC:
1383
996
        sym->symbol.flags |= BSF_FUNCTION;
1384
996
        break;
1385
599
      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
599
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
1.40k
      case STT_OBJECT:
1391
1.40k
        sym->symbol.flags |= BSF_OBJECT;
1392
1.40k
        break;
1393
862
      case STT_TLS:
1394
862
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
862
        break;
1396
1.14k
      case STT_RELC:
1397
1.14k
        sym->symbol.flags |= BSF_RELC;
1398
1.14k
        break;
1399
736
      case STT_SRELC:
1400
736
        sym->symbol.flags |= BSF_SRELC;
1401
736
        break;
1402
1.53k
      case STT_GNU_IFUNC:
1403
1.53k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
1.53k
        break;
1405
17.8k
      }
1406
1407
17.8k
    if (dynamic)
1408
0
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
17.8k
    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
17.8k
    if (ebd->elf_backend_symbol_processing)
1421
310
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
17.8k
  }
1423
101
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
105
  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
105
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
105
  if (symptrs)
1435
105
    {
1436
105
      long l = symcount;
1437
1438
105
      sym = symbase;
1439
17.9k
      while (l-- > 0)
1440
17.8k
  {
1441
17.8k
    *symptrs++ = &sym->symbol;
1442
17.8k
    sym++;
1443
17.8k
  }
1444
105
      *symptrs = 0;   /* Final null pointer */
1445
105
    }
1446
1447
105
  free (xverbuf);
1448
105
  if (hdr->contents != (unsigned char *) isymbuf)
1449
101
    free (isymbuf);
1450
105
  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
105
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1193
105
{
1194
105
  Elf_Internal_Shdr *hdr;
1195
105
  Elf_Internal_Shdr *verhdr;
1196
105
  unsigned long symcount; /* Number of external ELF symbols */
1197
105
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
105
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
105
  Elf_Internal_Sym *isym;
1200
105
  Elf_Internal_Sym *isymend;
1201
105
  Elf_Internal_Sym *isymbuf = NULL;
1202
105
  Elf_External_Versym *xver;
1203
105
  Elf_External_Versym *xverbuf = NULL;
1204
105
  const struct elf_backend_data *ebd;
1205
105
  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
105
  if (! dynamic)
1218
105
    {
1219
105
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
105
      verhdr = NULL;
1221
105
    }
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
105
  ebd = get_elf_backend_data (abfd);
1240
105
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
105
  if (symcount == 0)
1242
4
    sym = symbase = NULL;
1243
101
  else
1244
101
    {
1245
101
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
101
              NULL, NULL, NULL);
1247
101
      if (isymbuf == NULL)
1248
0
  return -1;
1249
1250
101
      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
101
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
101
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
101
      if (verhdr != NULL
1261
101
    && 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
101
      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
101
      xver = xverbuf;
1288
101
      if (xver != NULL)
1289
0
  ++xver;
1290
101
      isymend = isymbuf + symcount;
1291
17.9k
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
17.8k
  {
1293
17.8k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
17.8k
    sym->symbol.the_bfd = abfd;
1296
17.8k
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
17.8k
    sym->symbol.value = isym->st_value;
1298
1299
17.8k
    if (isym->st_shndx == SHN_UNDEF)
1300
5.71k
      {
1301
5.71k
        sym->symbol.section = bfd_und_section_ptr;
1302
5.71k
      }
1303
12.1k
    else if (isym->st_shndx == SHN_ABS)
1304
9
      {
1305
9
        sym->symbol.section = bfd_abs_section_ptr;
1306
9
      }
1307
12.1k
    else if (isym->st_shndx == SHN_COMMON)
1308
6
      {
1309
6
        sym->symbol.section = bfd_com_section_ptr;
1310
6
        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
6
        sym->symbol.value = isym->st_size;
1329
6
      }
1330
12.1k
    else
1331
12.1k
      {
1332
12.1k
        sym->symbol.section
1333
12.1k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
12.1k
        if (sym->symbol.section == NULL)
1335
12.1k
    {
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
12.1k
      sym->symbol.section = bfd_abs_section_ptr;
1343
12.1k
    }
1344
12.1k
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
17.8k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
101
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
17.8k
    switch (ELF_ST_BIND (isym->st_info))
1352
17.8k
      {
1353
6.80k
      case STB_LOCAL:
1354
6.80k
        sym->symbol.flags |= BSF_LOCAL;
1355
6.80k
        break;
1356
578
      case STB_GLOBAL:
1357
578
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
546
    sym->symbol.flags |= BSF_GLOBAL;
1359
578
        break;
1360
1.01k
      case STB_WEAK:
1361
1.01k
        sym->symbol.flags |= BSF_WEAK;
1362
1.01k
        break;
1363
1.46k
      case STB_GNU_UNIQUE:
1364
1.46k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
1.46k
        break;
1366
17.8k
      }
1367
1368
17.8k
    switch (ELF_ST_TYPE (isym->st_info))
1369
17.8k
      {
1370
606
      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
606
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
606
            | BSF_DEBUGGING
1377
606
            | BSF_SECTION_SYM_USED);
1378
606
        break;
1379
815
      case STT_FILE:
1380
815
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
815
        break;
1382
996
      case STT_FUNC:
1383
996
        sym->symbol.flags |= BSF_FUNCTION;
1384
996
        break;
1385
599
      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
599
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
1.40k
      case STT_OBJECT:
1391
1.40k
        sym->symbol.flags |= BSF_OBJECT;
1392
1.40k
        break;
1393
862
      case STT_TLS:
1394
862
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
862
        break;
1396
1.14k
      case STT_RELC:
1397
1.14k
        sym->symbol.flags |= BSF_RELC;
1398
1.14k
        break;
1399
736
      case STT_SRELC:
1400
736
        sym->symbol.flags |= BSF_SRELC;
1401
736
        break;
1402
1.53k
      case STT_GNU_IFUNC:
1403
1.53k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
1.53k
        break;
1405
17.8k
      }
1406
1407
17.8k
    if (dynamic)
1408
0
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
17.8k
    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
17.8k
    if (ebd->elf_backend_symbol_processing)
1421
310
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
17.8k
  }
1423
101
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
105
  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
105
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
105
  if (symptrs)
1435
105
    {
1436
105
      long l = symcount;
1437
1438
105
      sym = symbase;
1439
17.9k
      while (l-- > 0)
1440
17.8k
  {
1441
17.8k
    *symptrs++ = &sym->symbol;
1442
17.8k
    sym++;
1443
17.8k
  }
1444
105
      *symptrs = 0;   /* Final null pointer */
1445
105
    }
1446
1447
105
  free (xverbuf);
1448
105
  if (hdr->contents != (unsigned char *) isymbuf)
1449
101
    free (isymbuf);
1450
105
  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
105
}
Unexecuted instantiation: bfd_elf32_slurp_symbol_table
1458
1459
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1460
   them.  */
1461
1462
static bool
1463
elf_slurp_reloc_table_from_section (bfd *abfd,
1464
            asection *asect,
1465
            Elf_Internal_Shdr *rel_hdr,
1466
            bfd_size_type reloc_count,
1467
            arelent *relents,
1468
            asymbol **symbols,
1469
            bool dynamic)
1470
0
{
1471
0
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1472
0
  void *allocated = NULL;
1473
0
  bfd_byte *native_relocs;
1474
0
  arelent *relent;
1475
0
  unsigned int i;
1476
0
  int entsize;
1477
0
  unsigned int symcount;
1478
1479
0
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1480
0
    return false;
1481
0
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1482
0
  if (allocated == NULL)
1483
0
    return false;
1484
1485
0
  native_relocs = (bfd_byte *) allocated;
1486
1487
0
  entsize = rel_hdr->sh_entsize;
1488
0
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1489
0
        || entsize == sizeof (Elf_External_Rela));
1490
1491
0
  if (dynamic)
1492
0
    symcount = bfd_get_dynamic_symcount (abfd);
1493
0
  else
1494
0
    symcount = bfd_get_symcount (abfd);
1495
1496
0
  for (i = 0, relent = relents;
1497
0
       i < reloc_count;
1498
0
       i++, relent++, native_relocs += entsize)
1499
0
    {
1500
0
      bool res;
1501
0
      Elf_Internal_Rela rela;
1502
1503
0
      if (entsize == sizeof (Elf_External_Rela))
1504
0
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1505
0
      else
1506
0
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1507
1508
      /* The address of an ELF reloc is section relative for an object
1509
   file, and absolute for an executable file or shared library.
1510
   The address of a normal BFD reloc is always section relative,
1511
   and the address of a dynamic reloc is absolute..  */
1512
0
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1513
0
  relent->address = rela.r_offset;
1514
0
      else
1515
0
  relent->address = rela.r_offset - asect->vma;
1516
1517
0
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1518
  /* FIXME: This and the error case below mean that we have a
1519
     symbol on relocs that is not elf_symbol_type.  */
1520
0
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1521
0
      else if (ELF_R_SYM (rela.r_info) > symcount)
1522
0
  {
1523
0
    _bfd_error_handler
1524
      /* xgettext:c-format */
1525
0
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1526
0
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1527
0
    bfd_set_error (bfd_error_bad_value);
1528
0
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1529
0
  }
1530
0
      else
1531
0
  {
1532
0
    asymbol **ps;
1533
1534
0
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1535
1536
0
    relent->sym_ptr_ptr = ps;
1537
0
  }
1538
1539
0
      relent->addend = rela.r_addend;
1540
1541
0
      if ((entsize == sizeof (Elf_External_Rela)
1542
0
     && ebd->elf_info_to_howto != NULL)
1543
0
    || ebd->elf_info_to_howto_rel == NULL)
1544
0
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1545
0
      else
1546
0
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1547
1548
0
      if (! res || relent->howto == NULL)
1549
0
  goto error_return;
1550
0
    }
1551
1552
0
  free (allocated);
1553
0
  return true;
1554
1555
0
 error_return:
1556
0
  free (allocated);
1557
0
  return false;
1558
0
}
Unexecuted instantiation: elf64.c:elf_slurp_reloc_table_from_section
Unexecuted instantiation: elf32.c:elf_slurp_reloc_table_from_section
1559
1560
/* Read in and swap the external relocs.  */
1561
1562
bool
1563
elf_slurp_reloc_table (bfd *abfd,
1564
           asection *asect,
1565
           asymbol **symbols,
1566
           bool dynamic)
1567
0
{
1568
0
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1569
0
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1570
0
  Elf_Internal_Shdr *rel_hdr;
1571
0
  Elf_Internal_Shdr *rel_hdr2;
1572
0
  bfd_size_type reloc_count;
1573
0
  bfd_size_type reloc_count2;
1574
0
  arelent *relents;
1575
0
  size_t amt;
1576
1577
0
  if (asect->relocation != NULL)
1578
0
    return true;
1579
1580
0
  if (! dynamic)
1581
0
    {
1582
0
      if ((asect->flags & SEC_RELOC) == 0
1583
0
    || asect->reloc_count == 0)
1584
0
  return true;
1585
1586
0
      rel_hdr = d->rel.hdr;
1587
0
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1588
0
      rel_hdr2 = d->rela.hdr;
1589
0
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1590
1591
      /* PR 17512: file: 0b4f81b7.  */
1592
0
      if (asect->reloc_count != reloc_count + reloc_count2)
1593
0
  return false;
1594
0
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1595
0
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1596
1597
0
    }
1598
0
  else
1599
0
    {
1600
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1601
   case because relocations against this section may use the
1602
   dynamic symbol table, and in that case bfd_section_from_shdr
1603
   in elf.c does not update the RELOC_COUNT.  */
1604
0
      if (asect->size == 0)
1605
0
  return true;
1606
1607
0
      rel_hdr = &d->this_hdr;
1608
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1609
0
      rel_hdr2 = NULL;
1610
0
      reloc_count2 = 0;
1611
0
    }
1612
1613
0
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1614
0
    {
1615
0
      bfd_set_error (bfd_error_file_too_big);
1616
0
      return false;
1617
0
    }
1618
0
  relents = (arelent *) bfd_alloc (abfd, amt);
1619
0
  if (relents == NULL)
1620
0
    return false;
1621
1622
0
  if (rel_hdr
1623
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1624
0
                rel_hdr, reloc_count,
1625
0
                relents,
1626
0
                symbols, dynamic))
1627
0
    return false;
1628
1629
0
  if (rel_hdr2
1630
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1631
0
                rel_hdr2, reloc_count2,
1632
0
                relents + reloc_count,
1633
0
                symbols, dynamic))
1634
0
    return false;
1635
1636
0
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1637
0
    return false;
1638
1639
0
  asect->relocation = relents;
1640
0
  return true;
1641
0
}
Unexecuted instantiation: bfd_elf64_slurp_reloc_table
Unexecuted instantiation: bfd_elf32_slurp_reloc_table
1642
1643
#if DEBUG & 2
1644
static void
1645
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1646
{
1647
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1648
     hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1649
     (long) hdr);
1650
  fprintf (stderr,
1651
     "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1652
     (long) hdr->sh_name,
1653
     (long) hdr->sh_type,
1654
     (long) hdr->sh_flags);
1655
  fprintf (stderr,
1656
     "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1657
     (long) hdr->sh_addr,
1658
     (long) hdr->sh_offset,
1659
     (long) hdr->sh_size);
1660
  fprintf (stderr,
1661
     "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1662
     (long) hdr->sh_link,
1663
     (long) hdr->sh_info,
1664
     (long) hdr->sh_addralign);
1665
  fprintf (stderr, "sh_entsize   = %ld\n",
1666
     (long) hdr->sh_entsize);
1667
  fflush (stderr);
1668
}
1669
#endif
1670
1671
#if DEBUG & 1
1672
static void
1673
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1674
{
1675
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1676
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1677
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1678
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1679
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1680
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1681
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1682
}
1683
#endif
1684

1685
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1686
   reconstruct an ELF file by reading the segments out of remote
1687
   memory based on the ELF file header at EHDR_VMA and the ELF program
1688
   headers it points to.  If non-zero, SIZE is the known extent of the
1689
   object.  If not null, *LOADBASEP is filled in with the difference
1690
   between the VMAs from which the segments were read, and the VMAs
1691
   the file headers (and hence BFD's idea of each section's VMA) put
1692
   them at.
1693
1694
   The function TARGET_READ_MEMORY is called to copy LEN bytes from
1695
   the remote memory at target address VMA into the local buffer at
1696
   MYADDR; it should return zero on success or an `errno' code on
1697
   failure.  TEMPL must be a BFD for a target with the word size and
1698
   byte order found in the remote memory.  */
1699
1700
bfd *
1701
NAME(_bfd_elf,bfd_from_remote_memory)
1702
  (bfd *templ,
1703
   bfd_vma ehdr_vma    /* Bytes.  */,
1704
   bfd_size_type size  /* Octets.  */,
1705
   bfd_vma *loadbasep  /* Bytes.  */,
1706
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1707
                          /* (Bytes  ,           , octets       ).  */
1708
0
{
1709
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1710
0
  Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1711
0
  Elf_External_Phdr *x_phdrs;
1712
0
  Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
1713
0
  bfd *nbfd;
1714
0
  struct bfd_in_memory *bim;
1715
0
  bfd_byte *contents;
1716
0
  int err;
1717
0
  unsigned int i;
1718
0
  bfd_vma high_offset;
1719
0
  bfd_vma shdr_end;
1720
0
  bfd_vma loadbase;  /* Bytes.  */
1721
0
  size_t amt;
1722
0
  unsigned int opb = bfd_octets_per_byte (templ, NULL);
1723
1724
  /* Read in the ELF header in external format.  */
1725
0
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1726
0
  if (err)
1727
0
    {
1728
0
      bfd_set_error (bfd_error_system_call);
1729
0
      errno = err;
1730
0
      return NULL;
1731
0
    }
1732
1733
  /* Now check to see if we have a valid ELF file, and one that BFD can
1734
     make use of.  The magic number must match, the address size ('class')
1735
     and byte-swapping must match our XVEC entry.  */
1736
1737
0
  if (! elf_file_p (&x_ehdr)
1738
0
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1739
0
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1740
0
    {
1741
0
      bfd_set_error (bfd_error_wrong_format);
1742
0
      return NULL;
1743
0
    }
1744
1745
  /* Check that file's byte order matches xvec's */
1746
0
  switch (x_ehdr.e_ident[EI_DATA])
1747
0
    {
1748
0
    case ELFDATA2MSB:   /* Big-endian */
1749
0
      if (! bfd_header_big_endian (templ))
1750
0
  {
1751
0
    bfd_set_error (bfd_error_wrong_format);
1752
0
    return NULL;
1753
0
  }
1754
0
      break;
1755
0
    case ELFDATA2LSB:   /* Little-endian */
1756
0
      if (! bfd_header_little_endian (templ))
1757
0
  {
1758
0
    bfd_set_error (bfd_error_wrong_format);
1759
0
    return NULL;
1760
0
  }
1761
0
      break;
1762
0
    case ELFDATANONE:   /* No data encoding specified */
1763
0
    default:      /* Unknown data encoding specified */
1764
0
      bfd_set_error (bfd_error_wrong_format);
1765
0
      return NULL;
1766
0
    }
1767
1768
0
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1769
1770
  /* The file header tells where to find the program headers.
1771
     These are what we use to actually choose what to read.  */
1772
1773
0
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1774
0
    {
1775
0
      bfd_set_error (bfd_error_wrong_format);
1776
0
      return NULL;
1777
0
    }
1778
1779
0
  if (_bfd_mul_overflow (i_ehdr.e_phnum,
1780
0
       sizeof (*x_phdrs) + sizeof (*i_phdrs), &amt))
1781
0
    {
1782
0
      bfd_set_error (bfd_error_file_too_big);
1783
0
      return NULL;
1784
0
    }
1785
0
  x_phdrs = (Elf_External_Phdr *) bfd_malloc (amt);
1786
0
  if (x_phdrs == NULL)
1787
0
    return NULL;
1788
0
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1789
0
          i_ehdr.e_phnum * sizeof x_phdrs[0]);
1790
0
  if (err)
1791
0
    {
1792
0
      free (x_phdrs);
1793
0
      bfd_set_error (bfd_error_system_call);
1794
0
      errno = err;
1795
0
      return NULL;
1796
0
    }
1797
0
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1798
1799
0
  high_offset = 0;
1800
0
  loadbase = 0;
1801
0
  first_phdr = NULL;
1802
0
  last_phdr = NULL;
1803
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1804
0
    {
1805
0
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1806
0
      if (i_phdrs[i].p_type == PT_LOAD)
1807
0
  {
1808
0
    bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
1809
1810
0
    if (segment_end > high_offset)
1811
0
      {
1812
0
        high_offset = segment_end;
1813
0
        last_phdr = &i_phdrs[i];
1814
0
      }
1815
1816
    /* If this program header covers offset zero, where the file
1817
       header sits, then we can figure out the loadbase.  */
1818
0
    if (first_phdr == NULL)
1819
0
      {
1820
0
        bfd_vma p_offset = i_phdrs[i].p_offset;  /* Octets.  */
1821
0
        bfd_vma p_vaddr = i_phdrs[i].p_vaddr;    /* Octets.  */
1822
1823
0
        if (i_phdrs[i].p_align > 1)
1824
0
    {
1825
0
      p_offset &= -(i_phdrs[i].p_align * opb);
1826
0
      p_vaddr &= -(i_phdrs[i].p_align * opb);
1827
0
    }
1828
0
        if (p_offset == 0)
1829
0
    {
1830
0
      loadbase = ehdr_vma - p_vaddr / opb;
1831
0
      first_phdr = &i_phdrs[i];
1832
0
    }
1833
0
      }
1834
0
  }
1835
0
    }
1836
0
  if (high_offset == 0)
1837
0
    {
1838
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1839
0
      free (x_phdrs);
1840
0
      bfd_set_error (bfd_error_wrong_format);
1841
0
      return NULL;
1842
0
    }
1843
1844
0
  shdr_end = 0;
1845
0
  if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
1846
0
    {
1847
0
      shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1848
1849
0
      if (last_phdr->p_filesz != last_phdr->p_memsz)
1850
0
  {
1851
    /* If the last PT_LOAD header has a bss area then ld.so will
1852
       have cleared anything past p_filesz, zapping the section
1853
       headers.  */
1854
0
  }
1855
0
      else if (size >= shdr_end)
1856
0
  high_offset = size;
1857
0
      else
1858
0
  {
1859
0
    bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
1860
0
    bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
1861
1862
    /* Assume we loaded full pages, allowing us to sometimes see
1863
       section headers.  */
1864
0
    if (page_size > 1 && shdr_end > segment_end)
1865
0
      {
1866
0
        bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
1867
1868
0
        if (page_end >= shdr_end)
1869
    /* Whee, section headers covered.  */
1870
0
    high_offset = shdr_end;
1871
0
      }
1872
0
  }
1873
0
    }
1874
1875
  /* Now we know the size of the whole image we want read in.  */
1876
0
  contents = (bfd_byte *) bfd_zmalloc (high_offset);
1877
0
  if (contents == NULL)
1878
0
    {
1879
0
      free (x_phdrs);
1880
0
      return NULL;
1881
0
    }
1882
1883
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1884
0
    if (i_phdrs[i].p_type == PT_LOAD)
1885
0
      {
1886
0
  bfd_vma start = i_phdrs[i].p_offset;         /* Octets.  */
1887
0
  bfd_vma end = start + i_phdrs[i].p_filesz;   /* Octets.  */
1888
0
  bfd_vma vaddr = i_phdrs[i].p_vaddr;          /* Octets.  */
1889
1890
  /* Extend the beginning of the first pt_load to cover file
1891
     header and program headers, if we proved earlier that its
1892
     aligned offset is 0.  */
1893
0
  if (first_phdr == &i_phdrs[i])
1894
0
    {
1895
0
      vaddr -= start;
1896
0
      start = 0;
1897
0
    }
1898
  /* Extend the end of the last pt_load to cover section headers.  */
1899
0
  if (last_phdr == &i_phdrs[i])
1900
0
    end = high_offset;
1901
0
  err = target_read_memory (loadbase + vaddr / opb,
1902
0
          contents + start, end - start);
1903
0
  if (err)
1904
0
    {
1905
0
      free (x_phdrs);
1906
0
      free (contents);
1907
0
      bfd_set_error (bfd_error_system_call);
1908
0
      errno = err;
1909
0
      return NULL;
1910
0
    }
1911
0
      }
1912
0
  free (x_phdrs);
1913
1914
  /* If the segments visible in memory didn't include the section headers,
1915
     then clear them from the file header.  */
1916
0
  if (high_offset < shdr_end)
1917
0
    {
1918
0
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1919
0
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1920
0
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1921
0
    }
1922
1923
  /* This will normally have been in the first PT_LOAD segment.  But it
1924
     conceivably could be missing, and we might have just changed it.  */
1925
0
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1926
1927
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1928
0
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1929
0
  if (bim == NULL)
1930
0
    {
1931
0
      free (contents);
1932
0
      return NULL;
1933
0
    }
1934
0
  nbfd = _bfd_new_bfd ();
1935
0
  if (nbfd == NULL
1936
0
      || !bfd_set_filename (nbfd, "<in-memory>"))
1937
0
    {
1938
0
      free (bim);
1939
0
      free (contents);
1940
0
      return NULL;
1941
0
    }
1942
0
  nbfd->xvec = templ->xvec;
1943
0
  bim->size = high_offset;
1944
0
  bim->buffer = contents;
1945
0
  nbfd->iostream = bim;
1946
0
  nbfd->flags = BFD_IN_MEMORY;
1947
0
  nbfd->iovec = &_bfd_memory_iovec;
1948
0
  nbfd->origin = 0;
1949
0
  nbfd->direction = read_direction;
1950
0
  nbfd->mtime = time (NULL);
1951
0
  nbfd->mtime_set = true;
1952
1953
0
  if (loadbasep)
1954
0
    *loadbasep = loadbase;
1955
0
  return nbfd;
1956
0
}
Unexecuted instantiation: _bfd_elf64_bfd_from_remote_memory
Unexecuted instantiation: _bfd_elf32_bfd_from_remote_memory
1957
1958
/* Function for ELF_R_INFO.  */
1959
1960
bfd_vma
1961
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
1962
0
{
1963
0
  return ELF_R_INFO (sym, type);
1964
0
}
Unexecuted instantiation: elf64_r_info
Unexecuted instantiation: elf32_r_info
1965
1966
/* Function for ELF_R_SYM.  */
1967
1968
bfd_vma
1969
NAME(elf,r_sym) (bfd_vma r_info)
1970
0
{
1971
0
  return ELF_R_SYM (r_info);
1972
0
}
Unexecuted instantiation: elf64_r_sym
Unexecuted instantiation: elf32_r_sym
1973

1974
#include "elfcore.h"
1975

1976
/* Size-dependent data and functions.  */
1977
const struct elf_size_info NAME(_bfd_elf,size_info) = {
1978
  sizeof (Elf_External_Ehdr),
1979
  sizeof (Elf_External_Phdr),
1980
  sizeof (Elf_External_Shdr),
1981
  sizeof (Elf_External_Rel),
1982
  sizeof (Elf_External_Rela),
1983
  sizeof (Elf_External_Sym),
1984
  sizeof (Elf_External_Dyn),
1985
  sizeof (Elf_External_Note),
1986
  4,
1987
  1,
1988
  ARCH_SIZE, LOG_FILE_ALIGN,
1989
  ELFCLASS, EV_CURRENT,
1990
  elf_write_out_phdrs,
1991
  elf_write_shdrs_and_ehdr,
1992
  elf_checksum_contents,
1993
  elf_write_relocs,
1994
  elf_swap_symbol_in,
1995
  elf_swap_symbol_out,
1996
  elf_slurp_reloc_table,
1997
  elf_slurp_symbol_table,
1998
  elf_swap_dyn_in,
1999
  elf_swap_dyn_out,
2000
  elf_swap_reloc_in,
2001
  elf_swap_reloc_out,
2002
  elf_swap_reloca_in,
2003
  elf_swap_reloca_out
2004
};