Coverage Report

Created: 2026-04-04 08:16

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
20.7M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
1.80k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
18.8M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
1.71M
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
1.23k
#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
10.7k
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
81.9k
#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
213
#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.69M
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
254
#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.23k
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
236k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
1.28M
#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
22.3k
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
5.39M
#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
19.4k
#define H_PUT_WORD    H_PUT_64
159
1.38k
#define H_PUT_SIGNED_WORD H_PUT_S64
160
8.54M
#define H_GET_WORD    H_GET_64
161
582k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
0
#define H_PUT_WORD    H_PUT_32
165
0
#define H_PUT_SIGNED_WORD H_PUT_S32
166
12.3M
#define H_GET_WORD    H_GET_32
167
746k
#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
140k
{
179
140k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
140k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
140k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
140k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
140k
  if (signed_vma)
185
11.9k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
128k
  else
187
128k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
140k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
140k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
140k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
140k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
140k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
2.07k
    {
194
2.07k
      if (shndx == NULL)
195
411
  return false;
196
1.66k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1.66k
    }
198
138k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
3.61k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
139k
  dst->st_target_internal = 0;
201
139k
  return true;
202
140k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
111k
{
179
111k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
111k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
111k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
111k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
111k
  if (signed_vma)
185
6.25k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
104k
  else
187
104k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
111k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
111k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
111k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
111k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
111k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
435
    {
194
435
      if (shndx == NULL)
195
289
  return false;
196
146
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
146
    }
198
110k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
2.98k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
110k
  dst->st_target_internal = 0;
201
  return true;
202
111k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
29.0k
{
179
29.0k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
29.0k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
29.0k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
29.0k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
29.0k
  if (signed_vma)
185
5.71k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
23.3k
  else
187
23.3k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
29.0k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
29.0k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
29.0k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
29.0k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
29.0k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
1.63k
    {
194
1.63k
      if (shndx == NULL)
195
122
  return false;
196
1.51k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1.51k
    }
198
27.4k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
633
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
28.9k
  dst->st_target_internal = 0;
201
  return true;
202
29.0k
}
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.80k
{
213
1.80k
  unsigned int tmp;
214
1.80k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.80k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.80k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.80k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.80k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.80k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.80k
  tmp = src->st_shndx;
221
1.80k
  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.80k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.80k
}
bfd_elf64_swap_symbol_out
Line
Count
Source
212
1.80k
{
213
1.80k
  unsigned int tmp;
214
1.80k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.80k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.80k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.80k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.80k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.80k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.80k
  tmp = src->st_shndx;
221
1.80k
  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.80k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.80k
}
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.11M
{
239
2.11M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
2.11M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
2.11M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
2.11M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
2.11M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
2.11M
  if (signed_vma)
245
235k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
1.88M
  else
247
1.88M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
2.11M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
2.11M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
2.11M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
2.11M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
2.11M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
2.11M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
2.11M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
2.11M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
2.11M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
2.11M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
293k
{
239
293k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
293k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
293k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
293k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
293k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
293k
  if (signed_vma)
245
42.1k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
250k
  else
247
250k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
293k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
293k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
293k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
293k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
293k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
293k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
293k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
293k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
293k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
293k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
1.82M
{
239
1.82M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
1.82M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
1.82M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
1.82M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
1.82M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
1.82M
  if (signed_vma)
245
193k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
1.62M
  else
247
1.62M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
1.82M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
1.82M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
1.82M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
1.82M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
1.82M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
1.82M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
1.82M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
1.82M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
1.82M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
1.82M
}
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
152
{
267
152
  unsigned int tmp;
268
152
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
152
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
152
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
152
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
152
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
152
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
152
  if (signed_vma)
276
152
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
130
  else
278
152
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
152
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
152
  if (no_section_header)
281
152
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
152
  else
283
152
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
152
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
152
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
152
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
152
  tmp = src->e_phnum;
288
152
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
152
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
152
  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
152
  else
298
152
    {
299
152
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
152
      tmp = src->e_shnum;
301
152
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
152
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
152
      tmp = src->e_shstrndx;
305
152
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
152
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
152
    }
309
152
}
elf64.c:elf_swap_ehdr_out
Line
Count
Source
266
152
{
267
152
  unsigned int tmp;
268
152
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
152
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
152
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
152
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
152
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
152
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
152
  if (signed_vma)
276
152
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
130
  else
278
152
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
152
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
152
  if (no_section_header)
281
152
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
152
  else
283
152
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
152
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
152
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
152
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
152
  tmp = src->e_phnum;
288
152
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
152
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
152
  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
152
  else
298
152
    {
299
152
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
152
      tmp = src->e_shnum;
301
152
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
152
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
152
      tmp = src->e_shstrndx;
305
152
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
152
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
152
    }
309
152
}
Unexecuted instantiation: elf32.c:elf_swap_ehdr_out
310
311
/* Translate an ELF section header table entry in external format into an
312
   ELF section header table entry in internal format.  */
313
314
static bool
315
elf_swap_shdr_in (bfd *abfd,
316
      const Elf_External_Shdr *src,
317
      Elf_Internal_Shdr *dst)
318
844k
{
319
844k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
844k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
844k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
844k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
844k
  if (signed_vma)
325
203k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
641k
  else
327
641k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
844k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
844k
  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
844k
  if (dst->sh_type != SHT_NOBITS)
334
831k
    {
335
831k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
831k
      if (filesize != 0
338
831k
    && ((ufile_ptr) dst->sh_offset > filesize
339
628k
        || dst->sh_size > filesize - dst->sh_offset)
340
276k
    && !abfd->read_only)
341
51.8k
  {
342
51.8k
    _bfd_error_handler (_("warning: %pB has a section "
343
51.8k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
51.8k
    if (abfd->is_linker_input)
346
0
      return false;
347
51.8k
    abfd->read_only = 1;
348
51.8k
  }
349
831k
    }
350
844k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
844k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
844k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
844k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
844k
  dst->bfd_section = NULL;
355
844k
  dst->contents = NULL;
356
844k
  return true;
357
844k
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
572k
{
319
572k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
572k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
572k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
572k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
572k
  if (signed_vma)
325
94.4k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
478k
  else
327
478k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
572k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
572k
  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
572k
  if (dst->sh_type != SHT_NOBITS)
334
566k
    {
335
566k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
566k
      if (filesize != 0
338
566k
    && ((ufile_ptr) dst->sh_offset > filesize
339
443k
        || dst->sh_size > filesize - dst->sh_offset)
340
166k
    && !abfd->read_only)
341
27.2k
  {
342
27.2k
    _bfd_error_handler (_("warning: %pB has a section "
343
27.2k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
27.2k
    if (abfd->is_linker_input)
346
0
      return false;
347
27.2k
    abfd->read_only = 1;
348
27.2k
  }
349
566k
    }
350
572k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
572k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
572k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
572k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
572k
  dst->bfd_section = NULL;
355
572k
  dst->contents = NULL;
356
  return true;
357
572k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
272k
{
319
272k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
272k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
272k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
272k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
272k
  if (signed_vma)
325
108k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
163k
  else
327
163k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
272k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
272k
  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
272k
  if (dst->sh_type != SHT_NOBITS)
334
264k
    {
335
264k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
264k
      if (filesize != 0
338
264k
    && ((ufile_ptr) dst->sh_offset > filesize
339
184k
        || dst->sh_size > filesize - dst->sh_offset)
340
109k
    && !abfd->read_only)
341
24.5k
  {
342
24.5k
    _bfd_error_handler (_("warning: %pB has a section "
343
24.5k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
24.5k
    if (abfd->is_linker_input)
346
0
      return false;
347
24.5k
    abfd->read_only = 1;
348
24.5k
  }
349
264k
    }
350
272k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
272k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
272k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
272k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
272k
  dst->bfd_section = NULL;
355
272k
  dst->contents = NULL;
356
  return true;
357
272k
}
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.87k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.87k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.87k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.87k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.87k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.87k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.87k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.87k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.87k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.87k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.87k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.87k
}
elf64.c:elf_swap_shdr_out
Line
Count
Source
366
1.87k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.87k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.87k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.87k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.87k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.87k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.87k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.87k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.87k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.87k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.87k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.87k
}
Unexecuted instantiation: elf32.c:elf_swap_shdr_out
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.69M
{
388
1.69M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.69M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.69M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.69M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.69M
  if (signed_vma)
394
398k
    {
395
398k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
398k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
398k
    }
398
1.29M
  else
399
1.29M
    {
400
1.29M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.29M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.29M
    }
403
1.69M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.69M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.69M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.69M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
387
703k
{
388
703k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
703k
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
703k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
703k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
703k
  if (signed_vma)
394
178k
    {
395
178k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
178k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
178k
    }
398
524k
  else
399
524k
    {
400
524k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
524k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
524k
    }
403
703k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
703k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
703k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
703k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
387
991k
{
388
991k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
991k
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
991k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
991k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
991k
  if (signed_vma)
394
219k
    {
395
219k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
219k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
219k
    }
398
771k
  else
399
771k
    {
400
771k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
771k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
771k
    }
403
991k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
991k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
991k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
991k
}
407
408
void
409
elf_swap_phdr_out (bfd *abfd,
410
       const Elf_Internal_Phdr *src,
411
       Elf_External_Phdr *dst)
412
254
{
413
254
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
254
  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
254
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
254
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
254
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
254
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
254
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
254
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
254
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
254
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
254
}
bfd_elf64_swap_phdr_out
Line
Count
Source
412
254
{
413
254
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
254
  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
254
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
254
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
254
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
254
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
254
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
254
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
254
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
254
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
254
}
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
10.7k
{
433
10.7k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
10.7k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
10.7k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
10.7k
  dst->r_addend = 0;
437
10.7k
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
bfd_elf32_swap_reloc_in
Line
Count
Source
432
10.7k
{
433
10.7k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
10.7k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
10.7k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
10.7k
  dst->r_addend = 0;
437
10.7k
}
438
439
void
440
elf_swap_reloca_in (bfd *abfd,
441
        const bfd_byte *s,
442
        Elf_Internal_Rela *dst)
443
82.5k
{
444
82.5k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
82.5k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
82.5k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
82.5k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
82.5k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
443
82.5k
{
444
82.5k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
82.5k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
82.5k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
82.5k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
82.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.23k
{
466
1.23k
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
1.23k
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
1.23k
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
1.23k
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
1.23k
}
bfd_elf64_swap_reloca_out
Line
Count
Source
465
1.23k
{
466
1.23k
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
1.23k
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
1.23k
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
1.23k
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
1.23k
}
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.1k
{
477
65.1k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
65.1k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
65.1k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
65.1k
}
bfd_elf64_swap_dyn_in
Line
Count
Source
476
62.4k
{
477
62.4k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
62.4k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
62.4k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
62.4k
}
bfd_elf32_swap_dyn_in
Line
Count
Source
476
2.66k
{
477
2.66k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
2.66k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
2.66k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
2.66k
}
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
19.2M
{
504
19.2M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
6.79M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
6.78M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
6.77M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
19.2M
}
elf64.c:elf_file_p
Line
Count
Source
503
4.12M
{
504
4.12M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
1.30M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
1.30M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
1.30M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
4.12M
}
elf32.c:elf_file_p
Line
Count
Source
503
15.1M
{
504
15.1M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
5.48M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
5.48M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
5.47M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
15.1M
}
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
18.8M
{
521
18.8M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
18.8M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
18.8M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
18.8M
  Elf_Internal_Shdr i_shdr;
525
18.8M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
18.8M
  unsigned int shindex;
527
18.8M
  elf_backend_data *ebd;
528
18.8M
  asection *s;
529
18.8M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
18.8M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
1.33M
    {
535
1.33M
      if (bfd_get_error () != bfd_error_system_call)
536
1.33M
  goto got_wrong_format_error;
537
6.27k
      else
538
6.27k
  goto got_no_match;
539
1.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
17.5M
  if (! elf_file_p (&x_ehdr)
548
5.22M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
5.12M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
14.5M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
3.00M
  switch (x_ehdr.e_ident[EI_DATA])
554
3.00M
    {
555
836k
    case ELFDATA2MSB:   /* Big-endian */
556
836k
      if (! bfd_header_big_endian (abfd))
557
419k
  goto got_wrong_format_error;
558
416k
      break;
559
2.16M
    case ELFDATA2LSB:   /* Little-endian */
560
2.16M
      if (! bfd_header_little_endian (abfd))
561
1.06M
  goto got_wrong_format_error;
562
1.10M
      break;
563
1.10M
    case ELFDATANONE:   /* No data encoding specified */
564
1.84k
    default:      /* Unknown data encoding specified */
565
1.84k
      goto got_wrong_format_error;
566
3.00M
    }
567
568
1.52M
  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.52M
  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.52M
  i_ehdrp = elf_elfheader (abfd);
578
1.52M
  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.52M
  if (i_ehdrp->e_type == ET_CORE)
585
343k
    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.18M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
28.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
1.15M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
57.8k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.09M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
173
    goto got_wrong_format_error;
601
602
1.09M
  ebd = get_elf_backend_data (abfd);
603
1.09M
  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.09M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.04M
      && (ebd->elf_machine_alt1 == 0
610
257k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.04M
      && (ebd->elf_machine_alt2 == 0
612
35.8k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.04M
      && ebd->elf_machine_code != EM_NONE)
614
1.01M
    goto got_wrong_format_error;
615
616
76.2k
  if (i_ehdrp->e_type == ET_EXEC)
617
3.04k
    abfd->flags |= EXEC_P;
618
73.1k
  else if (i_ehdrp->e_type == ET_DYN)
619
3.14k
    abfd->flags |= DYNAMIC;
620
621
76.2k
  if (i_ehdrp->e_phnum > 0)
622
33.6k
    abfd->flags |= D_PAGED;
623
624
76.2k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
25.5k
    {
626
      /* It's OK if this fails for the generic target.  */
627
25.5k
      if (ebd->elf_machine_code != EM_NONE)
628
12
  goto got_no_match;
629
25.5k
    }
630
631
76.1k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
7.13k
    goto got_wrong_format_error;
633
634
69.0k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
57.0k
    {
636
57.0k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
57.0k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
318
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
56.7k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
55.0k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
1.68k
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
55.0k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
10.4k
  {
652
10.4k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
10.4k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
10.3k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
10.1k
        || i_ehdrp->e_shnum  == 0)
656
425
      goto got_wrong_format_error;
657
10.4k
  }
658
659
      /* And similarly for the string table index.  */
660
54.6k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
1.01k
  {
662
1.01k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
1.01k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
1.01k
  }
666
667
      /* And program headers.  */
668
54.6k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
568
  {
670
568
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
568
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
568
  }
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
54.6k
      if (i_ehdrp->e_shnum != 1)
678
53.1k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
53.1k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
52.6k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
599
      goto got_wrong_format_error;
683
684
52.5k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
52.5k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
52.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
52.5k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
597
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
51.9k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
51.9k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
51.9k
  }
698
54.6k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
65.4k
  if (i_ehdrp->e_shnum != 0)
703
53.4k
    {
704
53.4k
      Elf_Internal_Shdr *shdrp;
705
53.4k
      unsigned int num_sec;
706
53.4k
      size_t amt;
707
708
53.4k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
53.4k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
53.4k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
53.4k
      num_sec = i_ehdrp->e_shnum;
714
53.4k
      elf_numsections (abfd) = num_sec;
715
53.4k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
53.4k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
53.4k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
53.4k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
53.4k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
53.4k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
915k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
861k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
839k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
789k
  {
732
789k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
789k
        || !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
789k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
4.23k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
4.23k
        switch (ebd->elf_machine_code)
742
4.23k
    {
743
331
    case EM_386:
744
377
    case EM_IAMCU:
745
2.44k
    case EM_X86_64:
746
2.44k
    case EM_OLD_SPARCV9:
747
2.44k
    case EM_SPARC32PLUS:
748
2.71k
    case EM_SPARCV9:
749
2.84k
    case EM_SPARC:
750
2.84k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.20k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
1.91k
        break;
753
      /* Otherwise fall through.  */
754
2.32k
    default:
755
2.32k
      goto got_wrong_format_error;
756
4.23k
    }
757
4.23k
      }
758
759
787k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
659k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
624k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
177k
        && i_shdrp[shindex].sh_info >= num_sec)
763
571
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
786k
    if (i_shdrp[shindex].sh_size != 0
768
648k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
211k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
203k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
203k
       % ebd->minpagesize)
772
203k
      != 0))
773
124k
      abfd->flags &= ~D_PAGED;
774
786k
  }
775
776
50.5k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
48.7k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
3.52k
  {
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
3.52k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
3.52k
    if (!abfd->read_only)
787
288
      {
788
288
        _bfd_error_handler
789
288
    (_("warning: %pB has a corrupt string table index"), abfd);
790
288
        abfd->read_only = 1;
791
288
      }
792
3.52k
  }
793
50.5k
    }
794
11.9k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
4.19k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
58.3k
  if (i_ehdrp->e_phnum == 0)
799
35.2k
    elf_tdata (abfd)->phdr = NULL;
800
23.0k
  else
801
23.0k
    {
802
23.0k
      Elf_Internal_Phdr *i_phdr;
803
23.0k
      unsigned int i;
804
23.0k
      ufile_ptr filesize;
805
23.0k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
23.0k
      filesize = bfd_get_file_size (abfd);
810
23.0k
      if (filesize != 0
811
23.0k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
779
  goto got_wrong_format_error;
813
22.3k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
22.3k
      elf_tdata (abfd)->phdr
816
22.3k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
22.3k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
22.3k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
86
  goto got_no_match;
821
22.3k
      bool eu_strip_broken_phdrs = false;
822
22.2k
      i_phdr = elf_tdata (abfd)->phdr;
823
655k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
635k
  {
825
635k
    Elf_External_Phdr x_phdr;
826
827
635k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
1.26k
      goto got_no_match;
829
633k
    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
633k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
430k
      {
834
430k
        i_phdr->p_align &= -i_phdr->p_align;
835
430k
        if (!abfd->read_only)
836
5.64k
    {
837
5.64k
      _bfd_error_handler (_("warning: %pB has a program header "
838
5.64k
          "with invalid alignment"), abfd);
839
5.64k
      abfd->read_only = 1;
840
5.64k
    }
841
430k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
633k
    if (i_phdr->p_filesz != 0
845
491k
        && (i_phdr->p_filesz > filesize
846
82.4k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
442k
      eu_strip_broken_phdrs = true;
848
633k
  }
849
20.9k
      if (!eu_strip_broken_phdrs
850
4.09k
    && i_ehdrp->e_shoff == 0
851
2.96k
    && i_ehdrp->e_shstrndx == 0)
852
2.96k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
2.96k
    i_phdr = elf_tdata (abfd)->phdr;
856
11.5k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
11.3k
      if (i_phdr->p_type == PT_DYNAMIC)
858
2.73k
        {
859
2.73k
    if (i_phdr->p_filesz != 0
860
2.69k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
2.69k
                  elf_tdata (abfd)->phdr,
862
2.69k
                  i_ehdrp->e_phnum,
863
2.69k
                  filesize))
864
2.57k
      goto got_no_match;
865
157
    break;
866
2.73k
        }
867
2.96k
  }
868
20.9k
    }
869
870
53.6k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
46.9k
    {
872
46.9k
      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
46.9k
      num_sec = elf_numsections (abfd);
878
675k
      for (shindex = 1; shindex < num_sec; shindex++)
879
643k
  if (!bfd_section_from_shdr (abfd, shindex))
880
14.8k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
32.0k
      if (! _bfd_elf_setup_sections (abfd))
884
5.16k
  goto got_wrong_format_error;
885
32.0k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
33.6k
  if (ebd->elf_backend_object_p)
890
21.2k
    {
891
21.2k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
2.65k
  goto got_wrong_format_error;
893
21.2k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
30.9k
  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
255k
  for (s = abfd->sections; s != NULL; s = s->next)
901
224k
    {
902
224k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
222k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
14.1k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
12.5k
  {
906
12.5k
    unsigned long targ_index;
907
12.5k
    asection *targ_sec;
908
909
12.5k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
12.5k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
12.5k
    if (targ_sec != NULL
912
10.0k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.30k
      s->flags |= SEC_DEBUGGING;
914
12.5k
  }
915
224k
    }
916
30.9k
  return _bfd_no_cleanup;
917
918
18.8M
 got_wrong_format_error:
919
18.8M
  bfd_set_error (bfd_error_wrong_format);
920
921
18.8M
 got_no_match:
922
18.8M
  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
20.1k
    _bfd_elf_cleanup_object_attributes (abfd);
927
18.8M
  return NULL;
928
18.8M
}
bfd_elf64_object_p
Line
Count
Source
520
4.43M
{
521
4.43M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
4.43M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
4.43M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
4.43M
  Elf_Internal_Shdr i_shdr;
525
4.43M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
4.43M
  unsigned int shindex;
527
4.43M
  elf_backend_data *ebd;
528
4.43M
  asection *s;
529
4.43M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
4.43M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
617k
    {
535
617k
      if (bfd_get_error () != bfd_error_system_call)
536
611k
  goto got_wrong_format_error;
537
6.01k
      else
538
6.01k
  goto got_no_match;
539
617k
    }
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
3.81M
  if (! elf_file_p (&x_ehdr)
548
1.03M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
1.00M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
3.31M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
499k
  switch (x_ehdr.e_ident[EI_DATA])
554
499k
    {
555
75.0k
    case ELFDATA2MSB:   /* Big-endian */
556
75.0k
      if (! bfd_header_big_endian (abfd))
557
39.6k
  goto got_wrong_format_error;
558
35.4k
      break;
559
424k
    case ELFDATA2LSB:   /* Little-endian */
560
424k
      if (! bfd_header_little_endian (abfd))
561
193k
  goto got_wrong_format_error;
562
231k
      break;
563
231k
    case ELFDATANONE:   /* No data encoding specified */
564
124
    default:      /* Unknown data encoding specified */
565
124
      goto got_wrong_format_error;
566
499k
    }
567
568
266k
  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
266k
  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
266k
  i_ehdrp = elf_elfheader (abfd);
578
266k
  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
266k
  if (i_ehdrp->e_type == ET_CORE)
585
10.2k
    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
256k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
682
    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
255k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
4.93k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
250k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
41
    goto got_wrong_format_error;
601
602
250k
  ebd = get_elf_backend_data (abfd);
603
250k
  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
250k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
222k
      && (ebd->elf_machine_alt1 == 0
610
28.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
221k
      && (ebd->elf_machine_alt2 == 0
612
21.5k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
221k
      && ebd->elf_machine_code != EM_NONE)
614
209k
    goto got_wrong_format_error;
615
616
41.6k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.34k
    abfd->flags |= EXEC_P;
618
39.3k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.43k
    abfd->flags |= DYNAMIC;
620
621
41.6k
  if (i_ehdrp->e_phnum > 0)
622
15.7k
    abfd->flags |= D_PAGED;
623
624
41.6k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
12.4k
    {
626
      /* It's OK if this fails for the generic target.  */
627
12.4k
      if (ebd->elf_machine_code != EM_NONE)
628
0
  goto got_no_match;
629
12.4k
    }
630
631
41.6k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
5.56k
    goto got_wrong_format_error;
633
634
36.0k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
30.9k
    {
636
30.9k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
30.9k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
318
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
30.6k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
29.9k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
707
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
29.9k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
754
  {
652
754
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
754
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
716
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
472
        || i_ehdrp->e_shnum  == 0)
656
318
      goto got_wrong_format_error;
657
754
  }
658
659
      /* And similarly for the string table index.  */
660
29.6k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
589
  {
662
589
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
589
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
589
  }
666
667
      /* And program headers.  */
668
29.6k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
307
  {
670
307
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
307
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
307
  }
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
29.6k
      if (i_ehdrp->e_shnum != 1)
678
28.8k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
28.8k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
28.7k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
198
      goto got_wrong_format_error;
683
684
28.6k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
28.6k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
28.6k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
28.6k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
285
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
28.4k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
28.4k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
28.4k
  }
698
29.6k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
34.2k
  if (i_ehdrp->e_shnum != 0)
703
29.1k
    {
704
29.1k
      Elf_Internal_Shdr *shdrp;
705
29.1k
      unsigned int num_sec;
706
29.1k
      size_t amt;
707
708
29.1k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
29.1k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
29.1k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
29.1k
      num_sec = i_ehdrp->e_shnum;
714
29.1k
      elf_numsections (abfd) = num_sec;
715
29.1k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
29.1k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
29.1k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
29.1k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
29.1k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
29.1k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
612k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
583k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
570k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
542k
  {
732
542k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
542k
        || !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
542k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
3.00k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
3.00k
        switch (ebd->elf_machine_code)
742
3.00k
    {
743
0
    case EM_386:
744
0
    case EM_IAMCU:
745
2.02k
    case EM_X86_64:
746
2.02k
    case EM_OLD_SPARCV9:
747
2.02k
    case EM_SPARC32PLUS:
748
2.29k
    case EM_SPARCV9:
749
2.29k
    case EM_SPARC:
750
2.29k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
924
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
1.58k
        break;
753
      /* Otherwise fall through.  */
754
1.41k
    default:
755
1.41k
      goto got_wrong_format_error;
756
3.00k
    }
757
3.00k
      }
758
759
541k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
442k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
407k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
134k
        && i_shdrp[shindex].sh_info >= num_sec)
763
238
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
540k
    if (i_shdrp[shindex].sh_size != 0
768
463k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
163k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
160k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
160k
       % ebd->minpagesize)
772
160k
      != 0))
773
97.0k
      abfd->flags &= ~D_PAGED;
774
540k
  }
775
776
27.4k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
26.6k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
1.70k
  {
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
1.70k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
1.70k
    if (!abfd->read_only)
787
89
      {
788
89
        _bfd_error_handler
789
89
    (_("warning: %pB has a corrupt string table index"), abfd);
790
89
        abfd->read_only = 1;
791
89
      }
792
1.70k
  }
793
27.4k
    }
794
5.14k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
54
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
32.5k
  if (i_ehdrp->e_phnum == 0)
799
20.3k
    elf_tdata (abfd)->phdr = NULL;
800
12.1k
  else
801
12.1k
    {
802
12.1k
      Elf_Internal_Phdr *i_phdr;
803
12.1k
      unsigned int i;
804
12.1k
      ufile_ptr filesize;
805
12.1k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
12.1k
      filesize = bfd_get_file_size (abfd);
810
12.1k
      if (filesize != 0
811
12.1k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
414
  goto got_wrong_format_error;
813
11.7k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
11.7k
      elf_tdata (abfd)->phdr
816
11.7k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
11.7k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
11.7k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
86
  goto got_no_match;
821
11.7k
      bool eu_strip_broken_phdrs = false;
822
11.6k
      i_phdr = elf_tdata (abfd)->phdr;
823
377k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
366k
  {
825
366k
    Elf_External_Phdr x_phdr;
826
827
366k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
696
      goto got_no_match;
829
365k
    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
365k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
256k
      {
834
256k
        i_phdr->p_align &= -i_phdr->p_align;
835
256k
        if (!abfd->read_only)
836
4.55k
    {
837
4.55k
      _bfd_error_handler (_("warning: %pB has a program header "
838
4.55k
          "with invalid alignment"), abfd);
839
4.55k
      abfd->read_only = 1;
840
4.55k
    }
841
256k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
365k
    if (i_phdr->p_filesz != 0
845
288k
        && (i_phdr->p_filesz > filesize
846
40.5k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
261k
      eu_strip_broken_phdrs = true;
848
365k
  }
849
10.9k
      if (!eu_strip_broken_phdrs
850
3.51k
    && i_ehdrp->e_shoff == 0
851
2.69k
    && i_ehdrp->e_shstrndx == 0)
852
2.69k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
2.69k
    i_phdr = elf_tdata (abfd)->phdr;
856
10.5k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
10.4k
      if (i_phdr->p_type == PT_DYNAMIC)
858
2.56k
        {
859
2.56k
    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.43k
      goto got_no_match;
865
139
    break;
866
2.56k
        }
867
2.69k
  }
868
10.9k
    }
869
870
28.9k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
25.6k
    {
872
25.6k
      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
25.6k
      num_sec = elf_numsections (abfd);
878
450k
      for (shindex = 1; shindex < num_sec; shindex++)
879
434k
  if (!bfd_section_from_shdr (abfd, shindex))
880
10.4k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
15.2k
      if (! _bfd_elf_setup_sections (abfd))
884
2.99k
  goto got_wrong_format_error;
885
15.2k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
15.4k
  if (ebd->elf_backend_object_p)
890
9.66k
    {
891
9.66k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
12
  goto got_wrong_format_error;
893
9.66k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
15.4k
  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
164k
  for (s = abfd->sections; s != NULL; s = s->next)
901
149k
    {
902
149k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
149k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
12.1k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
11.0k
  {
906
11.0k
    unsigned long targ_index;
907
11.0k
    asection *targ_sec;
908
909
11.0k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
11.0k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
11.0k
    if (targ_sec != NULL
912
8.79k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.22k
      s->flags |= SEC_DEBUGGING;
914
11.0k
  }
915
149k
    }
916
15.4k
  return _bfd_no_cleanup;
917
918
4.39M
 got_wrong_format_error:
919
4.39M
  bfd_set_error (bfd_error_wrong_format);
920
921
4.41M
 got_no_match:
922
4.41M
  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.1k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
4.39M
}
bfd_elf32_object_p
Line
Count
Source
520
14.4M
{
521
14.4M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
14.4M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
14.4M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
14.4M
  Elf_Internal_Shdr i_shdr;
525
14.4M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
14.4M
  unsigned int shindex;
527
14.4M
  elf_backend_data *ebd;
528
14.4M
  asection *s;
529
14.4M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
14.4M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
721k
    {
535
721k
      if (bfd_get_error () != bfd_error_system_call)
536
721k
  goto got_wrong_format_error;
537
264
      else
538
264
  goto got_no_match;
539
721k
    }
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
13.7M
  if (! elf_file_p (&x_ehdr)
548
4.19M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
4.11M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
11.2M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
2.50M
  switch (x_ehdr.e_ident[EI_DATA])
554
2.50M
    {
555
761k
    case ELFDATA2MSB:   /* Big-endian */
556
761k
      if (! bfd_header_big_endian (abfd))
557
379k
  goto got_wrong_format_error;
558
381k
      break;
559
1.74M
    case ELFDATA2LSB:   /* Little-endian */
560
1.74M
      if (! bfd_header_little_endian (abfd))
561
866k
  goto got_wrong_format_error;
562
877k
      break;
563
877k
    case ELFDATANONE:   /* No data encoding specified */
564
1.71k
    default:      /* Unknown data encoding specified */
565
1.71k
      goto got_wrong_format_error;
566
2.50M
    }
567
568
1.25M
  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.25M
  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.25M
  i_ehdrp = elf_elfheader (abfd);
578
1.25M
  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.25M
  if (i_ehdrp->e_type == ET_CORE)
585
332k
    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
926k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
28.0k
    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
898k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
52.8k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
845k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
132
    goto got_wrong_format_error;
601
602
845k
  ebd = get_elf_backend_data (abfd);
603
845k
  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
845k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
824k
      && (ebd->elf_machine_alt1 == 0
610
229k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
823k
      && (ebd->elf_machine_alt2 == 0
612
14.3k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
823k
      && ebd->elf_machine_code != EM_NONE)
614
810k
    goto got_wrong_format_error;
615
616
34.5k
  if (i_ehdrp->e_type == ET_EXEC)
617
702
    abfd->flags |= EXEC_P;
618
33.8k
  else if (i_ehdrp->e_type == ET_DYN)
619
707
    abfd->flags |= DYNAMIC;
620
621
34.5k
  if (i_ehdrp->e_phnum > 0)
622
17.9k
    abfd->flags |= D_PAGED;
623
624
34.5k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
13.0k
    {
626
      /* It's OK if this fails for the generic target.  */
627
13.0k
      if (ebd->elf_machine_code != EM_NONE)
628
12
  goto got_no_match;
629
13.0k
    }
630
631
34.5k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
1.57k
    goto got_wrong_format_error;
633
634
32.9k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
26.1k
    {
636
26.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
26.1k
      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
26.1k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
25.1k
    || !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
25.1k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
9.67k
  {
652
9.67k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
9.67k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
9.63k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
9.63k
        || i_ehdrp->e_shnum  == 0)
656
107
      goto got_wrong_format_error;
657
9.67k
  }
658
659
      /* And similarly for the string table index.  */
660
25.0k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
423
  {
662
423
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
423
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
423
  }
666
667
      /* And program headers.  */
668
25.0k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
261
  {
670
261
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
261
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
261
  }
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
25.0k
      if (i_ehdrp->e_shnum != 1)
678
24.2k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
24.2k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
23.9k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
401
      goto got_wrong_format_error;
683
684
23.8k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
23.8k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
23.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
23.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
312
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
23.5k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
23.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
23.5k
  }
698
25.0k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
31.1k
  if (i_ehdrp->e_shnum != 0)
703
24.3k
    {
704
24.3k
      Elf_Internal_Shdr *shdrp;
705
24.3k
      unsigned int num_sec;
706
24.3k
      size_t amt;
707
708
24.3k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
24.3k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
24.3k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
24.3k
      num_sec = i_ehdrp->e_shnum;
714
24.3k
      elf_numsections (abfd) = num_sec;
715
24.3k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
24.3k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
24.3k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
24.3k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
24.3k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
24.3k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
303k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
278k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
269k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
246k
  {
732
246k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
246k
        || !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
246k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
1.22k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
1.22k
        switch (ebd->elf_machine_code)
742
1.22k
    {
743
331
    case EM_386:
744
377
    case EM_IAMCU:
745
420
    case EM_X86_64:
746
420
    case EM_OLD_SPARCV9:
747
420
    case EM_SPARC32PLUS:
748
420
    case EM_SPARCV9:
749
555
    case EM_SPARC:
750
555
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
277
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
323
        break;
753
      /* Otherwise fall through.  */
754
902
    default:
755
902
      goto got_wrong_format_error;
756
1.22k
    }
757
1.22k
      }
758
759
245k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
217k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
216k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
43.3k
        && i_shdrp[shindex].sh_info >= num_sec)
763
333
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
245k
    if (i_shdrp[shindex].sh_size != 0
768
184k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
47.2k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
42.9k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
42.9k
       % ebd->minpagesize)
772
42.9k
      != 0))
773
27.8k
      abfd->flags &= ~D_PAGED;
774
245k
  }
775
776
23.0k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
22.1k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
1.82k
  {
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
1.82k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
1.82k
    if (!abfd->read_only)
787
199
      {
788
199
        _bfd_error_handler
789
199
    (_("warning: %pB has a corrupt string table index"), abfd);
790
199
        abfd->read_only = 1;
791
199
      }
792
1.82k
  }
793
23.0k
    }
794
6.83k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
4.13k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
25.7k
  if (i_ehdrp->e_phnum == 0)
799
14.8k
    elf_tdata (abfd)->phdr = NULL;
800
10.9k
  else
801
10.9k
    {
802
10.9k
      Elf_Internal_Phdr *i_phdr;
803
10.9k
      unsigned int i;
804
10.9k
      ufile_ptr filesize;
805
10.9k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
10.9k
      filesize = bfd_get_file_size (abfd);
810
10.9k
      if (filesize != 0
811
10.9k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
365
  goto got_wrong_format_error;
813
10.5k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
10.5k
      elf_tdata (abfd)->phdr
816
10.5k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
10.5k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
10.5k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
0
  goto got_no_match;
821
10.5k
      bool eu_strip_broken_phdrs = false;
822
10.5k
      i_phdr = elf_tdata (abfd)->phdr;
823
278k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
268k
  {
825
268k
    Elf_External_Phdr x_phdr;
826
827
268k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
569
      goto got_no_match;
829
268k
    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
268k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
174k
      {
834
174k
        i_phdr->p_align &= -i_phdr->p_align;
835
174k
        if (!abfd->read_only)
836
1.09k
    {
837
1.09k
      _bfd_error_handler (_("warning: %pB has a program header "
838
1.09k
          "with invalid alignment"), abfd);
839
1.09k
      abfd->read_only = 1;
840
1.09k
    }
841
174k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
268k
    if (i_phdr->p_filesz != 0
845
203k
        && (i_phdr->p_filesz > filesize
846
41.9k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
181k
      eu_strip_broken_phdrs = true;
848
268k
  }
849
9.97k
      if (!eu_strip_broken_phdrs
850
581
    && i_ehdrp->e_shoff == 0
851
267
    && i_ehdrp->e_shstrndx == 0)
852
267
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
267
    i_phdr = elf_tdata (abfd)->phdr;
856
951
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
849
      if (i_phdr->p_type == PT_DYNAMIC)
858
165
        {
859
165
    if (i_phdr->p_filesz != 0
860
147
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
147
                  elf_tdata (abfd)->phdr,
862
147
                  i_ehdrp->e_phnum,
863
147
                  filesize))
864
147
      goto got_no_match;
865
18
    break;
866
165
        }
867
267
  }
868
9.97k
    }
869
870
24.7k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
21.2k
    {
872
21.2k
      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
21.2k
      num_sec = elf_numsections (abfd);
878
225k
      for (shindex = 1; shindex < num_sec; shindex++)
879
208k
  if (!bfd_section_from_shdr (abfd, shindex))
880
4.36k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
16.8k
      if (! _bfd_elf_setup_sections (abfd))
884
2.17k
  goto got_wrong_format_error;
885
16.8k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
18.1k
  if (ebd->elf_backend_object_p)
890
11.6k
    {
891
11.6k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
2.64k
  goto got_wrong_format_error;
893
11.6k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
15.5k
  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
90.8k
  for (s = abfd->sections; s != NULL; s = s->next)
901
75.3k
    {
902
75.3k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
73.3k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
2.00k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
1.47k
  {
906
1.47k
    unsigned long targ_index;
907
1.47k
    asection *targ_sec;
908
909
1.47k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
1.47k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
1.47k
    if (targ_sec != NULL
912
1.21k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
74
      s->flags |= SEC_DEBUGGING;
914
1.47k
  }
915
75.3k
    }
916
15.5k
  return _bfd_no_cleanup;
917
918
14.4M
 got_wrong_format_error:
919
14.4M
  bfd_set_error (bfd_error_wrong_format);
920
921
14.4M
 got_no_match:
922
14.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
8.02k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
14.4M
}
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
1.06k
{
937
1.06k
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
1.06k
  bool *failedp = (bool *) data;
939
1.06k
  Elf_Internal_Shdr *rela_hdr;
940
1.06k
  bfd_vma addr_offset;
941
1.06k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
1.06k
  size_t extsize;
943
1.06k
  bfd_byte *dst_rela;
944
1.06k
  unsigned int idx;
945
1.06k
  asymbol *last_sym;
946
1.06k
  int last_sym_idx;
947
1.06k
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
1.06k
  if (*failedp)
951
0
    return;
952
953
1.06k
  if ((sec->flags & SEC_RELOC) == 0)
954
849
    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
213
  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
213
  if (sec->orelocation == NULL)
967
0
    return;
968
969
213
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
213
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
213
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
213
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
213
      || (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
213
  if (rela_hdr->sh_type == SHT_RELA)
984
213
    {
985
213
      swap_out = elf_swap_reloca_out;
986
213
      extsize = sizeof (Elf_External_Rela);
987
213
    }
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
213
  addr_offset = 0;
1002
213
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
10
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
213
  last_sym = 0;
1007
213
  last_sym_idx = 0;
1008
213
  dst_rela = rela_hdr->contents;
1009
1010
1.44k
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
1.23k
    {
1012
1.23k
      Elf_Internal_Rela src_rela;
1013
1.23k
      arelent *ptr;
1014
1.23k
      asymbol *sym;
1015
1.23k
      int n;
1016
1017
1.23k
      ptr = sec->orelocation[idx];
1018
1.23k
      sym = *ptr->sym_ptr_ptr;
1019
1.23k
      if (sym == last_sym)
1020
310
  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
922
      else if (bfd_is_abs_section (sym->section)
1026
342
         && sym->value == 0
1027
258
         && (sym->flags & BSF_RELC) == 0)
1028
258
  n = STN_UNDEF;
1029
664
      else
1030
664
  {
1031
664
    last_sym = sym;
1032
664
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
664
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
664
    last_sym_idx = n;
1039
664
  }
1040
1041
1.23k
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
983
    && (*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.23k
      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.23k
      src_rela.r_offset = ptr->address + addr_offset;
1070
1.23k
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
1.23k
      src_rela.r_addend = ptr->addend;
1072
1.23k
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
1.23k
    }
1074
1075
213
  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
213
}
bfd_elf64_write_relocs
Line
Count
Source
936
1.06k
{
937
1.06k
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
1.06k
  bool *failedp = (bool *) data;
939
1.06k
  Elf_Internal_Shdr *rela_hdr;
940
1.06k
  bfd_vma addr_offset;
941
1.06k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
1.06k
  size_t extsize;
943
1.06k
  bfd_byte *dst_rela;
944
1.06k
  unsigned int idx;
945
1.06k
  asymbol *last_sym;
946
1.06k
  int last_sym_idx;
947
1.06k
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
1.06k
  if (*failedp)
951
0
    return;
952
953
1.06k
  if ((sec->flags & SEC_RELOC) == 0)
954
849
    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
213
  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
213
  if (sec->orelocation == NULL)
967
0
    return;
968
969
213
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
213
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
213
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
213
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
213
      || (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
213
  if (rela_hdr->sh_type == SHT_RELA)
984
213
    {
985
213
      swap_out = elf_swap_reloca_out;
986
213
      extsize = sizeof (Elf_External_Rela);
987
213
    }
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
213
  addr_offset = 0;
1002
213
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
10
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
213
  last_sym = 0;
1007
213
  last_sym_idx = 0;
1008
213
  dst_rela = rela_hdr->contents;
1009
1010
1.44k
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
1.23k
    {
1012
1.23k
      Elf_Internal_Rela src_rela;
1013
1.23k
      arelent *ptr;
1014
1.23k
      asymbol *sym;
1015
1.23k
      int n;
1016
1017
1.23k
      ptr = sec->orelocation[idx];
1018
1.23k
      sym = *ptr->sym_ptr_ptr;
1019
1.23k
      if (sym == last_sym)
1020
310
  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
922
      else if (bfd_is_abs_section (sym->section)
1026
342
         && sym->value == 0
1027
258
         && (sym->flags & BSF_RELC) == 0)
1028
258
  n = STN_UNDEF;
1029
664
      else
1030
664
  {
1031
664
    last_sym = sym;
1032
664
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
664
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
664
    last_sym_idx = n;
1039
664
  }
1040
1041
1.23k
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
983
    && (*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.23k
      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.23k
      src_rela.r_offset = ptr->address + addr_offset;
1070
1.23k
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
1.23k
      src_rela.r_addend = ptr->addend;
1072
1.23k
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
1.23k
    }
1074
1075
213
  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
213
}
Unexecuted instantiation: bfd_elf32_write_relocs
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
38
{
1090
292
  while (count--)
1091
254
    {
1092
254
      Elf_External_Phdr extphdr;
1093
1094
254
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
254
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
254
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
254
      phdr++;
1099
254
    }
1100
38
  return 0;
1101
38
}
bfd_elf64_write_out_phdrs
Line
Count
Source
1089
38
{
1090
292
  while (count--)
1091
254
    {
1092
254
      Elf_External_Phdr extphdr;
1093
1094
254
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
254
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
254
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
254
      phdr++;
1099
254
    }
1100
38
  return 0;
1101
38
}
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
152
{
1108
152
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
152
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
152
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
152
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
152
  unsigned int count;
1113
152
  size_t amt;
1114
1115
152
  i_ehdrp = elf_elfheader (abfd);
1116
152
  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
152
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
152
  amt = sizeof (x_ehdr);
1125
152
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
152
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
152
  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
152
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
152
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
152
  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
152
  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
152
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
152
  if (!x_shdrp)
1149
0
    return false;
1150
1151
2.02k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.87k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.87k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.87k
    }
1158
152
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
152
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
152
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
152
  return true;
1166
152
}
bfd_elf64_write_shdrs_and_ehdr
Line
Count
Source
1107
152
{
1108
152
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
152
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
152
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
152
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
152
  unsigned int count;
1113
152
  size_t amt;
1114
1115
152
  i_ehdrp = elf_elfheader (abfd);
1116
152
  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
152
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
152
  amt = sizeof (x_ehdr);
1125
152
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
152
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
152
  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
152
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
152
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
152
  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
152
  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
152
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
152
  if (!x_shdrp)
1149
0
    return false;
1150
1151
2.02k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.87k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.87k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.87k
    }
1158
152
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
152
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
152
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
152
  return true;
1166
152
}
Unexecuted instantiation: bfd_elf32_write_shdrs_and_ehdr
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
4.97k
{
1245
4.97k
  Elf_Internal_Shdr *hdr;
1246
4.97k
  Elf_Internal_Shdr *verhdr;
1247
4.97k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.97k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.97k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.97k
  Elf_Internal_Sym *isym;
1251
4.97k
  Elf_Internal_Sym *isymend;
1252
4.97k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.97k
  Elf_External_Versym *xver;
1254
4.97k
  Elf_External_Versym *xverbuf = NULL;
1255
4.97k
  elf_backend_data *ebd;
1256
4.97k
  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.97k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.97k
  if (! dynamic)
1270
4.75k
    {
1271
4.75k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1272
4.75k
      verhdr = NULL;
1273
4.75k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
4.75k
    }
1275
224
  else
1276
224
    {
1277
224
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
224
      if (elf_dynversym (abfd) == 0)
1279
50
  verhdr = NULL;
1280
174
      else
1281
174
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
224
      if ((elf_dynverdef (abfd) != 0
1283
12
     && elf_tdata (abfd)->verdef == NULL)
1284
212
    || (elf_dynverref (abfd) != 0
1285
169
        && elf_tdata (abfd)->verref == NULL)
1286
158
    || elf_tdata (abfd)->dt_verdef != NULL
1287
158
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
67
  {
1289
67
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
43
      return -1;
1291
67
  }
1292
1293
181
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
181
    }
1295
1296
4.93k
  if (symcount == 0)
1297
561
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.93k
  if (symcount == 0)
1300
386
    sym = symbase = NULL;
1301
4.54k
  else
1302
4.54k
    {
1303
4.54k
      size_t i;
1304
1305
4.54k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
4.54k
              NULL, NULL, NULL);
1307
4.54k
      if (isymbuf == NULL)
1308
680
  return -1;
1309
1310
3.86k
      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.86k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.86k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.86k
      if (verhdr != NULL
1321
132
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
7
  {
1323
7
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
7
      (_("%pB: version count (%" PRId64 ")"
1326
7
         " does not match symbol count (%ld)"),
1327
7
       abfd,
1328
7
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
7
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
7
    verhdr = NULL;
1334
7
  }
1335
1336
3.86k
      if (verhdr != NULL)
1337
125
  {
1338
125
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
1
      goto error_return;
1340
124
    xverbuf = (Elf_External_Versym *)
1341
124
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
124
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
0
      goto error_return;
1344
124
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.86k
      xver = xverbuf;
1348
3.86k
      if (xver != NULL)
1349
124
  ++xver;
1350
3.86k
      isymend = isymbuf + symcount;
1351
3.86k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
126k
     isym < isymend;
1353
122k
     isym++, sym++, i++)
1354
122k
  {
1355
122k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
122k
    sym->symbol.the_bfd = abfd;
1358
122k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
122k
    else
1362
122k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
122k
    sym->symbol.value = isym->st_value;
1364
1365
122k
    if (isym->st_shndx == SHN_UNDEF)
1366
59.2k
      {
1367
59.2k
        sym->symbol.section = bfd_und_section_ptr;
1368
59.2k
      }
1369
63.6k
    else if (isym->st_shndx == SHN_ABS)
1370
2.27k
      {
1371
2.27k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.27k
      }
1373
61.4k
    else if (isym->st_shndx == SHN_COMMON)
1374
38
      {
1375
38
        sym->symbol.section = bfd_com_section_ptr;
1376
38
        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
38
        sym->symbol.value = isym->st_size;
1395
38
      }
1396
61.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
61.3k
    else
1406
61.3k
      {
1407
61.3k
        sym->symbol.section
1408
61.3k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
61.3k
        if (sym->symbol.section == NULL)
1410
19.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
19.7k
      sym->symbol.section = bfd_abs_section_ptr;
1418
19.7k
    }
1419
61.3k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
122k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
16.0k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
122k
    switch (ELF_ST_BIND (isym->st_info))
1427
122k
      {
1428
76.7k
      case STB_LOCAL:
1429
76.7k
        sym->symbol.flags |= BSF_LOCAL;
1430
76.7k
        break;
1431
34.6k
      case STB_GLOBAL:
1432
34.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
5.86k
    sym->symbol.flags |= BSF_GLOBAL;
1434
34.6k
        break;
1435
6.52k
      case STB_WEAK:
1436
6.52k
        sym->symbol.flags |= BSF_WEAK;
1437
6.52k
        break;
1438
708
      case STB_GNU_UNIQUE:
1439
708
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
708
        break;
1441
122k
      }
1442
1443
122k
    switch (ELF_ST_TYPE (isym->st_info))
1444
122k
      {
1445
24.7k
      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.7k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
24.7k
            | BSF_DEBUGGING
1452
24.7k
            | BSF_SECTION_SYM_USED);
1453
24.7k
        break;
1454
3.40k
      case STT_FILE:
1455
3.40k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
3.40k
        break;
1457
10.5k
      case STT_FUNC:
1458
10.5k
        sym->symbol.flags |= BSF_FUNCTION;
1459
10.5k
        break;
1460
669
      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
669
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
9.09k
      case STT_OBJECT:
1466
9.09k
        sym->symbol.flags |= BSF_OBJECT;
1467
9.09k
        break;
1468
1.31k
      case STT_TLS:
1469
1.31k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.31k
        break;
1471
1.23k
      case STT_RELC:
1472
1.23k
        sym->symbol.flags |= BSF_RELC;
1473
1.23k
        break;
1474
683
      case STT_SRELC:
1475
683
        sym->symbol.flags |= BSF_SRELC;
1476
683
        break;
1477
998
      case STT_GNU_IFUNC:
1478
998
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
998
        break;
1480
122k
      }
1481
1482
122k
    if (dynamic)
1483
1.95k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
122k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
122k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
122k
    else if (xver != NULL)
1489
1.41k
      {
1490
1.41k
        Elf_Internal_Versym iversym;
1491
1492
1.41k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
1.41k
        sym->version = iversym.vs_vers;
1494
1.41k
        xver++;
1495
1.41k
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
122k
    if (ebd->elf_backend_symbol_processing)
1499
63.8k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
122k
  }
1501
3.86k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
4.25k
  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.25k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
4.25k
  if (symptrs)
1513
4.25k
    {
1514
4.25k
      long l = symcount;
1515
1516
4.25k
      sym = symbase;
1517
127k
      while (l-- > 0)
1518
122k
  {
1519
122k
    *symptrs++ = &sym->symbol;
1520
122k
    sym++;
1521
122k
  }
1522
4.25k
      *symptrs = 0;   /* Final null pointer */
1523
4.25k
    }
1524
1525
4.25k
  free (xverbuf);
1526
4.25k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.86k
      && !elf_use_dt_symtab_p (abfd))
1528
3.86k
    free (isymbuf);
1529
4.25k
  return symcount;
1530
1531
1
 error_return:
1532
1
  free (xverbuf);
1533
1
  if (hdr->contents != (unsigned char *) isymbuf
1534
1
      && !elf_use_dt_symtab_p (abfd))
1535
1
    free (isymbuf);
1536
1
  return -1;
1537
4.93k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1244
3.89k
{
1245
3.89k
  Elf_Internal_Shdr *hdr;
1246
3.89k
  Elf_Internal_Shdr *verhdr;
1247
3.89k
  unsigned long symcount; /* Number of external ELF symbols */
1248
3.89k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
3.89k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
3.89k
  Elf_Internal_Sym *isym;
1251
3.89k
  Elf_Internal_Sym *isymend;
1252
3.89k
  Elf_Internal_Sym *isymbuf = NULL;
1253
3.89k
  Elf_External_Versym *xver;
1254
3.89k
  Elf_External_Versym *xverbuf = NULL;
1255
3.89k
  elf_backend_data *ebd;
1256
3.89k
  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
3.89k
  ebd = get_elf_backend_data (abfd);
1268
1269
3.89k
  if (! dynamic)
1270
3.68k
    {
1271
3.68k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1272
3.68k
      verhdr = NULL;
1273
3.68k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
3.68k
    }
1275
211
  else
1276
211
    {
1277
211
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
211
      if (elf_dynversym (abfd) == 0)
1279
45
  verhdr = NULL;
1280
166
      else
1281
166
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
211
      if ((elf_dynverdef (abfd) != 0
1283
12
     && elf_tdata (abfd)->verdef == NULL)
1284
199
    || (elf_dynverref (abfd) != 0
1285
160
        && elf_tdata (abfd)->verref == NULL)
1286
149
    || elf_tdata (abfd)->dt_verdef != NULL
1287
149
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
63
  {
1289
63
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
41
      return -1;
1291
63
  }
1292
1293
170
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
170
    }
1295
1296
3.85k
  if (symcount == 0)
1297
534
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
3.85k
  if (symcount == 0)
1300
370
    sym = symbase = NULL;
1301
3.48k
  else
1302
3.48k
    {
1303
3.48k
      size_t i;
1304
1305
3.48k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
3.48k
              NULL, NULL, NULL);
1307
3.48k
      if (isymbuf == NULL)
1308
470
  return -1;
1309
1310
3.01k
      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.01k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.01k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.01k
      if (verhdr != NULL
1321
126
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
7
  {
1323
7
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
7
      (_("%pB: version count (%" PRId64 ")"
1326
7
         " does not match symbol count (%ld)"),
1327
7
       abfd,
1328
7
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
7
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
7
    verhdr = NULL;
1334
7
  }
1335
1336
3.01k
      if (verhdr != NULL)
1337
119
  {
1338
119
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
1
      goto error_return;
1340
118
    xverbuf = (Elf_External_Versym *)
1341
118
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
118
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
0
      goto error_return;
1344
118
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.01k
      xver = xverbuf;
1348
3.01k
      if (xver != NULL)
1349
118
  ++xver;
1350
3.01k
      isymend = isymbuf + symcount;
1351
3.01k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
100k
     isym < isymend;
1353
97.1k
     isym++, sym++, i++)
1354
97.1k
  {
1355
97.1k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
97.1k
    sym->symbol.the_bfd = abfd;
1358
97.1k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
97.1k
    else
1362
97.1k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
97.1k
    sym->symbol.value = isym->st_value;
1364
1365
97.1k
    if (isym->st_shndx == SHN_UNDEF)
1366
47.4k
      {
1367
47.4k
        sym->symbol.section = bfd_und_section_ptr;
1368
47.4k
      }
1369
49.7k
    else if (isym->st_shndx == SHN_ABS)
1370
2.22k
      {
1371
2.22k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.22k
      }
1373
47.5k
    else if (isym->st_shndx == SHN_COMMON)
1374
32
      {
1375
32
        sym->symbol.section = bfd_com_section_ptr;
1376
32
        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
32
        sym->symbol.value = isym->st_size;
1395
32
      }
1396
47.4k
    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
47.4k
    else
1406
47.4k
      {
1407
47.4k
        sym->symbol.section
1408
47.4k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
47.4k
        if (sym->symbol.section == NULL)
1410
8.46k
    {
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
8.46k
      sym->symbol.section = bfd_abs_section_ptr;
1418
8.46k
    }
1419
47.4k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
97.1k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
13.2k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
97.1k
    switch (ELF_ST_BIND (isym->st_info))
1427
97.1k
      {
1428
57.2k
      case STB_LOCAL:
1429
57.2k
        sym->symbol.flags |= BSF_LOCAL;
1430
57.2k
        break;
1431
33.4k
      case STB_GLOBAL:
1432
33.4k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
4.90k
    sym->symbol.flags |= BSF_GLOBAL;
1434
33.4k
        break;
1435
5.19k
      case STB_WEAK:
1436
5.19k
        sym->symbol.flags |= BSF_WEAK;
1437
5.19k
        break;
1438
130
      case STB_GNU_UNIQUE:
1439
130
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
130
        break;
1441
97.1k
      }
1442
1443
97.1k
    switch (ELF_ST_TYPE (isym->st_info))
1444
97.1k
      {
1445
23.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
23.6k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
23.6k
            | BSF_DEBUGGING
1452
23.6k
            | BSF_SECTION_SYM_USED);
1453
23.6k
        break;
1454
2.79k
      case STT_FILE:
1455
2.79k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
2.79k
        break;
1457
9.90k
      case STT_FUNC:
1458
9.90k
        sym->symbol.flags |= BSF_FUNCTION;
1459
9.90k
        break;
1460
239
      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
239
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
7.98k
      case STT_OBJECT:
1466
7.98k
        sym->symbol.flags |= BSF_OBJECT;
1467
7.98k
        break;
1468
1.07k
      case STT_TLS:
1469
1.07k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.07k
        break;
1471
451
      case STT_RELC:
1472
451
        sym->symbol.flags |= BSF_RELC;
1473
451
        break;
1474
400
      case STT_SRELC:
1475
400
        sym->symbol.flags |= BSF_SRELC;
1476
400
        break;
1477
429
      case STT_GNU_IFUNC:
1478
429
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
429
        break;
1480
97.1k
      }
1481
1482
97.1k
    if (dynamic)
1483
1.86k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
97.1k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
97.1k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
97.1k
    else if (xver != NULL)
1489
1.35k
      {
1490
1.35k
        Elf_Internal_Versym iversym;
1491
1492
1.35k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
1.35k
        sym->version = iversym.vs_vers;
1494
1.35k
        xver++;
1495
1.35k
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
97.1k
    if (ebd->elf_backend_symbol_processing)
1499
57.3k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
97.1k
  }
1501
3.01k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
3.38k
  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.38k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
3.38k
  if (symptrs)
1513
3.38k
    {
1514
3.38k
      long l = symcount;
1515
1516
3.38k
      sym = symbase;
1517
100k
      while (l-- > 0)
1518
97.1k
  {
1519
97.1k
    *symptrs++ = &sym->symbol;
1520
97.1k
    sym++;
1521
97.1k
  }
1522
3.38k
      *symptrs = 0;   /* Final null pointer */
1523
3.38k
    }
1524
1525
3.38k
  free (xverbuf);
1526
3.38k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.01k
      && !elf_use_dt_symtab_p (abfd))
1528
3.01k
    free (isymbuf);
1529
3.38k
  return symcount;
1530
1531
1
 error_return:
1532
1
  free (xverbuf);
1533
1
  if (hdr->contents != (unsigned char *) isymbuf
1534
1
      && !elf_use_dt_symtab_p (abfd))
1535
1
    free (isymbuf);
1536
1
  return -1;
1537
3.85k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1244
1.07k
{
1245
1.07k
  Elf_Internal_Shdr *hdr;
1246
1.07k
  Elf_Internal_Shdr *verhdr;
1247
1.07k
  unsigned long symcount; /* Number of external ELF symbols */
1248
1.07k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
1.07k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
1.07k
  Elf_Internal_Sym *isym;
1251
1.07k
  Elf_Internal_Sym *isymend;
1252
1.07k
  Elf_Internal_Sym *isymbuf = NULL;
1253
1.07k
  Elf_External_Versym *xver;
1254
1.07k
  Elf_External_Versym *xverbuf = NULL;
1255
1.07k
  elf_backend_data *ebd;
1256
1.07k
  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.07k
  ebd = get_elf_backend_data (abfd);
1268
1269
1.07k
  if (! dynamic)
1270
1.06k
    {
1271
1.06k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1272
1.06k
      verhdr = NULL;
1273
1.06k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
1.06k
    }
1275
13
  else
1276
13
    {
1277
13
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
13
      if (elf_dynversym (abfd) == 0)
1279
5
  verhdr = NULL;
1280
8
      else
1281
8
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
13
      if ((elf_dynverdef (abfd) != 0
1283
0
     && elf_tdata (abfd)->verdef == NULL)
1284
13
    || (elf_dynverref (abfd) != 0
1285
9
        && elf_tdata (abfd)->verref == NULL)
1286
9
    || elf_tdata (abfd)->dt_verdef != NULL
1287
9
    || 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
11
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
11
    }
1295
1296
1.07k
  if (symcount == 0)
1297
27
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
1.07k
  if (symcount == 0)
1300
16
    sym = symbase = NULL;
1301
1.06k
  else
1302
1.06k
    {
1303
1.06k
      size_t i;
1304
1305
1.06k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
1.06k
              NULL, NULL, NULL);
1307
1.06k
      if (isymbuf == NULL)
1308
210
  return -1;
1309
1310
851
      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
851
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
851
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
851
      if (verhdr != NULL
1321
6
    && 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
851
      if (verhdr != NULL)
1337
6
  {
1338
6
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
0
      goto error_return;
1340
6
    xverbuf = (Elf_External_Versym *)
1341
6
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
6
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
0
      goto error_return;
1344
6
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
851
      xver = xverbuf;
1348
851
      if (xver != NULL)
1349
6
  ++xver;
1350
851
      isymend = isymbuf + symcount;
1351
851
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
26.6k
     isym < isymend;
1353
25.7k
     isym++, sym++, i++)
1354
25.7k
  {
1355
25.7k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
25.7k
    sym->symbol.the_bfd = abfd;
1358
25.7k
    if (elf_use_dt_symtab_p (abfd))
1359
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
0
        + isym->st_name);
1361
25.7k
    else
1362
25.7k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
25.7k
    sym->symbol.value = isym->st_value;
1364
1365
25.7k
    if (isym->st_shndx == SHN_UNDEF)
1366
11.8k
      {
1367
11.8k
        sym->symbol.section = bfd_und_section_ptr;
1368
11.8k
      }
1369
13.9k
    else if (isym->st_shndx == SHN_ABS)
1370
49
      {
1371
49
        sym->symbol.section = bfd_abs_section_ptr;
1372
49
      }
1373
13.9k
    else if (isym->st_shndx == SHN_COMMON)
1374
6
      {
1375
6
        sym->symbol.section = bfd_com_section_ptr;
1376
6
        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
6
        sym->symbol.value = isym->st_size;
1395
6
      }
1396
13.8k
    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
13.8k
    else
1406
13.8k
      {
1407
13.8k
        sym->symbol.section
1408
13.8k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
13.8k
        if (sym->symbol.section == NULL)
1410
11.2k
    {
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
11.2k
      sym->symbol.section = bfd_abs_section_ptr;
1418
11.2k
    }
1419
13.8k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
25.7k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
2.76k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
25.7k
    switch (ELF_ST_BIND (isym->st_info))
1427
25.7k
      {
1428
19.5k
      case STB_LOCAL:
1429
19.5k
        sym->symbol.flags |= BSF_LOCAL;
1430
19.5k
        break;
1431
1.24k
      case STB_GLOBAL:
1432
1.24k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
959
    sym->symbol.flags |= BSF_GLOBAL;
1434
1.24k
        break;
1435
1.33k
      case STB_WEAK:
1436
1.33k
        sym->symbol.flags |= BSF_WEAK;
1437
1.33k
        break;
1438
578
      case STB_GNU_UNIQUE:
1439
578
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
578
        break;
1441
25.7k
      }
1442
1443
25.7k
    switch (ELF_ST_TYPE (isym->st_info))
1444
25.7k
      {
1445
1.08k
      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.08k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
1.08k
            | BSF_DEBUGGING
1452
1.08k
            | BSF_SECTION_SYM_USED);
1453
1.08k
        break;
1454
607
      case STT_FILE:
1455
607
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
607
        break;
1457
658
      case STT_FUNC:
1458
658
        sym->symbol.flags |= BSF_FUNCTION;
1459
658
        break;
1460
430
      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
430
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
1.11k
      case STT_OBJECT:
1466
1.11k
        sym->symbol.flags |= BSF_OBJECT;
1467
1.11k
        break;
1468
242
      case STT_TLS:
1469
242
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
242
        break;
1471
785
      case STT_RELC:
1472
785
        sym->symbol.flags |= BSF_RELC;
1473
785
        break;
1474
283
      case STT_SRELC:
1475
283
        sym->symbol.flags |= BSF_SRELC;
1476
283
        break;
1477
569
      case STT_GNU_IFUNC:
1478
569
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
569
        break;
1480
25.7k
      }
1481
1482
25.7k
    if (dynamic)
1483
93
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
25.7k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
25.7k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
25.7k
    else if (xver != NULL)
1489
60
      {
1490
60
        Elf_Internal_Versym iversym;
1491
1492
60
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
60
        sym->version = iversym.vs_vers;
1494
60
        xver++;
1495
60
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
25.7k
    if (ebd->elf_backend_symbol_processing)
1499
6.48k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
25.7k
  }
1501
851
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
867
  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
867
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
867
  if (symptrs)
1513
867
    {
1514
867
      long l = symcount;
1515
1516
867
      sym = symbase;
1517
26.6k
      while (l-- > 0)
1518
25.7k
  {
1519
25.7k
    *symptrs++ = &sym->symbol;
1520
25.7k
    sym++;
1521
25.7k
  }
1522
867
      *symptrs = 0;   /* Final null pointer */
1523
867
    }
1524
1525
867
  free (xverbuf);
1526
867
  if (hdr->contents != (unsigned char *) isymbuf
1527
851
      && !elf_use_dt_symtab_p (abfd))
1528
851
    free (isymbuf);
1529
867
  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.07k
}
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.8k
{
1551
11.8k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
11.8k
  void *allocated = NULL;
1553
11.8k
  bfd_byte *native_relocs;
1554
11.8k
  arelent *relent;
1555
11.8k
  unsigned int i;
1556
11.8k
  int entsize;
1557
11.8k
  unsigned int symcount;
1558
1559
11.8k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
107
    return false;
1561
11.7k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
11.7k
  if (allocated == NULL)
1563
250
    return false;
1564
1565
11.4k
  native_relocs = (bfd_byte *) allocated;
1566
1567
11.4k
  entsize = rel_hdr->sh_entsize;
1568
11.4k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
11.4k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
11.4k
  if (dynamic)
1572
219
    symcount = bfd_get_dynamic_symcount (abfd);
1573
11.2k
  else
1574
11.2k
    symcount = bfd_get_symcount (abfd);
1575
1576
11.4k
  for (i = 0, relent = relents;
1577
102k
       i < reloc_count;
1578
91.3k
       i++, relent++, native_relocs += entsize)
1579
92.6k
    {
1580
92.6k
      bool res;
1581
92.6k
      Elf_Internal_Rela rela;
1582
1583
92.6k
      if (entsize == sizeof (Elf_External_Rela))
1584
81.9k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
10.7k
      else
1586
10.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
92.6k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
91.2k
  relent->address = rela.r_offset;
1594
1.39k
      else
1595
1.39k
  relent->address = rela.r_offset - asect->vma;
1596
1597
92.6k
      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
10.3k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
82.3k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
13.4k
  {
1603
13.4k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
13.4k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
13.4k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
13.4k
    bfd_set_error (bfd_error_bad_value);
1608
13.4k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
13.4k
  }
1610
68.8k
      else
1611
68.8k
  {
1612
68.8k
    asymbol **ps;
1613
1614
68.8k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
68.8k
    relent->sym_ptr_ptr = ps;
1617
68.8k
  }
1618
1619
92.6k
      relent->addend = rela.r_addend;
1620
1621
92.6k
      res = false;
1622
92.6k
      if ((entsize == sizeof (Elf_External_Rela)
1623
10.7k
     || ebd->elf_info_to_howto_rel == NULL)
1624
90.4k
    && ebd->elf_info_to_howto != NULL)
1625
90.4k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
2.21k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
2.20k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
92.6k
      if (! res || relent->howto == NULL)
1630
1.38k
  goto error_return;
1631
92.6k
    }
1632
1633
10.0k
  free (allocated);
1634
10.0k
  return true;
1635
1636
1.38k
 error_return:
1637
1.38k
  free (allocated);
1638
1.38k
  return false;
1639
11.4k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
11.0k
{
1551
11.0k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
11.0k
  void *allocated = NULL;
1553
11.0k
  bfd_byte *native_relocs;
1554
11.0k
  arelent *relent;
1555
11.0k
  unsigned int i;
1556
11.0k
  int entsize;
1557
11.0k
  unsigned int symcount;
1558
1559
11.0k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
107
    return false;
1561
10.9k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
10.9k
  if (allocated == NULL)
1563
230
    return false;
1564
1565
10.7k
  native_relocs = (bfd_byte *) allocated;
1566
1567
10.7k
  entsize = rel_hdr->sh_entsize;
1568
10.7k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
10.7k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
10.7k
  if (dynamic)
1572
207
    symcount = bfd_get_dynamic_symcount (abfd);
1573
10.5k
  else
1574
10.5k
    symcount = bfd_get_symcount (abfd);
1575
1576
10.7k
  for (i = 0, relent = relents;
1577
91.5k
       i < reloc_count;
1578
80.8k
       i++, relent++, native_relocs += entsize)
1579
81.9k
    {
1580
81.9k
      bool res;
1581
81.9k
      Elf_Internal_Rela rela;
1582
1583
81.9k
      if (entsize == sizeof (Elf_External_Rela))
1584
81.9k
  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
81.9k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
80.5k
  relent->address = rela.r_offset;
1594
1.34k
      else
1595
1.34k
  relent->address = rela.r_offset - asect->vma;
1596
1597
81.9k
      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
5.44k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
76.5k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
9.84k
  {
1603
9.84k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
9.84k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
9.84k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
9.84k
    bfd_set_error (bfd_error_bad_value);
1608
9.84k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
9.84k
  }
1610
66.6k
      else
1611
66.6k
  {
1612
66.6k
    asymbol **ps;
1613
1614
66.6k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
66.6k
    relent->sym_ptr_ptr = ps;
1617
66.6k
  }
1618
1619
81.9k
      relent->addend = rela.r_addend;
1620
1621
81.9k
      res = false;
1622
81.9k
      if ((entsize == sizeof (Elf_External_Rela)
1623
0
     || ebd->elf_info_to_howto_rel == NULL)
1624
81.9k
    && ebd->elf_info_to_howto != NULL)
1625
81.9k
  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
81.9k
      if (! res || relent->howto == NULL)
1630
1.13k
  goto error_return;
1631
81.9k
    }
1632
1633
9.61k
  free (allocated);
1634
9.61k
  return true;
1635
1636
1.13k
 error_return:
1637
1.13k
  free (allocated);
1638
  return false;
1639
10.7k
}
elf32.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
730
{
1551
730
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
730
  void *allocated = NULL;
1553
730
  bfd_byte *native_relocs;
1554
730
  arelent *relent;
1555
730
  unsigned int i;
1556
730
  int entsize;
1557
730
  unsigned int symcount;
1558
1559
730
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
0
    return false;
1561
730
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
730
  if (allocated == NULL)
1563
20
    return false;
1564
1565
710
  native_relocs = (bfd_byte *) allocated;
1566
1567
710
  entsize = rel_hdr->sh_entsize;
1568
710
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
710
        || entsize == sizeof (Elf_External_Rela));
1570
1571
710
  if (dynamic)
1572
12
    symcount = bfd_get_dynamic_symcount (abfd);
1573
698
  else
1574
698
    symcount = bfd_get_symcount (abfd);
1575
1576
710
  for (i = 0, relent = relents;
1577
11.2k
       i < reloc_count;
1578
10.5k
       i++, relent++, native_relocs += entsize)
1579
10.7k
    {
1580
10.7k
      bool res;
1581
10.7k
      Elf_Internal_Rela rela;
1582
1583
10.7k
      if (entsize == sizeof (Elf_External_Rela))
1584
0
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
10.7k
      else
1586
10.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
10.7k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
10.7k
  relent->address = rela.r_offset;
1594
54
      else
1595
54
  relent->address = rela.r_offset - asect->vma;
1596
1597
10.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
4.94k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
5.81k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
3.61k
  {
1603
3.61k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
3.61k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
3.61k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
3.61k
    bfd_set_error (bfd_error_bad_value);
1608
3.61k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
3.61k
  }
1610
2.19k
      else
1611
2.19k
  {
1612
2.19k
    asymbol **ps;
1613
1614
2.19k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
2.19k
    relent->sym_ptr_ptr = ps;
1617
2.19k
  }
1618
1619
10.7k
      relent->addend = rela.r_addend;
1620
1621
10.7k
      res = false;
1622
10.7k
      if ((entsize == sizeof (Elf_External_Rela)
1623
10.7k
     || ebd->elf_info_to_howto_rel == NULL)
1624
8.54k
    && ebd->elf_info_to_howto != NULL)
1625
8.54k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
2.20k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
2.20k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
10.7k
      if (! res || relent->howto == NULL)
1630
249
  goto error_return;
1631
10.7k
    }
1632
1633
461
  free (allocated);
1634
461
  return true;
1635
1636
249
 error_return:
1637
249
  free (allocated);
1638
  return false;
1639
710
}
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.4k
{
1649
15.4k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
15.4k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
15.4k
  Elf_Internal_Shdr *rel_hdr;
1652
15.4k
  Elf_Internal_Shdr *rel_hdr2;
1653
15.4k
  bfd_size_type reloc_count;
1654
15.4k
  bfd_size_type reloc_count2;
1655
15.4k
  arelent *relents;
1656
15.4k
  size_t amt;
1657
1658
15.4k
  if (asect->relocation != NULL)
1659
2.41k
    return true;
1660
1661
13.0k
  if (! dynamic)
1662
12.8k
    {
1663
12.8k
      if ((asect->flags & SEC_RELOC) == 0
1664
11.7k
    || asect->reloc_count == 0)
1665
1.26k
  return true;
1666
1667
11.5k
      rel_hdr = d->rel.hdr;
1668
11.5k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
11.5k
      rel_hdr2 = d->rela.hdr;
1670
11.5k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
11.5k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
11.5k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
11.5k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
11.5k
    }
1679
223
  else
1680
223
    {
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
223
      if (asect->size == 0)
1686
3
  return true;
1687
1688
220
      rel_hdr = &d->this_hdr;
1689
220
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
220
      rel_hdr2 = NULL;
1691
220
      reloc_count2 = 0;
1692
220
    }
1693
1694
11.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
11.8k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
11.8k
  if (relents == NULL)
1701
0
    return false;
1702
1703
11.8k
  if (rel_hdr
1704
938
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
938
                rel_hdr, reloc_count,
1706
938
                relents,
1707
938
                symbols, dynamic))
1708
287
    return false;
1709
1710
11.5k
  if (rel_hdr2
1711
10.8k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
10.8k
                rel_hdr2, reloc_count2,
1713
10.8k
                relents + reloc_count,
1714
10.8k
                symbols, dynamic))
1715
1.45k
    return false;
1716
1717
10.0k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
34
    return false;
1719
1720
10.0k
  asect->relocation = relents;
1721
10.0k
  return true;
1722
10.0k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1648
14.5k
{
1649
14.5k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
14.5k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
14.5k
  Elf_Internal_Shdr *rel_hdr;
1652
14.5k
  Elf_Internal_Shdr *rel_hdr2;
1653
14.5k
  bfd_size_type reloc_count;
1654
14.5k
  bfd_size_type reloc_count2;
1655
14.5k
  arelent *relents;
1656
14.5k
  size_t amt;
1657
1658
14.5k
  if (asect->relocation != NULL)
1659
2.28k
    return true;
1660
1661
12.3k
  if (! dynamic)
1662
12.1k
    {
1663
12.1k
      if ((asect->flags & SEC_RELOC) == 0
1664
10.9k
    || asect->reloc_count == 0)
1665
1.22k
  return true;
1666
1667
10.8k
      rel_hdr = d->rel.hdr;
1668
10.8k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
10.8k
      rel_hdr2 = d->rela.hdr;
1670
10.8k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
10.8k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
10.8k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
10.8k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
10.8k
    }
1679
211
  else
1680
211
    {
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
211
      if (asect->size == 0)
1686
3
  return true;
1687
1688
208
      rel_hdr = &d->this_hdr;
1689
208
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
208
      rel_hdr2 = NULL;
1691
208
      reloc_count2 = 0;
1692
208
    }
1693
1694
11.0k
  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.0k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
11.0k
  if (relents == NULL)
1701
0
    return false;
1702
1703
11.0k
  if (rel_hdr
1704
208
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
208
                rel_hdr, reloc_count,
1706
208
                relents,
1707
208
                symbols, dynamic))
1708
18
    return false;
1709
1710
11.0k
  if (rel_hdr2
1711
10.8k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
10.8k
                rel_hdr2, reloc_count2,
1713
10.8k
                relents + reloc_count,
1714
10.8k
                symbols, dynamic))
1715
1.45k
    return false;
1716
1717
9.61k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
34
    return false;
1719
1720
9.57k
  asect->relocation = relents;
1721
  return true;
1722
9.61k
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1648
901
{
1649
901
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
901
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
901
  Elf_Internal_Shdr *rel_hdr;
1652
901
  Elf_Internal_Shdr *rel_hdr2;
1653
901
  bfd_size_type reloc_count;
1654
901
  bfd_size_type reloc_count2;
1655
901
  arelent *relents;
1656
901
  size_t amt;
1657
1658
901
  if (asect->relocation != NULL)
1659
131
    return true;
1660
1661
770
  if (! dynamic)
1662
758
    {
1663
758
      if ((asect->flags & SEC_RELOC) == 0
1664
724
    || asect->reloc_count == 0)
1665
40
  return true;
1666
1667
718
      rel_hdr = d->rel.hdr;
1668
718
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
718
      rel_hdr2 = d->rela.hdr;
1670
718
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
718
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
718
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
718
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
718
    }
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
730
  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
730
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
730
  if (relents == NULL)
1701
0
    return false;
1702
1703
730
  if (rel_hdr
1704
730
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
730
                rel_hdr, reloc_count,
1706
730
                relents,
1707
730
                symbols, dynamic))
1708
269
    return false;
1709
1710
461
  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
461
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
0
    return false;
1719
1720
461
  asect->relocation = relents;
1721
  return true;
1722
461
}
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.65k
{
2052
1.65k
  return ELF_R_SYM (r_info);
2053
1.65k
}
elf64_r_sym
Line
Count
Source
2051
1.64k
{
2052
1.64k
  return ELF_R_SYM (r_info);
2053
1.64k
}
elf32_r_sym
Line
Count
Source
2051
6
{
2052
6
  return ELF_R_SYM (r_info);
2053
6
}
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
};