Coverage Report

Created: 2026-03-10 08:46

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
26.8M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
1.28k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
23.2M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
1.83M
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
826
#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
8.65k
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
78.1k
#define elf_swap_reloca_in    NAME(bfd_elf,swap_reloca_in)
97
0
#define elf_swap_reloc_out    NAME(bfd_elf,swap_reloc_out)
98
143
#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.80M
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
445
#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
826
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
226k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
1.45M
#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
17.9k
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
5.88M
#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
14.6k
#define H_PUT_WORD    H_PUT_64
159
957
#define H_PUT_SIGNED_WORD H_PUT_S64
160
9.11M
#define H_GET_WORD    H_GET_64
161
552k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
5.34k
#define H_PUT_WORD    H_PUT_32
165
156
#define H_PUT_SIGNED_WORD H_PUT_S32
166
13.0M
#define H_GET_WORD    H_GET_32
167
770k
#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
135k
{
179
135k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
135k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
135k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
135k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
135k
  if (signed_vma)
185
10.9k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
124k
  else
187
124k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
135k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
135k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
135k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
135k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
135k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
2.31k
    {
194
2.31k
      if (shndx == NULL)
195
459
  return false;
196
1.85k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1.85k
    }
198
133k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
3.43k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
135k
  dst->st_target_internal = 0;
201
135k
  return true;
202
135k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
108k
{
179
108k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
108k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
108k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
108k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
108k
  if (signed_vma)
185
5.55k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
102k
  else
187
102k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
108k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
108k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
108k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
108k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
108k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
414
    {
194
414
      if (shndx == NULL)
195
296
  return false;
196
118
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
118
    }
198
108k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
2.84k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
108k
  dst->st_target_internal = 0;
201
  return true;
202
108k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
27.3k
{
179
27.3k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
27.3k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
27.3k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
27.3k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
27.3k
  if (signed_vma)
185
5.43k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
21.9k
  else
187
21.9k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
27.3k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
27.3k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
27.3k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
27.3k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
27.3k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
1.89k
    {
194
1.89k
      if (shndx == NULL)
195
163
  return false;
196
1.73k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1.73k
    }
198
25.5k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
588
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
27.2k
  dst->st_target_internal = 0;
201
  return true;
202
27.3k
}
203
204
/* Translate an ELF symbol in internal format into an ELF symbol in external
205
   format.  */
206
207
void
208
elf_swap_symbol_out (bfd *abfd,
209
         const Elf_Internal_Sym *src,
210
         void *cdst,
211
         void *shndx)
212
1.28k
{
213
1.28k
  unsigned int tmp;
214
1.28k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.28k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.28k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.28k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.28k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.28k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.28k
  tmp = src->st_shndx;
221
1.28k
  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.28k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.28k
}
bfd_elf64_swap_symbol_out
Line
Count
Source
212
1.28k
{
213
1.28k
  unsigned int tmp;
214
1.28k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.28k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.28k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.28k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.28k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.28k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.28k
  tmp = src->st_shndx;
221
1.28k
  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.28k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.28k
}
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.25M
{
239
2.25M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
2.25M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
2.25M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
2.25M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
2.25M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
2.25M
  if (signed_vma)
245
251k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.00M
  else
247
2.00M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
2.25M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
2.25M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
2.25M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
2.25M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
2.25M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
2.25M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
2.25M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
2.25M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
2.25M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
2.25M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
347k
{
239
347k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
347k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
347k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
347k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
347k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
347k
  if (signed_vma)
245
49.9k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
297k
  else
247
297k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
347k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
347k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
347k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
347k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
347k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
347k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
347k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
347k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
347k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
347k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
1.90M
{
239
1.90M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
1.90M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
1.90M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
1.90M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
1.90M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
1.90M
  if (signed_vma)
245
201k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
1.70M
  else
247
1.70M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
1.90M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
1.90M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
1.90M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
1.90M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
1.90M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
1.90M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
1.90M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
1.90M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
1.90M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
1.90M
}
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
287
{
267
287
  unsigned int tmp;
268
287
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
287
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
287
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
287
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
287
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
287
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
287
  if (signed_vma)
276
287
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
231
  else
278
287
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
287
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
287
  if (no_section_header)
281
287
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
287
  else
283
287
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
287
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
287
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
287
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
287
  tmp = src->e_phnum;
288
287
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
287
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
287
  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
287
  else
298
287
    {
299
287
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
287
      tmp = src->e_shnum;
301
287
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
287
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
287
      tmp = src->e_shstrndx;
305
287
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
287
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
287
    }
309
287
}
elf64.c:elf_swap_ehdr_out
Line
Count
Source
266
131
{
267
131
  unsigned int tmp;
268
131
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
131
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
131
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
131
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
131
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
131
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
131
  if (signed_vma)
276
131
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
105
  else
278
131
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
131
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
131
  if (no_section_header)
281
131
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
131
  else
283
131
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
131
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
131
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
131
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
131
  tmp = src->e_phnum;
288
131
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
131
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
131
  if (no_section_header)
292
0
    {
293
0
      H_PUT_16 (abfd, 0, dst->e_shentsize);
294
0
      H_PUT_16 (abfd, 0, dst->e_shnum);
295
0
      H_PUT_16 (abfd, 0, dst->e_shstrndx);
296
0
    }
297
131
  else
298
131
    {
299
131
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
131
      tmp = src->e_shnum;
301
131
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
131
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
131
      tmp = src->e_shstrndx;
305
131
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
131
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
131
    }
309
131
}
elf32.c:elf_swap_ehdr_out
Line
Count
Source
266
156
{
267
156
  unsigned int tmp;
268
156
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
156
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
156
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
156
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
156
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
156
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
156
  if (signed_vma)
276
156
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
126
  else
278
156
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
156
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
156
  if (no_section_header)
281
156
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
156
  else
283
156
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
156
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
156
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
156
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
156
  tmp = src->e_phnum;
288
156
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
156
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
156
  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
156
  else
298
156
    {
299
156
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
156
      tmp = src->e_shnum;
301
156
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
156
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
156
      tmp = src->e_shstrndx;
305
156
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
156
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
156
    }
309
156
}
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
877k
{
319
877k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
877k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
877k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
877k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
877k
  if (signed_vma)
325
216k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
660k
  else
327
660k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
877k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
877k
  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
877k
  if (dst->sh_type != SHT_NOBITS)
334
863k
    {
335
863k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
863k
      if (filesize != 0
338
863k
    && ((ufile_ptr) dst->sh_offset > filesize
339
648k
        || dst->sh_size > filesize - dst->sh_offset)
340
292k
    && !abfd->read_only)
341
56.2k
  {
342
56.2k
    _bfd_error_handler (_("warning: %pB has a section "
343
56.2k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
56.2k
    if (abfd->is_linker_input)
346
0
      return false;
347
56.2k
    abfd->read_only = 1;
348
56.2k
  }
349
863k
    }
350
877k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
877k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
877k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
877k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
877k
  dst->bfd_section = NULL;
355
877k
  dst->contents = NULL;
356
877k
  return true;
357
877k
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
577k
{
319
577k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
577k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
577k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
577k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
577k
  if (signed_vma)
325
91.1k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
486k
  else
327
486k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
577k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
577k
  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
577k
  if (dst->sh_type != SHT_NOBITS)
334
571k
    {
335
571k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
571k
      if (filesize != 0
338
571k
    && ((ufile_ptr) dst->sh_offset > filesize
339
439k
        || dst->sh_size > filesize - dst->sh_offset)
340
176k
    && !abfd->read_only)
341
29.7k
  {
342
29.7k
    _bfd_error_handler (_("warning: %pB has a section "
343
29.7k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
29.7k
    if (abfd->is_linker_input)
346
0
      return false;
347
29.7k
    abfd->read_only = 1;
348
29.7k
  }
349
571k
    }
350
577k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
577k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
577k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
577k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
577k
  dst->bfd_section = NULL;
355
577k
  dst->contents = NULL;
356
  return true;
357
577k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
300k
{
319
300k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
300k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
300k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
300k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
300k
  if (signed_vma)
325
125k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
174k
  else
327
174k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
300k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
300k
  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
300k
  if (dst->sh_type != SHT_NOBITS)
334
291k
    {
335
291k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
291k
      if (filesize != 0
338
291k
    && ((ufile_ptr) dst->sh_offset > filesize
339
209k
        || dst->sh_size > filesize - dst->sh_offset)
340
116k
    && !abfd->read_only)
341
26.4k
  {
342
26.4k
    _bfd_error_handler (_("warning: %pB has a section "
343
26.4k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
26.4k
    if (abfd->is_linker_input)
346
0
      return false;
347
26.4k
    abfd->read_only = 1;
348
26.4k
  }
349
291k
    }
350
300k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
300k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
300k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
300k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
300k
  dst->bfd_section = NULL;
355
300k
  dst->contents = NULL;
356
  return true;
357
300k
}
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.99k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.99k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.99k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.99k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.99k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.99k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.99k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.99k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.99k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.99k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.99k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.99k
}
elf64.c:elf_swap_shdr_out
Line
Count
Source
366
1.40k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.40k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.40k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.40k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.40k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.40k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.40k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.40k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.40k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.40k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.40k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.40k
}
elf32.c:elf_swap_shdr_out
Line
Count
Source
366
589
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
589
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
589
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
589
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
589
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
589
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
589
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
589
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
589
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
589
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
589
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
589
}
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.80M
{
388
1.80M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.80M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.80M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.80M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.80M
  if (signed_vma)
394
382k
    {
395
382k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
382k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
382k
    }
398
1.42M
  else
399
1.42M
    {
400
1.42M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.42M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.42M
    }
403
1.80M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.80M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.80M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.80M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
387
763k
{
388
763k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
763k
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
763k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
763k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
763k
  if (signed_vma)
394
163k
    {
395
163k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
163k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
163k
    }
398
600k
  else
399
600k
    {
400
600k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
600k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
600k
    }
403
763k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
763k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
763k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
763k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
387
1.04M
{
388
1.04M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.04M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.04M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.04M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.04M
  if (signed_vma)
394
218k
    {
395
218k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
218k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
218k
    }
398
822k
  else
399
822k
    {
400
822k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
822k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
822k
    }
403
1.04M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.04M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.04M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.04M
}
407
408
void
409
elf_swap_phdr_out (bfd *abfd,
410
       const Elf_Internal_Phdr *src,
411
       Elf_External_Phdr *dst)
412
445
{
413
445
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
445
  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
445
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
445
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
445
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
445
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
445
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
445
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
445
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
445
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
445
}
bfd_elf64_swap_phdr_out
Line
Count
Source
412
247
{
413
247
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
247
  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
247
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
247
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
247
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
247
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
247
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
247
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
247
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
247
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
247
}
bfd_elf32_swap_phdr_out
Line
Count
Source
412
198
{
413
198
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
198
  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
198
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
198
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
198
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
198
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
198
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
198
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
198
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
198
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
198
}
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
8.65k
{
433
8.65k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
8.65k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
8.65k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
8.65k
  dst->r_addend = 0;
437
8.65k
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
bfd_elf32_swap_reloc_in
Line
Count
Source
432
8.65k
{
433
8.65k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
8.65k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
8.65k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
8.65k
  dst->r_addend = 0;
437
8.65k
}
438
439
void
440
elf_swap_reloca_in (bfd *abfd,
441
        const bfd_byte *s,
442
        Elf_Internal_Rela *dst)
443
78.7k
{
444
78.7k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
78.7k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
78.7k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
78.7k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
78.7k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
443
78.7k
{
444
78.7k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
78.7k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
78.7k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
78.7k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
78.7k
}
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
826
{
466
826
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
826
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
826
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
826
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
826
}
bfd_elf64_swap_reloca_out
Line
Count
Source
465
826
{
466
826
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
826
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
826
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
826
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
826
}
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
68.7k
{
477
68.7k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
68.7k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
68.7k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
68.7k
}
bfd_elf64_swap_dyn_in
Line
Count
Source
476
63.5k
{
477
63.5k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
63.5k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
63.5k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
63.5k
}
bfd_elf32_swap_dyn_in
Line
Count
Source
476
5.18k
{
477
5.18k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
5.18k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
5.18k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
5.18k
}
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
23.9M
{
504
23.9M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
7.54M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
7.54M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
7.53M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
23.9M
}
elf64.c:elf_file_p
Line
Count
Source
503
5.17M
{
504
5.17M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
1.50M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
1.49M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
1.49M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
5.17M
}
elf32.c:elf_file_p
Line
Count
Source
503
18.8M
{
504
18.8M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
6.04M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
6.04M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
6.03M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
18.8M
}
509
510
/* Check to see if the file associated with ABFD matches the target vector
511
   that ABFD points to.
512
513
   Note that we may be called several times with the same ABFD, but different
514
   target vectors, most of which will not match.  We have to avoid leaving
515
   any side effects in ABFD, or any data it points to (like tdata), if the
516
   file does not match the target vector.  */
517
518
bfd_cleanup
519
elf_object_p (bfd *abfd)
520
23.2M
{
521
23.2M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
23.2M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
23.2M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
23.2M
  Elf_Internal_Shdr i_shdr;
525
23.2M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
23.2M
  unsigned int shindex;
527
23.2M
  elf_backend_data *ebd;
528
23.2M
  asection *s;
529
23.2M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
23.2M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
2.20M
    {
535
2.20M
      if (bfd_get_error () != bfd_error_system_call)
536
2.19M
  goto got_wrong_format_error;
537
8.81k
      else
538
8.81k
  goto got_no_match;
539
2.20M
    }
540
541
  /* Now check to see if we have a valid ELF file, and one that BFD can
542
     make use of.  The magic number must match, the address size ('class')
543
     and byte-swapping must match our XVEC entry, and it must have a
544
     section header table (FIXME: See comments re sections at top of this
545
     file).  */
546
547
21.0M
  if (! elf_file_p (&x_ehdr)
548
5.70M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
5.52M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
17.9M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
3.15M
  switch (x_ehdr.e_ident[EI_DATA])
554
3.15M
    {
555
904k
    case ELFDATA2MSB:   /* Big-endian */
556
904k
      if (! bfd_header_big_endian (abfd))
557
453k
  goto got_wrong_format_error;
558
451k
      break;
559
2.24M
    case ELFDATA2LSB:   /* Little-endian */
560
2.24M
      if (! bfd_header_little_endian (abfd))
561
1.09M
  goto got_wrong_format_error;
562
1.15M
      break;
563
1.15M
    case ELFDATANONE:   /* No data encoding specified */
564
2.67k
    default:      /* Unknown data encoding specified */
565
2.67k
      goto got_wrong_format_error;
566
3.15M
    }
567
568
1.60M
  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.60M
  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.60M
  i_ehdrp = elf_elfheader (abfd);
578
1.60M
  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.60M
  if (i_ehdrp->e_type == ET_CORE)
585
391k
    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.21M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
25.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.18M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
49.4k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.13M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
584
    goto got_wrong_format_error;
601
602
1.13M
  ebd = get_elf_backend_data (abfd);
603
1.13M
  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.13M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.08M
      && (ebd->elf_machine_alt1 == 0
610
265k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.08M
      && (ebd->elf_machine_alt2 == 0
612
38.8k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.07M
      && ebd->elf_machine_code != EM_NONE)
614
1.05M
    goto got_wrong_format_error;
615
616
83.0k
  if (i_ehdrp->e_type == ET_EXEC)
617
3.48k
    abfd->flags |= EXEC_P;
618
79.5k
  else if (i_ehdrp->e_type == ET_DYN)
619
3.60k
    abfd->flags |= DYNAMIC;
620
621
83.0k
  if (i_ehdrp->e_phnum > 0)
622
36.1k
    abfd->flags |= D_PAGED;
623
624
83.0k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
27.1k
    {
626
      /* It's OK if this fails for the generic target.  */
627
27.1k
      if (ebd->elf_machine_code != EM_NONE)
628
16
  goto got_no_match;
629
27.1k
    }
630
631
82.9k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
7.88k
    goto got_wrong_format_error;
633
634
75.1k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
61.7k
    {
636
61.7k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
61.7k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
448
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
61.2k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
59.6k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
1.59k
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
59.6k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
11.3k
  {
652
11.3k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
11.3k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
11.1k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
10.7k
        || i_ehdrp->e_shnum  == 0)
656
793
      goto got_wrong_format_error;
657
11.3k
  }
658
659
      /* And similarly for the string table index.  */
660
58.8k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
1.10k
  {
662
1.10k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
1.10k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
1.10k
  }
666
667
      /* And program headers.  */
668
58.8k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
641
  {
670
641
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
641
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
641
  }
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
58.8k
      if (i_ehdrp->e_shnum != 1)
678
57.1k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
57.1k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
56.6k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
698
      goto got_wrong_format_error;
683
684
56.4k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
56.4k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
56.4k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
56.4k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
863
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
55.6k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
55.6k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
55.6k
  }
698
58.8k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
70.7k
  if (i_ehdrp->e_shnum != 0)
703
57.3k
    {
704
57.3k
      Elf_Internal_Shdr *shdrp;
705
57.3k
      unsigned int num_sec;
706
57.3k
      size_t amt;
707
708
57.3k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
57.3k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
57.3k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
57.3k
      num_sec = i_ehdrp->e_shnum;
714
57.3k
      elf_numsections (abfd) = num_sec;
715
57.3k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
57.3k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
57.3k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
57.3k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
57.3k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
57.3k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
949k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
892k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
871k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
817k
  {
732
817k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
817k
        || !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
817k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
4.85k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
4.85k
        switch (ebd->elf_machine_code)
742
4.85k
    {
743
471
    case EM_386:
744
527
    case EM_IAMCU:
745
2.71k
    case EM_X86_64:
746
2.71k
    case EM_OLD_SPARCV9:
747
2.71k
    case EM_SPARC32PLUS:
748
3.00k
    case EM_SPARCV9:
749
3.16k
    case EM_SPARC:
750
3.16k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.28k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
2.23k
        break;
753
      /* Otherwise fall through.  */
754
2.62k
    default:
755
2.62k
      goto got_wrong_format_error;
756
4.85k
    }
757
4.85k
      }
758
759
814k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
683k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
649k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
180k
        && i_shdrp[shindex].sh_info >= num_sec)
763
435
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
814k
    if (i_shdrp[shindex].sh_size != 0
768
657k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
209k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
201k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
201k
       % ebd->minpagesize)
772
201k
      != 0))
773
124k
      abfd->flags &= ~D_PAGED;
774
814k
  }
775
776
54.2k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
52.1k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
3.81k
  {
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.81k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
3.81k
    if (!abfd->read_only)
787
385
      {
788
385
        _bfd_error_handler
789
385
    (_("warning: %pB has a corrupt string table index"), abfd);
790
385
        abfd->read_only = 1;
791
385
      }
792
3.81k
  }
793
54.2k
    }
794
13.4k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
3.98k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
63.6k
  if (i_ehdrp->e_phnum == 0)
799
38.5k
    elf_tdata (abfd)->phdr = NULL;
800
25.1k
  else
801
25.1k
    {
802
25.1k
      Elf_Internal_Phdr *i_phdr;
803
25.1k
      unsigned int i;
804
25.1k
      ufile_ptr filesize;
805
25.1k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
25.1k
      filesize = bfd_get_file_size (abfd);
810
25.1k
      if (filesize != 0
811
25.1k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
967
  goto got_wrong_format_error;
813
24.1k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
24.1k
      elf_tdata (abfd)->phdr
816
24.1k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
24.1k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
24.1k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
106
  goto got_no_match;
821
24.1k
      bool eu_strip_broken_phdrs = false;
822
24.0k
      i_phdr = elf_tdata (abfd)->phdr;
823
651k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
628k
  {
825
628k
    Elf_External_Phdr x_phdr;
826
827
628k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
1.46k
      goto got_no_match;
829
627k
    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
627k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
426k
      {
834
426k
        i_phdr->p_align &= -i_phdr->p_align;
835
426k
        if (!abfd->read_only)
836
6.47k
    {
837
6.47k
      _bfd_error_handler (_("warning: %pB has a program header "
838
6.47k
          "with invalid alignment"), abfd);
839
6.47k
      abfd->read_only = 1;
840
6.47k
    }
841
426k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
627k
    if (i_phdr->p_filesz != 0
845
486k
        && (i_phdr->p_filesz > filesize
846
81.5k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
437k
      eu_strip_broken_phdrs = true;
848
627k
  }
849
22.6k
      if (!eu_strip_broken_phdrs
850
4.89k
    && i_ehdrp->e_shoff == 0
851
3.51k
    && i_ehdrp->e_shstrndx == 0)
852
3.51k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
3.51k
    i_phdr = elf_tdata (abfd)->phdr;
856
13.8k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
13.5k
      if (i_phdr->p_type == PT_DYNAMIC)
858
3.18k
        {
859
3.18k
    if (i_phdr->p_filesz != 0
860
3.11k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
3.11k
                  elf_tdata (abfd)->phdr,
862
3.11k
                  i_ehdrp->e_phnum,
863
3.11k
                  filesize))
864
2.99k
      goto got_no_match;
865
192
    break;
866
3.18k
        }
867
3.51k
  }
868
22.6k
    }
869
870
58.1k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
50.2k
    {
872
50.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
50.2k
      num_sec = elf_numsections (abfd);
878
688k
      for (shindex = 1; shindex < num_sec; shindex++)
879
655k
  if (!bfd_section_from_shdr (abfd, shindex))
880
17.2k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
33.0k
      if (! _bfd_elf_setup_sections (abfd))
884
5.77k
  goto got_wrong_format_error;
885
33.0k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
35.1k
  if (ebd->elf_backend_object_p)
890
22.2k
    {
891
22.2k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
2.81k
  goto got_wrong_format_error;
893
22.2k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
32.3k
  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
252k
  for (s = abfd->sections; s != NULL; s = s->next)
901
219k
    {
902
219k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
217k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
14.1k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
12.4k
  {
906
12.4k
    unsigned long targ_index;
907
12.4k
    asection *targ_sec;
908
909
12.4k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
12.4k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
12.4k
    if (targ_sec != NULL
912
9.98k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.39k
      s->flags |= SEC_DEBUGGING;
914
12.4k
  }
915
219k
    }
916
32.3k
  return _bfd_no_cleanup;
917
918
23.2M
 got_wrong_format_error:
919
23.2M
  bfd_set_error (bfd_error_wrong_format);
920
921
23.2M
 got_no_match:
922
23.2M
  if (abfd->sections != NULL)
923
    /* Unlike most early section processing, the object attribute v2
924
       code uses bfd_malloc rather than bfd_alloc.  Free memory
925
       containing attributes.  */
926
22.8k
    _bfd_elf_cleanup_object_attributes (abfd);
927
23.2M
  return NULL;
928
23.2M
}
bfd_elf64_object_p
Line
Count
Source
520
5.46M
{
521
5.46M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
5.46M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
5.46M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
5.46M
  Elf_Internal_Shdr i_shdr;
525
5.46M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
5.46M
  unsigned int shindex;
527
5.46M
  elf_backend_data *ebd;
528
5.46M
  asection *s;
529
5.46M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
5.46M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
862k
    {
535
862k
      if (bfd_get_error () != bfd_error_system_call)
536
854k
  goto got_wrong_format_error;
537
8.41k
      else
538
8.41k
  goto got_no_match;
539
862k
    }
540
541
  /* Now check to see if we have a valid ELF file, and one that BFD can
542
     make use of.  The magic number must match, the address size ('class')
543
     and byte-swapping must match our XVEC entry, and it must have a
544
     section header table (FIXME: See comments re sections at top of this
545
     file).  */
546
547
4.59M
  if (! elf_file_p (&x_ehdr)
548
1.15M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
1.11M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
4.03M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
563k
  switch (x_ehdr.e_ident[EI_DATA])
554
563k
    {
555
79.1k
    case ELFDATA2MSB:   /* Big-endian */
556
79.1k
      if (! bfd_header_big_endian (abfd))
557
41.6k
  goto got_wrong_format_error;
558
37.4k
      break;
559
483k
    case ELFDATA2LSB:   /* Little-endian */
560
483k
      if (! bfd_header_little_endian (abfd))
561
221k
  goto got_wrong_format_error;
562
262k
      break;
563
262k
    case ELFDATANONE:   /* No data encoding specified */
564
164
    default:      /* Unknown data encoding specified */
565
164
      goto got_wrong_format_error;
566
563k
    }
567
568
300k
  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
300k
  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
300k
  i_ehdrp = elf_elfheader (abfd);
578
300k
  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
300k
  if (i_ehdrp->e_type == ET_CORE)
585
19.1k
    goto got_wrong_format_error;
586
587
  /* If this is a relocatable file and there is no section header
588
     table, then we're hosed.  */
589
280k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
358
    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
280k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
3.93k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
276k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
122
    goto got_wrong_format_error;
601
602
276k
  ebd = get_elf_backend_data (abfd);
603
276k
  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
276k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
246k
      && (ebd->elf_machine_alt1 == 0
610
31.0k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
244k
      && (ebd->elf_machine_alt2 == 0
612
23.7k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
244k
      && ebd->elf_machine_code != EM_NONE)
614
231k
    goto got_wrong_format_error;
615
616
45.1k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.46k
    abfd->flags |= EXEC_P;
618
42.6k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.46k
    abfd->flags |= DYNAMIC;
620
621
45.1k
  if (i_ehdrp->e_phnum > 0)
622
16.2k
    abfd->flags |= D_PAGED;
623
624
45.1k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
13.8k
    {
626
      /* It's OK if this fails for the generic target.  */
627
13.8k
      if (ebd->elf_machine_code != EM_NONE)
628
0
  goto got_no_match;
629
13.8k
    }
630
631
45.1k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
6.01k
    goto got_wrong_format_error;
633
634
39.1k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
33.5k
    {
636
33.5k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
33.5k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
448
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
33.1k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
32.3k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
790
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
32.3k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
1.12k
  {
652
1.12k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
1.12k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
1.05k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
601
        || i_ehdrp->e_shnum  == 0)
656
571
      goto got_wrong_format_error;
657
1.12k
  }
658
659
      /* And similarly for the string table index.  */
660
31.7k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
530
  {
662
530
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
530
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
530
  }
666
667
      /* And program headers.  */
668
31.7k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
272
  {
670
272
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
272
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
272
  }
674
675
      /* Sanity check that we can read all of the section headers.
676
   It ought to be good enough to just read the last one.  */
677
31.7k
      if (i_ehdrp->e_shnum != 1)
678
30.9k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
30.9k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
30.9k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
169
      goto got_wrong_format_error;
683
684
30.8k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
30.8k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
30.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
30.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
411
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
30.4k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
30.4k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
30.4k
  }
698
31.7k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
36.7k
  if (i_ehdrp->e_shnum != 0)
703
31.1k
    {
704
31.1k
      Elf_Internal_Shdr *shdrp;
705
31.1k
      unsigned int num_sec;
706
31.1k
      size_t amt;
707
708
31.1k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
31.1k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
31.1k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
31.1k
      num_sec = i_ehdrp->e_shnum;
714
31.1k
      elf_numsections (abfd) = num_sec;
715
31.1k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
31.1k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
31.1k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
31.1k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
31.1k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
31.1k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
616k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
585k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
574k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
544k
  {
732
544k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
544k
        || !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
544k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
3.18k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
3.18k
        switch (ebd->elf_machine_code)
742
3.18k
    {
743
0
    case EM_386:
744
0
    case EM_IAMCU:
745
2.12k
    case EM_X86_64:
746
2.12k
    case EM_OLD_SPARCV9:
747
2.12k
    case EM_SPARC32PLUS:
748
2.42k
    case EM_SPARCV9:
749
2.42k
    case EM_SPARC:
750
2.42k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
901
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
1.77k
        break;
753
      /* Otherwise fall through.  */
754
1.41k
    default:
755
1.41k
      goto got_wrong_format_error;
756
3.18k
    }
757
3.18k
      }
758
759
543k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
445k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
411k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
132k
        && i_shdrp[shindex].sh_info >= num_sec)
763
205
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
543k
    if (i_shdrp[shindex].sh_size != 0
768
465k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
160k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
157k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
157k
       % ebd->minpagesize)
772
157k
      != 0))
773
95.1k
      abfd->flags &= ~D_PAGED;
774
543k
  }
775
776
29.5k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
28.5k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
1.83k
  {
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.83k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
1.83k
    if (!abfd->read_only)
787
106
      {
788
106
        _bfd_error_handler
789
106
    (_("warning: %pB has a corrupt string table index"), abfd);
790
106
        abfd->read_only = 1;
791
106
      }
792
1.83k
  }
793
29.5k
    }
794
5.57k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
73
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
35.0k
  if (i_ehdrp->e_phnum == 0)
799
22.6k
    elf_tdata (abfd)->phdr = NULL;
800
12.3k
  else
801
12.3k
    {
802
12.3k
      Elf_Internal_Phdr *i_phdr;
803
12.3k
      unsigned int i;
804
12.3k
      ufile_ptr filesize;
805
12.3k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
12.3k
      filesize = bfd_get_file_size (abfd);
810
12.3k
      if (filesize != 0
811
12.3k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
439
  goto got_wrong_format_error;
813
11.9k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
11.9k
      elf_tdata (abfd)->phdr
816
11.9k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
11.9k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
11.9k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
106
  goto got_no_match;
821
11.9k
      bool eu_strip_broken_phdrs = false;
822
11.8k
      i_phdr = elf_tdata (abfd)->phdr;
823
355k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
343k
  {
825
343k
    Elf_External_Phdr x_phdr;
826
827
343k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
735
      goto got_no_match;
829
343k
    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
343k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
240k
      {
834
240k
        i_phdr->p_align &= -i_phdr->p_align;
835
240k
        if (!abfd->read_only)
836
4.84k
    {
837
4.84k
      _bfd_error_handler (_("warning: %pB has a program header "
838
4.84k
          "with invalid alignment"), abfd);
839
4.84k
      abfd->read_only = 1;
840
4.84k
    }
841
240k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
343k
    if (i_phdr->p_filesz != 0
845
271k
        && (i_phdr->p_filesz > filesize
846
40.0k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
244k
      eu_strip_broken_phdrs = true;
848
343k
  }
849
11.1k
      if (!eu_strip_broken_phdrs
850
3.96k
    && i_ehdrp->e_shoff == 0
851
3.01k
    && i_ehdrp->e_shstrndx == 0)
852
3.01k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
3.01k
    i_phdr = elf_tdata (abfd)->phdr;
856
12.1k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
11.9k
      if (i_phdr->p_type == PT_DYNAMIC)
858
2.81k
        {
859
2.81k
    if (i_phdr->p_filesz != 0
860
2.78k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
2.78k
                  elf_tdata (abfd)->phdr,
862
2.78k
                  i_ehdrp->e_phnum,
863
2.78k
                  filesize))
864
2.65k
      goto got_no_match;
865
151
    break;
866
2.81k
        }
867
3.01k
  }
868
11.1k
    }
869
870
31.1k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
27.6k
    {
872
27.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
27.6k
      num_sec = elf_numsections (abfd);
878
448k
      for (shindex = 1; shindex < num_sec; shindex++)
879
432k
  if (!bfd_section_from_shdr (abfd, shindex))
880
11.7k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
15.9k
      if (! _bfd_elf_setup_sections (abfd))
884
3.20k
  goto got_wrong_format_error;
885
15.9k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
16.2k
  if (ebd->elf_backend_object_p)
890
9.99k
    {
891
9.99k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
15
  goto got_wrong_format_error;
893
9.99k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
16.1k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
897
898
  /* If we have created any reloc sections that are associated with
899
     debugging sections, mark the reloc sections as debugging as well.  */
900
165k
  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.0k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
10.8k
  {
906
10.8k
    unsigned long targ_index;
907
10.8k
    asection *targ_sec;
908
909
10.8k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
10.8k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
10.8k
    if (targ_sec != NULL
912
8.74k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.31k
      s->flags |= SEC_DEBUGGING;
914
10.8k
  }
915
149k
    }
916
16.1k
  return _bfd_no_cleanup;
917
918
5.42M
 got_wrong_format_error:
919
5.42M
  bfd_set_error (bfd_error_wrong_format);
920
921
5.44M
 got_no_match:
922
5.44M
  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
13.3k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
5.42M
}
bfd_elf32_object_p
Line
Count
Source
520
17.8M
{
521
17.8M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
17.8M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
17.8M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
17.8M
  Elf_Internal_Shdr i_shdr;
525
17.8M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
17.8M
  unsigned int shindex;
527
17.8M
  elf_backend_data *ebd;
528
17.8M
  asection *s;
529
17.8M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
17.8M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
1.34M
    {
535
1.34M
      if (bfd_get_error () != bfd_error_system_call)
536
1.34M
  goto got_wrong_format_error;
537
396
      else
538
396
  goto got_no_match;
539
1.34M
    }
540
541
  /* Now check to see if we have a valid ELF file, and one that BFD can
542
     make use of.  The magic number must match, the address size ('class')
543
     and byte-swapping must match our XVEC entry, and it must have a
544
     section header table (FIXME: See comments re sections at top of this
545
     file).  */
546
547
16.4M
  if (! elf_file_p (&x_ehdr)
548
4.55M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
4.41M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
13.8M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
2.59M
  switch (x_ehdr.e_ident[EI_DATA])
554
2.59M
    {
555
825k
    case ELFDATA2MSB:   /* Big-endian */
556
825k
      if (! bfd_header_big_endian (abfd))
557
411k
  goto got_wrong_format_error;
558
413k
      break;
559
1.76M
    case ELFDATA2LSB:   /* Little-endian */
560
1.76M
      if (! bfd_header_little_endian (abfd))
561
875k
  goto got_wrong_format_error;
562
890k
      break;
563
890k
    case ELFDATANONE:   /* No data encoding specified */
564
2.50k
    default:      /* Unknown data encoding specified */
565
2.50k
      goto got_wrong_format_error;
566
2.59M
    }
567
568
1.30M
  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.30M
  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.30M
  i_ehdrp = elf_elfheader (abfd);
578
1.30M
  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.30M
  if (i_ehdrp->e_type == ET_CORE)
585
372k
    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
931k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
25.3k
    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
906k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
45.4k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
860k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
462
    goto got_wrong_format_error;
601
602
860k
  ebd = get_elf_backend_data (abfd);
603
860k
  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
860k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
836k
      && (ebd->elf_machine_alt1 == 0
610
234k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
835k
      && (ebd->elf_machine_alt2 == 0
612
15.0k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
835k
      && ebd->elf_machine_code != EM_NONE)
614
822k
    goto got_wrong_format_error;
615
616
37.8k
  if (i_ehdrp->e_type == ET_EXEC)
617
1.01k
    abfd->flags |= EXEC_P;
618
36.8k
  else if (i_ehdrp->e_type == ET_DYN)
619
1.14k
    abfd->flags |= DYNAMIC;
620
621
37.8k
  if (i_ehdrp->e_phnum > 0)
622
19.8k
    abfd->flags |= D_PAGED;
623
624
37.8k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
13.3k
    {
626
      /* It's OK if this fails for the generic target.  */
627
13.3k
      if (ebd->elf_machine_code != EM_NONE)
628
16
  goto got_no_match;
629
13.3k
    }
630
631
37.8k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
1.86k
    goto got_wrong_format_error;
633
634
35.9k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
28.1k
    {
636
28.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
28.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
28.1k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
27.3k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
802
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
27.3k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
10.2k
  {
652
10.2k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
10.2k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
10.1k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
10.1k
        || i_ehdrp->e_shnum  == 0)
656
222
      goto got_wrong_format_error;
657
10.2k
  }
658
659
      /* And similarly for the string table index.  */
660
27.1k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
578
  {
662
578
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
578
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
578
  }
666
667
      /* And program headers.  */
668
27.1k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
369
  {
670
369
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
369
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
369
  }
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
27.1k
      if (i_ehdrp->e_shnum != 1)
678
26.1k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
26.1k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
25.7k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
529
      goto got_wrong_format_error;
683
684
25.6k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
25.6k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
25.6k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
25.6k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
452
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
25.2k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
25.2k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
25.2k
  }
698
27.1k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
33.9k
  if (i_ehdrp->e_shnum != 0)
703
26.1k
    {
704
26.1k
      Elf_Internal_Shdr *shdrp;
705
26.1k
      unsigned int num_sec;
706
26.1k
      size_t amt;
707
708
26.1k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
26.1k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
26.1k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
26.1k
      num_sec = i_ehdrp->e_shnum;
714
26.1k
      elf_numsections (abfd) = num_sec;
715
26.1k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
26.1k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
26.1k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
26.1k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
26.1k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
26.1k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
333k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
307k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
297k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
272k
  {
732
272k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
272k
        || !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
272k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
1.67k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
1.67k
        switch (ebd->elf_machine_code)
742
1.67k
    {
743
471
    case EM_386:
744
527
    case EM_IAMCU:
745
585
    case EM_X86_64:
746
585
    case EM_OLD_SPARCV9:
747
585
    case EM_SPARC32PLUS:
748
585
    case EM_SPARCV9:
749
741
    case EM_SPARC:
750
741
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
387
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
455
        break;
753
      /* Otherwise fall through.  */
754
1.21k
    default:
755
1.21k
      goto got_wrong_format_error;
756
1.67k
    }
757
1.67k
      }
758
759
271k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
238k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
238k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
47.3k
        && i_shdrp[shindex].sh_info >= num_sec)
763
230
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
271k
    if (i_shdrp[shindex].sh_size != 0
768
192k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
48.4k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
44.2k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
44.2k
       % ebd->minpagesize)
772
44.2k
      != 0))
773
29.0k
      abfd->flags &= ~D_PAGED;
774
271k
  }
775
776
24.6k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
23.6k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
1.98k
  {
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.98k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
1.98k
    if (!abfd->read_only)
787
279
      {
788
279
        _bfd_error_handler
789
279
    (_("warning: %pB has a corrupt string table index"), abfd);
790
279
        abfd->read_only = 1;
791
279
      }
792
1.98k
  }
793
24.6k
    }
794
7.84k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
3.91k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
28.6k
  if (i_ehdrp->e_phnum == 0)
799
15.8k
    elf_tdata (abfd)->phdr = NULL;
800
12.7k
  else
801
12.7k
    {
802
12.7k
      Elf_Internal_Phdr *i_phdr;
803
12.7k
      unsigned int i;
804
12.7k
      ufile_ptr filesize;
805
12.7k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
12.7k
      filesize = bfd_get_file_size (abfd);
810
12.7k
      if (filesize != 0
811
12.7k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
528
  goto got_wrong_format_error;
813
12.2k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
12.2k
      elf_tdata (abfd)->phdr
816
12.2k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
12.2k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
12.2k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
0
  goto got_no_match;
821
12.2k
      bool eu_strip_broken_phdrs = false;
822
12.2k
      i_phdr = elf_tdata (abfd)->phdr;
823
296k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
285k
  {
825
285k
    Elf_External_Phdr x_phdr;
826
827
285k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
730
      goto got_no_match;
829
284k
    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
284k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
186k
      {
834
186k
        i_phdr->p_align &= -i_phdr->p_align;
835
186k
        if (!abfd->read_only)
836
1.63k
    {
837
1.63k
      _bfd_error_handler (_("warning: %pB has a program header "
838
1.63k
          "with invalid alignment"), abfd);
839
1.63k
      abfd->read_only = 1;
840
1.63k
    }
841
186k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
284k
    if (i_phdr->p_filesz != 0
845
214k
        && (i_phdr->p_filesz > filesize
846
41.4k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
192k
      eu_strip_broken_phdrs = true;
848
284k
  }
849
11.4k
      if (!eu_strip_broken_phdrs
850
930
    && i_ehdrp->e_shoff == 0
851
503
    && i_ehdrp->e_shstrndx == 0)
852
503
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
503
    i_phdr = elf_tdata (abfd)->phdr;
856
1.68k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
1.55k
      if (i_phdr->p_type == PT_DYNAMIC)
858
376
        {
859
376
    if (i_phdr->p_filesz != 0
860
335
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
335
                  elf_tdata (abfd)->phdr,
862
335
                  i_ehdrp->e_phnum,
863
335
                  filesize))
864
335
      goto got_no_match;
865
41
    break;
866
376
        }
867
503
  }
868
11.4k
    }
869
870
27.0k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
22.6k
    {
872
22.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
22.6k
      num_sec = elf_numsections (abfd);
878
240k
      for (shindex = 1; shindex < num_sec; shindex++)
879
223k
  if (!bfd_section_from_shdr (abfd, shindex))
880
5.53k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
17.0k
      if (! _bfd_elf_setup_sections (abfd))
884
2.57k
  goto got_wrong_format_error;
885
17.0k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
18.9k
  if (ebd->elf_backend_object_p)
890
12.2k
    {
891
12.2k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
2.80k
  goto got_wrong_format_error;
893
12.2k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
16.1k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
897
898
  /* If we have created any reloc sections that are associated with
899
     debugging sections, mark the reloc sections as debugging as well.  */
900
86.1k
  for (s = abfd->sections; s != NULL; s = s->next)
901
69.9k
    {
902
69.9k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
67.8k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
2.11k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
1.57k
  {
906
1.57k
    unsigned long targ_index;
907
1.57k
    asection *targ_sec;
908
909
1.57k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
1.57k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
1.57k
    if (targ_sec != NULL
912
1.24k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
73
      s->flags |= SEC_DEBUGGING;
914
1.57k
  }
915
69.9k
    }
916
16.1k
  return _bfd_no_cleanup;
917
918
17.7M
 got_wrong_format_error:
919
17.7M
  bfd_set_error (bfd_error_wrong_format);
920
921
17.8M
 got_no_match:
922
17.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
9.49k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
17.7M
}
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.11k
{
937
1.11k
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
1.11k
  bool *failedp = (bool *) data;
939
1.11k
  Elf_Internal_Shdr *rela_hdr;
940
1.11k
  bfd_vma addr_offset;
941
1.11k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
1.11k
  size_t extsize;
943
1.11k
  bfd_byte *dst_rela;
944
1.11k
  unsigned int idx;
945
1.11k
  asymbol *last_sym;
946
1.11k
  int last_sym_idx;
947
1.11k
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
1.11k
  if (*failedp)
951
0
    return;
952
953
1.11k
  if ((sec->flags & SEC_RELOC) == 0)
954
971
    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
143
  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
143
  if (sec->orelocation == NULL)
967
0
    return;
968
969
143
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
143
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
143
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
143
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
143
      || (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
143
  if (rela_hdr->sh_type == SHT_RELA)
984
143
    {
985
143
      swap_out = elf_swap_reloca_out;
986
143
      extsize = sizeof (Elf_External_Rela);
987
143
    }
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
143
  addr_offset = 0;
1002
143
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
18
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
143
  last_sym = 0;
1007
143
  last_sym_idx = 0;
1008
143
  dst_rela = rela_hdr->contents;
1009
1010
969
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
826
    {
1012
826
      Elf_Internal_Rela src_rela;
1013
826
      arelent *ptr;
1014
826
      asymbol *sym;
1015
826
      int n;
1016
1017
826
      ptr = sec->orelocation[idx];
1018
826
      sym = *ptr->sym_ptr_ptr;
1019
826
      if (sym == last_sym)
1020
218
  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
608
      else if (bfd_is_abs_section (sym->section)
1026
126
         && sym->value == 0
1027
91
         && (sym->flags & BSF_RELC) == 0)
1028
91
  n = STN_UNDEF;
1029
517
      else
1030
517
  {
1031
517
    last_sym = sym;
1032
517
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
517
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
517
    last_sym_idx = n;
1039
517
  }
1040
1041
826
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
743
    && (*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
826
      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
826
      src_rela.r_offset = ptr->address + addr_offset;
1070
826
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
826
      src_rela.r_addend = ptr->addend;
1072
826
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
826
    }
1074
1075
143
  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
143
}
bfd_elf64_write_relocs
Line
Count
Source
936
837
{
937
837
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
837
  bool *failedp = (bool *) data;
939
837
  Elf_Internal_Shdr *rela_hdr;
940
837
  bfd_vma addr_offset;
941
837
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
837
  size_t extsize;
943
837
  bfd_byte *dst_rela;
944
837
  unsigned int idx;
945
837
  asymbol *last_sym;
946
837
  int last_sym_idx;
947
837
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
837
  if (*failedp)
951
0
    return;
952
953
837
  if ((sec->flags & SEC_RELOC) == 0)
954
694
    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
143
  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
143
  if (sec->orelocation == NULL)
967
0
    return;
968
969
143
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
143
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
143
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
143
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
143
      || (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
143
  if (rela_hdr->sh_type == SHT_RELA)
984
143
    {
985
143
      swap_out = elf_swap_reloca_out;
986
143
      extsize = sizeof (Elf_External_Rela);
987
143
    }
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
143
  addr_offset = 0;
1002
143
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
18
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
143
  last_sym = 0;
1007
143
  last_sym_idx = 0;
1008
143
  dst_rela = rela_hdr->contents;
1009
1010
969
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
826
    {
1012
826
      Elf_Internal_Rela src_rela;
1013
826
      arelent *ptr;
1014
826
      asymbol *sym;
1015
826
      int n;
1016
1017
826
      ptr = sec->orelocation[idx];
1018
826
      sym = *ptr->sym_ptr_ptr;
1019
826
      if (sym == last_sym)
1020
218
  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
608
      else if (bfd_is_abs_section (sym->section)
1026
126
         && sym->value == 0
1027
91
         && (sym->flags & BSF_RELC) == 0)
1028
91
  n = STN_UNDEF;
1029
517
      else
1030
517
  {
1031
517
    last_sym = sym;
1032
517
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
517
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
517
    last_sym_idx = n;
1039
517
  }
1040
1041
826
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
743
    && (*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
826
      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
826
      src_rela.r_offset = ptr->address + addr_offset;
1070
826
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
826
      src_rela.r_addend = ptr->addend;
1072
826
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
826
    }
1074
1075
143
  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
143
}
bfd_elf32_write_relocs
Line
Count
Source
936
277
{
937
277
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
277
  bool *failedp = (bool *) data;
939
277
  Elf_Internal_Shdr *rela_hdr;
940
277
  bfd_vma addr_offset;
941
277
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
277
  size_t extsize;
943
277
  bfd_byte *dst_rela;
944
277
  unsigned int idx;
945
277
  asymbol *last_sym;
946
277
  int last_sym_idx;
947
277
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
277
  if (*failedp)
951
0
    return;
952
953
277
  if ((sec->flags & SEC_RELOC) == 0)
954
277
    return;
955
956
  /* The linker backend writes the relocs out itself, and sets the
957
     reloc_count field to zero to inhibit writing them here.  Also,
958
     sometimes the SEC_RELOC flag gets set even when there aren't any
959
     relocs.  */
960
0
  if (sec->reloc_count == 0)
961
0
    return;
962
963
  /* If we have opened an existing file for update, reloc_count may be
964
     set even though we are not linking.  In that case we have nothing
965
     to do.  */
966
0
  if (sec->orelocation == NULL)
967
0
    return;
968
969
0
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
0
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
0
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
0
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
0
      || (rela_hdr->contents = bfd_alloc (abfd, amt)) == NULL)
976
0
    {
977
0
      bfd_set_error (bfd_error_no_memory);
978
0
      *failedp = true;
979
0
      return;
980
0
    }
981
982
  /* Figure out whether the relocations are RELA or REL relocations.  */
983
0
  if (rela_hdr->sh_type == SHT_RELA)
984
0
    {
985
0
      swap_out = elf_swap_reloca_out;
986
0
      extsize = sizeof (Elf_External_Rela);
987
0
    }
988
0
  else if (rela_hdr->sh_type == SHT_REL)
989
0
    {
990
0
      swap_out = elf_swap_reloc_out;
991
0
      extsize = sizeof (Elf_External_Rel);
992
0
    }
993
0
  else
994
    /* Every relocation section should be either an SHT_RELA or an
995
       SHT_REL section.  */
996
0
    abort ();
997
998
  /* The address of an ELF reloc is section relative for an object
999
     file, and absolute for an executable file or shared library.
1000
     The address of a BFD reloc is always section relative.  */
1001
0
  addr_offset = 0;
1002
0
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
0
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
0
  last_sym = 0;
1007
0
  last_sym_idx = 0;
1008
0
  dst_rela = rela_hdr->contents;
1009
1010
0
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
0
    {
1012
0
      Elf_Internal_Rela src_rela;
1013
0
      arelent *ptr;
1014
0
      asymbol *sym;
1015
0
      int n;
1016
1017
0
      ptr = sec->orelocation[idx];
1018
0
      sym = *ptr->sym_ptr_ptr;
1019
0
      if (sym == last_sym)
1020
0
  n = last_sym_idx;
1021
      /* If the relocation is against an absolute symbol whoes value is
1022
   zero, then the symbol can be dropped, simplifying the reloc.
1023
   PR 31106: Except for complex relocations where the symbols
1024
   itself might be significant.  */
1025
0
      else if (bfd_is_abs_section (sym->section)
1026
0
         && sym->value == 0
1027
0
         && (sym->flags & BSF_RELC) == 0)
1028
0
  n = STN_UNDEF;
1029
0
      else
1030
0
  {
1031
0
    last_sym = sym;
1032
0
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
0
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
0
    last_sym_idx = n;
1039
0
  }
1040
1041
0
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
0
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
1043
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
1044
0
  {
1045
0
    *failedp = true;
1046
0
    return;
1047
0
  }
1048
1049
0
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
0
#if defined(BFD64) && ARCH_SIZE == 32
1056
0
      if (rela_hdr->sh_type == SHT_RELA
1057
0
    && ptr->howto->bitsize > 32
1058
0
    && ptr->addend - INT32_MIN > UINT32_MAX)
1059
0
  {
1060
0
    _bfd_error_handler (_("%pB: %pA+%" PRIx64 ": "
1061
0
        "relocation addend %" PRIx64 " too large"),
1062
0
            abfd, sec, (uint64_t) ptr->address,
1063
0
            (uint64_t) ptr->addend);
1064
0
    *failedp = true;
1065
0
    bfd_set_error (bfd_error_bad_value);
1066
0
  }
1067
0
#endif
1068
1069
0
      src_rela.r_offset = ptr->address + addr_offset;
1070
0
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
0
      src_rela.r_addend = ptr->addend;
1072
0
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
0
    }
1074
1075
0
  if (elf_section_data (sec)->has_secondary_relocs
1076
0
      && !bed->write_secondary_relocs (abfd, sec))
1077
0
    {
1078
      *failedp = true;
1079
0
      return;
1080
0
    }
1081
0
}
1082
1083
/* Write out the program headers.  */
1084
1085
int
1086
elf_write_out_phdrs (bfd *abfd,
1087
         const Elf_Internal_Phdr *phdr,
1088
         unsigned int count)
1089
126
{
1090
571
  while (count--)
1091
445
    {
1092
445
      Elf_External_Phdr extphdr;
1093
1094
445
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
445
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
445
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
445
      phdr++;
1099
445
    }
1100
126
  return 0;
1101
126
}
bfd_elf64_write_out_phdrs
Line
Count
Source
1089
56
{
1090
303
  while (count--)
1091
247
    {
1092
247
      Elf_External_Phdr extphdr;
1093
1094
247
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
247
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
247
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
247
      phdr++;
1099
247
    }
1100
56
  return 0;
1101
56
}
bfd_elf32_write_out_phdrs
Line
Count
Source
1089
70
{
1090
268
  while (count--)
1091
198
    {
1092
198
      Elf_External_Phdr extphdr;
1093
1094
198
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
198
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
198
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
198
      phdr++;
1099
198
    }
1100
70
  return 0;
1101
70
}
1102
1103
/* Write out the section headers and the ELF file header.  */
1104
1105
bool
1106
elf_write_shdrs_and_ehdr (bfd *abfd)
1107
287
{
1108
287
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
287
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
287
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
287
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
287
  unsigned int count;
1113
287
  size_t amt;
1114
1115
287
  i_ehdrp = elf_elfheader (abfd);
1116
287
  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
287
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
287
  amt = sizeof (x_ehdr);
1125
287
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
287
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
287
  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
287
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
287
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
287
  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
287
  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
287
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
287
  if (!x_shdrp)
1149
0
    return false;
1150
1151
2.27k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.99k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.99k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.99k
    }
1158
287
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
287
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
287
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
287
  return true;
1166
287
}
bfd_elf64_write_shdrs_and_ehdr
Line
Count
Source
1107
131
{
1108
131
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
131
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
131
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
131
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
131
  unsigned int count;
1113
131
  size_t amt;
1114
1115
131
  i_ehdrp = elf_elfheader (abfd);
1116
131
  i_shdrp = elf_elfsections (abfd);
1117
1118
  /* swap the header before spitting it out...  */
1119
1120
#if DEBUG & 1
1121
  elf_debug_file (i_ehdrp);
1122
#endif
1123
131
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
131
  amt = sizeof (x_ehdr);
1125
131
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
131
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
131
  if ((abfd->flags & BFD_NO_SECTION_HEADER) != 0)
1130
0
    return true;
1131
1132
  /* Some fields in the first section header handle overflow of ehdr
1133
     fields.  */
1134
131
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
131
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
131
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1139
0
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1140
1141
  /* at this point we've concocted all the ELF sections...  */
1142
131
  if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*x_shdrp), &amt))
1143
0
    {
1144
0
      bfd_set_error (bfd_error_no_memory);
1145
0
      return false;
1146
0
    }
1147
131
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
131
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.53k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.40k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.40k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.40k
    }
1158
131
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
131
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
131
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
131
  return true;
1166
131
}
bfd_elf32_write_shdrs_and_ehdr
Line
Count
Source
1107
156
{
1108
156
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
156
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
156
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
156
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
156
  unsigned int count;
1113
156
  size_t amt;
1114
1115
156
  i_ehdrp = elf_elfheader (abfd);
1116
156
  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
156
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
156
  amt = sizeof (x_ehdr);
1125
156
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
156
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
156
  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
156
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
156
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
156
  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
156
  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
156
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
156
  if (!x_shdrp)
1149
0
    return false;
1150
1151
745
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
589
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
589
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
589
    }
1158
156
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
156
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
156
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
156
  return true;
1166
156
}
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.99k
{
1245
4.99k
  Elf_Internal_Shdr *hdr;
1246
4.99k
  Elf_Internal_Shdr *verhdr;
1247
4.99k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.99k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.99k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.99k
  Elf_Internal_Sym *isym;
1251
4.99k
  Elf_Internal_Sym *isymend;
1252
4.99k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.99k
  Elf_External_Versym *xver;
1254
4.99k
  Elf_External_Versym *xverbuf = NULL;
1255
4.99k
  elf_backend_data *ebd;
1256
4.99k
  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.99k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.99k
  if (! dynamic)
1270
4.77k
    {
1271
4.77k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1272
4.77k
      verhdr = NULL;
1273
4.77k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
4.77k
    }
1275
225
  else
1276
225
    {
1277
225
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
225
      if (elf_dynversym (abfd) == 0)
1279
43
  verhdr = NULL;
1280
182
      else
1281
182
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
225
      if ((elf_dynverdef (abfd) != 0
1283
11
     && elf_tdata (abfd)->verdef == NULL)
1284
214
    || (elf_dynverref (abfd) != 0
1285
171
        && elf_tdata (abfd)->verref == NULL)
1286
160
    || elf_tdata (abfd)->dt_verdef != NULL
1287
160
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
66
  {
1289
66
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
41
      return -1;
1291
66
  }
1292
1293
184
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
184
    }
1295
1296
4.95k
  if (symcount == 0)
1297
748
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.95k
  if (symcount == 0)
1300
570
    sym = symbase = NULL;
1301
4.38k
  else
1302
4.38k
    {
1303
4.38k
      size_t i;
1304
1305
4.38k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
4.38k
              NULL, NULL, NULL);
1307
4.38k
      if (isymbuf == NULL)
1308
752
  return -1;
1309
1310
3.63k
      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.63k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.63k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.63k
      if (verhdr != NULL
1321
138
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
8
  {
1323
8
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
8
      (_("%pB: version count (%" PRId64 ")"
1326
8
         " does not match symbol count (%ld)"),
1327
8
       abfd,
1328
8
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
8
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
8
    verhdr = NULL;
1334
8
  }
1335
1336
3.63k
      if (verhdr != NULL)
1337
130
  {
1338
130
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
1
      goto error_return;
1340
129
    xverbuf = (Elf_External_Versym *)
1341
129
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
129
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
0
      goto error_return;
1344
129
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.63k
      xver = xverbuf;
1348
3.63k
      if (xver != NULL)
1349
129
  ++xver;
1350
3.63k
      isymend = isymbuf + symcount;
1351
3.63k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
122k
     isym < isymend;
1353
118k
     isym++, sym++, i++)
1354
118k
  {
1355
118k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
118k
    sym->symbol.the_bfd = abfd;
1358
118k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
118k
    else
1362
118k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
118k
    sym->symbol.value = isym->st_value;
1364
1365
118k
    if (isym->st_shndx == SHN_UNDEF)
1366
57.2k
      {
1367
57.2k
        sym->symbol.section = bfd_und_section_ptr;
1368
57.2k
      }
1369
61.7k
    else if (isym->st_shndx == SHN_ABS)
1370
2.18k
      {
1371
2.18k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.18k
      }
1373
59.5k
    else if (isym->st_shndx == SHN_COMMON)
1374
41
      {
1375
41
        sym->symbol.section = bfd_com_section_ptr;
1376
41
        if ((abfd->flags & BFD_PLUGIN) != 0)
1377
0
    {
1378
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1379
1380
0
      if (xc == NULL)
1381
0
        {
1382
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1383
0
          | SEC_EXCLUDE);
1384
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1385
0
          if (xc == NULL)
1386
0
      goto error_return;
1387
0
        }
1388
0
      sym->symbol.section = xc;
1389
0
    }
1390
        /* Elf puts the alignment into the `value' field, and
1391
     the size into the `size' field.  BFD wants to see the
1392
     size in the value field, and doesn't care (at the
1393
     moment) about the alignment.  */
1394
41
        sym->symbol.value = isym->st_size;
1395
41
      }
1396
59.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
59.4k
    else
1406
59.4k
      {
1407
59.4k
        sym->symbol.section
1408
59.4k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
59.4k
        if (sym->symbol.section == NULL)
1410
18.0k
    {
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
18.0k
      sym->symbol.section = bfd_abs_section_ptr;
1418
18.0k
    }
1419
59.4k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
118k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
17.3k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
118k
    switch (ELF_ST_BIND (isym->st_info))
1427
118k
      {
1428
73.1k
      case STB_LOCAL:
1429
73.1k
        sym->symbol.flags |= BSF_LOCAL;
1430
73.1k
        break;
1431
34.7k
      case STB_GLOBAL:
1432
34.7k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
5.63k
    sym->symbol.flags |= BSF_GLOBAL;
1434
34.7k
        break;
1435
6.16k
      case STB_WEAK:
1436
6.16k
        sym->symbol.flags |= BSF_WEAK;
1437
6.16k
        break;
1438
515
      case STB_GNU_UNIQUE:
1439
515
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
515
        break;
1441
118k
      }
1442
1443
118k
    switch (ELF_ST_TYPE (isym->st_info))
1444
118k
      {
1445
24.5k
      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.5k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
24.5k
            | BSF_DEBUGGING
1452
24.5k
            | BSF_SECTION_SYM_USED);
1453
24.5k
        break;
1454
3.22k
      case STT_FILE:
1455
3.22k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
3.22k
        break;
1457
10.5k
      case STT_FUNC:
1458
10.5k
        sym->symbol.flags |= BSF_FUNCTION;
1459
10.5k
        break;
1460
605
      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
605
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
8.79k
      case STT_OBJECT:
1466
8.79k
        sym->symbol.flags |= BSF_OBJECT;
1467
8.79k
        break;
1468
1.13k
      case STT_TLS:
1469
1.13k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.13k
        break;
1471
1.23k
      case STT_RELC:
1472
1.23k
        sym->symbol.flags |= BSF_RELC;
1473
1.23k
        break;
1474
726
      case STT_SRELC:
1475
726
        sym->symbol.flags |= BSF_SRELC;
1476
726
        break;
1477
904
      case STT_GNU_IFUNC:
1478
904
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
904
        break;
1480
118k
      }
1481
1482
118k
    if (dynamic)
1483
1.96k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
118k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
118k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
118k
    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
118k
    if (ebd->elf_backend_symbol_processing)
1499
64.4k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
118k
  }
1501
3.63k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
4.20k
  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.20k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
4.20k
  if (symptrs)
1513
4.20k
    {
1514
4.20k
      long l = symcount;
1515
1516
4.20k
      sym = symbase;
1517
123k
      while (l-- > 0)
1518
118k
  {
1519
118k
    *symptrs++ = &sym->symbol;
1520
118k
    sym++;
1521
118k
  }
1522
4.20k
      *symptrs = 0;   /* Final null pointer */
1523
4.20k
    }
1524
1525
4.20k
  free (xverbuf);
1526
4.20k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.63k
      && !elf_use_dt_symtab_p (abfd))
1528
3.63k
    free (isymbuf);
1529
4.20k
  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.95k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1244
3.85k
{
1245
3.85k
  Elf_Internal_Shdr *hdr;
1246
3.85k
  Elf_Internal_Shdr *verhdr;
1247
3.85k
  unsigned long symcount; /* Number of external ELF symbols */
1248
3.85k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
3.85k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
3.85k
  Elf_Internal_Sym *isym;
1251
3.85k
  Elf_Internal_Sym *isymend;
1252
3.85k
  Elf_Internal_Sym *isymbuf = NULL;
1253
3.85k
  Elf_External_Versym *xver;
1254
3.85k
  Elf_External_Versym *xverbuf = NULL;
1255
3.85k
  elf_backend_data *ebd;
1256
3.85k
  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.85k
  ebd = get_elf_backend_data (abfd);
1268
1269
3.85k
  if (! dynamic)
1270
3.64k
    {
1271
3.64k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1272
3.64k
      verhdr = NULL;
1273
3.64k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
3.64k
    }
1275
214
  else
1276
214
    {
1277
214
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
214
      if (elf_dynversym (abfd) == 0)
1279
41
  verhdr = NULL;
1280
173
      else
1281
173
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
214
      if ((elf_dynverdef (abfd) != 0
1283
11
     && elf_tdata (abfd)->verdef == NULL)
1284
203
    || (elf_dynverref (abfd) != 0
1285
162
        && elf_tdata (abfd)->verref == NULL)
1286
153
    || elf_tdata (abfd)->dt_verdef != NULL
1287
153
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
62
  {
1289
62
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
38
      return -1;
1291
62
  }
1292
1293
176
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
176
    }
1295
1296
3.82k
  if (symcount == 0)
1297
562
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
3.82k
  if (symcount == 0)
1300
392
    sym = symbase = NULL;
1301
3.42k
  else
1302
3.42k
    {
1303
3.42k
      size_t i;
1304
1305
3.42k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
3.42k
              NULL, NULL, NULL);
1307
3.42k
      if (isymbuf == NULL)
1308
516
  return -1;
1309
1310
2.91k
      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
2.91k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
2.91k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
2.91k
      if (verhdr != NULL
1321
132
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
8
  {
1323
8
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
8
      (_("%pB: version count (%" PRId64 ")"
1326
8
         " does not match symbol count (%ld)"),
1327
8
       abfd,
1328
8
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
8
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
8
    verhdr = NULL;
1334
8
  }
1335
1336
2.91k
      if (verhdr != NULL)
1337
124
  {
1338
124
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
1
      goto error_return;
1340
123
    xverbuf = (Elf_External_Versym *)
1341
123
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
123
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
0
      goto error_return;
1344
123
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
2.91k
      xver = xverbuf;
1348
2.91k
      if (xver != NULL)
1349
123
  ++xver;
1350
2.91k
      isymend = isymbuf + symcount;
1351
2.91k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
97.6k
     isym < isymend;
1353
94.7k
     isym++, sym++, i++)
1354
94.7k
  {
1355
94.7k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
94.7k
    sym->symbol.the_bfd = abfd;
1358
94.7k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
94.6k
    else
1362
94.6k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
94.7k
    sym->symbol.value = isym->st_value;
1364
1365
94.7k
    if (isym->st_shndx == SHN_UNDEF)
1366
46.3k
      {
1367
46.3k
        sym->symbol.section = bfd_und_section_ptr;
1368
46.3k
      }
1369
48.3k
    else if (isym->st_shndx == SHN_ABS)
1370
2.12k
      {
1371
2.12k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.12k
      }
1373
46.2k
    else if (isym->st_shndx == SHN_COMMON)
1374
37
      {
1375
37
        sym->symbol.section = bfd_com_section_ptr;
1376
37
        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
37
        sym->symbol.value = isym->st_size;
1395
37
      }
1396
46.1k
    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
46.1k
    else
1406
46.1k
      {
1407
46.1k
        sym->symbol.section
1408
46.1k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
46.1k
        if (sym->symbol.section == NULL)
1410
7.31k
    {
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
7.31k
      sym->symbol.section = bfd_abs_section_ptr;
1418
7.31k
    }
1419
46.1k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
94.7k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
13.2k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
94.7k
    switch (ELF_ST_BIND (isym->st_info))
1427
94.7k
      {
1428
55.0k
      case STB_LOCAL:
1429
55.0k
        sym->symbol.flags |= BSF_LOCAL;
1430
55.0k
        break;
1431
33.6k
      case STB_GLOBAL:
1432
33.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
4.74k
    sym->symbol.flags |= BSF_GLOBAL;
1434
33.6k
        break;
1435
4.99k
      case STB_WEAK:
1436
4.99k
        sym->symbol.flags |= BSF_WEAK;
1437
4.99k
        break;
1438
112
      case STB_GNU_UNIQUE:
1439
112
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
112
        break;
1441
94.7k
      }
1442
1443
94.7k
    switch (ELF_ST_TYPE (isym->st_info))
1444
94.7k
      {
1445
23.4k
      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.4k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
23.4k
            | BSF_DEBUGGING
1452
23.4k
            | BSF_SECTION_SYM_USED);
1453
23.4k
        break;
1454
2.63k
      case STT_FILE:
1455
2.63k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
2.63k
        break;
1457
9.76k
      case STT_FUNC:
1458
9.76k
        sym->symbol.flags |= BSF_FUNCTION;
1459
9.76k
        break;
1460
172
      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
172
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
7.67k
      case STT_OBJECT:
1466
7.67k
        sym->symbol.flags |= BSF_OBJECT;
1467
7.67k
        break;
1468
966
      case STT_TLS:
1469
966
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
966
        break;
1471
449
      case STT_RELC:
1472
449
        sym->symbol.flags |= BSF_RELC;
1473
449
        break;
1474
412
      case STT_SRELC:
1475
412
        sym->symbol.flags |= BSF_SRELC;
1476
412
        break;
1477
363
      case STT_GNU_IFUNC:
1478
363
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
363
        break;
1480
94.7k
      }
1481
1482
94.7k
    if (dynamic)
1483
1.90k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
94.7k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
94.7k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
94.7k
    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
94.7k
    if (ebd->elf_backend_symbol_processing)
1499
58.5k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
94.7k
  }
1501
2.91k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
3.30k
  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.30k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
3.30k
  if (symptrs)
1513
3.30k
    {
1514
3.30k
      long l = symcount;
1515
1516
3.30k
      sym = symbase;
1517
98.0k
      while (l-- > 0)
1518
94.7k
  {
1519
94.7k
    *symptrs++ = &sym->symbol;
1520
94.7k
    sym++;
1521
94.7k
  }
1522
3.30k
      *symptrs = 0;   /* Final null pointer */
1523
3.30k
    }
1524
1525
3.30k
  free (xverbuf);
1526
3.30k
  if (hdr->contents != (unsigned char *) isymbuf
1527
2.91k
      && !elf_use_dt_symtab_p (abfd))
1528
2.90k
    free (isymbuf);
1529
3.30k
  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.82k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1244
1.14k
{
1245
1.14k
  Elf_Internal_Shdr *hdr;
1246
1.14k
  Elf_Internal_Shdr *verhdr;
1247
1.14k
  unsigned long symcount; /* Number of external ELF symbols */
1248
1.14k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
1.14k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
1.14k
  Elf_Internal_Sym *isym;
1251
1.14k
  Elf_Internal_Sym *isymend;
1252
1.14k
  Elf_Internal_Sym *isymbuf = NULL;
1253
1.14k
  Elf_External_Versym *xver;
1254
1.14k
  Elf_External_Versym *xverbuf = NULL;
1255
1.14k
  elf_backend_data *ebd;
1256
1.14k
  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.14k
  ebd = get_elf_backend_data (abfd);
1268
1269
1.14k
  if (! dynamic)
1270
1.13k
    {
1271
1.13k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1272
1.13k
      verhdr = NULL;
1273
1.13k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
1.13k
    }
1275
11
  else
1276
11
    {
1277
11
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
11
      if (elf_dynversym (abfd) == 0)
1279
2
  verhdr = NULL;
1280
9
      else
1281
9
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
11
      if ((elf_dynverdef (abfd) != 0
1283
0
     && elf_tdata (abfd)->verdef == NULL)
1284
11
    || (elf_dynverref (abfd) != 0
1285
9
        && elf_tdata (abfd)->verref == NULL)
1286
7
    || elf_tdata (abfd)->dt_verdef != NULL
1287
7
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
4
  {
1289
4
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
3
      return -1;
1291
4
  }
1292
1293
8
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
8
    }
1295
1296
1.13k
  if (symcount == 0)
1297
186
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
1.13k
  if (symcount == 0)
1300
178
    sym = symbase = NULL;
1301
960
  else
1302
960
    {
1303
960
      size_t i;
1304
1305
960
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
960
              NULL, NULL, NULL);
1307
960
      if (isymbuf == NULL)
1308
236
  return -1;
1309
1310
724
      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
724
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
724
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
724
      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
724
      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
724
      xver = xverbuf;
1348
724
      if (xver != NULL)
1349
6
  ++xver;
1350
724
      isymend = isymbuf + symcount;
1351
724
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
25.0k
     isym < isymend;
1353
24.2k
     isym++, sym++, i++)
1354
24.2k
  {
1355
24.2k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
24.2k
    sym->symbol.the_bfd = abfd;
1358
24.2k
    if (elf_use_dt_symtab_p (abfd))
1359
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
0
        + isym->st_name);
1361
24.2k
    else
1362
24.2k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
24.2k
    sym->symbol.value = isym->st_value;
1364
1365
24.2k
    if (isym->st_shndx == SHN_UNDEF)
1366
10.9k
      {
1367
10.9k
        sym->symbol.section = bfd_und_section_ptr;
1368
10.9k
      }
1369
13.3k
    else if (isym->st_shndx == SHN_ABS)
1370
57
      {
1371
57
        sym->symbol.section = bfd_abs_section_ptr;
1372
57
      }
1373
13.2k
    else if (isym->st_shndx == SHN_COMMON)
1374
4
      {
1375
4
        sym->symbol.section = bfd_com_section_ptr;
1376
4
        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
4
        sym->symbol.value = isym->st_size;
1395
4
      }
1396
13.2k
    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.2k
    else
1406
13.2k
      {
1407
13.2k
        sym->symbol.section
1408
13.2k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
13.2k
        if (sym->symbol.section == NULL)
1410
10.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
10.7k
      sym->symbol.section = bfd_abs_section_ptr;
1418
10.7k
    }
1419
13.2k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
24.2k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
4.06k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
24.2k
    switch (ELF_ST_BIND (isym->st_info))
1427
24.2k
      {
1428
18.1k
      case STB_LOCAL:
1429
18.1k
        sym->symbol.flags |= BSF_LOCAL;
1430
18.1k
        break;
1431
1.13k
      case STB_GLOBAL:
1432
1.13k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
891
    sym->symbol.flags |= BSF_GLOBAL;
1434
1.13k
        break;
1435
1.16k
      case STB_WEAK:
1436
1.16k
        sym->symbol.flags |= BSF_WEAK;
1437
1.16k
        break;
1438
403
      case STB_GNU_UNIQUE:
1439
403
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
403
        break;
1441
24.2k
      }
1442
1443
24.2k
    switch (ELF_ST_TYPE (isym->st_info))
1444
24.2k
      {
1445
1.06k
      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.06k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
1.06k
            | BSF_DEBUGGING
1452
1.06k
            | BSF_SECTION_SYM_USED);
1453
1.06k
        break;
1454
585
      case STT_FILE:
1455
585
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
585
        break;
1457
738
      case STT_FUNC:
1458
738
        sym->symbol.flags |= BSF_FUNCTION;
1459
738
        break;
1460
433
      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
433
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
1.12k
      case STT_OBJECT:
1466
1.12k
        sym->symbol.flags |= BSF_OBJECT;
1467
1.12k
        break;
1468
173
      case STT_TLS:
1469
173
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
173
        break;
1471
782
      case STT_RELC:
1472
782
        sym->symbol.flags |= BSF_RELC;
1473
782
        break;
1474
314
      case STT_SRELC:
1475
314
        sym->symbol.flags |= BSF_SRELC;
1476
314
        break;
1477
541
      case STT_GNU_IFUNC:
1478
541
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
541
        break;
1480
24.2k
      }
1481
1482
24.2k
    if (dynamic)
1483
60
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
24.2k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
24.2k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
24.2k
    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
24.2k
    if (ebd->elf_backend_symbol_processing)
1499
5.91k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
24.2k
  }
1501
724
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
902
  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
902
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
902
  if (symptrs)
1513
902
    {
1514
902
      long l = symcount;
1515
1516
902
      sym = symbase;
1517
25.1k
      while (l-- > 0)
1518
24.2k
  {
1519
24.2k
    *symptrs++ = &sym->symbol;
1520
24.2k
    sym++;
1521
24.2k
  }
1522
902
      *symptrs = 0;   /* Final null pointer */
1523
902
    }
1524
1525
902
  free (xverbuf);
1526
902
  if (hdr->contents != (unsigned char *) isymbuf
1527
724
      && !elf_use_dt_symtab_p (abfd))
1528
724
    free (isymbuf);
1529
902
  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.13k
}
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.5k
{
1551
11.5k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
11.5k
  void *allocated = NULL;
1553
11.5k
  bfd_byte *native_relocs;
1554
11.5k
  arelent *relent;
1555
11.5k
  unsigned int i;
1556
11.5k
  int entsize;
1557
11.5k
  unsigned int symcount;
1558
1559
11.5k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
112
    return false;
1561
11.4k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
11.4k
  if (allocated == NULL)
1563
240
    return false;
1564
1565
11.1k
  native_relocs = (bfd_byte *) allocated;
1566
1567
11.1k
  entsize = rel_hdr->sh_entsize;
1568
11.1k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
11.1k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
11.1k
  if (dynamic)
1572
224
    symcount = bfd_get_dynamic_symcount (abfd);
1573
10.9k
  else
1574
10.9k
    symcount = bfd_get_symcount (abfd);
1575
1576
11.1k
  for (i = 0, relent = relents;
1577
96.5k
       i < reloc_count;
1578
85.3k
       i++, relent++, native_relocs += entsize)
1579
86.7k
    {
1580
86.7k
      bool res;
1581
86.7k
      Elf_Internal_Rela rela;
1582
1583
86.7k
      if (entsize == sizeof (Elf_External_Rela))
1584
78.1k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
8.65k
      else
1586
8.65k
  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
86.7k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
84.7k
  relent->address = rela.r_offset;
1594
2.02k
      else
1595
2.02k
  relent->address = rela.r_offset - asect->vma;
1596
1597
86.7k
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1598
  /* FIXME: This and the error case below mean that we have a
1599
     symbol on relocs that is not elf_symbol_type.  */
1600
8.60k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
78.1k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
11.1k
  {
1603
11.1k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
11.1k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
11.1k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
11.1k
    bfd_set_error (bfd_error_bad_value);
1608
11.1k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
11.1k
  }
1610
67.0k
      else
1611
67.0k
  {
1612
67.0k
    asymbol **ps;
1613
1614
67.0k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
67.0k
    relent->sym_ptr_ptr = ps;
1617
67.0k
  }
1618
1619
86.7k
      relent->addend = rela.r_addend;
1620
1621
86.7k
      res = false;
1622
86.7k
      if ((entsize == sizeof (Elf_External_Rela)
1623
8.65k
     || ebd->elf_info_to_howto_rel == NULL)
1624
84.5k
    && ebd->elf_info_to_howto != NULL)
1625
84.5k
  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
86.7k
      if (! res || relent->howto == NULL)
1630
1.38k
  goto error_return;
1631
86.7k
    }
1632
1633
9.79k
  free (allocated);
1634
9.79k
  return true;
1635
1636
1.38k
 error_return:
1637
1.38k
  free (allocated);
1638
1.38k
  return false;
1639
11.1k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
10.9k
{
1551
10.9k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
10.9k
  void *allocated = NULL;
1553
10.9k
  bfd_byte *native_relocs;
1554
10.9k
  arelent *relent;
1555
10.9k
  unsigned int i;
1556
10.9k
  int entsize;
1557
10.9k
  unsigned int symcount;
1558
1559
10.9k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
112
    return false;
1561
10.7k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
10.7k
  if (allocated == NULL)
1563
230
    return false;
1564
1565
10.5k
  native_relocs = (bfd_byte *) allocated;
1566
1567
10.5k
  entsize = rel_hdr->sh_entsize;
1568
10.5k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
10.5k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
10.5k
  if (dynamic)
1572
210
    symcount = bfd_get_dynamic_symcount (abfd);
1573
10.3k
  else
1574
10.3k
    symcount = bfd_get_symcount (abfd);
1575
1576
10.5k
  for (i = 0, relent = relents;
1577
87.5k
       i < reloc_count;
1578
76.9k
       i++, relent++, native_relocs += entsize)
1579
78.1k
    {
1580
78.1k
      bool res;
1581
78.1k
      Elf_Internal_Rela rela;
1582
1583
78.1k
      if (entsize == sizeof (Elf_External_Rela))
1584
78.1k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
0
      else
1586
0
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1587
1588
      /* The address of an ELF reloc is section relative for an object
1589
   file, and absolute for an executable file or shared library.
1590
   The address of a normal BFD reloc is always section relative,
1591
   and the address of a dynamic reloc is absolute..  */
1592
78.1k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
76.1k
  relent->address = rela.r_offset;
1594
1.97k
      else
1595
1.97k
  relent->address = rela.r_offset - asect->vma;
1596
1597
78.1k
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1598
  /* FIXME: This and the error case below mean that we have a
1599
     symbol on relocs that is not elf_symbol_type.  */
1600
4.59k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
73.5k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
8.24k
  {
1603
8.24k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
8.24k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
8.24k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
8.24k
    bfd_set_error (bfd_error_bad_value);
1608
8.24k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
8.24k
  }
1610
65.2k
      else
1611
65.2k
  {
1612
65.2k
    asymbol **ps;
1613
1614
65.2k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
65.2k
    relent->sym_ptr_ptr = ps;
1617
65.2k
  }
1618
1619
78.1k
      relent->addend = rela.r_addend;
1620
1621
78.1k
      res = false;
1622
78.1k
      if ((entsize == sizeof (Elf_External_Rela)
1623
0
     || ebd->elf_info_to_howto_rel == NULL)
1624
78.1k
    && ebd->elf_info_to_howto != NULL)
1625
78.1k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
0
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
0
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
78.1k
      if (! res || relent->howto == NULL)
1630
1.16k
  goto error_return;
1631
78.1k
    }
1632
1633
9.40k
  free (allocated);
1634
9.40k
  return true;
1635
1636
1.16k
 error_return:
1637
1.16k
  free (allocated);
1638
  return false;
1639
10.5k
}
elf32.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
616
{
1551
616
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
616
  void *allocated = NULL;
1553
616
  bfd_byte *native_relocs;
1554
616
  arelent *relent;
1555
616
  unsigned int i;
1556
616
  int entsize;
1557
616
  unsigned int symcount;
1558
1559
616
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
0
    return false;
1561
616
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
616
  if (allocated == NULL)
1563
10
    return false;
1564
1565
606
  native_relocs = (bfd_byte *) allocated;
1566
1567
606
  entsize = rel_hdr->sh_entsize;
1568
606
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
606
        || entsize == sizeof (Elf_External_Rela));
1570
1571
606
  if (dynamic)
1572
14
    symcount = bfd_get_dynamic_symcount (abfd);
1573
592
  else
1574
592
    symcount = bfd_get_symcount (abfd);
1575
1576
606
  for (i = 0, relent = relents;
1577
9.03k
       i < reloc_count;
1578
8.43k
       i++, relent++, native_relocs += entsize)
1579
8.65k
    {
1580
8.65k
      bool res;
1581
8.65k
      Elf_Internal_Rela rela;
1582
1583
8.65k
      if (entsize == sizeof (Elf_External_Rela))
1584
0
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
8.65k
      else
1586
8.65k
  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
8.65k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
8.60k
  relent->address = rela.r_offset;
1594
54
      else
1595
54
  relent->address = rela.r_offset - asect->vma;
1596
1597
8.65k
      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.01k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
4.64k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
2.91k
  {
1603
2.91k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
2.91k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
2.91k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
2.91k
    bfd_set_error (bfd_error_bad_value);
1608
2.91k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
2.91k
  }
1610
1.72k
      else
1611
1.72k
  {
1612
1.72k
    asymbol **ps;
1613
1614
1.72k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
1.72k
    relent->sym_ptr_ptr = ps;
1617
1.72k
  }
1618
1619
8.65k
      relent->addend = rela.r_addend;
1620
1621
8.65k
      res = false;
1622
8.65k
      if ((entsize == sizeof (Elf_External_Rela)
1623
8.65k
     || ebd->elf_info_to_howto_rel == NULL)
1624
6.45k
    && ebd->elf_info_to_howto != NULL)
1625
6.45k
  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
8.65k
      if (! res || relent->howto == NULL)
1630
222
  goto error_return;
1631
8.65k
    }
1632
1633
384
  free (allocated);
1634
384
  return true;
1635
1636
222
 error_return:
1637
222
  free (allocated);
1638
  return false;
1639
606
}
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.0k
{
1649
15.0k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
15.0k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
15.0k
  Elf_Internal_Shdr *rel_hdr;
1652
15.0k
  Elf_Internal_Shdr *rel_hdr2;
1653
15.0k
  bfd_size_type reloc_count;
1654
15.0k
  bfd_size_type reloc_count2;
1655
15.0k
  arelent *relents;
1656
15.0k
  size_t amt;
1657
1658
15.0k
  if (asect->relocation != NULL)
1659
2.40k
    return true;
1660
1661
12.6k
  if (! dynamic)
1662
12.3k
    {
1663
12.3k
      if ((asect->flags & SEC_RELOC) == 0
1664
11.3k
    || asect->reloc_count == 0)
1665
1.07k
  return true;
1666
1667
11.3k
      rel_hdr = d->rel.hdr;
1668
11.3k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
11.3k
      rel_hdr2 = d->rela.hdr;
1670
11.3k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
11.3k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
11.3k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
11.3k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
11.3k
    }
1679
228
  else
1680
228
    {
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
228
      if (asect->size == 0)
1686
3
  return true;
1687
1688
225
      rel_hdr = &d->this_hdr;
1689
225
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
225
      rel_hdr2 = NULL;
1691
225
      reloc_count2 = 0;
1692
225
    }
1693
1694
11.5k
  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.5k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
11.5k
  if (relents == NULL)
1701
0
    return false;
1702
1703
11.5k
  if (rel_hdr
1704
827
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
827
                rel_hdr, reloc_count,
1706
827
                relents,
1707
827
                symbols, dynamic))
1708
250
    return false;
1709
1710
11.2k
  if (rel_hdr2
1711
10.7k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
10.7k
                rel_hdr2, reloc_count2,
1713
10.7k
                relents + reloc_count,
1714
10.7k
                symbols, dynamic))
1715
1.48k
    return false;
1716
1717
9.79k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
31
    return false;
1719
1720
9.76k
  asect->relocation = relents;
1721
9.76k
  return true;
1722
9.79k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1648
14.2k
{
1649
14.2k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
14.2k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
14.2k
  Elf_Internal_Shdr *rel_hdr;
1652
14.2k
  Elf_Internal_Shdr *rel_hdr2;
1653
14.2k
  bfd_size_type reloc_count;
1654
14.2k
  bfd_size_type reloc_count2;
1655
14.2k
  arelent *relents;
1656
14.2k
  size_t amt;
1657
1658
14.2k
  if (asect->relocation != NULL)
1659
2.25k
    return true;
1660
1661
11.9k
  if (! dynamic)
1662
11.7k
    {
1663
11.7k
      if ((asect->flags & SEC_RELOC) == 0
1664
10.7k
    || asect->reloc_count == 0)
1665
1.04k
  return true;
1666
1667
10.7k
      rel_hdr = d->rel.hdr;
1668
10.7k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
10.7k
      rel_hdr2 = d->rela.hdr;
1670
10.7k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
10.7k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
10.7k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
10.7k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
10.7k
    }
1679
214
  else
1680
214
    {
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
214
      if (asect->size == 0)
1686
3
  return true;
1687
1688
211
      rel_hdr = &d->this_hdr;
1689
211
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
211
      rel_hdr2 = NULL;
1691
211
      reloc_count2 = 0;
1692
211
    }
1693
1694
10.9k
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1695
0
    {
1696
0
      bfd_set_error (bfd_error_file_too_big);
1697
0
      return false;
1698
0
    }
1699
10.9k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
10.9k
  if (relents == NULL)
1701
0
    return false;
1702
1703
10.9k
  if (rel_hdr
1704
211
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
211
                rel_hdr, reloc_count,
1706
211
                relents,
1707
211
                symbols, dynamic))
1708
18
    return false;
1709
1710
10.8k
  if (rel_hdr2
1711
10.7k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
10.7k
                rel_hdr2, reloc_count2,
1713
10.7k
                relents + reloc_count,
1714
10.7k
                symbols, dynamic))
1715
1.48k
    return false;
1716
1717
9.40k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
31
    return false;
1719
1720
9.37k
  asect->relocation = relents;
1721
  return true;
1722
9.40k
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1648
782
{
1649
782
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
782
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
782
  Elf_Internal_Shdr *rel_hdr;
1652
782
  Elf_Internal_Shdr *rel_hdr2;
1653
782
  bfd_size_type reloc_count;
1654
782
  bfd_size_type reloc_count2;
1655
782
  arelent *relents;
1656
782
  size_t amt;
1657
1658
782
  if (asect->relocation != NULL)
1659
141
    return true;
1660
1661
641
  if (! dynamic)
1662
627
    {
1663
627
      if ((asect->flags & SEC_RELOC) == 0
1664
603
    || asect->reloc_count == 0)
1665
25
  return true;
1666
1667
602
      rel_hdr = d->rel.hdr;
1668
602
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
602
      rel_hdr2 = d->rela.hdr;
1670
602
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
602
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
602
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
602
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
602
    }
1679
14
  else
1680
14
    {
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
14
      if (asect->size == 0)
1686
0
  return true;
1687
1688
14
      rel_hdr = &d->this_hdr;
1689
14
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
14
      rel_hdr2 = NULL;
1691
14
      reloc_count2 = 0;
1692
14
    }
1693
1694
616
  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
616
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
616
  if (relents == NULL)
1701
0
    return false;
1702
1703
616
  if (rel_hdr
1704
616
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
616
                rel_hdr, reloc_count,
1706
616
                relents,
1707
616
                symbols, dynamic))
1708
232
    return false;
1709
1710
384
  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
384
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
0
    return false;
1719
1720
384
  asect->relocation = relents;
1721
  return true;
1722
384
}
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.74k
{
2052
1.74k
  return ELF_R_SYM (r_info);
2053
1.74k
}
elf64_r_sym
Line
Count
Source
2051
1.74k
{
2052
1.74k
  return ELF_R_SYM (r_info);
2053
1.74k
}
elf32_r_sym
Line
Count
Source
2051
2
{
2052
2
  return ELF_R_SYM (r_info);
2053
2
}
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
};