Coverage Report

Created: 2023-06-29 07:10

/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
92.2M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
0
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
92.2M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
1.30M
#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
1.30M
#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
2.88M
#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
9.56M
#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
5.78M
#define H_GET_WORD    H_GET_64
161
172k
#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
21.4M
#define H_GET_WORD    H_GET_32
167
862k
#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
6.73k
{
179
6.73k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
6.73k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
6.73k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
6.73k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
6.73k
  if (signed_vma)
185
4.20k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
2.52k
  else
187
2.52k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
6.73k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
6.73k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
6.73k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
6.73k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
6.73k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
26
    {
194
26
      if (shndx == NULL)
195
25
  return false;
196
1
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1
    }
198
6.70k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
498
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
6.70k
  dst->st_target_internal = 0;
201
6.70k
  return true;
202
6.73k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
1.24k
{
179
1.24k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
1.24k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
1.24k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
1.24k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
1.24k
  if (signed_vma)
185
0
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
1.24k
  else
187
1.24k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
1.24k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
1.24k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
1.24k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
1.24k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
1.24k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
0
    {
194
0
      if (shndx == NULL)
195
0
  return false;
196
0
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
0
    }
198
1.24k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
478
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
1.24k
  dst->st_target_internal = 0;
201
1.24k
  return true;
202
1.24k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
5.48k
{
179
5.48k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
5.48k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
5.48k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
5.48k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
5.48k
  if (signed_vma)
185
4.20k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
1.28k
  else
187
1.28k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
5.48k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
5.48k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
5.48k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
5.48k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
5.48k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
26
    {
194
26
      if (shndx == NULL)
195
25
  return false;
196
1
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1
    }
198
5.46k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
20
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
5.46k
  dst->st_target_internal = 0;
201
5.46k
  return true;
202
5.48k
}
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
3.67M
{
239
3.67M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.67M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.67M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.67M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.67M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.67M
  if (signed_vma)
245
406k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
3.27M
  else
247
3.27M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.67M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.67M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.67M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.67M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.67M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.67M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.67M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.67M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.67M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.67M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
573k
{
239
573k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
573k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
573k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
573k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
573k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
573k
  if (signed_vma)
245
76.3k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
497k
  else
247
497k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
573k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
573k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
573k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
573k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
573k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
573k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
573k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
573k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
573k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
573k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
3.10M
{
239
3.10M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.10M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.10M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.10M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.10M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.10M
  if (signed_vma)
245
329k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.77M
  else
247
2.77M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.10M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.10M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.10M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.10M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.10M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.10M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.10M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.10M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.10M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.10M
}
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
1.56M
{
306
1.56M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
1.56M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
1.56M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
1.56M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
1.56M
  if (signed_vma)
312
506k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
1.05M
  else
314
1.05M
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
1.56M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
1.56M
  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
1.56M
  if (dst->sh_type != SHT_NOBITS)
321
1.54M
    {
322
1.54M
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
1.54M
      if (filesize != 0
325
1.54M
    && ((ufile_ptr) dst->sh_offset > filesize
326
1.54M
        || dst->sh_size > filesize - dst->sh_offset)
327
1.54M
    && !abfd->read_only)
328
119k
  {
329
119k
    _bfd_error_handler (_("warning: %pB has a section "
330
119k
        "extending past end of file"), abfd);
331
119k
    abfd->read_only = 1;
332
119k
  }
333
1.54M
    }
334
1.56M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
1.56M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
1.56M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
1.56M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
1.56M
  dst->bfd_section = NULL;
339
1.56M
  dst->contents = NULL;
340
1.56M
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
305
344k
{
306
344k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
344k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
344k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
344k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
344k
  if (signed_vma)
312
52.7k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
292k
  else
314
292k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
344k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
344k
  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
344k
  if (dst->sh_type != SHT_NOBITS)
321
338k
    {
322
338k
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
338k
      if (filesize != 0
325
338k
    && ((ufile_ptr) dst->sh_offset > filesize
326
338k
        || dst->sh_size > filesize - dst->sh_offset)
327
338k
    && !abfd->read_only)
328
33.9k
  {
329
33.9k
    _bfd_error_handler (_("warning: %pB has a section "
330
33.9k
        "extending past end of file"), abfd);
331
33.9k
    abfd->read_only = 1;
332
33.9k
  }
333
338k
    }
334
344k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
344k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
344k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
344k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
344k
  dst->bfd_section = NULL;
339
344k
  dst->contents = NULL;
340
344k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
305
1.21M
{
306
1.21M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
1.21M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
1.21M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
1.21M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
1.21M
  if (signed_vma)
312
453k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
765k
  else
314
765k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
1.21M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
1.21M
  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
1.21M
  if (dst->sh_type != SHT_NOBITS)
321
1.20M
    {
322
1.20M
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
1.20M
      if (filesize != 0
325
1.20M
    && ((ufile_ptr) dst->sh_offset > filesize
326
1.20M
        || dst->sh_size > filesize - dst->sh_offset)
327
1.20M
    && !abfd->read_only)
328
85.1k
  {
329
85.1k
    _bfd_error_handler (_("warning: %pB has a section "
330
85.1k
        "extending past end of file"), abfd);
331
85.1k
    abfd->read_only = 1;
332
85.1k
  }
333
1.20M
    }
334
1.21M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
1.21M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
1.21M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
1.21M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
1.21M
  dst->bfd_section = NULL;
339
1.21M
  dst->contents = NULL;
340
1.21M
}
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
1.30M
{
371
1.30M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
1.30M
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
1.30M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
1.30M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
1.30M
  if (signed_vma)
377
59.3k
    {
378
59.3k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
59.3k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
59.3k
    }
381
1.24M
  else
382
1.24M
    {
383
1.24M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
1.24M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
1.24M
    }
386
1.30M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
1.30M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
1.30M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
1.30M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
370
360k
{
371
360k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
360k
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
360k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
360k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
360k
  if (signed_vma)
377
21.9k
    {
378
21.9k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
21.9k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
21.9k
    }
381
338k
  else
382
338k
    {
383
338k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
338k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
338k
    }
386
360k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
360k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
360k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
360k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
370
944k
{
371
944k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
944k
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
944k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
944k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
944k
  if (signed_vma)
377
37.3k
    {
378
37.3k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
37.3k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
37.3k
    }
381
907k
  else
382
907k
    {
383
907k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
907k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
907k
    }
386
944k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
944k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
944k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
944k
}
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
84.2M
{
490
84.2M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
84.2M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
84.2M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
84.2M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
84.2M
}
elf64.c:elf_file_p
Line
Count
Source
489
20.0M
{
490
20.0M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
20.0M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
20.0M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
20.0M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
20.0M
}
elf32.c:elf_file_p
Line
Count
Source
489
64.2M
{
490
64.2M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
64.2M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
64.2M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
64.2M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
64.2M
}
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
92.2M
{
507
92.2M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
92.2M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
92.2M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
92.2M
  Elf_Internal_Shdr i_shdr;
511
92.2M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
92.2M
  unsigned int shindex;
513
92.2M
  const struct elf_backend_data *ebd;
514
92.2M
  asection *s;
515
92.2M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
92.2M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
7.96M
    {
521
7.96M
      if (bfd_get_error () != bfd_error_system_call)
522
7.92M
  goto got_wrong_format_error;
523
35.8k
      else
524
35.8k
  goto got_no_match;
525
7.96M
    }
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
84.2M
  if (! elf_file_p (&x_ehdr)
534
84.2M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
84.2M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
76.9M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
7.31M
  switch (x_ehdr.e_ident[EI_DATA])
540
7.31M
    {
541
856k
    case ELFDATA2MSB:   /* Big-endian */
542
856k
      if (! bfd_header_big_endian (abfd))
543
427k
  goto got_wrong_format_error;
544
429k
      break;
545
6.43M
    case ELFDATA2LSB:   /* Little-endian */
546
6.43M
      if (! bfd_header_little_endian (abfd))
547
3.18M
  goto got_wrong_format_error;
548
3.24M
      break;
549
3.24M
    case ELFDATANONE:   /* No data encoding specified */
550
18.4k
    default:      /* Unknown data encoding specified */
551
18.4k
      goto got_wrong_format_error;
552
7.31M
    }
553
554
3.67M
  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
3.67M
  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
3.67M
  i_ehdrp = elf_elfheader (abfd);
564
3.67M
  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
3.67M
  if (i_ehdrp->e_type == ET_CORE)
571
264
    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
3.67M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
266
    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
3.67M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
16.2k
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
3.66M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
9.23k
    goto got_wrong_format_error;
587
588
3.65M
  ebd = get_elf_backend_data (abfd);
589
3.65M
  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
3.65M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
3.65M
      && (ebd->elf_machine_alt1 == 0
596
3.48M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
3.65M
      && (ebd->elf_machine_alt2 == 0
598
3.48M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
3.65M
      && ebd->elf_machine_code != EM_NONE)
600
3.41M
    goto got_wrong_format_error;
601
602
241k
  if (i_ehdrp->e_type == ET_EXEC)
603
6.09k
    abfd->flags |= EXEC_P;
604
235k
  else if (i_ehdrp->e_type == ET_DYN)
605
5.21k
    abfd->flags |= DYNAMIC;
606
607
241k
  if (i_ehdrp->e_phnum > 0)
608
119k
    abfd->flags |= D_PAGED;
609
610
241k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
71.5k
    {
612
      /* It's OK if this fails for the generic target.  */
613
71.5k
      if (ebd->elf_machine_code != EM_NONE)
614
232
  goto got_no_match;
615
71.5k
    }
616
617
241k
  if (ebd->elf_machine_code != EM_NONE
618
241k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
241k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
20.4k
    goto got_wrong_format_error;
621
622
220k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
135k
    {
624
135k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
135k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
1.81k
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
133k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
2.38k
  goto got_no_match;
634
130k
      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
130k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
15.6k
  {
640
15.6k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
15.6k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
15.6k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
15.6k
        || i_ehdrp->e_shnum  == 0)
644
4.42k
      goto got_wrong_format_error;
645
15.6k
  }
646
647
      /* And similarly for the string table index.  */
648
126k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
13.3k
  {
650
13.3k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
13.3k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
13.3k
  }
654
655
      /* And program headers.  */
656
126k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
12.5k
  {
658
12.5k
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
12.5k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
12.5k
  }
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
126k
      if (i_ehdrp->e_shnum != 1)
666
94.4k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
94.4k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
94.4k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
2.33k
      goto got_wrong_format_error;
671
672
92.0k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
92.0k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
92.0k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
92.0k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
3.51k
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
88.5k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
88.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
88.5k
  }
686
126k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
206k
  if (i_ehdrp->e_shnum != 0)
691
120k
    {
692
120k
      Elf_Internal_Shdr *shdrp;
693
120k
      unsigned int num_sec;
694
120k
      size_t amt;
695
696
120k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
120k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
120k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
120k
      num_sec = i_ehdrp->e_shnum;
702
120k
      elf_numsections (abfd) = num_sec;
703
120k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
120k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
120k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
120k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
120k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
120k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
1.68M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
1.56M
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
1.54M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
1.43M
  {
720
1.43M
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
1.43M
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
1.43M
    if (i_shdrp[shindex].sh_link >= num_sec)
726
5.80k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
5.80k
        switch (ebd->elf_machine_code)
730
5.80k
    {
731
792
    case EM_386:
732
1.00k
    case EM_IAMCU:
733
2.44k
    case EM_X86_64:
734
2.44k
    case EM_OLD_SPARCV9:
735
2.44k
    case EM_SPARC32PLUS:
736
2.45k
    case EM_SPARCV9:
737
2.45k
    case EM_SPARC:
738
2.45k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
2.45k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
772
        break;
741
      /* Otherwise fall through.  */
742
5.03k
    default:
743
5.03k
      goto got_wrong_format_error;
744
5.80k
    }
745
5.80k
      }
746
747
1.42M
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
1.42M
         || i_shdrp[shindex].sh_type == SHT_RELA
749
1.42M
         || i_shdrp[shindex].sh_type == SHT_REL)
750
1.42M
        && i_shdrp[shindex].sh_info >= num_sec)
751
1.28k
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
1.42M
    if (i_shdrp[shindex].sh_size != 0
756
1.42M
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
1.42M
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
1.42M
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
144k
       % ebd->minpagesize)
760
144k
      != 0))
761
86.3k
      abfd->flags &= ~D_PAGED;
762
1.42M
  }
763
764
114k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
114k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
60.4k
  {
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
60.4k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
60.4k
    if (!abfd->read_only)
775
10.4k
      {
776
10.4k
        _bfd_error_handler
777
10.4k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
10.4k
        abfd->read_only = 1;
779
10.4k
      }
780
60.4k
  }
781
114k
    }
782
85.4k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
662
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
199k
  if (i_ehdrp->e_phnum == 0)
787
106k
    elf_tdata (abfd)->phdr = NULL;
788
92.3k
  else
789
92.3k
    {
790
92.3k
      Elf_Internal_Phdr *i_phdr;
791
92.3k
      unsigned int i;
792
92.3k
      ufile_ptr filesize;
793
92.3k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
92.3k
      filesize = bfd_get_file_size (abfd);
798
92.3k
      if (filesize != 0
799
92.3k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
6.50k
  goto got_wrong_format_error;
801
85.8k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
85.8k
      elf_tdata (abfd)->phdr
804
85.8k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
85.8k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
85.8k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
525
  goto got_no_match;
809
85.3k
      i_phdr = elf_tdata (abfd)->phdr;
810
1.39M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
1.30M
  {
812
1.30M
    Elf_External_Phdr x_phdr;
813
814
1.30M
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
962
      goto got_no_match;
816
1.30M
    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
1.30M
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
918k
      {
821
918k
        i_phdr->p_align &= -i_phdr->p_align;
822
918k
        if (!abfd->read_only)
823
18.7k
    {
824
18.7k
      _bfd_error_handler (_("warning: %pB has a program header "
825
18.7k
          "with invalid alignment"), abfd);
826
18.7k
      abfd->read_only = 1;
827
18.7k
    }
828
918k
      }
829
1.30M
  }
830
85.3k
    }
831
832
191k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
53.6k
    {
834
53.6k
      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
53.6k
      num_sec = elf_numsections (abfd);
840
1.03M
      for (shindex = 1; shindex < num_sec; shindex++)
841
985k
  if (!bfd_section_from_shdr (abfd, shindex))
842
9.11k
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
44.5k
      if (! _bfd_elf_setup_sections (abfd))
846
140
  goto got_wrong_format_error;
847
44.5k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
181k
  if (ebd->elf_backend_object_p)
852
121k
    {
853
121k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
17.0k
  goto got_wrong_format_error;
855
121k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
164k
  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
605k
  for (s = abfd->sections; s != NULL; s = s->next)
863
440k
    {
864
440k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
440k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
440k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
12.4k
  {
868
12.4k
    unsigned long targ_index;
869
12.4k
    asection *targ_sec;
870
871
12.4k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
12.4k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
12.4k
    if (targ_sec != NULL
874
12.4k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
237
      s->flags |= SEC_DEBUGGING;
876
12.4k
  }
877
440k
    }
878
164k
  return _bfd_no_cleanup;
879
880
92.0M
 got_wrong_format_error:
881
92.0M
  bfd_set_error (bfd_error_wrong_format);
882
883
92.0M
 got_no_match:
884
92.0M
  return NULL;
885
92.0M
}
bfd_elf64_object_p
Line
Count
Source
506
22.5M
{
507
22.5M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
22.5M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
22.5M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
22.5M
  Elf_Internal_Shdr i_shdr;
511
22.5M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
22.5M
  unsigned int shindex;
513
22.5M
  const struct elf_backend_data *ebd;
514
22.5M
  asection *s;
515
22.5M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
22.5M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
2.46M
    {
521
2.46M
      if (bfd_get_error () != bfd_error_system_call)
522
2.45M
  goto got_wrong_format_error;
523
8.61k
      else
524
8.61k
  goto got_no_match;
525
2.46M
    }
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
20.0M
  if (! elf_file_p (&x_ehdr)
534
20.0M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
20.0M
      || 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
1.08M
  switch (x_ehdr.e_ident[EI_DATA])
540
1.08M
    {
541
128k
    case ELFDATA2MSB:   /* Big-endian */
542
128k
      if (! bfd_header_big_endian (abfd))
543
67.5k
  goto got_wrong_format_error;
544
60.7k
      break;
545
952k
    case ELFDATA2LSB:   /* Little-endian */
546
952k
      if (! bfd_header_little_endian (abfd))
547
439k
  goto got_wrong_format_error;
548
512k
      break;
549
512k
    case ELFDATANONE:   /* No data encoding specified */
550
4.38k
    default:      /* Unknown data encoding specified */
551
4.38k
      goto got_wrong_format_error;
552
1.08M
    }
553
554
573k
  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
573k
  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
573k
  i_ehdrp = elf_elfheader (abfd);
564
573k
  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
573k
  if (i_ehdrp->e_type == ET_CORE)
571
66
    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
573k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
68
    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
573k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
2.38k
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
571k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
2.36k
    goto got_wrong_format_error;
587
588
568k
  ebd = get_elf_backend_data (abfd);
589
568k
  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
568k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
568k
      && (ebd->elf_machine_alt1 == 0
596
516k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
568k
      && (ebd->elf_machine_alt2 == 0
598
513k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
568k
      && ebd->elf_machine_code != EM_NONE)
600
489k
    goto got_wrong_format_error;
601
602
79.2k
  if (i_ehdrp->e_type == ET_EXEC)
603
2.18k
    abfd->flags |= EXEC_P;
604
77.0k
  else if (i_ehdrp->e_type == ET_DYN)
605
2.19k
    abfd->flags |= DYNAMIC;
606
607
79.2k
  if (i_ehdrp->e_phnum > 0)
608
52.2k
    abfd->flags |= D_PAGED;
609
610
79.2k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
24.7k
    {
612
      /* It's OK if this fails for the generic target.  */
613
24.7k
      if (ebd->elf_machine_code != EM_NONE)
614
0
  goto got_no_match;
615
24.7k
    }
616
617
79.2k
  if (ebd->elf_machine_code != EM_NONE
618
79.2k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
79.2k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
12.1k
    goto got_wrong_format_error;
621
622
67.0k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
38.7k
    {
624
38.7k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
38.7k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
1.81k
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
36.9k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
1.38k
  goto got_no_match;
634
35.5k
      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
35.5k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
6.58k
  {
640
6.58k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
6.58k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
6.58k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
6.58k
        || i_ehdrp->e_shnum  == 0)
644
3.53k
      goto got_wrong_format_error;
645
6.58k
  }
646
647
      /* And similarly for the string table index.  */
648
32.0k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
6.56k
  {
650
6.56k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
6.56k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
6.56k
  }
654
655
      /* And program headers.  */
656
32.0k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
7.80k
  {
658
7.80k
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
7.80k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
7.80k
  }
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
32.0k
      if (i_ehdrp->e_shnum != 1)
666
29.0k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
29.0k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
29.0k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
661
      goto got_wrong_format_error;
671
672
28.3k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
28.3k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
28.3k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
28.3k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
2.44k
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
25.9k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
25.9k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
25.9k
  }
686
32.0k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
57.2k
  if (i_ehdrp->e_shnum != 0)
691
28.9k
    {
692
28.9k
      Elf_Internal_Shdr *shdrp;
693
28.9k
      unsigned int num_sec;
694
28.9k
      size_t amt;
695
696
28.9k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
28.9k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
28.9k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
28.9k
      num_sec = i_ehdrp->e_shnum;
702
28.9k
      elf_numsections (abfd) = num_sec;
703
28.9k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
28.9k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
28.9k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
28.9k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
28.9k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
28.9k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
372k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
343k
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
333k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
309k
  {
720
309k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
309k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
309k
    if (i_shdrp[shindex].sh_link >= num_sec)
726
3.30k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
3.30k
        switch (ebd->elf_machine_code)
730
3.30k
    {
731
0
    case EM_386:
732
0
    case EM_IAMCU:
733
1.33k
    case EM_X86_64:
734
1.33k
    case EM_OLD_SPARCV9:
735
1.33k
    case EM_SPARC32PLUS:
736
1.33k
    case EM_SPARCV9:
737
1.33k
    case EM_SPARC:
738
1.33k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
1.33k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
31
        break;
741
      /* Otherwise fall through.  */
742
3.27k
    default:
743
3.27k
      goto got_wrong_format_error;
744
3.30k
    }
745
3.30k
      }
746
747
305k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
305k
         || i_shdrp[shindex].sh_type == SHT_RELA
749
305k
         || i_shdrp[shindex].sh_type == SHT_REL)
750
305k
        && i_shdrp[shindex].sh_info >= num_sec)
751
885
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
305k
    if (i_shdrp[shindex].sh_size != 0
756
305k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
305k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
305k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
35.1k
       % ebd->minpagesize)
760
35.1k
      != 0))
761
16.0k
      abfd->flags &= ~D_PAGED;
762
305k
  }
763
764
24.7k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
24.7k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
12.9k
  {
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.9k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
12.9k
    if (!abfd->read_only)
775
809
      {
776
809
        _bfd_error_handler
777
809
    (_("warning: %pB has a corrupt string table index"), abfd);
778
809
        abfd->read_only = 1;
779
809
      }
780
12.9k
  }
781
24.7k
    }
782
28.3k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
322
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
52.7k
  if (i_ehdrp->e_phnum == 0)
787
20.4k
    elf_tdata (abfd)->phdr = NULL;
788
32.3k
  else
789
32.3k
    {
790
32.3k
      Elf_Internal_Phdr *i_phdr;
791
32.3k
      unsigned int i;
792
32.3k
      ufile_ptr filesize;
793
32.3k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
32.3k
      filesize = bfd_get_file_size (abfd);
798
32.3k
      if (filesize != 0
799
32.3k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
5.29k
  goto got_wrong_format_error;
801
27.0k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
27.0k
      elf_tdata (abfd)->phdr
804
27.0k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
27.0k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
27.0k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
525
  goto got_no_match;
809
26.5k
      i_phdr = elf_tdata (abfd)->phdr;
810
387k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
361k
  {
812
361k
    Elf_External_Phdr x_phdr;
813
814
361k
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
600
      goto got_no_match;
816
360k
    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
360k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
312k
      {
821
312k
        i_phdr->p_align &= -i_phdr->p_align;
822
312k
        if (!abfd->read_only)
823
15.2k
    {
824
15.2k
      _bfd_error_handler (_("warning: %pB has a program header "
825
15.2k
          "with invalid alignment"), abfd);
826
15.2k
      abfd->read_only = 1;
827
15.2k
    }
828
312k
      }
829
360k
  }
830
26.5k
    }
831
832
46.3k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
11.8k
    {
834
11.8k
      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
11.8k
      num_sec = elf_numsections (abfd);
840
170k
      for (shindex = 1; shindex < num_sec; shindex++)
841
164k
  if (!bfd_section_from_shdr (abfd, shindex))
842
5.67k
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
6.13k
      if (! _bfd_elf_setup_sections (abfd))
846
11
  goto got_wrong_format_error;
847
6.13k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
40.6k
  if (ebd->elf_backend_object_p)
852
25.0k
    {
853
25.0k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
232
  goto got_wrong_format_error;
855
25.0k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
40.4k
  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
110k
  for (s = abfd->sections; s != NULL; s = s->next)
863
70.2k
    {
864
70.2k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
70.2k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
70.2k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
3.30k
  {
868
3.30k
    unsigned long targ_index;
869
3.30k
    asection *targ_sec;
870
871
3.30k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
3.30k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
3.30k
    if (targ_sec != NULL
874
3.30k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
0
      s->flags |= SEC_DEBUGGING;
876
3.30k
  }
877
70.2k
    }
878
40.4k
  return _bfd_no_cleanup;
879
880
22.4M
 got_wrong_format_error:
881
22.4M
  bfd_set_error (bfd_error_wrong_format);
882
883
22.4M
 got_no_match:
884
22.4M
  return NULL;
885
22.4M
}
bfd_elf32_object_p
Line
Count
Source
506
69.6M
{
507
69.6M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
69.6M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
69.6M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
69.6M
  Elf_Internal_Shdr i_shdr;
511
69.6M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
69.6M
  unsigned int shindex;
513
69.6M
  const struct elf_backend_data *ebd;
514
69.6M
  asection *s;
515
69.6M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
69.6M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
5.49M
    {
521
5.49M
      if (bfd_get_error () != bfd_error_system_call)
522
5.47M
  goto got_wrong_format_error;
523
27.2k
      else
524
27.2k
  goto got_no_match;
525
5.49M
    }
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
64.2M
  if (! elf_file_p (&x_ehdr)
534
64.2M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
64.2M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
57.9M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
6.22M
  switch (x_ehdr.e_ident[EI_DATA])
540
6.22M
    {
541
728k
    case ELFDATA2MSB:   /* Big-endian */
542
728k
      if (! bfd_header_big_endian (abfd))
543
359k
  goto got_wrong_format_error;
544
368k
      break;
545
5.48M
    case ELFDATA2LSB:   /* Little-endian */
546
5.48M
      if (! bfd_header_little_endian (abfd))
547
2.74M
  goto got_wrong_format_error;
548
2.73M
      break;
549
2.73M
    case ELFDATANONE:   /* No data encoding specified */
550
14.0k
    default:      /* Unknown data encoding specified */
551
14.0k
      goto got_wrong_format_error;
552
6.22M
    }
553
554
3.10M
  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
3.10M
  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
3.10M
  i_ehdrp = elf_elfheader (abfd);
564
3.10M
  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
3.10M
  if (i_ehdrp->e_type == ET_CORE)
571
198
    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
3.10M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
198
    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
3.10M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
13.8k
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
3.09M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
6.86k
    goto got_wrong_format_error;
587
588
3.08M
  ebd = get_elf_backend_data (abfd);
589
3.08M
  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
3.08M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
3.08M
      && (ebd->elf_machine_alt1 == 0
596
2.97M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
3.08M
      && (ebd->elf_machine_alt2 == 0
598
2.96M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
3.08M
      && ebd->elf_machine_code != EM_NONE)
600
2.92M
    goto got_wrong_format_error;
601
602
162k
  if (i_ehdrp->e_type == ET_EXEC)
603
3.90k
    abfd->flags |= EXEC_P;
604
158k
  else if (i_ehdrp->e_type == ET_DYN)
605
3.01k
    abfd->flags |= DYNAMIC;
606
607
162k
  if (i_ehdrp->e_phnum > 0)
608
67.6k
    abfd->flags |= D_PAGED;
609
610
162k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
46.7k
    {
612
      /* It's OK if this fails for the generic target.  */
613
46.7k
      if (ebd->elf_machine_code != EM_NONE)
614
232
  goto got_no_match;
615
46.7k
    }
616
617
161k
  if (ebd->elf_machine_code != EM_NONE
618
161k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
161k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
8.29k
    goto got_wrong_format_error;
621
622
153k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
96.4k
    {
624
96.4k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
96.4k
      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
96.4k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
997
  goto got_no_match;
634
95.4k
      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
95.4k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
9.09k
  {
640
9.09k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
9.09k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
9.09k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
9.09k
        || i_ehdrp->e_shnum  == 0)
644
895
      goto got_wrong_format_error;
645
9.09k
  }
646
647
      /* And similarly for the string table index.  */
648
94.5k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
6.76k
  {
650
6.76k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
6.76k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
6.76k
  }
654
655
      /* And program headers.  */
656
94.5k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
4.70k
  {
658
4.70k
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
4.70k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
4.70k
  }
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
94.5k
      if (i_ehdrp->e_shnum != 1)
666
65.3k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
65.3k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
65.3k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
1.67k
      goto got_wrong_format_error;
671
672
63.7k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
63.7k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
63.7k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
63.7k
    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
62.6k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
62.6k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
62.6k
  }
686
94.5k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
148k
  if (i_ehdrp->e_shnum != 0)
691
91.8k
    {
692
91.8k
      Elf_Internal_Shdr *shdrp;
693
91.8k
      unsigned int num_sec;
694
91.8k
      size_t amt;
695
696
91.8k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
91.8k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
91.8k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
91.8k
      num_sec = i_ehdrp->e_shnum;
702
91.8k
      elf_numsections (abfd) = num_sec;
703
91.8k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
91.8k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
91.8k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
91.8k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
91.8k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
91.8k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
1.31M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
1.22M
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
1.21M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
1.12M
  {
720
1.12M
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
1.12M
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
1.12M
    if (i_shdrp[shindex].sh_link >= num_sec)
726
2.50k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
2.50k
        switch (ebd->elf_machine_code)
730
2.50k
    {
731
792
    case EM_386:
732
1.00k
    case EM_IAMCU:
733
1.11k
    case EM_X86_64:
734
1.11k
    case EM_OLD_SPARCV9:
735
1.11k
    case EM_SPARC32PLUS:
736
1.11k
    case EM_SPARCV9:
737
1.12k
    case EM_SPARC:
738
1.12k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
1.12k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
741
        break;
741
      /* Otherwise fall through.  */
742
1.76k
    default:
743
1.76k
      goto got_wrong_format_error;
744
2.50k
    }
745
2.50k
      }
746
747
1.12M
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
1.12M
         || i_shdrp[shindex].sh_type == SHT_RELA
749
1.12M
         || i_shdrp[shindex].sh_type == SHT_REL)
750
1.12M
        && i_shdrp[shindex].sh_info >= num_sec)
751
401
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
1.12M
    if (i_shdrp[shindex].sh_size != 0
756
1.12M
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
1.12M
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
1.12M
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
109k
       % ebd->minpagesize)
760
109k
      != 0))
761
70.2k
      abfd->flags &= ~D_PAGED;
762
1.12M
  }
763
764
89.6k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
89.6k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
47.5k
  {
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
47.5k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
47.5k
    if (!abfd->read_only)
775
9.61k
      {
776
9.61k
        _bfd_error_handler
777
9.61k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
9.61k
        abfd->read_only = 1;
779
9.61k
      }
780
47.5k
  }
781
89.6k
    }
782
57.1k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
340
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
146k
  if (i_ehdrp->e_phnum == 0)
787
86.3k
    elf_tdata (abfd)->phdr = NULL;
788
60.0k
  else
789
60.0k
    {
790
60.0k
      Elf_Internal_Phdr *i_phdr;
791
60.0k
      unsigned int i;
792
60.0k
      ufile_ptr filesize;
793
60.0k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
60.0k
      filesize = bfd_get_file_size (abfd);
798
60.0k
      if (filesize != 0
799
60.0k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
1.21k
  goto got_wrong_format_error;
801
58.8k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
58.8k
      elf_tdata (abfd)->phdr
804
58.8k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
58.8k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
58.8k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
0
  goto got_no_match;
809
58.8k
      i_phdr = elf_tdata (abfd)->phdr;
810
1.00M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
944k
  {
812
944k
    Elf_External_Phdr x_phdr;
813
814
944k
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
362
      goto got_no_match;
816
944k
    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
944k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
605k
      {
821
605k
        i_phdr->p_align &= -i_phdr->p_align;
822
605k
        if (!abfd->read_only)
823
3.56k
    {
824
3.56k
      _bfd_error_handler (_("warning: %pB has a program header "
825
3.56k
          "with invalid alignment"), abfd);
826
3.56k
      abfd->read_only = 1;
827
3.56k
    }
828
605k
      }
829
944k
  }
830
58.8k
    }
831
832
144k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
41.8k
    {
834
41.8k
      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
41.8k
      num_sec = elf_numsections (abfd);
840
859k
      for (shindex = 1; shindex < num_sec; shindex++)
841
821k
  if (!bfd_section_from_shdr (abfd, shindex))
842
3.44k
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
38.4k
      if (! _bfd_elf_setup_sections (abfd))
846
129
  goto got_wrong_format_error;
847
38.4k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
141k
  if (ebd->elf_backend_object_p)
852
96.0k
    {
853
96.0k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
16.8k
  goto got_wrong_format_error;
855
96.0k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
124k
  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
494k
  for (s = abfd->sections; s != NULL; s = s->next)
863
370k
    {
864
370k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
370k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
370k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
9.17k
  {
868
9.17k
    unsigned long targ_index;
869
9.17k
    asection *targ_sec;
870
871
9.17k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
9.17k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
9.17k
    if (targ_sec != NULL
874
9.17k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
237
      s->flags |= SEC_DEBUGGING;
876
9.17k
  }
877
370k
    }
878
124k
  return _bfd_no_cleanup;
879
880
69.5M
 got_wrong_format_error:
881
69.5M
  bfd_set_error (bfd_error_wrong_format);
882
883
69.5M
 got_no_match:
884
69.5M
  return NULL;
885
69.5M
}
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
0
{
1194
0
  Elf_Internal_Shdr *hdr;
1195
0
  Elf_Internal_Shdr *verhdr;
1196
0
  unsigned long symcount; /* Number of external ELF symbols */
1197
0
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
0
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
0
  Elf_Internal_Sym *isym;
1200
0
  Elf_Internal_Sym *isymend;
1201
0
  Elf_Internal_Sym *isymbuf = NULL;
1202
0
  Elf_External_Versym *xver;
1203
0
  Elf_External_Versym *xverbuf = NULL;
1204
0
  const struct elf_backend_data *ebd;
1205
0
  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
0
  if (! dynamic)
1218
0
    {
1219
0
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
0
      verhdr = NULL;
1221
0
    }
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
0
  ebd = get_elf_backend_data (abfd);
1240
0
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
0
  if (symcount == 0)
1242
0
    sym = symbase = NULL;
1243
0
  else
1244
0
    {
1245
0
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
0
              NULL, NULL, NULL);
1247
0
      if (isymbuf == NULL)
1248
0
  return -1;
1249
1250
0
      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
0
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
0
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
0
      if (verhdr != NULL
1261
0
    && 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
0
      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
0
      xver = xverbuf;
1288
0
      if (xver != NULL)
1289
0
  ++xver;
1290
0
      isymend = isymbuf + symcount;
1291
0
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
0
  {
1293
0
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
0
    sym->symbol.the_bfd = abfd;
1296
0
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
0
    sym->symbol.value = isym->st_value;
1298
1299
0
    if (isym->st_shndx == SHN_UNDEF)
1300
0
      {
1301
0
        sym->symbol.section = bfd_und_section_ptr;
1302
0
      }
1303
0
    else if (isym->st_shndx == SHN_ABS)
1304
0
      {
1305
0
        sym->symbol.section = bfd_abs_section_ptr;
1306
0
      }
1307
0
    else if (isym->st_shndx == SHN_COMMON)
1308
0
      {
1309
0
        sym->symbol.section = bfd_com_section_ptr;
1310
0
        if ((abfd->flags & BFD_PLUGIN) != 0)
1311
0
    {
1312
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1313
1314
0
      if (xc == NULL)
1315
0
        {
1316
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1317
0
          | SEC_EXCLUDE);
1318
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1319
0
          if (xc == NULL)
1320
0
      goto error_return;
1321
0
        }
1322
0
      sym->symbol.section = xc;
1323
0
    }
1324
        /* Elf puts the alignment into the `value' field, and
1325
     the size into the `size' field.  BFD wants to see the
1326
     size in the value field, and doesn't care (at the
1327
     moment) about the alignment.  */
1328
0
        sym->symbol.value = isym->st_size;
1329
0
      }
1330
0
    else
1331
0
      {
1332
0
        sym->symbol.section
1333
0
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
0
        if (sym->symbol.section == NULL)
1335
0
    {
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
0
      sym->symbol.section = bfd_abs_section_ptr;
1343
0
    }
1344
0
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
0
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
0
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
0
    switch (ELF_ST_BIND (isym->st_info))
1352
0
      {
1353
0
      case STB_LOCAL:
1354
0
        sym->symbol.flags |= BSF_LOCAL;
1355
0
        break;
1356
0
      case STB_GLOBAL:
1357
0
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
0
    sym->symbol.flags |= BSF_GLOBAL;
1359
0
        break;
1360
0
      case STB_WEAK:
1361
0
        sym->symbol.flags |= BSF_WEAK;
1362
0
        break;
1363
0
      case STB_GNU_UNIQUE:
1364
0
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
0
        break;
1366
0
      }
1367
1368
0
    switch (ELF_ST_TYPE (isym->st_info))
1369
0
      {
1370
0
      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
0
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
0
            | BSF_DEBUGGING
1377
0
            | BSF_SECTION_SYM_USED);
1378
0
        break;
1379
0
      case STT_FILE:
1380
0
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
0
        break;
1382
0
      case STT_FUNC:
1383
0
        sym->symbol.flags |= BSF_FUNCTION;
1384
0
        break;
1385
0
      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
0
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
0
      case STT_OBJECT:
1391
0
        sym->symbol.flags |= BSF_OBJECT;
1392
0
        break;
1393
0
      case STT_TLS:
1394
0
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
0
        break;
1396
0
      case STT_RELC:
1397
0
        sym->symbol.flags |= BSF_RELC;
1398
0
        break;
1399
0
      case STT_SRELC:
1400
0
        sym->symbol.flags |= BSF_SRELC;
1401
0
        break;
1402
0
      case STT_GNU_IFUNC:
1403
0
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
0
        break;
1405
0
      }
1406
1407
0
    if (dynamic)
1408
0
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
0
    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
0
    if (ebd->elf_backend_symbol_processing)
1421
0
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
0
  }
1423
0
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
0
  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
0
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
0
  if (symptrs)
1435
0
    {
1436
0
      long l = symcount;
1437
1438
0
      sym = symbase;
1439
0
      while (l-- > 0)
1440
0
  {
1441
0
    *symptrs++ = &sym->symbol;
1442
0
    sym++;
1443
0
  }
1444
0
      *symptrs = 0;   /* Final null pointer */
1445
0
    }
1446
1447
0
  free (xverbuf);
1448
0
  if (hdr->contents != (unsigned char *) isymbuf)
1449
0
    free (isymbuf);
1450
0
  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
0
}
Unexecuted instantiation: bfd_elf64_slurp_symbol_table
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
};