Coverage Report

Created: 2026-05-11 07:54

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