Coverage Report

Created: 2023-06-29 07:13

/src/binutils-gdb/bfd/elfcode.h
Line
Count
Source (jump to first uncovered line)
1
/* ELF executable support for BFD.
2
   Copyright (C) 1991-2023 Free Software Foundation, Inc.
3
4
   Written by Fred Fish @ Cygnus Support, from information published
5
   in "UNIX System V Release 4, Programmers Guide: ANSI C and
6
   Programming Support Tools".  Sufficient support for gdb.
7
8
   Rewritten by Mark Eichin @ Cygnus Support, from information
9
   published in "System V Application Binary Interface", chapters 4
10
   and 5, as well as the various "Processor Supplement" documents
11
   derived from it. Added support for assembler and other object file
12
   utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
13
   Meissner (Open Software Foundation), and Peter Hoogenboom (University
14
   of Utah) to finish and extend this.
15
16
   This file is part of BFD, the Binary File Descriptor library.
17
18
   This program is free software; you can redistribute it and/or modify
19
   it under the terms of the GNU General Public License as published by
20
   the Free Software Foundation; either version 3 of the License, or
21
   (at your option) any later version.
22
23
   This program is distributed in the hope that it will be useful,
24
   but WITHOUT ANY WARRANTY; without even the implied warranty of
25
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26
   GNU General Public License for more details.
27
28
   You should have received a copy of the GNU General Public License
29
   along with this program; if not, write to the Free Software
30
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
31
   MA 02110-1301, USA.  */
32
33
34
/* Problems and other issues to resolve.
35
36
   (1)  BFD expects there to be some fixed number of "sections" in
37
  the object file.  I.E. there is a "section_count" variable in the
38
  bfd structure which contains the number of sections.  However, ELF
39
  supports multiple "views" of a file.  In particular, with current
40
  implementations, executable files typically have two tables, a
41
  program header table and a section header table, both of which
42
  partition the executable.
43
44
  In ELF-speak, the "linking view" of the file uses the section header
45
  table to access "sections" within the file, and the "execution view"
46
  uses the program header table to access "segments" within the file.
47
  "Segments" typically may contain all the data from one or more
48
  "sections".
49
50
  Note that the section header table is optional in ELF executables,
51
  but it is this information that is most useful to gdb.  If the
52
  section header table is missing, then gdb should probably try
53
  to make do with the program header table.  (FIXME)
54
55
   (2)  The code in this file is compiled twice, once in 32-bit mode and
56
  once in 64-bit mode.  More of it should be made size-independent
57
  and moved into elf.c.
58
59
   (3)  ELF section symbols are handled rather sloppily now.  This should
60
  be cleaned up, and ELF section symbols reconciled with BFD section
61
  symbols.
62
63
   (4)  We need a published spec for 64-bit ELF.  We've got some stuff here
64
  that we're using for SPARC V9 64-bit chips, but don't assume that
65
  it's cast in stone.
66
 */
67
68
#include "sysdep.h"
69
#include "bfd.h"
70
#include "libiberty.h"
71
#include "bfdlink.h"
72
#include "libbfd.h"
73
#include "elf-bfd.h"
74
#include "libiberty.h"
75
76
/* Renaming structures, typedefs, macros and functions to be size-specific.  */
77
319M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
38.0k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
317M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
14.7M
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
81.7k
#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
14.6k
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
854k
#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
1.29k
#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
14.7M
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
330
#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
81.7k
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
2.54M
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
11.3M
#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
46.6k
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
39.4M
#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
211k
#define H_PUT_WORD    H_PUT_64
159
81.8k
#define H_PUT_SIGNED_WORD H_PUT_S64
160
67.9M
#define H_GET_WORD    H_GET_64
161
11.7M
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
67.5k
#define H_PUT_WORD    H_PUT_32
165
95
#define H_PUT_SIGNED_WORD H_PUT_S32
166
85.8M
#define H_GET_WORD    H_GET_32
167
3.22M
#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
939k
{
179
939k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
939k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
939k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
939k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
939k
  if (signed_vma)
185
54.4k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
885k
  else
187
885k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
939k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
939k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
939k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
939k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
939k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
5.40k
    {
194
5.40k
      if (shndx == NULL)
195
1.06k
  return false;
196
4.33k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
4.33k
    }
198
934k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
14.8k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
938k
  dst->st_target_internal = 0;
201
938k
  return true;
202
939k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
500k
{
179
500k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
500k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
500k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
500k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
500k
  if (signed_vma)
185
21.0k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
479k
  else
187
479k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
500k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
500k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
500k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
500k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
500k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
5.08k
    {
194
5.08k
      if (shndx == NULL)
195
988
  return false;
196
4.09k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
4.09k
    }
198
495k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
6.77k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
499k
  dst->st_target_internal = 0;
201
499k
  return true;
202
500k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
438k
{
179
438k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
438k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
438k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
438k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
438k
  if (signed_vma)
185
33.4k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
405k
  else
187
405k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
438k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
438k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
438k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
438k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
438k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
321
    {
194
321
      if (shndx == NULL)
195
76
  return false;
196
245
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
245
    }
198
438k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
8.11k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
438k
  dst->st_target_internal = 0;
201
438k
  return true;
202
438k
}
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
38.0k
{
213
38.0k
  unsigned int tmp;
214
38.0k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
38.0k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
38.0k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
38.0k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
38.0k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
38.0k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
38.0k
  tmp = src->st_shndx;
221
38.0k
  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
38.0k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
38.0k
}
bfd_elf64_swap_symbol_out
Line
Count
Source
212
9.25k
{
213
9.25k
  unsigned int tmp;
214
9.25k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
9.25k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
9.25k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
9.25k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
9.25k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
9.25k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
9.25k
  tmp = src->st_shndx;
221
9.25k
  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
9.25k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
9.25k
}
bfd_elf32_swap_symbol_out
Line
Count
Source
212
28.8k
{
213
28.8k
  unsigned int tmp;
214
28.8k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
28.8k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
28.8k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
28.8k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
28.8k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
28.8k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
28.8k
  tmp = src->st_shndx;
221
28.8k
  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
28.8k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
28.8k
}
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
13.9M
{
239
13.9M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
13.9M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
13.9M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
13.9M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
13.9M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
13.9M
  if (signed_vma)
245
1.56M
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
12.3M
  else
247
12.3M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
13.9M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
13.9M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
13.9M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
13.9M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
13.9M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
13.9M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
13.9M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
13.9M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
13.9M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
13.9M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
3.01M
{
239
3.01M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.01M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.01M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.01M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.01M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.01M
  if (signed_vma)
245
404k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.60M
  else
247
2.60M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.01M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.01M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.01M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.01M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.01M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.01M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.01M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.01M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.01M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.01M
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
10.9M
{
239
10.9M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
10.9M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
10.9M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
10.9M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
10.9M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
10.9M
  if (signed_vma)
245
1.15M
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
9.75M
  else
247
9.75M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
10.9M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
10.9M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
10.9M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
10.9M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
10.9M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
10.9M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
10.9M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
10.9M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
10.9M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
10.9M
}
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
188
{
267
188
  unsigned int tmp;
268
188
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
188
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
270
  /* note that all elements of dst are *arrays of unsigned char* already...  */
271
188
  H_PUT_16 (abfd, src->e_type, dst->e_type);
272
188
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
273
188
  H_PUT_32 (abfd, src->e_version, dst->e_version);
274
188
  if (signed_vma)
275
188
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
276
162
  else
277
188
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
278
188
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
279
188
  H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
280
188
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
281
188
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
282
188
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
283
188
  tmp = src->e_phnum;
284
188
  if (tmp > PN_XNUM)
285
0
    tmp = PN_XNUM;
286
188
  H_PUT_16 (abfd, tmp, dst->e_phnum);
287
188
  H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
288
188
  tmp = src->e_shnum;
289
188
  if (tmp >= (SHN_LORESERVE & 0xffff))
290
0
    tmp = SHN_UNDEF;
291
188
  H_PUT_16 (abfd, tmp, dst->e_shnum);
292
188
  tmp = src->e_shstrndx;
293
188
  if (tmp >= (SHN_LORESERVE & 0xffff))
294
0
    tmp = SHN_XINDEX & 0xffff;
295
188
  H_PUT_16 (abfd, tmp, dst->e_shstrndx);
296
188
}
elf64.c:elf_swap_ehdr_out
Line
Count
Source
266
93
{
267
93
  unsigned int tmp;
268
93
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
93
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
270
  /* note that all elements of dst are *arrays of unsigned char* already...  */
271
93
  H_PUT_16 (abfd, src->e_type, dst->e_type);
272
93
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
273
93
  H_PUT_32 (abfd, src->e_version, dst->e_version);
274
93
  if (signed_vma)
275
93
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
276
93
  else
277
93
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
278
93
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
279
93
  H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
280
93
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
281
93
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
282
93
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
283
93
  tmp = src->e_phnum;
284
93
  if (tmp > PN_XNUM)
285
0
    tmp = PN_XNUM;
286
93
  H_PUT_16 (abfd, tmp, dst->e_phnum);
287
93
  H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
288
93
  tmp = src->e_shnum;
289
93
  if (tmp >= (SHN_LORESERVE & 0xffff))
290
0
    tmp = SHN_UNDEF;
291
93
  H_PUT_16 (abfd, tmp, dst->e_shnum);
292
93
  tmp = src->e_shstrndx;
293
93
  if (tmp >= (SHN_LORESERVE & 0xffff))
294
0
    tmp = SHN_XINDEX & 0xffff;
295
93
  H_PUT_16 (abfd, tmp, dst->e_shstrndx);
296
93
}
elf32.c:elf_swap_ehdr_out
Line
Count
Source
266
95
{
267
95
  unsigned int tmp;
268
95
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
95
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
270
  /* note that all elements of dst are *arrays of unsigned char* already...  */
271
95
  H_PUT_16 (abfd, src->e_type, dst->e_type);
272
95
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
273
95
  H_PUT_32 (abfd, src->e_version, dst->e_version);
274
95
  if (signed_vma)
275
95
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
276
69
  else
277
95
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
278
95
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
279
95
  H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
280
95
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
281
95
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
282
95
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
283
95
  tmp = src->e_phnum;
284
95
  if (tmp > PN_XNUM)
285
0
    tmp = PN_XNUM;
286
95
  H_PUT_16 (abfd, tmp, dst->e_phnum);
287
95
  H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
288
95
  tmp = src->e_shnum;
289
95
  if (tmp >= (SHN_LORESERVE & 0xffff))
290
0
    tmp = SHN_UNDEF;
291
95
  H_PUT_16 (abfd, tmp, dst->e_shnum);
292
95
  tmp = src->e_shstrndx;
293
95
  if (tmp >= (SHN_LORESERVE & 0xffff))
294
0
    tmp = SHN_XINDEX & 0xffff;
295
95
  H_PUT_16 (abfd, tmp, dst->e_shstrndx);
296
95
}
297
298
/* Translate an ELF section header table entry in external format into an
299
   ELF section header table entry in internal format.  */
300
301
static void
302
elf_swap_shdr_in (bfd *abfd,
303
      const Elf_External_Shdr *src,
304
      Elf_Internal_Shdr *dst)
305
5.68M
{
306
5.68M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
5.68M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
5.68M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
5.68M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
5.68M
  if (signed_vma)
312
1.34M
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
4.34M
  else
314
4.34M
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
5.68M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
5.68M
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
317
  /* PR 23657.  Check for invalid section size, in sections with contents.
318
     Note - we do not set an error value here because the contents
319
     of this particular section might not be needed by the consumer.  */
320
5.68M
  if (dst->sh_type != SHT_NOBITS)
321
5.60M
    {
322
5.60M
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
5.60M
      if (filesize != 0
325
5.60M
    && ((ufile_ptr) dst->sh_offset > filesize
326
5.60M
        || dst->sh_size > filesize - dst->sh_offset)
327
5.60M
    && !abfd->read_only)
328
508k
  {
329
508k
    _bfd_error_handler (_("warning: %pB has a section "
330
508k
        "extending past end of file"), abfd);
331
508k
    abfd->read_only = 1;
332
508k
  }
333
5.60M
    }
334
5.68M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
5.68M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
5.68M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
5.68M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
5.68M
  dst->bfd_section = NULL;
339
5.68M
  dst->contents = NULL;
340
5.68M
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
305
2.76M
{
306
2.76M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
2.76M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
2.76M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
2.76M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
2.76M
  if (signed_vma)
312
341k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
2.42M
  else
314
2.42M
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
2.76M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
2.76M
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
317
  /* PR 23657.  Check for invalid section size, in sections with contents.
318
     Note - we do not set an error value here because the contents
319
     of this particular section might not be needed by the consumer.  */
320
2.76M
  if (dst->sh_type != SHT_NOBITS)
321
2.72M
    {
322
2.72M
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
2.72M
      if (filesize != 0
325
2.72M
    && ((ufile_ptr) dst->sh_offset > filesize
326
2.72M
        || dst->sh_size > filesize - dst->sh_offset)
327
2.72M
    && !abfd->read_only)
328
249k
  {
329
249k
    _bfd_error_handler (_("warning: %pB has a section "
330
249k
        "extending past end of file"), abfd);
331
249k
    abfd->read_only = 1;
332
249k
  }
333
2.72M
    }
334
2.76M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
2.76M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
2.76M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
2.76M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
2.76M
  dst->bfd_section = NULL;
339
2.76M
  dst->contents = NULL;
340
2.76M
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
305
2.92M
{
306
2.92M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
307
308
2.92M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
309
2.92M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
310
2.92M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
311
2.92M
  if (signed_vma)
312
1.00M
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
313
1.92M
  else
314
1.92M
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
315
2.92M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
316
2.92M
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
317
  /* PR 23657.  Check for invalid section size, in sections with contents.
318
     Note - we do not set an error value here because the contents
319
     of this particular section might not be needed by the consumer.  */
320
2.92M
  if (dst->sh_type != SHT_NOBITS)
321
2.88M
    {
322
2.88M
      ufile_ptr filesize = bfd_get_file_size (abfd);
323
324
2.88M
      if (filesize != 0
325
2.88M
    && ((ufile_ptr) dst->sh_offset > filesize
326
2.88M
        || dst->sh_size > filesize - dst->sh_offset)
327
2.88M
    && !abfd->read_only)
328
259k
  {
329
259k
    _bfd_error_handler (_("warning: %pB has a section "
330
259k
        "extending past end of file"), abfd);
331
259k
    abfd->read_only = 1;
332
259k
  }
333
2.88M
    }
334
2.92M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
335
2.92M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
336
2.92M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
337
2.92M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
338
2.92M
  dst->bfd_section = NULL;
339
2.92M
  dst->contents = NULL;
340
2.92M
}
341
342
/* Translate an ELF section header table entry in internal format into an
343
   ELF section header table entry in external format.  */
344
345
static void
346
elf_swap_shdr_out (bfd *abfd,
347
       const Elf_Internal_Shdr *src,
348
       Elf_External_Shdr *dst)
349
6.20k
{
350
  /* note that all elements of dst are *arrays of unsigned char* already...  */
351
6.20k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
352
6.20k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
353
6.20k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
354
6.20k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
355
6.20k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
356
6.20k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
357
6.20k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
358
6.20k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
359
6.20k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
360
6.20k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
361
6.20k
}
elf64.c:elf_swap_shdr_out
Line
Count
Source
349
4.68k
{
350
  /* note that all elements of dst are *arrays of unsigned char* already...  */
351
4.68k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
352
4.68k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
353
4.68k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
354
4.68k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
355
4.68k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
356
4.68k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
357
4.68k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
358
4.68k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
359
4.68k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
360
4.68k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
361
4.68k
}
elf32.c:elf_swap_shdr_out
Line
Count
Source
349
1.52k
{
350
  /* note that all elements of dst are *arrays of unsigned char* already...  */
351
1.52k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
352
1.52k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
353
1.52k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
354
1.52k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
355
1.52k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
356
1.52k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
357
1.52k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
358
1.52k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
359
1.52k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
360
1.52k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
361
1.52k
}
362
363
/* Translate an ELF program header table entry in external format into an
364
   ELF program header table entry in internal format.  */
365
366
void
367
elf_swap_phdr_in (bfd *abfd,
368
      const Elf_External_Phdr *src,
369
      Elf_Internal_Phdr *dst)
370
14.7M
{
371
14.7M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
14.7M
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
14.7M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
14.7M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
14.7M
  if (signed_vma)
377
5.57M
    {
378
5.57M
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
5.57M
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
5.57M
    }
381
9.16M
  else
382
9.16M
    {
383
9.16M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
9.16M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
9.16M
    }
386
14.7M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
14.7M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
14.7M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
14.7M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
370
8.42M
{
371
8.42M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
8.42M
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
8.42M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
8.42M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
8.42M
  if (signed_vma)
377
5.05M
    {
378
5.05M
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
5.05M
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
5.05M
    }
381
3.36M
  else
382
3.36M
    {
383
3.36M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
3.36M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
3.36M
    }
386
8.42M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
8.42M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
8.42M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
8.42M
}
bfd_elf32_swap_phdr_in
Line
Count
Source
370
6.31M
{
371
6.31M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
372
373
6.31M
  dst->p_type = H_GET_32 (abfd, src->p_type);
374
6.31M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
375
6.31M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
376
6.31M
  if (signed_vma)
377
514k
    {
378
514k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
379
514k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
380
514k
    }
381
5.79M
  else
382
5.79M
    {
383
5.79M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
384
5.79M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
385
5.79M
    }
386
6.31M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
387
6.31M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
388
6.31M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
389
6.31M
}
390
391
void
392
elf_swap_phdr_out (bfd *abfd,
393
       const Elf_Internal_Phdr *src,
394
       Elf_External_Phdr *dst)
395
330
{
396
330
  const struct elf_backend_data *bed;
397
330
  bfd_vma p_paddr;
398
399
330
  bed = get_elf_backend_data (abfd);
400
330
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
401
402
  /* note that all elements of dst are *arrays of unsigned char* already...  */
403
330
  H_PUT_32 (abfd, src->p_type, dst->p_type);
404
330
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
405
330
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
406
330
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
407
330
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
408
330
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
409
330
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
410
330
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
411
330
}
bfd_elf64_swap_phdr_out
Line
Count
Source
395
234
{
396
234
  const struct elf_backend_data *bed;
397
234
  bfd_vma p_paddr;
398
399
234
  bed = get_elf_backend_data (abfd);
400
234
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
401
402
  /* note that all elements of dst are *arrays of unsigned char* already...  */
403
234
  H_PUT_32 (abfd, src->p_type, dst->p_type);
404
234
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
405
234
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
406
234
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
407
234
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
408
234
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
409
234
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
410
234
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
411
234
}
bfd_elf32_swap_phdr_out
Line
Count
Source
395
96
{
396
96
  const struct elf_backend_data *bed;
397
96
  bfd_vma p_paddr;
398
399
96
  bed = get_elf_backend_data (abfd);
400
96
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
401
402
  /* note that all elements of dst are *arrays of unsigned char* already...  */
403
96
  H_PUT_32 (abfd, src->p_type, dst->p_type);
404
96
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
405
96
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
406
96
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
407
96
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
408
96
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
409
96
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
410
96
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
411
96
}
412
413
/* Translate an ELF reloc from external format to internal format.  */
414
void
415
elf_swap_reloc_in (bfd *abfd,
416
       const bfd_byte *s,
417
       Elf_Internal_Rela *dst)
418
14.6k
{
419
14.6k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
420
14.6k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
421
14.6k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
422
14.6k
  dst->r_addend = 0;
423
14.6k
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
bfd_elf32_swap_reloc_in
Line
Count
Source
418
14.6k
{
419
14.6k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
420
14.6k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
421
14.6k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
422
14.6k
  dst->r_addend = 0;
423
14.6k
}
424
425
void
426
elf_swap_reloca_in (bfd *abfd,
427
        const bfd_byte *s,
428
        Elf_Internal_Rela *dst)
429
855k
{
430
855k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
431
855k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
432
855k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
433
855k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
434
855k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
429
854k
{
430
854k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
431
854k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
432
854k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
433
854k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
434
854k
}
bfd_elf32_swap_reloca_in
Line
Count
Source
429
1.32k
{
430
1.32k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
431
1.32k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
432
1.32k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
433
1.32k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
434
1.32k
}
435
436
/* Translate an ELF reloc from internal format to external format.  */
437
void
438
elf_swap_reloc_out (bfd *abfd,
439
        const Elf_Internal_Rela *src,
440
        bfd_byte *d)
441
0
{
442
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
443
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
444
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
445
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
446
447
void
448
elf_swap_reloca_out (bfd *abfd,
449
         const Elf_Internal_Rela *src,
450
         bfd_byte *d)
451
81.7k
{
452
81.7k
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
453
81.7k
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
454
81.7k
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
455
81.7k
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
456
81.7k
}
bfd_elf64_swap_reloca_out
Line
Count
Source
451
81.7k
{
452
81.7k
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
453
81.7k
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
454
81.7k
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
455
81.7k
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
456
81.7k
}
Unexecuted instantiation: bfd_elf32_swap_reloca_out
457
458
void
459
elf_swap_dyn_in (bfd *abfd,
460
     const void *p,
461
     Elf_Internal_Dyn *dst)
462
2.98k
{
463
2.98k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
464
465
2.98k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
466
2.98k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
467
2.98k
}
bfd_elf64_swap_dyn_in
Line
Count
Source
462
1.77k
{
463
1.77k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
464
465
1.77k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
466
1.77k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
467
1.77k
}
bfd_elf32_swap_dyn_in
Line
Count
Source
462
1.21k
{
463
1.21k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
464
465
1.21k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
466
1.21k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
467
1.21k
}
468
469
void
470
elf_swap_dyn_out (bfd *abfd,
471
      const Elf_Internal_Dyn *src,
472
      void *p)
473
0
{
474
0
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
475
476
0
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
477
0
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
478
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_out
Unexecuted instantiation: bfd_elf32_swap_dyn_out
479

480
/* ELF .o/exec file reading */
481
482
/* Begin processing a given object.
483
484
   First we validate the file by reading in the ELF header and checking
485
   the magic number.  */
486
487
static inline bool
488
elf_file_p (Elf_External_Ehdr *x_ehdrp)
489
293M
{
490
293M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
293M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
293M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
293M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
293M
}
elf64.c:elf_file_p
Line
Count
Source
489
69.4M
{
490
69.4M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
69.4M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
69.4M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
69.4M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
69.4M
}
elf32.c:elf_file_p
Line
Count
Source
489
224M
{
490
224M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
491
224M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
492
224M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
493
224M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
494
224M
}
495
496
/* Check to see if the file associated with ABFD matches the target vector
497
   that ABFD points to.
498
499
   Note that we may be called several times with the same ABFD, but different
500
   target vectors, most of which will not match.  We have to avoid leaving
501
   any side effects in ABFD, or any data it points to (like tdata), if the
502
   file does not match the target vector.  */
503
504
bfd_cleanup
505
elf_object_p (bfd *abfd)
506
317M
{
507
317M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
317M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
317M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
317M
  Elf_Internal_Shdr i_shdr;
511
317M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
317M
  unsigned int shindex;
513
317M
  const struct elf_backend_data *ebd;
514
317M
  asection *s;
515
317M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
317M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
25.6M
    {
521
25.6M
      if (bfd_get_error () != bfd_error_system_call)
522
25.5M
  goto got_wrong_format_error;
523
149k
      else
524
149k
  goto got_no_match;
525
25.6M
    }
526
527
  /* Now check to see if we have a valid ELF file, and one that BFD can
528
     make use of.  The magic number must match, the address size ('class')
529
     and byte-swapping must match our XVEC entry, and it must have a
530
     section header table (FIXME: See comments re sections at top of this
531
     file).  */
532
533
291M
  if (! elf_file_p (&x_ehdr)
534
291M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
291M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
264M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
26.5M
  switch (x_ehdr.e_ident[EI_DATA])
540
26.5M
    {
541
5.19M
    case ELFDATA2MSB:   /* Big-endian */
542
5.19M
      if (! bfd_header_big_endian (abfd))
543
2.59M
  goto got_wrong_format_error;
544
2.60M
      break;
545
21.2M
    case ELFDATA2LSB:   /* Little-endian */
546
21.2M
      if (! bfd_header_little_endian (abfd))
547
10.4M
  goto got_wrong_format_error;
548
10.8M
      break;
549
10.8M
    case ELFDATANONE:   /* No data encoding specified */
550
74.8k
    default:      /* Unknown data encoding specified */
551
74.8k
      goto got_wrong_format_error;
552
26.5M
    }
553
554
13.4M
  target = abfd->xvec;
555
556
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
557
     the tdata pointer in the bfd.  */
558
559
13.4M
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
560
0
    goto got_no_match;
561
562
  /* Now that we know the byte order, swap in the rest of the header */
563
13.4M
  i_ehdrp = elf_elfheader (abfd);
564
13.4M
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
565
#if DEBUG & 1
566
  elf_debug_file (i_ehdrp);
567
#endif
568
569
  /* Reject ET_CORE (header indicates core file, not object file) */
570
13.4M
  if (i_ehdrp->e_type == ET_CORE)
571
359k
    goto got_wrong_format_error;
572
573
  /* If this is a relocatable file and there is no section header
574
     table, then we're hosed.  */
575
13.0M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
20.3k
    goto got_wrong_format_error;
577
578
  /* As a simple sanity check, verify that what BFD thinks is the
579
     size of each section header table entry actually matches the size
580
     recorded in the file, but only if there are any sections.  */
581
13.0M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
191k
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
12.8M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
23.7k
    goto got_wrong_format_error;
587
588
12.8M
  ebd = get_elf_backend_data (abfd);
589
12.8M
  if (ebd->s->arch_size != ARCH_SIZE)
590
0
    goto got_wrong_format_error;
591
592
  /* Check that the ELF e_machine field matches what this particular
593
     BFD format expects.  */
594
12.8M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
12.8M
      && (ebd->elf_machine_alt1 == 0
596
12.1M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
12.8M
      && (ebd->elf_machine_alt2 == 0
598
12.1M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
12.8M
      && ebd->elf_machine_code != EM_NONE)
600
11.8M
    goto got_wrong_format_error;
601
602
938k
  if (i_ehdrp->e_type == ET_EXEC)
603
26.2k
    abfd->flags |= EXEC_P;
604
912k
  else if (i_ehdrp->e_type == ET_DYN)
605
25.2k
    abfd->flags |= DYNAMIC;
606
607
938k
  if (i_ehdrp->e_phnum > 0)
608
365k
    abfd->flags |= D_PAGED;
609
610
938k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
276k
    {
612
      /* It's OK if this fails for the generic target.  */
613
276k
      if (ebd->elf_machine_code != EM_NONE)
614
735
  goto got_no_match;
615
276k
    }
616
617
937k
  if (ebd->elf_machine_code != EM_NONE
618
937k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
937k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
90.6k
    goto got_wrong_format_error;
621
622
847k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
567k
    {
624
567k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
567k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
5.93k
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
561k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
11.2k
  goto got_no_match;
634
550k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
635
636
      /* If the section count is zero, the actual count is in the first
637
   section header.  */
638
550k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
57.5k
  {
640
57.5k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
57.5k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
57.5k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
57.5k
        || i_ehdrp->e_shnum  == 0)
644
12.8k
      goto got_wrong_format_error;
645
57.5k
  }
646
647
      /* And similarly for the string table index.  */
648
537k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
32.9k
  {
650
32.9k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
32.9k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
32.9k
  }
654
655
      /* And program headers.  */
656
537k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
19.3k
  {
658
19.3k
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
19.3k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
19.3k
  }
662
663
      /* Sanity check that we can read all of the section headers.
664
   It ought to be good enough to just read the last one.  */
665
537k
      if (i_ehdrp->e_shnum != 1)
666
445k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
445k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
445k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
8.29k
      goto got_wrong_format_error;
671
672
437k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
437k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
437k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
437k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
10.6k
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
427k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
427k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
427k
  }
686
537k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
798k
  if (i_ehdrp->e_shnum != 0)
691
518k
    {
692
518k
      Elf_Internal_Shdr *shdrp;
693
518k
      unsigned int num_sec;
694
518k
      size_t amt;
695
696
518k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
518k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
518k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
518k
      num_sec = i_ehdrp->e_shnum;
702
518k
      elf_numsections (abfd) = num_sec;
703
518k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
518k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
518k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
518k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
518k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
518k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
6.25M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
5.74M
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
5.63M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
5.13M
  {
720
5.13M
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
5.13M
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
5.13M
    if (i_shdrp[shindex].sh_link >= num_sec)
726
20.4k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
20.4k
        switch (ebd->elf_machine_code)
730
20.4k
    {
731
2.55k
    case EM_386:
732
2.78k
    case EM_IAMCU:
733
10.7k
    case EM_X86_64:
734
10.7k
    case EM_OLD_SPARCV9:
735
10.7k
    case EM_SPARC32PLUS:
736
11.4k
    case EM_SPARCV9:
737
11.5k
    case EM_SPARC:
738
11.5k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
11.5k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
4.92k
        break;
741
      /* Otherwise fall through.  */
742
15.4k
    default:
743
15.4k
      goto got_wrong_format_error;
744
20.4k
    }
745
20.4k
      }
746
747
5.12M
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
5.12M
         || i_shdrp[shindex].sh_type == SHT_RELA
749
5.12M
         || i_shdrp[shindex].sh_type == SHT_REL)
750
5.12M
        && i_shdrp[shindex].sh_info >= num_sec)
751
4.35k
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
5.11M
    if (i_shdrp[shindex].sh_size != 0
756
5.11M
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
5.11M
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
5.11M
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
888k
       % ebd->minpagesize)
760
888k
      != 0))
761
530k
      abfd->flags &= ~D_PAGED;
762
5.11M
  }
763
764
498k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
498k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
192k
  {
767
    /* PR 2257:
768
       We used to just goto got_wrong_format_error here
769
       but there are binaries in existance for which this test
770
       will prevent the binutils from working with them at all.
771
       So we are kind, and reset the string index value to 0
772
       so that at least some processing can be done.  */
773
192k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
192k
    if (!abfd->read_only)
775
30.0k
      {
776
30.0k
        _bfd_error_handler
777
30.0k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
30.0k
        abfd->read_only = 1;
779
30.0k
      }
780
192k
  }
781
498k
    }
782
279k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
3.28k
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
774k
  if (i_ehdrp->e_phnum == 0)
787
476k
    elf_tdata (abfd)->phdr = NULL;
788
298k
  else
789
298k
    {
790
298k
      Elf_Internal_Phdr *i_phdr;
791
298k
      unsigned int i;
792
298k
      ufile_ptr filesize;
793
298k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
298k
      filesize = bfd_get_file_size (abfd);
798
298k
      if (filesize != 0
799
298k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
14.0k
  goto got_wrong_format_error;
801
284k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
284k
      elf_tdata (abfd)->phdr
804
284k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
284k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
284k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
1.44k
  goto got_no_match;
809
283k
      i_phdr = elf_tdata (abfd)->phdr;
810
12.6M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
12.3M
  {
812
12.3M
    Elf_External_Phdr x_phdr;
813
814
12.3M
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
3.54k
      goto got_no_match;
816
12.3M
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
817
    /* Too much code in BFD relies on alignment being a power of
818
       two, as required by the ELF spec.  */
819
12.3M
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
9.53M
      {
821
9.53M
        i_phdr->p_align &= -i_phdr->p_align;
822
9.53M
        if (!abfd->read_only)
823
49.2k
    {
824
49.2k
      _bfd_error_handler (_("warning: %pB has a program header "
825
49.2k
          "with invalid alignment"), abfd);
826
49.2k
      abfd->read_only = 1;
827
49.2k
    }
828
9.53M
      }
829
12.3M
  }
830
283k
    }
831
832
755k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
304k
    {
834
304k
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
304k
      num_sec = elf_numsections (abfd);
840
3.61M
      for (shindex = 1; shindex < num_sec; shindex++)
841
3.40M
  if (!bfd_section_from_shdr (abfd, shindex))
842
87.9k
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
216k
      if (! _bfd_elf_setup_sections (abfd))
846
7.55k
  goto got_wrong_format_error;
847
216k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
660k
  if (ebd->elf_backend_object_p)
852
429k
    {
853
429k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
54.9k
  goto got_wrong_format_error;
855
429k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
605k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
859
860
  /* If we have created any reloc sections that are associated with
861
     debugging sections, mark the reloc sections as debugging as well.  */
862
2.08M
  for (s = abfd->sections; s != NULL; s = s->next)
863
1.48M
    {
864
1.48M
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
1.48M
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
1.48M
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
47.7k
  {
868
47.7k
    unsigned long targ_index;
869
47.7k
    asection *targ_sec;
870
871
47.7k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
47.7k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
47.7k
    if (targ_sec != NULL
874
47.7k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
3.41k
      s->flags |= SEC_DEBUGGING;
876
47.7k
  }
877
1.48M
    }
878
605k
  return _bfd_no_cleanup;
879
880
316M
 got_wrong_format_error:
881
316M
  bfd_set_error (bfd_error_wrong_format);
882
883
316M
 got_no_match:
884
316M
  return NULL;
885
316M
}
bfd_elf64_object_p
Line
Count
Source
506
77.4M
{
507
77.4M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
77.4M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
77.4M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
77.4M
  Elf_Internal_Shdr i_shdr;
511
77.4M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
77.4M
  unsigned int shindex;
513
77.4M
  const struct elf_backend_data *ebd;
514
77.4M
  asection *s;
515
77.4M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
77.4M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
8.56M
    {
521
8.56M
      if (bfd_get_error () != bfd_error_system_call)
522
8.52M
  goto got_wrong_format_error;
523
35.9k
      else
524
35.9k
  goto got_no_match;
525
8.56M
    }
526
527
  /* Now check to see if we have a valid ELF file, and one that BFD can
528
     make use of.  The magic number must match, the address size ('class')
529
     and byte-swapping must match our XVEC entry, and it must have a
530
     section header table (FIXME: See comments re sections at top of this
531
     file).  */
532
533
68.8M
  if (! elf_file_p (&x_ehdr)
534
68.8M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
68.8M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
63.3M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
5.58M
  switch (x_ehdr.e_ident[EI_DATA])
540
5.58M
    {
541
680k
    case ELFDATA2MSB:   /* Big-endian */
542
680k
      if (! bfd_header_big_endian (abfd))
543
361k
  goto got_wrong_format_error;
544
319k
      break;
545
4.88M
    case ELFDATA2LSB:   /* Little-endian */
546
4.88M
      if (! bfd_header_little_endian (abfd))
547
2.25M
  goto got_wrong_format_error;
548
2.63M
      break;
549
2.63M
    case ELFDATANONE:   /* No data encoding specified */
550
13.9k
    default:      /* Unknown data encoding specified */
551
13.9k
      goto got_wrong_format_error;
552
5.58M
    }
553
554
2.95M
  target = abfd->xvec;
555
556
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
557
     the tdata pointer in the bfd.  */
558
559
2.95M
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
560
0
    goto got_no_match;
561
562
  /* Now that we know the byte order, swap in the rest of the header */
563
2.95M
  i_ehdrp = elf_elfheader (abfd);
564
2.95M
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
565
#if DEBUG & 1
566
  elf_debug_file (i_ehdrp);
567
#endif
568
569
  /* Reject ET_CORE (header indicates core file, not object file) */
570
2.95M
  if (i_ehdrp->e_type == ET_CORE)
571
26.8k
    goto got_wrong_format_error;
572
573
  /* If this is a relocatable file and there is no section header
574
     table, then we're hosed.  */
575
2.92M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
6.97k
    goto got_wrong_format_error;
577
578
  /* As a simple sanity check, verify that what BFD thinks is the
579
     size of each section header table entry actually matches the size
580
     recorded in the file, but only if there are any sections.  */
581
2.91M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
24.5k
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
2.89M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
2.58k
    goto got_wrong_format_error;
587
588
2.88M
  ebd = get_elf_backend_data (abfd);
589
2.88M
  if (ebd->s->arch_size != ARCH_SIZE)
590
0
    goto got_wrong_format_error;
591
592
  /* Check that the ELF e_machine field matches what this particular
593
     BFD format expects.  */
594
2.88M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
2.88M
      && (ebd->elf_machine_alt1 == 0
596
2.61M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
2.88M
      && (ebd->elf_machine_alt2 == 0
598
2.59M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
2.88M
      && ebd->elf_machine_code != EM_NONE)
600
2.47M
    goto got_wrong_format_error;
601
602
415k
  if (i_ehdrp->e_type == ET_EXEC)
603
14.8k
    abfd->flags |= EXEC_P;
604
400k
  else if (i_ehdrp->e_type == ET_DYN)
605
12.5k
    abfd->flags |= DYNAMIC;
606
607
415k
  if (i_ehdrp->e_phnum > 0)
608
138k
    abfd->flags |= D_PAGED;
609
610
415k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
126k
    {
612
      /* It's OK if this fails for the generic target.  */
613
126k
      if (ebd->elf_machine_code != EM_NONE)
614
0
  goto got_no_match;
615
126k
    }
616
617
415k
  if (ebd->elf_machine_code != EM_NONE
618
415k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
415k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
65.8k
    goto got_wrong_format_error;
621
622
349k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
276k
    {
624
276k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
276k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
5.93k
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
270k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
6.18k
  goto got_no_match;
634
264k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
635
636
      /* If the section count is zero, the actual count is in the first
637
   section header.  */
638
264k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
22.8k
  {
640
22.8k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
22.8k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
22.8k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
22.8k
        || i_ehdrp->e_shnum  == 0)
644
9.89k
      goto got_wrong_format_error;
645
22.8k
  }
646
647
      /* And similarly for the string table index.  */
648
254k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
14.7k
  {
650
14.7k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
14.7k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
14.7k
  }
654
655
      /* And program headers.  */
656
254k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
10.4k
  {
658
10.4k
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
10.4k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
10.4k
  }
662
663
      /* Sanity check that we can read all of the section headers.
664
   It ought to be good enough to just read the last one.  */
665
254k
      if (i_ehdrp->e_shnum != 1)
666
234k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
234k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
234k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
2.79k
      goto got_wrong_format_error;
671
672
231k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
231k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
231k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
231k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
7.99k
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
223k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
223k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
223k
  }
686
254k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
316k
  if (i_ehdrp->e_shnum != 0)
691
243k
    {
692
243k
      Elf_Internal_Shdr *shdrp;
693
243k
      unsigned int num_sec;
694
243k
      size_t amt;
695
696
243k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
243k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
243k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
243k
      num_sec = i_ehdrp->e_shnum;
702
243k
      elf_numsections (abfd) = num_sec;
703
243k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
243k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
243k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
243k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
243k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
243k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
3.03M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
2.79M
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
2.72M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
2.49M
  {
720
2.49M
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
2.49M
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
2.49M
    if (i_shdrp[shindex].sh_link >= num_sec)
726
13.4k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
13.4k
        switch (ebd->elf_machine_code)
730
13.4k
    {
731
0
    case EM_386:
732
0
    case EM_IAMCU:
733
7.55k
    case EM_X86_64:
734
7.55k
    case EM_OLD_SPARCV9:
735
7.55k
    case EM_SPARC32PLUS:
736
8.32k
    case EM_SPARCV9:
737
8.32k
    case EM_SPARC:
738
8.32k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
8.32k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
2.51k
        break;
741
      /* Otherwise fall through.  */
742
10.9k
    default:
743
10.9k
      goto got_wrong_format_error;
744
13.4k
    }
745
13.4k
      }
746
747
2.48M
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
2.48M
         || i_shdrp[shindex].sh_type == SHT_RELA
749
2.48M
         || i_shdrp[shindex].sh_type == SHT_REL)
750
2.48M
        && i_shdrp[shindex].sh_info >= num_sec)
751
2.94k
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
2.48M
    if (i_shdrp[shindex].sh_size != 0
756
2.48M
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
2.48M
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
2.48M
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
538k
       % ebd->minpagesize)
760
538k
      != 0))
761
348k
      abfd->flags &= ~D_PAGED;
762
2.48M
  }
763
764
230k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
230k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
53.9k
  {
767
    /* PR 2257:
768
       We used to just goto got_wrong_format_error here
769
       but there are binaries in existance for which this test
770
       will prevent the binutils from working with them at all.
771
       So we are kind, and reset the string index value to 0
772
       so that at least some processing can be done.  */
773
53.9k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
53.9k
    if (!abfd->read_only)
775
7.15k
      {
776
7.15k
        _bfd_error_handler
777
7.15k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
7.15k
        abfd->read_only = 1;
779
7.15k
      }
780
53.9k
  }
781
230k
    }
782
72.7k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
1.47k
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
301k
  if (i_ehdrp->e_phnum == 0)
787
207k
    elf_tdata (abfd)->phdr = NULL;
788
93.4k
  else
789
93.4k
    {
790
93.4k
      Elf_Internal_Phdr *i_phdr;
791
93.4k
      unsigned int i;
792
93.4k
      ufile_ptr filesize;
793
93.4k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
93.4k
      filesize = bfd_get_file_size (abfd);
798
93.4k
      if (filesize != 0
799
93.4k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
9.29k
  goto got_wrong_format_error;
801
84.1k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
84.1k
      elf_tdata (abfd)->phdr
804
84.1k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
84.1k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
84.1k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
1.44k
  goto got_no_match;
809
82.6k
      i_phdr = elf_tdata (abfd)->phdr;
810
8.24M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
8.16M
  {
812
8.16M
    Elf_External_Phdr x_phdr;
813
814
8.16M
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
2.01k
      goto got_no_match;
816
8.16M
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
817
    /* Too much code in BFD relies on alignment being a power of
818
       two, as required by the ELF spec.  */
819
8.16M
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
6.78M
      {
821
6.78M
        i_phdr->p_align &= -i_phdr->p_align;
822
6.78M
        if (!abfd->read_only)
823
31.5k
    {
824
31.5k
      _bfd_error_handler (_("warning: %pB has a program header "
825
31.5k
          "with invalid alignment"), abfd);
826
31.5k
      abfd->read_only = 1;
827
31.5k
    }
828
6.78M
      }
829
8.16M
  }
830
82.6k
    }
831
832
288k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
176k
    {
834
176k
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
176k
      num_sec = elf_numsections (abfd);
840
1.66M
      for (shindex = 1; shindex < num_sec; shindex++)
841
1.56M
  if (!bfd_section_from_shdr (abfd, shindex))
842
80.2k
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
95.7k
      if (! _bfd_elf_setup_sections (abfd))
846
6.64k
  goto got_wrong_format_error;
847
95.7k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
201k
  if (ebd->elf_backend_object_p)
852
111k
    {
853
111k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
493
  goto got_wrong_format_error;
855
111k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
201k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
859
860
  /* If we have created any reloc sections that are associated with
861
     debugging sections, mark the reloc sections as debugging as well.  */
862
798k
  for (s = abfd->sections; s != NULL; s = s->next)
863
597k
    {
864
597k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
597k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
597k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
26.0k
  {
868
26.0k
    unsigned long targ_index;
869
26.0k
    asection *targ_sec;
870
871
26.0k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
26.0k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
26.0k
    if (targ_sec != NULL
874
26.0k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
822
      s->flags |= SEC_DEBUGGING;
876
26.0k
  }
877
597k
    }
878
201k
  return _bfd_no_cleanup;
879
880
77.1M
 got_wrong_format_error:
881
77.1M
  bfd_set_error (bfd_error_wrong_format);
882
883
77.2M
 got_no_match:
884
77.2M
  return NULL;
885
77.1M
}
bfd_elf32_object_p
Line
Count
Source
506
239M
{
507
239M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
508
239M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
509
239M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
510
239M
  Elf_Internal_Shdr i_shdr;
511
239M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
512
239M
  unsigned int shindex;
513
239M
  const struct elf_backend_data *ebd;
514
239M
  asection *s;
515
239M
  const bfd_target *target;
516
517
  /* Read in the ELF header in external format.  */
518
519
239M
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
520
17.1M
    {
521
17.1M
      if (bfd_get_error () != bfd_error_system_call)
522
17.0M
  goto got_wrong_format_error;
523
113k
      else
524
113k
  goto got_no_match;
525
17.1M
    }
526
527
  /* Now check to see if we have a valid ELF file, and one that BFD can
528
     make use of.  The magic number must match, the address size ('class')
529
     and byte-swapping must match our XVEC entry, and it must have a
530
     section header table (FIXME: See comments re sections at top of this
531
     file).  */
532
533
222M
  if (! elf_file_p (&x_ehdr)
534
222M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
535
222M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
536
201M
    goto got_wrong_format_error;
537
538
  /* Check that file's byte order matches xvec's */
539
20.9M
  switch (x_ehdr.e_ident[EI_DATA])
540
20.9M
    {
541
4.51M
    case ELFDATA2MSB:   /* Big-endian */
542
4.51M
      if (! bfd_header_big_endian (abfd))
543
2.22M
  goto got_wrong_format_error;
544
2.28M
      break;
545
16.3M
    case ELFDATA2LSB:   /* Little-endian */
546
16.3M
      if (! bfd_header_little_endian (abfd))
547
8.21M
  goto got_wrong_format_error;
548
8.17M
      break;
549
8.17M
    case ELFDATANONE:   /* No data encoding specified */
550
60.9k
    default:      /* Unknown data encoding specified */
551
60.9k
      goto got_wrong_format_error;
552
20.9M
    }
553
554
10.4M
  target = abfd->xvec;
555
556
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
557
     the tdata pointer in the bfd.  */
558
559
10.4M
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
560
0
    goto got_no_match;
561
562
  /* Now that we know the byte order, swap in the rest of the header */
563
10.4M
  i_ehdrp = elf_elfheader (abfd);
564
10.4M
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
565
#if DEBUG & 1
566
  elf_debug_file (i_ehdrp);
567
#endif
568
569
  /* Reject ET_CORE (header indicates core file, not object file) */
570
10.4M
  if (i_ehdrp->e_type == ET_CORE)
571
332k
    goto got_wrong_format_error;
572
573
  /* If this is a relocatable file and there is no section header
574
     table, then we're hosed.  */
575
10.1M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
576
13.3k
    goto got_wrong_format_error;
577
578
  /* As a simple sanity check, verify that what BFD thinks is the
579
     size of each section header table entry actually matches the size
580
     recorded in the file, but only if there are any sections.  */
581
10.1M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
582
167k
    goto got_wrong_format_error;
583
584
  /* Further sanity check.  */
585
9.94M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
586
21.1k
    goto got_wrong_format_error;
587
588
9.92M
  ebd = get_elf_backend_data (abfd);
589
9.92M
  if (ebd->s->arch_size != ARCH_SIZE)
590
0
    goto got_wrong_format_error;
591
592
  /* Check that the ELF e_machine field matches what this particular
593
     BFD format expects.  */
594
9.92M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
595
9.92M
      && (ebd->elf_machine_alt1 == 0
596
9.58M
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
597
9.92M
      && (ebd->elf_machine_alt2 == 0
598
9.54M
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
599
9.92M
      && ebd->elf_machine_code != EM_NONE)
600
9.40M
    goto got_wrong_format_error;
601
602
523k
  if (i_ehdrp->e_type == ET_EXEC)
603
11.4k
    abfd->flags |= EXEC_P;
604
511k
  else if (i_ehdrp->e_type == ET_DYN)
605
12.7k
    abfd->flags |= DYNAMIC;
606
607
523k
  if (i_ehdrp->e_phnum > 0)
608
227k
    abfd->flags |= D_PAGED;
609
610
523k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
611
150k
    {
612
      /* It's OK if this fails for the generic target.  */
613
150k
      if (ebd->elf_machine_code != EM_NONE)
614
735
  goto got_no_match;
615
150k
    }
616
617
522k
  if (ebd->elf_machine_code != EM_NONE
618
522k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
619
522k
      && ebd->elf_osabi != ELFOSABI_NONE)
620
24.7k
    goto got_wrong_format_error;
621
622
497k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
623
290k
    {
624
290k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
625
626
      /* Seek to the section header table in the file.  */
627
290k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
628
0
  goto got_no_match;
629
630
      /* Read the first section header at index 0, and convert to internal
631
   form.  */
632
290k
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
633
5.10k
  goto got_no_match;
634
285k
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
635
636
      /* If the section count is zero, the actual count is in the first
637
   section header.  */
638
285k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
639
34.6k
  {
640
34.6k
    i_ehdrp->e_shnum = i_shdr.sh_size;
641
34.6k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
642
34.6k
        || i_ehdrp->e_shnum != i_shdr.sh_size
643
34.6k
        || i_ehdrp->e_shnum  == 0)
644
2.96k
      goto got_wrong_format_error;
645
34.6k
  }
646
647
      /* And similarly for the string table index.  */
648
282k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
649
18.2k
  {
650
18.2k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
651
18.2k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
652
0
      goto got_wrong_format_error;
653
18.2k
  }
654
655
      /* And program headers.  */
656
282k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
657
8.95k
  {
658
8.95k
    i_ehdrp->e_phnum = i_shdr.sh_info;
659
8.95k
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
660
0
      goto got_wrong_format_error;
661
8.95k
  }
662
663
      /* Sanity check that we can read all of the section headers.
664
   It ought to be good enough to just read the last one.  */
665
282k
      if (i_ehdrp->e_shnum != 1)
666
211k
  {
667
    /* Check that we don't have a totally silly number of sections.  */
668
211k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
669
211k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
670
5.49k
      goto got_wrong_format_error;
671
672
205k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
673
205k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
674
0
      goto got_wrong_format_error;
675
676
205k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
677
0
      goto got_no_match;
678
205k
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
679
2.65k
      goto got_no_match;
680
681
    /* Back to where we were.  */
682
203k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
683
203k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
684
0
      goto got_no_match;
685
203k
  }
686
282k
    }
687
688
  /* Allocate space for a copy of the section header table in
689
     internal form.  */
690
481k
  if (i_ehdrp->e_shnum != 0)
691
274k
    {
692
274k
      Elf_Internal_Shdr *shdrp;
693
274k
      unsigned int num_sec;
694
274k
      size_t amt;
695
696
274k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
697
0
  goto got_wrong_format_error;
698
274k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
699
274k
      if (!i_shdrp)
700
0
  goto got_no_match;
701
274k
      num_sec = i_ehdrp->e_shnum;
702
274k
      elf_numsections (abfd) = num_sec;
703
274k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
704
0
  goto got_wrong_format_error;
705
274k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
706
274k
      if (!elf_elfsections (abfd))
707
0
  goto got_no_match;
708
274k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
709
274k
      if (!elf_tdata (abfd)->being_created)
710
0
  goto got_no_match;
711
712
274k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
713
3.22M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
714
2.94M
  elf_elfsections (abfd)[shindex] = shdrp++;
715
716
      /* Read in the rest of the section header table and convert it
717
   to internal form.  */
718
2.90M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
719
2.63M
  {
720
2.63M
    if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
721
0
      goto got_no_match;
722
2.63M
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
723
724
    /* Sanity check sh_link and sh_info.  */
725
2.63M
    if (i_shdrp[shindex].sh_link >= num_sec)
726
6.97k
      {
727
        /* PR 10478: Accept Solaris binaries with a sh_link
728
     field set to SHN_BEFORE or SHN_AFTER.  */
729
6.97k
        switch (ebd->elf_machine_code)
730
6.97k
    {
731
2.55k
    case EM_386:
732
2.78k
    case EM_IAMCU:
733
3.16k
    case EM_X86_64:
734
3.16k
    case EM_OLD_SPARCV9:
735
3.16k
    case EM_SPARC32PLUS:
736
3.16k
    case EM_SPARCV9:
737
3.25k
    case EM_SPARC:
738
3.25k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
739
3.25k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
740
2.40k
        break;
741
      /* Otherwise fall through.  */
742
4.57k
    default:
743
4.57k
      goto got_wrong_format_error;
744
6.97k
    }
745
6.97k
      }
746
747
2.63M
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
748
2.63M
         || i_shdrp[shindex].sh_type == SHT_RELA
749
2.63M
         || i_shdrp[shindex].sh_type == SHT_REL)
750
2.63M
        && i_shdrp[shindex].sh_info >= num_sec)
751
1.40k
      goto got_wrong_format_error;
752
753
    /* If the section is loaded, but not page aligned, clear
754
       D_PAGED.  */
755
2.63M
    if (i_shdrp[shindex].sh_size != 0
756
2.63M
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
757
2.63M
        && i_shdrp[shindex].sh_type != SHT_NOBITS
758
2.63M
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
759
349k
       % ebd->minpagesize)
760
349k
      != 0))
761
182k
      abfd->flags &= ~D_PAGED;
762
2.63M
  }
763
764
268k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
765
268k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
766
138k
  {
767
    /* PR 2257:
768
       We used to just goto got_wrong_format_error here
769
       but there are binaries in existance for which this test
770
       will prevent the binutils from working with them at all.
771
       So we are kind, and reset the string index value to 0
772
       so that at least some processing can be done.  */
773
138k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
774
138k
    if (!abfd->read_only)
775
22.8k
      {
776
22.8k
        _bfd_error_handler
777
22.8k
    (_("warning: %pB has a corrupt string table index"), abfd);
778
22.8k
        abfd->read_only = 1;
779
22.8k
      }
780
138k
  }
781
268k
    }
782
206k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
783
1.80k
    goto got_wrong_format_error;
784
785
  /* Read in the program headers.  */
786
473k
  if (i_ehdrp->e_phnum == 0)
787
268k
    elf_tdata (abfd)->phdr = NULL;
788
205k
  else
789
205k
    {
790
205k
      Elf_Internal_Phdr *i_phdr;
791
205k
      unsigned int i;
792
205k
      ufile_ptr filesize;
793
205k
      size_t amt;
794
795
      /* Check for a corrupt input file with an impossibly large number
796
   of program headers.  */
797
205k
      filesize = bfd_get_file_size (abfd);
798
205k
      if (filesize != 0
799
205k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
800
4.77k
  goto got_wrong_format_error;
801
200k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
802
0
  goto got_wrong_format_error;
803
200k
      elf_tdata (abfd)->phdr
804
200k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
805
200k
      if (elf_tdata (abfd)->phdr == NULL)
806
0
  goto got_no_match;
807
200k
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
808
0
  goto got_no_match;
809
200k
      i_phdr = elf_tdata (abfd)->phdr;
810
4.39M
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
811
4.20M
  {
812
4.20M
    Elf_External_Phdr x_phdr;
813
814
4.20M
    if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
815
1.53k
      goto got_no_match;
816
4.19M
    elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
817
    /* Too much code in BFD relies on alignment being a power of
818
       two, as required by the ELF spec.  */
819
4.19M
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
820
2.74M
      {
821
2.74M
        i_phdr->p_align &= -i_phdr->p_align;
822
2.74M
        if (!abfd->read_only)
823
17.7k
    {
824
17.7k
      _bfd_error_handler (_("warning: %pB has a program header "
825
17.7k
          "with invalid alignment"), abfd);
826
17.7k
      abfd->read_only = 1;
827
17.7k
    }
828
2.74M
      }
829
4.19M
  }
830
200k
    }
831
832
467k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
833
128k
    {
834
128k
      unsigned int num_sec;
835
836
      /* Once all of the section headers have been read and converted, we
837
   can start processing them.  Note that the first section header is
838
   a dummy placeholder entry, so we ignore it.  */
839
128k
      num_sec = elf_numsections (abfd);
840
1.95M
      for (shindex = 1; shindex < num_sec; shindex++)
841
1.83M
  if (!bfd_section_from_shdr (abfd, shindex))
842
7.69k
    goto got_no_match;
843
844
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
845
120k
      if (! _bfd_elf_setup_sections (abfd))
846
910
  goto got_wrong_format_error;
847
120k
    }
848
849
  /* Let the backend double check the format and override global
850
     information.  */
851
458k
  if (ebd->elf_backend_object_p)
852
317k
    {
853
317k
      if (! (*ebd->elf_backend_object_p) (abfd))
854
54.5k
  goto got_wrong_format_error;
855
317k
    }
856
857
  /* Remember the entry point specified in the ELF file header.  */
858
404k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
859
860
  /* If we have created any reloc sections that are associated with
861
     debugging sections, mark the reloc sections as debugging as well.  */
862
1.29M
  for (s = abfd->sections; s != NULL; s = s->next)
863
886k
    {
864
886k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
865
886k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
866
886k
    && elf_section_data (s)->this_hdr.sh_info > 0)
867
21.7k
  {
868
21.7k
    unsigned long targ_index;
869
21.7k
    asection *targ_sec;
870
871
21.7k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
872
21.7k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
873
21.7k
    if (targ_sec != NULL
874
21.7k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
875
2.58k
      s->flags |= SEC_DEBUGGING;
876
21.7k
  }
877
886k
    }
878
404k
  return _bfd_no_cleanup;
879
880
239M
 got_wrong_format_error:
881
239M
  bfd_set_error (bfd_error_wrong_format);
882
883
239M
 got_no_match:
884
239M
  return NULL;
885
239M
}
886

887
/* ELF .o/exec file writing */
888
889
/* Write out the relocs.  */
890
891
void
892
elf_write_relocs (bfd *abfd, asection *sec, void *data)
893
4.54k
{
894
4.54k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
895
4.54k
  bool *failedp = (bool *) data;
896
4.54k
  Elf_Internal_Shdr *rela_hdr;
897
4.54k
  bfd_vma addr_offset;
898
4.54k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
899
4.54k
  size_t extsize;
900
4.54k
  bfd_byte *dst_rela;
901
4.54k
  unsigned int idx;
902
4.54k
  asymbol *last_sym;
903
4.54k
  int last_sym_idx;
904
4.54k
  size_t amt;
905
906
  /* If we have already failed, don't do anything.  */
907
4.54k
  if (*failedp)
908
161
    return;
909
910
4.38k
  if ((sec->flags & SEC_RELOC) == 0)
911
3.08k
    return;
912
913
  /* The linker backend writes the relocs out itself, and sets the
914
     reloc_count field to zero to inhibit writing them here.  Also,
915
     sometimes the SEC_RELOC flag gets set even when there aren't any
916
     relocs.  */
917
1.29k
  if (sec->reloc_count == 0)
918
0
    return;
919
920
  /* If we have opened an existing file for update, reloc_count may be
921
     set even though we are not linking.  In that case we have nothing
922
     to do.  */
923
1.29k
  if (sec->orelocation == NULL)
924
0
    return;
925
926
1.29k
  rela_hdr = elf_section_data (sec)->rela.hdr;
927
1.29k
  if (rela_hdr == NULL)
928
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
929
930
1.29k
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
931
1.29k
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
932
1.29k
      || (rela_hdr->contents = bfd_alloc (abfd, amt)) == NULL)
933
0
    {
934
0
      bfd_set_error (bfd_error_no_memory);
935
0
      *failedp = true;
936
0
      return;
937
0
    }
938
939
  /* Figure out whether the relocations are RELA or REL relocations.  */
940
1.29k
  if (rela_hdr->sh_type == SHT_RELA)
941
1.29k
    {
942
1.29k
      swap_out = elf_swap_reloca_out;
943
1.29k
      extsize = sizeof (Elf_External_Rela);
944
1.29k
    }
945
0
  else if (rela_hdr->sh_type == SHT_REL)
946
0
    {
947
0
      swap_out = elf_swap_reloc_out;
948
0
      extsize = sizeof (Elf_External_Rel);
949
0
    }
950
0
  else
951
    /* Every relocation section should be either an SHT_RELA or an
952
       SHT_REL section.  */
953
0
    abort ();
954
955
  /* The address of an ELF reloc is section relative for an object
956
     file, and absolute for an executable file or shared library.
957
     The address of a BFD reloc is always section relative.  */
958
1.29k
  addr_offset = 0;
959
1.29k
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
960
0
    addr_offset = sec->vma;
961
962
  /* orelocation has the data, reloc_count has the count...  */
963
1.29k
  last_sym = 0;
964
1.29k
  last_sym_idx = 0;
965
1.29k
  dst_rela = rela_hdr->contents;
966
967
83.0k
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
968
81.7k
    {
969
81.7k
      Elf_Internal_Rela src_rela;
970
81.7k
      arelent *ptr;
971
81.7k
      asymbol *sym;
972
81.7k
      int n;
973
974
81.7k
      ptr = sec->orelocation[idx];
975
81.7k
      sym = *ptr->sym_ptr_ptr;
976
81.7k
      if (sym == last_sym)
977
44.0k
  n = last_sym_idx;
978
37.7k
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
979
895
  n = STN_UNDEF;
980
36.8k
      else
981
36.8k
  {
982
36.8k
    last_sym = sym;
983
36.8k
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
984
36.8k
    if (n < 0)
985
1
      {
986
1
        *failedp = true;
987
1
        return;
988
1
      }
989
36.8k
    last_sym_idx = n;
990
36.8k
  }
991
992
81.7k
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
993
81.7k
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
994
81.7k
    && ! _bfd_elf_validate_reloc (abfd, ptr))
995
0
  {
996
0
    *failedp = true;
997
0
    return;
998
0
  }
999
1000
81.7k
      if (ptr->howto == NULL)
1001
0
  {
1002
0
    *failedp = true;
1003
0
    return;
1004
0
  }
1005
1006
#if defined(BFD64) && ARCH_SIZE == 32
1007
0
      if (rela_hdr->sh_type == SHT_RELA
1008
0
    && ptr->howto->bitsize > 32
1009
0
    && ptr->addend - INT32_MIN > UINT32_MAX)
1010
0
  {
1011
0
    _bfd_error_handler (_("%pB: %pA+%" PRIx64 ": "
1012
0
        "relocation addend %" PRIx64 " too large"),
1013
0
            abfd, sec, (uint64_t) ptr->address,
1014
0
            (uint64_t) ptr->addend);
1015
0
    *failedp = true;
1016
0
    bfd_set_error (bfd_error_bad_value);
1017
0
  }
1018
#endif
1019
1020
81.7k
      src_rela.r_offset = ptr->address + addr_offset;
1021
81.7k
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1022
81.7k
      src_rela.r_addend = ptr->addend;
1023
81.7k
      (*swap_out) (abfd, &src_rela, dst_rela);
1024
81.7k
    }
1025
1026
1.29k
  if (elf_section_data (sec)->has_secondary_relocs
1027
1.29k
      && !bed->write_secondary_relocs (abfd, sec))
1028
0
    {
1029
0
      *failedp = true;
1030
0
      return;
1031
0
    }
1032
1.29k
}
bfd_elf64_write_relocs
Line
Count
Source
893
3.28k
{
894
3.28k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
895
3.28k
  bool *failedp = (bool *) data;
896
3.28k
  Elf_Internal_Shdr *rela_hdr;
897
3.28k
  bfd_vma addr_offset;
898
3.28k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
899
3.28k
  size_t extsize;
900
3.28k
  bfd_byte *dst_rela;
901
3.28k
  unsigned int idx;
902
3.28k
  asymbol *last_sym;
903
3.28k
  int last_sym_idx;
904
3.28k
  size_t amt;
905
906
  /* If we have already failed, don't do anything.  */
907
3.28k
  if (*failedp)
908
161
    return;
909
910
3.12k
  if ((sec->flags & SEC_RELOC) == 0)
911
1.82k
    return;
912
913
  /* The linker backend writes the relocs out itself, and sets the
914
     reloc_count field to zero to inhibit writing them here.  Also,
915
     sometimes the SEC_RELOC flag gets set even when there aren't any
916
     relocs.  */
917
1.29k
  if (sec->reloc_count == 0)
918
0
    return;
919
920
  /* If we have opened an existing file for update, reloc_count may be
921
     set even though we are not linking.  In that case we have nothing
922
     to do.  */
923
1.29k
  if (sec->orelocation == NULL)
924
0
    return;
925
926
1.29k
  rela_hdr = elf_section_data (sec)->rela.hdr;
927
1.29k
  if (rela_hdr == NULL)
928
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
929
930
1.29k
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
931
1.29k
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
932
1.29k
      || (rela_hdr->contents = bfd_alloc (abfd, amt)) == NULL)
933
0
    {
934
0
      bfd_set_error (bfd_error_no_memory);
935
0
      *failedp = true;
936
0
      return;
937
0
    }
938
939
  /* Figure out whether the relocations are RELA or REL relocations.  */
940
1.29k
  if (rela_hdr->sh_type == SHT_RELA)
941
1.29k
    {
942
1.29k
      swap_out = elf_swap_reloca_out;
943
1.29k
      extsize = sizeof (Elf_External_Rela);
944
1.29k
    }
945
0
  else if (rela_hdr->sh_type == SHT_REL)
946
0
    {
947
0
      swap_out = elf_swap_reloc_out;
948
0
      extsize = sizeof (Elf_External_Rel);
949
0
    }
950
0
  else
951
    /* Every relocation section should be either an SHT_RELA or an
952
       SHT_REL section.  */
953
0
    abort ();
954
955
  /* The address of an ELF reloc is section relative for an object
956
     file, and absolute for an executable file or shared library.
957
     The address of a BFD reloc is always section relative.  */
958
1.29k
  addr_offset = 0;
959
1.29k
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
960
0
    addr_offset = sec->vma;
961
962
  /* orelocation has the data, reloc_count has the count...  */
963
1.29k
  last_sym = 0;
964
1.29k
  last_sym_idx = 0;
965
1.29k
  dst_rela = rela_hdr->contents;
966
967
83.0k
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
968
81.7k
    {
969
81.7k
      Elf_Internal_Rela src_rela;
970
81.7k
      arelent *ptr;
971
81.7k
      asymbol *sym;
972
81.7k
      int n;
973
974
81.7k
      ptr = sec->orelocation[idx];
975
81.7k
      sym = *ptr->sym_ptr_ptr;
976
81.7k
      if (sym == last_sym)
977
44.0k
  n = last_sym_idx;
978
37.7k
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
979
895
  n = STN_UNDEF;
980
36.8k
      else
981
36.8k
  {
982
36.8k
    last_sym = sym;
983
36.8k
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
984
36.8k
    if (n < 0)
985
1
      {
986
1
        *failedp = true;
987
1
        return;
988
1
      }
989
36.8k
    last_sym_idx = n;
990
36.8k
  }
991
992
81.7k
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
993
81.7k
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
994
81.7k
    && ! _bfd_elf_validate_reloc (abfd, ptr))
995
0
  {
996
0
    *failedp = true;
997
0
    return;
998
0
  }
999
1000
81.7k
      if (ptr->howto == NULL)
1001
0
  {
1002
0
    *failedp = true;
1003
0
    return;
1004
0
  }
1005
1006
#if defined(BFD64) && ARCH_SIZE == 32
1007
      if (rela_hdr->sh_type == SHT_RELA
1008
    && ptr->howto->bitsize > 32
1009
    && ptr->addend - INT32_MIN > UINT32_MAX)
1010
  {
1011
    _bfd_error_handler (_("%pB: %pA+%" PRIx64 ": "
1012
        "relocation addend %" PRIx64 " too large"),
1013
            abfd, sec, (uint64_t) ptr->address,
1014
            (uint64_t) ptr->addend);
1015
    *failedp = true;
1016
    bfd_set_error (bfd_error_bad_value);
1017
  }
1018
#endif
1019
1020
81.7k
      src_rela.r_offset = ptr->address + addr_offset;
1021
81.7k
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1022
81.7k
      src_rela.r_addend = ptr->addend;
1023
81.7k
      (*swap_out) (abfd, &src_rela, dst_rela);
1024
81.7k
    }
1025
1026
1.29k
  if (elf_section_data (sec)->has_secondary_relocs
1027
1.29k
      && !bed->write_secondary_relocs (abfd, sec))
1028
0
    {
1029
0
      *failedp = true;
1030
0
      return;
1031
0
    }
1032
1.29k
}
bfd_elf32_write_relocs
Line
Count
Source
893
1.26k
{
894
1.26k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
895
1.26k
  bool *failedp = (bool *) data;
896
1.26k
  Elf_Internal_Shdr *rela_hdr;
897
1.26k
  bfd_vma addr_offset;
898
1.26k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
899
1.26k
  size_t extsize;
900
1.26k
  bfd_byte *dst_rela;
901
1.26k
  unsigned int idx;
902
1.26k
  asymbol *last_sym;
903
1.26k
  int last_sym_idx;
904
1.26k
  size_t amt;
905
906
  /* If we have already failed, don't do anything.  */
907
1.26k
  if (*failedp)
908
0
    return;
909
910
1.26k
  if ((sec->flags & SEC_RELOC) == 0)
911
1.26k
    return;
912
913
  /* The linker backend writes the relocs out itself, and sets the
914
     reloc_count field to zero to inhibit writing them here.  Also,
915
     sometimes the SEC_RELOC flag gets set even when there aren't any
916
     relocs.  */
917
0
  if (sec->reloc_count == 0)
918
0
    return;
919
920
  /* If we have opened an existing file for update, reloc_count may be
921
     set even though we are not linking.  In that case we have nothing
922
     to do.  */
923
0
  if (sec->orelocation == NULL)
924
0
    return;
925
926
0
  rela_hdr = elf_section_data (sec)->rela.hdr;
927
0
  if (rela_hdr == NULL)
928
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
929
930
0
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
931
0
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
932
0
      || (rela_hdr->contents = bfd_alloc (abfd, amt)) == NULL)
933
0
    {
934
0
      bfd_set_error (bfd_error_no_memory);
935
0
      *failedp = true;
936
0
      return;
937
0
    }
938
939
  /* Figure out whether the relocations are RELA or REL relocations.  */
940
0
  if (rela_hdr->sh_type == SHT_RELA)
941
0
    {
942
0
      swap_out = elf_swap_reloca_out;
943
0
      extsize = sizeof (Elf_External_Rela);
944
0
    }
945
0
  else if (rela_hdr->sh_type == SHT_REL)
946
0
    {
947
0
      swap_out = elf_swap_reloc_out;
948
0
      extsize = sizeof (Elf_External_Rel);
949
0
    }
950
0
  else
951
    /* Every relocation section should be either an SHT_RELA or an
952
       SHT_REL section.  */
953
0
    abort ();
954
955
  /* The address of an ELF reloc is section relative for an object
956
     file, and absolute for an executable file or shared library.
957
     The address of a BFD reloc is always section relative.  */
958
0
  addr_offset = 0;
959
0
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
960
0
    addr_offset = sec->vma;
961
962
  /* orelocation has the data, reloc_count has the count...  */
963
0
  last_sym = 0;
964
0
  last_sym_idx = 0;
965
0
  dst_rela = rela_hdr->contents;
966
967
0
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
968
0
    {
969
0
      Elf_Internal_Rela src_rela;
970
0
      arelent *ptr;
971
0
      asymbol *sym;
972
0
      int n;
973
974
0
      ptr = sec->orelocation[idx];
975
0
      sym = *ptr->sym_ptr_ptr;
976
0
      if (sym == last_sym)
977
0
  n = last_sym_idx;
978
0
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
979
0
  n = STN_UNDEF;
980
0
      else
981
0
  {
982
0
    last_sym = sym;
983
0
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
984
0
    if (n < 0)
985
0
      {
986
0
        *failedp = true;
987
0
        return;
988
0
      }
989
0
    last_sym_idx = n;
990
0
  }
991
992
0
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
993
0
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
994
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
995
0
  {
996
0
    *failedp = true;
997
0
    return;
998
0
  }
999
1000
0
      if (ptr->howto == NULL)
1001
0
  {
1002
0
    *failedp = true;
1003
0
    return;
1004
0
  }
1005
1006
0
#if defined(BFD64) && ARCH_SIZE == 32
1007
0
      if (rela_hdr->sh_type == SHT_RELA
1008
0
    && ptr->howto->bitsize > 32
1009
0
    && ptr->addend - INT32_MIN > UINT32_MAX)
1010
0
  {
1011
0
    _bfd_error_handler (_("%pB: %pA+%" PRIx64 ": "
1012
0
        "relocation addend %" PRIx64 " too large"),
1013
0
            abfd, sec, (uint64_t) ptr->address,
1014
0
            (uint64_t) ptr->addend);
1015
0
    *failedp = true;
1016
0
    bfd_set_error (bfd_error_bad_value);
1017
0
  }
1018
0
#endif
1019
1020
0
      src_rela.r_offset = ptr->address + addr_offset;
1021
0
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1022
0
      src_rela.r_addend = ptr->addend;
1023
0
      (*swap_out) (abfd, &src_rela, dst_rela);
1024
0
    }
1025
1026
0
  if (elf_section_data (sec)->has_secondary_relocs
1027
0
      && !bed->write_secondary_relocs (abfd, sec))
1028
0
    {
1029
0
      *failedp = true;
1030
0
      return;
1031
0
    }
1032
0
}
1033
1034
/* Write out the program headers.  */
1035
1036
int
1037
elf_write_out_phdrs (bfd *abfd,
1038
         const Elf_Internal_Phdr *phdr,
1039
         unsigned int count)
1040
36
{
1041
366
  while (count--)
1042
330
    {
1043
330
      Elf_External_Phdr extphdr;
1044
1045
330
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1046
330
      if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
1047
330
    != sizeof (Elf_External_Phdr))
1048
0
  return -1;
1049
330
      phdr++;
1050
330
    }
1051
36
  return 0;
1052
36
}
bfd_elf64_write_out_phdrs
Line
Count
Source
1040
19
{
1041
253
  while (count--)
1042
234
    {
1043
234
      Elf_External_Phdr extphdr;
1044
1045
234
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1046
234
      if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
1047
234
    != sizeof (Elf_External_Phdr))
1048
0
  return -1;
1049
234
      phdr++;
1050
234
    }
1051
19
  return 0;
1052
19
}
bfd_elf32_write_out_phdrs
Line
Count
Source
1040
17
{
1041
113
  while (count--)
1042
96
    {
1043
96
      Elf_External_Phdr extphdr;
1044
1045
96
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1046
96
      if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
1047
96
    != sizeof (Elf_External_Phdr))
1048
0
  return -1;
1049
96
      phdr++;
1050
96
    }
1051
17
  return 0;
1052
17
}
1053
1054
/* Write out the section headers and the ELF file header.  */
1055
1056
bool
1057
elf_write_shdrs_and_ehdr (bfd *abfd)
1058
188
{
1059
188
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1060
188
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1061
188
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1062
188
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1063
188
  unsigned int count;
1064
188
  size_t amt;
1065
1066
188
  i_ehdrp = elf_elfheader (abfd);
1067
188
  i_shdrp = elf_elfsections (abfd);
1068
1069
  /* swap the header before spitting it out...  */
1070
1071
#if DEBUG & 1
1072
  elf_debug_file (i_ehdrp);
1073
#endif
1074
188
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1075
188
  amt = sizeof (x_ehdr);
1076
188
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1077
188
      || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
1078
0
    return false;
1079
1080
  /* Some fields in the first section header handle overflow of ehdr
1081
     fields.  */
1082
188
  if (i_ehdrp->e_phnum >= PN_XNUM)
1083
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1084
188
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1085
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1086
188
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1087
0
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1088
1089
  /* at this point we've concocted all the ELF sections...  */
1090
188
  if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*x_shdrp), &amt))
1091
0
    {
1092
0
      bfd_set_error (bfd_error_no_memory);
1093
0
      return false;
1094
0
    }
1095
188
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1096
188
  if (!x_shdrp)
1097
0
    return false;
1098
1099
6.39k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1100
6.20k
    {
1101
#if DEBUG & 2
1102
      elf_debug_section (count, *i_shdrp);
1103
#endif
1104
6.20k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1105
6.20k
    }
1106
188
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1107
188
  if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1108
188
      || bfd_bwrite (x_shdrp, amt, abfd) != amt)
1109
0
    return false;
1110
1111
  /* need to dump the string table too...  */
1112
1113
188
  return true;
1114
188
}
bfd_elf64_write_shdrs_and_ehdr
Line
Count
Source
1058
93
{
1059
93
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1060
93
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1061
93
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1062
93
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1063
93
  unsigned int count;
1064
93
  size_t amt;
1065
1066
93
  i_ehdrp = elf_elfheader (abfd);
1067
93
  i_shdrp = elf_elfsections (abfd);
1068
1069
  /* swap the header before spitting it out...  */
1070
1071
#if DEBUG & 1
1072
  elf_debug_file (i_ehdrp);
1073
#endif
1074
93
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1075
93
  amt = sizeof (x_ehdr);
1076
93
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1077
93
      || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
1078
0
    return false;
1079
1080
  /* Some fields in the first section header handle overflow of ehdr
1081
     fields.  */
1082
93
  if (i_ehdrp->e_phnum >= PN_XNUM)
1083
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1084
93
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1085
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1086
93
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1087
0
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1088
1089
  /* at this point we've concocted all the ELF sections...  */
1090
93
  if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*x_shdrp), &amt))
1091
0
    {
1092
0
      bfd_set_error (bfd_error_no_memory);
1093
0
      return false;
1094
0
    }
1095
93
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1096
93
  if (!x_shdrp)
1097
0
    return false;
1098
1099
4.77k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1100
4.68k
    {
1101
#if DEBUG & 2
1102
      elf_debug_section (count, *i_shdrp);
1103
#endif
1104
4.68k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1105
4.68k
    }
1106
93
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1107
93
  if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1108
93
      || bfd_bwrite (x_shdrp, amt, abfd) != amt)
1109
0
    return false;
1110
1111
  /* need to dump the string table too...  */
1112
1113
93
  return true;
1114
93
}
bfd_elf32_write_shdrs_and_ehdr
Line
Count
Source
1058
95
{
1059
95
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1060
95
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1061
95
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1062
95
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1063
95
  unsigned int count;
1064
95
  size_t amt;
1065
1066
95
  i_ehdrp = elf_elfheader (abfd);
1067
95
  i_shdrp = elf_elfsections (abfd);
1068
1069
  /* swap the header before spitting it out...  */
1070
1071
#if DEBUG & 1
1072
  elf_debug_file (i_ehdrp);
1073
#endif
1074
95
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1075
95
  amt = sizeof (x_ehdr);
1076
95
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1077
95
      || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
1078
0
    return false;
1079
1080
  /* Some fields in the first section header handle overflow of ehdr
1081
     fields.  */
1082
95
  if (i_ehdrp->e_phnum >= PN_XNUM)
1083
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1084
95
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1085
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1086
95
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1087
0
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1088
1089
  /* at this point we've concocted all the ELF sections...  */
1090
95
  if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*x_shdrp), &amt))
1091
0
    {
1092
0
      bfd_set_error (bfd_error_no_memory);
1093
0
      return false;
1094
0
    }
1095
95
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1096
95
  if (!x_shdrp)
1097
0
    return false;
1098
1099
1.61k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1100
1.52k
    {
1101
#if DEBUG & 2
1102
      elf_debug_section (count, *i_shdrp);
1103
#endif
1104
1.52k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1105
1.52k
    }
1106
95
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1107
95
  if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1108
95
      || bfd_bwrite (x_shdrp, amt, abfd) != amt)
1109
0
    return false;
1110
1111
  /* need to dump the string table too...  */
1112
1113
95
  return true;
1114
95
}
1115
1116
bool
1117
elf_checksum_contents (bfd *abfd,
1118
           void (*process) (const void *, size_t, void *),
1119
           void *arg)
1120
0
{
1121
0
  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1122
0
  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1123
0
  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1124
0
  unsigned int count, num;
1125
1126
0
  {
1127
0
    Elf_External_Ehdr x_ehdr;
1128
0
    Elf_Internal_Ehdr i_ehdr;
1129
1130
0
    i_ehdr = *i_ehdrp;
1131
0
    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1132
0
    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1133
0
    (*process) (&x_ehdr, sizeof x_ehdr, arg);
1134
0
  }
1135
1136
0
  num = i_ehdrp->e_phnum;
1137
0
  for (count = 0; count < num; count++)
1138
0
    {
1139
0
      Elf_External_Phdr x_phdr;
1140
0
      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1141
0
      (*process) (&x_phdr, sizeof x_phdr, arg);
1142
0
    }
1143
1144
0
  num = elf_numsections (abfd);
1145
0
  for (count = 0; count < num; count++)
1146
0
    {
1147
0
      Elf_Internal_Shdr i_shdr;
1148
0
      Elf_External_Shdr x_shdr;
1149
0
      bfd_byte *contents, *free_contents;
1150
1151
0
      i_shdr = *i_shdrp[count];
1152
0
      i_shdr.sh_offset = 0;
1153
1154
0
      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1155
0
      (*process) (&x_shdr, sizeof x_shdr, arg);
1156
1157
      /* Process the section's contents, if it has some.
1158
   PR ld/12451: Read them in if necessary.  */
1159
0
      if (i_shdr.sh_type == SHT_NOBITS)
1160
0
  continue;
1161
0
      free_contents = NULL;
1162
0
      contents = i_shdr.contents;
1163
0
      if (contents == NULL)
1164
0
  {
1165
0
    asection *sec;
1166
1167
0
    sec = bfd_section_from_elf_index (abfd, count);
1168
0
    if (sec != NULL)
1169
0
      {
1170
0
        contents = sec->contents;
1171
0
        if (contents == NULL)
1172
0
    {
1173
      /* Force rereading from file.  */
1174
0
      sec->flags &= ~SEC_IN_MEMORY;
1175
0
      if (!bfd_malloc_and_get_section (abfd, sec, &free_contents))
1176
0
        continue;
1177
0
      contents = free_contents;
1178
0
    }
1179
0
      }
1180
0
  }
1181
0
      if (contents != NULL)
1182
0
  {
1183
0
    (*process) (contents, i_shdr.sh_size, arg);
1184
0
    free (free_contents);
1185
0
  }
1186
0
    }
1187
1188
0
  return true;
1189
0
}
Unexecuted instantiation: bfd_elf64_checksum_contents
Unexecuted instantiation: bfd_elf32_checksum_contents
1190
1191
long
1192
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic)
1193
4.58k
{
1194
4.58k
  Elf_Internal_Shdr *hdr;
1195
4.58k
  Elf_Internal_Shdr *verhdr;
1196
4.58k
  unsigned long symcount; /* Number of external ELF symbols */
1197
4.58k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
4.58k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
4.58k
  Elf_Internal_Sym *isym;
1200
4.58k
  Elf_Internal_Sym *isymend;
1201
4.58k
  Elf_Internal_Sym *isymbuf = NULL;
1202
4.58k
  Elf_External_Versym *xver;
1203
4.58k
  Elf_External_Versym *xverbuf = NULL;
1204
4.58k
  const struct elf_backend_data *ebd;
1205
4.58k
  size_t amt;
1206
1207
  /* Read each raw ELF symbol, converting from external ELF form to
1208
     internal ELF form, and then using the information to create a
1209
     canonical bfd symbol table entry.
1210
1211
     Note that we allocate the initial bfd canonical symbol buffer
1212
     based on a one-to-one mapping of the ELF symbols to canonical
1213
     symbols.  We actually use all the ELF symbols, so there will be no
1214
     space left over at the end.  When we have all the symbols, we
1215
     build the caller's pointer vector.  */
1216
1217
4.58k
  if (! dynamic)
1218
4.39k
    {
1219
4.39k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
4.39k
      verhdr = NULL;
1221
4.39k
    }
1222
194
  else
1223
194
    {
1224
194
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1225
194
      if (elf_dynversym (abfd) == 0)
1226
29
  verhdr = NULL;
1227
165
      else
1228
165
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1229
194
      if ((elf_dynverdef (abfd) != 0
1230
194
     && elf_tdata (abfd)->verdef == NULL)
1231
194
    || (elf_dynverref (abfd) != 0
1232
188
        && elf_tdata (abfd)->verref == NULL))
1233
85
  {
1234
85
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1235
20
      return -1;
1236
85
  }
1237
194
    }
1238
1239
4.56k
  ebd = get_elf_backend_data (abfd);
1240
4.56k
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
4.56k
  if (symcount == 0)
1242
311
    sym = symbase = NULL;
1243
4.25k
  else
1244
4.25k
    {
1245
4.25k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
4.25k
              NULL, NULL, NULL);
1247
4.25k
      if (isymbuf == NULL)
1248
167
  return -1;
1249
1250
4.08k
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1251
0
  {
1252
0
    bfd_set_error (bfd_error_file_too_big);
1253
0
    goto error_return;
1254
0
  }
1255
4.08k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
4.08k
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
4.08k
      if (verhdr != NULL
1261
4.08k
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1262
72
  {
1263
72
    _bfd_error_handler
1264
      /* xgettext:c-format */
1265
72
      (_("%pB: version count (%" PRId64 ")"
1266
72
         " does not match symbol count (%ld)"),
1267
72
       abfd,
1268
72
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1269
72
       symcount);
1270
1271
    /* Slurp in the symbols without the version information,
1272
       since that is more helpful than just quitting.  */
1273
72
    verhdr = NULL;
1274
72
  }
1275
1276
4.08k
      if (verhdr != NULL)
1277
56
  {
1278
56
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1279
1
      goto error_return;
1280
55
    xverbuf = (Elf_External_Versym *)
1281
55
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1282
55
    if (xverbuf == NULL && verhdr->sh_size != 0)
1283
0
      goto error_return;
1284
55
  }
1285
1286
      /* Skip first symbol, which is a null dummy.  */
1287
4.08k
      xver = xverbuf;
1288
4.08k
      if (xver != NULL)
1289
55
  ++xver;
1290
4.08k
      isymend = isymbuf + symcount;
1291
878k
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
874k
  {
1293
874k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
874k
    sym->symbol.the_bfd = abfd;
1296
874k
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
874k
    sym->symbol.value = isym->st_value;
1298
1299
874k
    if (isym->st_shndx == SHN_UNDEF)
1300
310k
      {
1301
310k
        sym->symbol.section = bfd_und_section_ptr;
1302
310k
      }
1303
563k
    else if (isym->st_shndx == SHN_ABS)
1304
9.69k
      {
1305
9.69k
        sym->symbol.section = bfd_abs_section_ptr;
1306
9.69k
      }
1307
554k
    else if (isym->st_shndx == SHN_COMMON)
1308
196
      {
1309
196
        sym->symbol.section = bfd_com_section_ptr;
1310
196
        if ((abfd->flags & BFD_PLUGIN) != 0)
1311
0
    {
1312
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1313
1314
0
      if (xc == NULL)
1315
0
        {
1316
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1317
0
          | SEC_EXCLUDE);
1318
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1319
0
          if (xc == NULL)
1320
0
      goto error_return;
1321
0
        }
1322
0
      sym->symbol.section = xc;
1323
0
    }
1324
        /* Elf puts the alignment into the `value' field, and
1325
     the size into the `size' field.  BFD wants to see the
1326
     size in the value field, and doesn't care (at the
1327
     moment) about the alignment.  */
1328
196
        sym->symbol.value = isym->st_size;
1329
196
      }
1330
554k
    else
1331
554k
      {
1332
554k
        sym->symbol.section
1333
554k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
554k
        if (sym->symbol.section == NULL)
1335
289k
    {
1336
      /* This symbol is in a section for which we did not
1337
         create a BFD section.  Just use bfd_abs_section,
1338
         although it is wrong.  FIXME.  Note - there is
1339
         code in elf.c:swap_out_syms that calls
1340
         symbol_section_index() in the elf backend for
1341
         cases like this.  */
1342
289k
      sym->symbol.section = bfd_abs_section_ptr;
1343
289k
    }
1344
554k
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
874k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
392k
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
874k
    switch (ELF_ST_BIND (isym->st_info))
1352
874k
      {
1353
501k
      case STB_LOCAL:
1354
501k
        sym->symbol.flags |= BSF_LOCAL;
1355
501k
        break;
1356
178k
      case STB_GLOBAL:
1357
178k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
98.7k
    sym->symbol.flags |= BSF_GLOBAL;
1359
178k
        break;
1360
30.6k
      case STB_WEAK:
1361
30.6k
        sym->symbol.flags |= BSF_WEAK;
1362
30.6k
        break;
1363
7.11k
      case STB_GNU_UNIQUE:
1364
7.11k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
7.11k
        break;
1366
874k
      }
1367
1368
874k
    switch (ELF_ST_TYPE (isym->st_info))
1369
874k
      {
1370
74.0k
      case STT_SECTION:
1371
        /* Mark the input section symbol as used since it may be
1372
           used for relocation and section group.
1373
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1374
     be cleared by objcopy for non-relocatable inputs.  */
1375
74.0k
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
74.0k
            | BSF_DEBUGGING
1377
74.0k
            | BSF_SECTION_SYM_USED);
1378
74.0k
        break;
1379
27.4k
      case STT_FILE:
1380
27.4k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
27.4k
        break;
1382
133k
      case STT_FUNC:
1383
133k
        sym->symbol.flags |= BSF_FUNCTION;
1384
133k
        break;
1385
17.7k
      case STT_COMMON:
1386
        /* FIXME: Do we have to put the size field into the value field
1387
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1388
17.7k
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
138k
      case STT_OBJECT:
1391
138k
        sym->symbol.flags |= BSF_OBJECT;
1392
138k
        break;
1393
14.1k
      case STT_TLS:
1394
14.1k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
14.1k
        break;
1396
14.6k
      case STT_RELC:
1397
14.6k
        sym->symbol.flags |= BSF_RELC;
1398
14.6k
        break;
1399
14.0k
      case STT_SRELC:
1400
14.0k
        sym->symbol.flags |= BSF_SRELC;
1401
14.0k
        break;
1402
13.9k
      case STT_GNU_IFUNC:
1403
13.9k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
13.9k
        break;
1405
874k
      }
1406
1407
874k
    if (dynamic)
1408
187k
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
874k
    if (xver != NULL)
1411
60.3k
      {
1412
60.3k
        Elf_Internal_Versym iversym;
1413
1414
60.3k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1415
60.3k
        sym->version = iversym.vs_vers;
1416
60.3k
        xver++;
1417
60.3k
      }
1418
1419
    /* Do some backend-specific processing on this symbol.  */
1420
874k
    if (ebd->elf_backend_symbol_processing)
1421
540k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
874k
  }
1423
4.08k
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
4.39k
  if (ebd->elf_backend_symbol_table_processing)
1427
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1428
1429
  /* We rely on the zalloc to clear out the final symbol entry.  */
1430
1431
4.39k
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
4.39k
  if (symptrs)
1435
4.39k
    {
1436
4.39k
      long l = symcount;
1437
1438
4.39k
      sym = symbase;
1439
878k
      while (l-- > 0)
1440
874k
  {
1441
874k
    *symptrs++ = &sym->symbol;
1442
874k
    sym++;
1443
874k
  }
1444
4.39k
      *symptrs = 0;   /* Final null pointer */
1445
4.39k
    }
1446
1447
4.39k
  free (xverbuf);
1448
4.39k
  if (hdr->contents != (unsigned char *) isymbuf)
1449
4.08k
    free (isymbuf);
1450
4.39k
  return symcount;
1451
1452
1
 error_return:
1453
1
  free (xverbuf);
1454
1
  if (hdr->contents != (unsigned char *) isymbuf)
1455
1
    free (isymbuf);
1456
1
  return -1;
1457
4.56k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1193
3.98k
{
1194
3.98k
  Elf_Internal_Shdr *hdr;
1195
3.98k
  Elf_Internal_Shdr *verhdr;
1196
3.98k
  unsigned long symcount; /* Number of external ELF symbols */
1197
3.98k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
3.98k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
3.98k
  Elf_Internal_Sym *isym;
1200
3.98k
  Elf_Internal_Sym *isymend;
1201
3.98k
  Elf_Internal_Sym *isymbuf = NULL;
1202
3.98k
  Elf_External_Versym *xver;
1203
3.98k
  Elf_External_Versym *xverbuf = NULL;
1204
3.98k
  const struct elf_backend_data *ebd;
1205
3.98k
  size_t amt;
1206
1207
  /* Read each raw ELF symbol, converting from external ELF form to
1208
     internal ELF form, and then using the information to create a
1209
     canonical bfd symbol table entry.
1210
1211
     Note that we allocate the initial bfd canonical symbol buffer
1212
     based on a one-to-one mapping of the ELF symbols to canonical
1213
     symbols.  We actually use all the ELF symbols, so there will be no
1214
     space left over at the end.  When we have all the symbols, we
1215
     build the caller's pointer vector.  */
1216
1217
3.98k
  if (! dynamic)
1218
3.90k
    {
1219
3.90k
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
3.90k
      verhdr = NULL;
1221
3.90k
    }
1222
84
  else
1223
84
    {
1224
84
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1225
84
      if (elf_dynversym (abfd) == 0)
1226
25
  verhdr = NULL;
1227
59
      else
1228
59
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1229
84
      if ((elf_dynverdef (abfd) != 0
1230
84
     && elf_tdata (abfd)->verdef == NULL)
1231
84
    || (elf_dynverref (abfd) != 0
1232
78
        && elf_tdata (abfd)->verref == NULL))
1233
34
  {
1234
34
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1235
19
      return -1;
1236
34
  }
1237
84
    }
1238
1239
3.96k
  ebd = get_elf_backend_data (abfd);
1240
3.96k
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
3.96k
  if (symcount == 0)
1242
186
    sym = symbase = NULL;
1243
3.78k
  else
1244
3.78k
    {
1245
3.78k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
3.78k
              NULL, NULL, NULL);
1247
3.78k
      if (isymbuf == NULL)
1248
127
  return -1;
1249
1250
3.65k
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1251
0
  {
1252
0
    bfd_set_error (bfd_error_file_too_big);
1253
0
    goto error_return;
1254
0
  }
1255
3.65k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
3.65k
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
3.65k
      if (verhdr != NULL
1261
3.65k
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1262
7
  {
1263
7
    _bfd_error_handler
1264
      /* xgettext:c-format */
1265
7
      (_("%pB: version count (%" PRId64 ")"
1266
7
         " does not match symbol count (%ld)"),
1267
7
       abfd,
1268
7
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1269
7
       symcount);
1270
1271
    /* Slurp in the symbols without the version information,
1272
       since that is more helpful than just quitting.  */
1273
7
    verhdr = NULL;
1274
7
  }
1275
1276
3.65k
      if (verhdr != NULL)
1277
29
  {
1278
29
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1279
1
      goto error_return;
1280
28
    xverbuf = (Elf_External_Versym *)
1281
28
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1282
28
    if (xverbuf == NULL && verhdr->sh_size != 0)
1283
0
      goto error_return;
1284
28
  }
1285
1286
      /* Skip first symbol, which is a null dummy.  */
1287
3.65k
      xver = xverbuf;
1288
3.65k
      if (xver != NULL)
1289
28
  ++xver;
1290
3.65k
      isymend = isymbuf + symcount;
1291
463k
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
460k
  {
1293
460k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
460k
    sym->symbol.the_bfd = abfd;
1296
460k
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
460k
    sym->symbol.value = isym->st_value;
1298
1299
460k
    if (isym->st_shndx == SHN_UNDEF)
1300
190k
      {
1301
190k
        sym->symbol.section = bfd_und_section_ptr;
1302
190k
      }
1303
269k
    else if (isym->st_shndx == SHN_ABS)
1304
3.06k
      {
1305
3.06k
        sym->symbol.section = bfd_abs_section_ptr;
1306
3.06k
      }
1307
265k
    else if (isym->st_shndx == SHN_COMMON)
1308
195
      {
1309
195
        sym->symbol.section = bfd_com_section_ptr;
1310
195
        if ((abfd->flags & BFD_PLUGIN) != 0)
1311
0
    {
1312
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1313
1314
0
      if (xc == NULL)
1315
0
        {
1316
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1317
0
          | SEC_EXCLUDE);
1318
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1319
0
          if (xc == NULL)
1320
0
      goto error_return;
1321
0
        }
1322
0
      sym->symbol.section = xc;
1323
0
    }
1324
        /* Elf puts the alignment into the `value' field, and
1325
     the size into the `size' field.  BFD wants to see the
1326
     size in the value field, and doesn't care (at the
1327
     moment) about the alignment.  */
1328
195
        sym->symbol.value = isym->st_size;
1329
195
      }
1330
265k
    else
1331
265k
      {
1332
265k
        sym->symbol.section
1333
265k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
265k
        if (sym->symbol.section == NULL)
1335
106k
    {
1336
      /* This symbol is in a section for which we did not
1337
         create a BFD section.  Just use bfd_abs_section,
1338
         although it is wrong.  FIXME.  Note - there is
1339
         code in elf.c:swap_out_syms that calls
1340
         symbol_section_index() in the elf backend for
1341
         cases like this.  */
1342
106k
      sym->symbol.section = bfd_abs_section_ptr;
1343
106k
    }
1344
265k
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
460k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
163k
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
460k
    switch (ELF_ST_BIND (isym->st_info))
1352
460k
      {
1353
309k
      case STB_LOCAL:
1354
309k
        sym->symbol.flags |= BSF_LOCAL;
1355
309k
        break;
1356
79.2k
      case STB_GLOBAL:
1357
79.2k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
27.9k
    sym->symbol.flags |= BSF_GLOBAL;
1359
79.2k
        break;
1360
12.9k
      case STB_WEAK:
1361
12.9k
        sym->symbol.flags |= BSF_WEAK;
1362
12.9k
        break;
1363
3.24k
      case STB_GNU_UNIQUE:
1364
3.24k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
3.24k
        break;
1366
460k
      }
1367
1368
460k
    switch (ELF_ST_TYPE (isym->st_info))
1369
460k
      {
1370
55.0k
      case STT_SECTION:
1371
        /* Mark the input section symbol as used since it may be
1372
           used for relocation and section group.
1373
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1374
     be cleared by objcopy for non-relocatable inputs.  */
1375
55.0k
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
55.0k
            | BSF_DEBUGGING
1377
55.0k
            | BSF_SECTION_SYM_USED);
1378
55.0k
        break;
1379
9.22k
      case STT_FILE:
1380
9.22k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
9.22k
        break;
1382
37.5k
      case STT_FUNC:
1383
37.5k
        sym->symbol.flags |= BSF_FUNCTION;
1384
37.5k
        break;
1385
5.23k
      case STT_COMMON:
1386
        /* FIXME: Do we have to put the size field into the value field
1387
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1388
5.23k
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
85.4k
      case STT_OBJECT:
1391
85.4k
        sym->symbol.flags |= BSF_OBJECT;
1392
85.4k
        break;
1393
8.01k
      case STT_TLS:
1394
8.01k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
8.01k
        break;
1396
6.54k
      case STT_RELC:
1397
6.54k
        sym->symbol.flags |= BSF_RELC;
1398
6.54k
        break;
1399
3.66k
      case STT_SRELC:
1400
3.66k
        sym->symbol.flags |= BSF_SRELC;
1401
3.66k
        break;
1402
5.87k
      case STT_GNU_IFUNC:
1403
5.87k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
5.87k
        break;
1405
460k
      }
1406
1407
460k
    if (dynamic)
1408
23.7k
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
460k
    if (xver != NULL)
1411
23.2k
      {
1412
23.2k
        Elf_Internal_Versym iversym;
1413
1414
23.2k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1415
23.2k
        sym->version = iversym.vs_vers;
1416
23.2k
        xver++;
1417
23.2k
      }
1418
1419
    /* Do some backend-specific processing on this symbol.  */
1420
460k
    if (ebd->elf_backend_symbol_processing)
1421
384k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
460k
  }
1423
3.65k
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
3.83k
  if (ebd->elf_backend_symbol_table_processing)
1427
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1428
1429
  /* We rely on the zalloc to clear out the final symbol entry.  */
1430
1431
3.83k
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
3.83k
  if (symptrs)
1435
3.83k
    {
1436
3.83k
      long l = symcount;
1437
1438
3.83k
      sym = symbase;
1439
463k
      while (l-- > 0)
1440
460k
  {
1441
460k
    *symptrs++ = &sym->symbol;
1442
460k
    sym++;
1443
460k
  }
1444
3.83k
      *symptrs = 0;   /* Final null pointer */
1445
3.83k
    }
1446
1447
3.83k
  free (xverbuf);
1448
3.83k
  if (hdr->contents != (unsigned char *) isymbuf)
1449
3.65k
    free (isymbuf);
1450
3.83k
  return symcount;
1451
1452
1
 error_return:
1453
1
  free (xverbuf);
1454
1
  if (hdr->contents != (unsigned char *) isymbuf)
1455
1
    free (isymbuf);
1456
1
  return -1;
1457
3.96k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1193
601
{
1194
601
  Elf_Internal_Shdr *hdr;
1195
601
  Elf_Internal_Shdr *verhdr;
1196
601
  unsigned long symcount; /* Number of external ELF symbols */
1197
601
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1198
601
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1199
601
  Elf_Internal_Sym *isym;
1200
601
  Elf_Internal_Sym *isymend;
1201
601
  Elf_Internal_Sym *isymbuf = NULL;
1202
601
  Elf_External_Versym *xver;
1203
601
  Elf_External_Versym *xverbuf = NULL;
1204
601
  const struct elf_backend_data *ebd;
1205
601
  size_t amt;
1206
1207
  /* Read each raw ELF symbol, converting from external ELF form to
1208
     internal ELF form, and then using the information to create a
1209
     canonical bfd symbol table entry.
1210
1211
     Note that we allocate the initial bfd canonical symbol buffer
1212
     based on a one-to-one mapping of the ELF symbols to canonical
1213
     symbols.  We actually use all the ELF symbols, so there will be no
1214
     space left over at the end.  When we have all the symbols, we
1215
     build the caller's pointer vector.  */
1216
1217
601
  if (! dynamic)
1218
491
    {
1219
491
      hdr = &elf_tdata (abfd)->symtab_hdr;
1220
491
      verhdr = NULL;
1221
491
    }
1222
110
  else
1223
110
    {
1224
110
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1225
110
      if (elf_dynversym (abfd) == 0)
1226
4
  verhdr = NULL;
1227
106
      else
1228
106
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1229
110
      if ((elf_dynverdef (abfd) != 0
1230
110
     && elf_tdata (abfd)->verdef == NULL)
1231
110
    || (elf_dynverref (abfd) != 0
1232
110
        && elf_tdata (abfd)->verref == NULL))
1233
51
  {
1234
51
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1235
1
      return -1;
1236
51
  }
1237
110
    }
1238
1239
600
  ebd = get_elf_backend_data (abfd);
1240
600
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1241
600
  if (symcount == 0)
1242
125
    sym = symbase = NULL;
1243
475
  else
1244
475
    {
1245
475
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1246
475
              NULL, NULL, NULL);
1247
475
      if (isymbuf == NULL)
1248
40
  return -1;
1249
1250
435
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1251
0
  {
1252
0
    bfd_set_error (bfd_error_file_too_big);
1253
0
    goto error_return;
1254
0
  }
1255
435
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1256
435
      if (symbase == (elf_symbol_type *) NULL)
1257
0
  goto error_return;
1258
1259
      /* Read the raw ELF version symbol information.  */
1260
435
      if (verhdr != NULL
1261
435
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1262
65
  {
1263
65
    _bfd_error_handler
1264
      /* xgettext:c-format */
1265
65
      (_("%pB: version count (%" PRId64 ")"
1266
65
         " does not match symbol count (%ld)"),
1267
65
       abfd,
1268
65
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1269
65
       symcount);
1270
1271
    /* Slurp in the symbols without the version information,
1272
       since that is more helpful than just quitting.  */
1273
65
    verhdr = NULL;
1274
65
  }
1275
1276
435
      if (verhdr != NULL)
1277
27
  {
1278
27
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1279
0
      goto error_return;
1280
27
    xverbuf = (Elf_External_Versym *)
1281
27
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1282
27
    if (xverbuf == NULL && verhdr->sh_size != 0)
1283
0
      goto error_return;
1284
27
  }
1285
1286
      /* Skip first symbol, which is a null dummy.  */
1287
435
      xver = xverbuf;
1288
435
      if (xver != NULL)
1289
27
  ++xver;
1290
435
      isymend = isymbuf + symcount;
1291
414k
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1292
414k
  {
1293
414k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1294
1295
414k
    sym->symbol.the_bfd = abfd;
1296
414k
    sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1297
414k
    sym->symbol.value = isym->st_value;
1298
1299
414k
    if (isym->st_shndx == SHN_UNDEF)
1300
119k
      {
1301
119k
        sym->symbol.section = bfd_und_section_ptr;
1302
119k
      }
1303
294k
    else if (isym->st_shndx == SHN_ABS)
1304
6.63k
      {
1305
6.63k
        sym->symbol.section = bfd_abs_section_ptr;
1306
6.63k
      }
1307
288k
    else if (isym->st_shndx == SHN_COMMON)
1308
1
      {
1309
1
        sym->symbol.section = bfd_com_section_ptr;
1310
1
        if ((abfd->flags & BFD_PLUGIN) != 0)
1311
0
    {
1312
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1313
1314
0
      if (xc == NULL)
1315
0
        {
1316
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1317
0
          | SEC_EXCLUDE);
1318
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1319
0
          if (xc == NULL)
1320
0
      goto error_return;
1321
0
        }
1322
0
      sym->symbol.section = xc;
1323
0
    }
1324
        /* Elf puts the alignment into the `value' field, and
1325
     the size into the `size' field.  BFD wants to see the
1326
     size in the value field, and doesn't care (at the
1327
     moment) about the alignment.  */
1328
1
        sym->symbol.value = isym->st_size;
1329
1
      }
1330
288k
    else
1331
288k
      {
1332
288k
        sym->symbol.section
1333
288k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1334
288k
        if (sym->symbol.section == NULL)
1335
182k
    {
1336
      /* This symbol is in a section for which we did not
1337
         create a BFD section.  Just use bfd_abs_section,
1338
         although it is wrong.  FIXME.  Note - there is
1339
         code in elf.c:swap_out_syms that calls
1340
         symbol_section_index() in the elf backend for
1341
         cases like this.  */
1342
182k
      sym->symbol.section = bfd_abs_section_ptr;
1343
182k
    }
1344
288k
      }
1345
1346
    /* If this is a relocatable file, then the symbol value is
1347
       already section relative.  */
1348
414k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1349
228k
      sym->symbol.value -= sym->symbol.section->vma;
1350
1351
414k
    switch (ELF_ST_BIND (isym->st_info))
1352
414k
      {
1353
191k
      case STB_LOCAL:
1354
191k
        sym->symbol.flags |= BSF_LOCAL;
1355
191k
        break;
1356
99.6k
      case STB_GLOBAL:
1357
99.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1358
70.8k
    sym->symbol.flags |= BSF_GLOBAL;
1359
99.6k
        break;
1360
17.6k
      case STB_WEAK:
1361
17.6k
        sym->symbol.flags |= BSF_WEAK;
1362
17.6k
        break;
1363
3.87k
      case STB_GNU_UNIQUE:
1364
3.87k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1365
3.87k
        break;
1366
414k
      }
1367
1368
414k
    switch (ELF_ST_TYPE (isym->st_info))
1369
414k
      {
1370
18.9k
      case STT_SECTION:
1371
        /* Mark the input section symbol as used since it may be
1372
           used for relocation and section group.
1373
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1374
     be cleared by objcopy for non-relocatable inputs.  */
1375
18.9k
        sym->symbol.flags |= (BSF_SECTION_SYM
1376
18.9k
            | BSF_DEBUGGING
1377
18.9k
            | BSF_SECTION_SYM_USED);
1378
18.9k
        break;
1379
18.2k
      case STT_FILE:
1380
18.2k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1381
18.2k
        break;
1382
95.6k
      case STT_FUNC:
1383
95.6k
        sym->symbol.flags |= BSF_FUNCTION;
1384
95.6k
        break;
1385
12.4k
      case STT_COMMON:
1386
        /* FIXME: Do we have to put the size field into the value field
1387
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1388
12.4k
        sym->symbol.flags |= BSF_ELF_COMMON;
1389
        /* Fall through.  */
1390
52.5k
      case STT_OBJECT:
1391
52.5k
        sym->symbol.flags |= BSF_OBJECT;
1392
52.5k
        break;
1393
6.14k
      case STT_TLS:
1394
6.14k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1395
6.14k
        break;
1396
8.08k
      case STT_RELC:
1397
8.08k
        sym->symbol.flags |= BSF_RELC;
1398
8.08k
        break;
1399
10.3k
      case STT_SRELC:
1400
10.3k
        sym->symbol.flags |= BSF_SRELC;
1401
10.3k
        break;
1402
8.05k
      case STT_GNU_IFUNC:
1403
8.05k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1404
8.05k
        break;
1405
414k
      }
1406
1407
414k
    if (dynamic)
1408
163k
      sym->symbol.flags |= BSF_DYNAMIC;
1409
1410
414k
    if (xver != NULL)
1411
37.1k
      {
1412
37.1k
        Elf_Internal_Versym iversym;
1413
1414
37.1k
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1415
37.1k
        sym->version = iversym.vs_vers;
1416
37.1k
        xver++;
1417
37.1k
      }
1418
1419
    /* Do some backend-specific processing on this symbol.  */
1420
414k
    if (ebd->elf_backend_symbol_processing)
1421
156k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1422
414k
  }
1423
435
    }
1424
1425
  /* Do some backend-specific processing on this symbol table.  */
1426
560
  if (ebd->elf_backend_symbol_table_processing)
1427
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1428
1429
  /* We rely on the zalloc to clear out the final symbol entry.  */
1430
1431
560
  symcount = sym - symbase;
1432
1433
  /* Fill in the user's symbol pointer vector if needed.  */
1434
560
  if (symptrs)
1435
560
    {
1436
560
      long l = symcount;
1437
1438
560
      sym = symbase;
1439
414k
      while (l-- > 0)
1440
414k
  {
1441
414k
    *symptrs++ = &sym->symbol;
1442
414k
    sym++;
1443
414k
  }
1444
560
      *symptrs = 0;   /* Final null pointer */
1445
560
    }
1446
1447
560
  free (xverbuf);
1448
560
  if (hdr->contents != (unsigned char *) isymbuf)
1449
435
    free (isymbuf);
1450
560
  return symcount;
1451
1452
0
 error_return:
1453
0
  free (xverbuf);
1454
0
  if (hdr->contents != (unsigned char *) isymbuf)
1455
0
    free (isymbuf);
1456
0
  return -1;
1457
600
}
1458
1459
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1460
   them.  */
1461
1462
static bool
1463
elf_slurp_reloc_table_from_section (bfd *abfd,
1464
            asection *asect,
1465
            Elf_Internal_Shdr *rel_hdr,
1466
            bfd_size_type reloc_count,
1467
            arelent *relents,
1468
            asymbol **symbols,
1469
            bool dynamic)
1470
17.1k
{
1471
17.1k
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1472
17.1k
  void *allocated = NULL;
1473
17.1k
  bfd_byte *native_relocs;
1474
17.1k
  arelent *relent;
1475
17.1k
  unsigned int i;
1476
17.1k
  int entsize;
1477
17.1k
  unsigned int symcount;
1478
1479
17.1k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1480
216
    return false;
1481
16.9k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1482
16.9k
  if (allocated == NULL)
1483
265
    return false;
1484
1485
16.6k
  native_relocs = (bfd_byte *) allocated;
1486
1487
16.6k
  entsize = rel_hdr->sh_entsize;
1488
16.6k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1489
16.6k
        || entsize == sizeof (Elf_External_Rela));
1490
1491
16.6k
  if (dynamic)
1492
67
    symcount = bfd_get_dynamic_symcount (abfd);
1493
16.6k
  else
1494
16.6k
    symcount = bfd_get_symcount (abfd);
1495
1496
16.6k
  for (i = 0, relent = relents;
1497
884k
       i < reloc_count;
1498
868k
       i++, relent++, native_relocs += entsize)
1499
869k
    {
1500
869k
      bool res;
1501
869k
      Elf_Internal_Rela rela;
1502
1503
869k
      if (entsize == sizeof (Elf_External_Rela))
1504
854k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1505
14.6k
      else
1506
14.6k
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1507
1508
      /* The address of an ELF reloc is section relative for an object
1509
   file, and absolute for an executable file or shared library.
1510
   The address of a normal BFD reloc is always section relative,
1511
   and the address of a dynamic reloc is absolute..  */
1512
869k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1513
865k
  relent->address = rela.r_offset;
1514
3.41k
      else
1515
3.41k
  relent->address = rela.r_offset - asect->vma;
1516
1517
869k
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1518
  /* FIXME: This and the error case below mean that we have a
1519
     symbol on relocs that is not elf_symbol_type.  */
1520
9.72k
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1521
859k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1522
16.2k
  {
1523
16.2k
    _bfd_error_handler
1524
      /* xgettext:c-format */
1525
16.2k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1526
16.2k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1527
16.2k
    bfd_set_error (bfd_error_bad_value);
1528
16.2k
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1529
16.2k
  }
1530
843k
      else
1531
843k
  {
1532
843k
    asymbol **ps;
1533
1534
843k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1535
1536
843k
    relent->sym_ptr_ptr = ps;
1537
843k
  }
1538
1539
869k
      relent->addend = rela.r_addend;
1540
1541
869k
      if ((entsize == sizeof (Elf_External_Rela)
1542
869k
     && ebd->elf_info_to_howto != NULL)
1543
869k
    || ebd->elf_info_to_howto_rel == NULL)
1544
854k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1545
14.6k
      else
1546
14.6k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1547
1548
869k
      if (! res || relent->howto == NULL)
1549
1.25k
  goto error_return;
1550
869k
    }
1551
1552
15.4k
  free (allocated);
1553
15.4k
  return true;
1554
1555
1.25k
 error_return:
1556
1.25k
  free (allocated);
1557
1.25k
  return false;
1558
16.6k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1470
17.1k
{
1471
17.1k
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1472
17.1k
  void *allocated = NULL;
1473
17.1k
  bfd_byte *native_relocs;
1474
17.1k
  arelent *relent;
1475
17.1k
  unsigned int i;
1476
17.1k
  int entsize;
1477
17.1k
  unsigned int symcount;
1478
1479
17.1k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1480
216
    return false;
1481
16.9k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1482
16.9k
  if (allocated == NULL)
1483
265
    return false;
1484
1485
16.6k
  native_relocs = (bfd_byte *) allocated;
1486
1487
16.6k
  entsize = rel_hdr->sh_entsize;
1488
16.6k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1489
16.6k
        || entsize == sizeof (Elf_External_Rela));
1490
1491
16.6k
  if (dynamic)
1492
38
    symcount = bfd_get_dynamic_symcount (abfd);
1493
16.6k
  else
1494
16.6k
    symcount = bfd_get_symcount (abfd);
1495
1496
16.6k
  for (i = 0, relent = relents;
1497
868k
       i < reloc_count;
1498
852k
       i++, relent++, native_relocs += entsize)
1499
853k
    {
1500
853k
      bool res;
1501
853k
      Elf_Internal_Rela rela;
1502
1503
853k
      if (entsize == sizeof (Elf_External_Rela))
1504
853k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1505
0
      else
1506
0
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1507
1508
      /* The address of an ELF reloc is section relative for an object
1509
   file, and absolute for an executable file or shared library.
1510
   The address of a normal BFD reloc is always section relative,
1511
   and the address of a dynamic reloc is absolute..  */
1512
853k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1513
849k
  relent->address = rela.r_offset;
1514
3.41k
      else
1515
3.41k
  relent->address = rela.r_offset - asect->vma;
1516
1517
853k
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1518
  /* FIXME: This and the error case below mean that we have a
1519
     symbol on relocs that is not elf_symbol_type.  */
1520
9.02k
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1521
844k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1522
16.2k
  {
1523
16.2k
    _bfd_error_handler
1524
      /* xgettext:c-format */
1525
16.2k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1526
16.2k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1527
16.2k
    bfd_set_error (bfd_error_bad_value);
1528
16.2k
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1529
16.2k
  }
1530
828k
      else
1531
828k
  {
1532
828k
    asymbol **ps;
1533
1534
828k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1535
1536
828k
    relent->sym_ptr_ptr = ps;
1537
828k
  }
1538
1539
853k
      relent->addend = rela.r_addend;
1540
1541
853k
      if ((entsize == sizeof (Elf_External_Rela)
1542
853k
     && ebd->elf_info_to_howto != NULL)
1543
853k
    || ebd->elf_info_to_howto_rel == NULL)
1544
853k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1545
0
      else
1546
0
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1547
1548
853k
      if (! res || relent->howto == NULL)
1549
1.25k
  goto error_return;
1550
853k
    }
1551
1552
15.3k
  free (allocated);
1553
15.3k
  return true;
1554
1555
1.25k
 error_return:
1556
1.25k
  free (allocated);
1557
1.25k
  return false;
1558
16.6k
}
elf32.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1470
29
{
1471
29
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1472
29
  void *allocated = NULL;
1473
29
  bfd_byte *native_relocs;
1474
29
  arelent *relent;
1475
29
  unsigned int i;
1476
29
  int entsize;
1477
29
  unsigned int symcount;
1478
1479
29
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1480
0
    return false;
1481
29
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1482
29
  if (allocated == NULL)
1483
0
    return false;
1484
1485
29
  native_relocs = (bfd_byte *) allocated;
1486
1487
29
  entsize = rel_hdr->sh_entsize;
1488
29
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1489
29
        || entsize == sizeof (Elf_External_Rela));
1490
1491
29
  if (dynamic)
1492
29
    symcount = bfd_get_dynamic_symcount (abfd);
1493
0
  else
1494
0
    symcount = bfd_get_symcount (abfd);
1495
1496
29
  for (i = 0, relent = relents;
1497
16.0k
       i < reloc_count;
1498
16.0k
       i++, relent++, native_relocs += entsize)
1499
16.0k
    {
1500
16.0k
      bool res;
1501
16.0k
      Elf_Internal_Rela rela;
1502
1503
16.0k
      if (entsize == sizeof (Elf_External_Rela))
1504
1.32k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1505
14.6k
      else
1506
14.6k
  elf_swap_reloc_in (abfd, native_relocs, &rela);
1507
1508
      /* The address of an ELF reloc is section relative for an object
1509
   file, and absolute for an executable file or shared library.
1510
   The address of a normal BFD reloc is always section relative,
1511
   and the address of a dynamic reloc is absolute..  */
1512
16.0k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1513
16.0k
  relent->address = rela.r_offset;
1514
0
      else
1515
0
  relent->address = rela.r_offset - asect->vma;
1516
1517
16.0k
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1518
  /* FIXME: This and the error case below mean that we have a
1519
     symbol on relocs that is not elf_symbol_type.  */
1520
701
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1521
15.3k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1522
0
  {
1523
0
    _bfd_error_handler
1524
      /* xgettext:c-format */
1525
0
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1526
0
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1527
0
    bfd_set_error (bfd_error_bad_value);
1528
0
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1529
0
  }
1530
15.3k
      else
1531
15.3k
  {
1532
15.3k
    asymbol **ps;
1533
1534
15.3k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1535
1536
15.3k
    relent->sym_ptr_ptr = ps;
1537
15.3k
  }
1538
1539
16.0k
      relent->addend = rela.r_addend;
1540
1541
16.0k
      if ((entsize == sizeof (Elf_External_Rela)
1542
16.0k
     && ebd->elf_info_to_howto != NULL)
1543
16.0k
    || ebd->elf_info_to_howto_rel == NULL)
1544
1.32k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1545
14.6k
      else
1546
14.6k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1547
1548
16.0k
      if (! res || relent->howto == NULL)
1549
0
  goto error_return;
1550
16.0k
    }
1551
1552
29
  free (allocated);
1553
29
  return true;
1554
1555
0
 error_return:
1556
0
  free (allocated);
1557
0
  return false;
1558
29
}
1559
1560
/* Read in and swap the external relocs.  */
1561
1562
bool
1563
elf_slurp_reloc_table (bfd *abfd,
1564
           asection *asect,
1565
           asymbol **symbols,
1566
           bool dynamic)
1567
22.8k
{
1568
22.8k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1569
22.8k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1570
22.8k
  Elf_Internal_Shdr *rel_hdr;
1571
22.8k
  Elf_Internal_Shdr *rel_hdr2;
1572
22.8k
  bfd_size_type reloc_count;
1573
22.8k
  bfd_size_type reloc_count2;
1574
22.8k
  arelent *relents;
1575
22.8k
  size_t amt;
1576
1577
22.8k
  if (asect->relocation != NULL)
1578
2.37k
    return true;
1579
1580
20.4k
  if (! dynamic)
1581
20.3k
    {
1582
20.3k
      if ((asect->flags & SEC_RELOC) == 0
1583
20.3k
    || asect->reloc_count == 0)
1584
3.27k
  return true;
1585
1586
17.1k
      rel_hdr = d->rel.hdr;
1587
17.1k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1588
17.1k
      rel_hdr2 = d->rela.hdr;
1589
17.1k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1590
1591
      /* PR 17512: file: 0b4f81b7.  */
1592
17.1k
      if (asect->reloc_count != reloc_count + reloc_count2)
1593
0
  return false;
1594
17.1k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1595
17.1k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1596
1597
17.1k
    }
1598
67
  else
1599
67
    {
1600
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1601
   case because relocations against this section may use the
1602
   dynamic symbol table, and in that case bfd_section_from_shdr
1603
   in elf.c does not update the RELOC_COUNT.  */
1604
67
      if (asect->size == 0)
1605
0
  return true;
1606
1607
67
      rel_hdr = &d->this_hdr;
1608
67
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1609
67
      rel_hdr2 = NULL;
1610
67
      reloc_count2 = 0;
1611
67
    }
1612
1613
17.1k
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1614
0
    {
1615
0
      bfd_set_error (bfd_error_file_too_big);
1616
0
      return false;
1617
0
    }
1618
17.1k
  relents = (arelent *) bfd_alloc (abfd, amt);
1619
17.1k
  if (relents == NULL)
1620
0
    return false;
1621
1622
17.1k
  if (rel_hdr
1623
17.1k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1624
67
                rel_hdr, reloc_count,
1625
67
                relents,
1626
67
                symbols, dynamic))
1627
6
    return false;
1628
1629
17.1k
  if (rel_hdr2
1630
17.1k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1631
17.1k
                rel_hdr2, reloc_count2,
1632
17.1k
                relents + reloc_count,
1633
17.1k
                symbols, dynamic))
1634
1.73k
    return false;
1635
1636
15.4k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1637
318
    return false;
1638
1639
15.1k
  asect->relocation = relents;
1640
15.1k
  return true;
1641
15.4k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1567
21.2k
{
1568
21.2k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1569
21.2k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1570
21.2k
  Elf_Internal_Shdr *rel_hdr;
1571
21.2k
  Elf_Internal_Shdr *rel_hdr2;
1572
21.2k
  bfd_size_type reloc_count;
1573
21.2k
  bfd_size_type reloc_count2;
1574
21.2k
  arelent *relents;
1575
21.2k
  size_t amt;
1576
1577
21.2k
  if (asect->relocation != NULL)
1578
2.35k
    return true;
1579
1580
18.9k
  if (! dynamic)
1581
18.8k
    {
1582
18.8k
      if ((asect->flags & SEC_RELOC) == 0
1583
18.8k
    || asect->reloc_count == 0)
1584
1.79k
  return true;
1585
1586
17.1k
      rel_hdr = d->rel.hdr;
1587
17.1k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1588
17.1k
      rel_hdr2 = d->rela.hdr;
1589
17.1k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1590
1591
      /* PR 17512: file: 0b4f81b7.  */
1592
17.1k
      if (asect->reloc_count != reloc_count + reloc_count2)
1593
0
  return false;
1594
17.1k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1595
17.1k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1596
1597
17.1k
    }
1598
38
  else
1599
38
    {
1600
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1601
   case because relocations against this section may use the
1602
   dynamic symbol table, and in that case bfd_section_from_shdr
1603
   in elf.c does not update the RELOC_COUNT.  */
1604
38
      if (asect->size == 0)
1605
0
  return true;
1606
1607
38
      rel_hdr = &d->this_hdr;
1608
38
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1609
38
      rel_hdr2 = NULL;
1610
38
      reloc_count2 = 0;
1611
38
    }
1612
1613
17.1k
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1614
0
    {
1615
0
      bfd_set_error (bfd_error_file_too_big);
1616
0
      return false;
1617
0
    }
1618
17.1k
  relents = (arelent *) bfd_alloc (abfd, amt);
1619
17.1k
  if (relents == NULL)
1620
0
    return false;
1621
1622
17.1k
  if (rel_hdr
1623
17.1k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1624
38
                rel_hdr, reloc_count,
1625
38
                relents,
1626
38
                symbols, dynamic))
1627
6
    return false;
1628
1629
17.1k
  if (rel_hdr2
1630
17.1k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1631
17.1k
                rel_hdr2, reloc_count2,
1632
17.1k
                relents + reloc_count,
1633
17.1k
                symbols, dynamic))
1634
1.73k
    return false;
1635
1636
15.3k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1637
318
    return false;
1638
1639
15.0k
  asect->relocation = relents;
1640
15.0k
  return true;
1641
15.3k
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1567
1.53k
{
1568
1.53k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1569
1.53k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1570
1.53k
  Elf_Internal_Shdr *rel_hdr;
1571
1.53k
  Elf_Internal_Shdr *rel_hdr2;
1572
1.53k
  bfd_size_type reloc_count;
1573
1.53k
  bfd_size_type reloc_count2;
1574
1.53k
  arelent *relents;
1575
1.53k
  size_t amt;
1576
1577
1.53k
  if (asect->relocation != NULL)
1578
21
    return true;
1579
1580
1.50k
  if (! dynamic)
1581
1.48k
    {
1582
1.48k
      if ((asect->flags & SEC_RELOC) == 0
1583
1.48k
    || asect->reloc_count == 0)
1584
1.48k
  return true;
1585
1586
0
      rel_hdr = d->rel.hdr;
1587
0
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1588
0
      rel_hdr2 = d->rela.hdr;
1589
0
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1590
1591
      /* PR 17512: file: 0b4f81b7.  */
1592
0
      if (asect->reloc_count != reloc_count + reloc_count2)
1593
0
  return false;
1594
0
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1595
0
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1596
1597
0
    }
1598
29
  else
1599
29
    {
1600
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1601
   case because relocations against this section may use the
1602
   dynamic symbol table, and in that case bfd_section_from_shdr
1603
   in elf.c does not update the RELOC_COUNT.  */
1604
29
      if (asect->size == 0)
1605
0
  return true;
1606
1607
29
      rel_hdr = &d->this_hdr;
1608
29
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1609
29
      rel_hdr2 = NULL;
1610
29
      reloc_count2 = 0;
1611
29
    }
1612
1613
29
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1614
0
    {
1615
0
      bfd_set_error (bfd_error_file_too_big);
1616
0
      return false;
1617
0
    }
1618
29
  relents = (arelent *) bfd_alloc (abfd, amt);
1619
29
  if (relents == NULL)
1620
0
    return false;
1621
1622
29
  if (rel_hdr
1623
29
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1624
29
                rel_hdr, reloc_count,
1625
29
                relents,
1626
29
                symbols, dynamic))
1627
0
    return false;
1628
1629
29
  if (rel_hdr2
1630
29
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1631
0
                rel_hdr2, reloc_count2,
1632
0
                relents + reloc_count,
1633
0
                symbols, dynamic))
1634
0
    return false;
1635
1636
29
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1637
0
    return false;
1638
1639
29
  asect->relocation = relents;
1640
29
  return true;
1641
29
}
1642
1643
#if DEBUG & 2
1644
static void
1645
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1646
{
1647
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1648
     hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1649
     (long) hdr);
1650
  fprintf (stderr,
1651
     "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1652
     (long) hdr->sh_name,
1653
     (long) hdr->sh_type,
1654
     (long) hdr->sh_flags);
1655
  fprintf (stderr,
1656
     "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1657
     (long) hdr->sh_addr,
1658
     (long) hdr->sh_offset,
1659
     (long) hdr->sh_size);
1660
  fprintf (stderr,
1661
     "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1662
     (long) hdr->sh_link,
1663
     (long) hdr->sh_info,
1664
     (long) hdr->sh_addralign);
1665
  fprintf (stderr, "sh_entsize   = %ld\n",
1666
     (long) hdr->sh_entsize);
1667
  fflush (stderr);
1668
}
1669
#endif
1670
1671
#if DEBUG & 1
1672
static void
1673
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1674
{
1675
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1676
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1677
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1678
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1679
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1680
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1681
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1682
}
1683
#endif
1684

1685
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1686
   reconstruct an ELF file by reading the segments out of remote
1687
   memory based on the ELF file header at EHDR_VMA and the ELF program
1688
   headers it points to.  If non-zero, SIZE is the known extent of the
1689
   object.  If not null, *LOADBASEP is filled in with the difference
1690
   between the VMAs from which the segments were read, and the VMAs
1691
   the file headers (and hence BFD's idea of each section's VMA) put
1692
   them at.
1693
1694
   The function TARGET_READ_MEMORY is called to copy LEN bytes from
1695
   the remote memory at target address VMA into the local buffer at
1696
   MYADDR; it should return zero on success or an `errno' code on
1697
   failure.  TEMPL must be a BFD for a target with the word size and
1698
   byte order found in the remote memory.  */
1699
1700
bfd *
1701
NAME(_bfd_elf,bfd_from_remote_memory)
1702
  (bfd *templ,
1703
   bfd_vma ehdr_vma    /* Bytes.  */,
1704
   bfd_size_type size  /* Octets.  */,
1705
   bfd_vma *loadbasep  /* Bytes.  */,
1706
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1707
                          /* (Bytes  ,           , octets       ).  */
1708
0
{
1709
0
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1710
0
  Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */
1711
0
  Elf_External_Phdr *x_phdrs;
1712
0
  Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
1713
0
  bfd *nbfd;
1714
0
  struct bfd_in_memory *bim;
1715
0
  bfd_byte *contents;
1716
0
  int err;
1717
0
  unsigned int i;
1718
0
  bfd_vma high_offset;
1719
0
  bfd_vma shdr_end;
1720
0
  bfd_vma loadbase;  /* Bytes.  */
1721
0
  size_t amt;
1722
0
  unsigned int opb = bfd_octets_per_byte (templ, NULL);
1723
1724
  /* Read in the ELF header in external format.  */
1725
0
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1726
0
  if (err)
1727
0
    {
1728
0
      bfd_set_error (bfd_error_system_call);
1729
0
      errno = err;
1730
0
      return NULL;
1731
0
    }
1732
1733
  /* Now check to see if we have a valid ELF file, and one that BFD can
1734
     make use of.  The magic number must match, the address size ('class')
1735
     and byte-swapping must match our XVEC entry.  */
1736
1737
0
  if (! elf_file_p (&x_ehdr)
1738
0
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1739
0
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1740
0
    {
1741
0
      bfd_set_error (bfd_error_wrong_format);
1742
0
      return NULL;
1743
0
    }
1744
1745
  /* Check that file's byte order matches xvec's */
1746
0
  switch (x_ehdr.e_ident[EI_DATA])
1747
0
    {
1748
0
    case ELFDATA2MSB:   /* Big-endian */
1749
0
      if (! bfd_header_big_endian (templ))
1750
0
  {
1751
0
    bfd_set_error (bfd_error_wrong_format);
1752
0
    return NULL;
1753
0
  }
1754
0
      break;
1755
0
    case ELFDATA2LSB:   /* Little-endian */
1756
0
      if (! bfd_header_little_endian (templ))
1757
0
  {
1758
0
    bfd_set_error (bfd_error_wrong_format);
1759
0
    return NULL;
1760
0
  }
1761
0
      break;
1762
0
    case ELFDATANONE:   /* No data encoding specified */
1763
0
    default:      /* Unknown data encoding specified */
1764
0
      bfd_set_error (bfd_error_wrong_format);
1765
0
      return NULL;
1766
0
    }
1767
1768
0
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1769
1770
  /* The file header tells where to find the program headers.
1771
     These are what we use to actually choose what to read.  */
1772
1773
0
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1774
0
    {
1775
0
      bfd_set_error (bfd_error_wrong_format);
1776
0
      return NULL;
1777
0
    }
1778
1779
0
  if (_bfd_mul_overflow (i_ehdr.e_phnum,
1780
0
       sizeof (*x_phdrs) + sizeof (*i_phdrs), &amt))
1781
0
    {
1782
0
      bfd_set_error (bfd_error_file_too_big);
1783
0
      return NULL;
1784
0
    }
1785
0
  x_phdrs = (Elf_External_Phdr *) bfd_malloc (amt);
1786
0
  if (x_phdrs == NULL)
1787
0
    return NULL;
1788
0
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1789
0
          i_ehdr.e_phnum * sizeof x_phdrs[0]);
1790
0
  if (err)
1791
0
    {
1792
0
      free (x_phdrs);
1793
0
      bfd_set_error (bfd_error_system_call);
1794
0
      errno = err;
1795
0
      return NULL;
1796
0
    }
1797
0
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1798
1799
0
  high_offset = 0;
1800
0
  loadbase = 0;
1801
0
  first_phdr = NULL;
1802
0
  last_phdr = NULL;
1803
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1804
0
    {
1805
0
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1806
0
      if (i_phdrs[i].p_type == PT_LOAD)
1807
0
  {
1808
0
    bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
1809
1810
0
    if (segment_end > high_offset)
1811
0
      {
1812
0
        high_offset = segment_end;
1813
0
        last_phdr = &i_phdrs[i];
1814
0
      }
1815
1816
    /* If this program header covers offset zero, where the file
1817
       header sits, then we can figure out the loadbase.  */
1818
0
    if (first_phdr == NULL)
1819
0
      {
1820
0
        bfd_vma p_offset = i_phdrs[i].p_offset;  /* Octets.  */
1821
0
        bfd_vma p_vaddr = i_phdrs[i].p_vaddr;    /* Octets.  */
1822
1823
0
        if (i_phdrs[i].p_align > 1)
1824
0
    {
1825
0
      p_offset &= -(i_phdrs[i].p_align * opb);
1826
0
      p_vaddr &= -(i_phdrs[i].p_align * opb);
1827
0
    }
1828
0
        if (p_offset == 0)
1829
0
    {
1830
0
      loadbase = ehdr_vma - p_vaddr / opb;
1831
0
      first_phdr = &i_phdrs[i];
1832
0
    }
1833
0
      }
1834
0
  }
1835
0
    }
1836
0
  if (high_offset == 0)
1837
0
    {
1838
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1839
0
      free (x_phdrs);
1840
0
      bfd_set_error (bfd_error_wrong_format);
1841
0
      return NULL;
1842
0
    }
1843
1844
0
  shdr_end = 0;
1845
0
  if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
1846
0
    {
1847
0
      shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1848
1849
0
      if (last_phdr->p_filesz != last_phdr->p_memsz)
1850
0
  {
1851
    /* If the last PT_LOAD header has a bss area then ld.so will
1852
       have cleared anything past p_filesz, zapping the section
1853
       headers.  */
1854
0
  }
1855
0
      else if (size >= shdr_end)
1856
0
  high_offset = size;
1857
0
      else
1858
0
  {
1859
0
    bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
1860
0
    bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
1861
1862
    /* Assume we loaded full pages, allowing us to sometimes see
1863
       section headers.  */
1864
0
    if (page_size > 1 && shdr_end > segment_end)
1865
0
      {
1866
0
        bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
1867
1868
0
        if (page_end >= shdr_end)
1869
    /* Whee, section headers covered.  */
1870
0
    high_offset = shdr_end;
1871
0
      }
1872
0
  }
1873
0
    }
1874
1875
  /* Now we know the size of the whole image we want read in.  */
1876
0
  contents = (bfd_byte *) bfd_zmalloc (high_offset);
1877
0
  if (contents == NULL)
1878
0
    {
1879
0
      free (x_phdrs);
1880
0
      return NULL;
1881
0
    }
1882
1883
0
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1884
0
    if (i_phdrs[i].p_type == PT_LOAD)
1885
0
      {
1886
0
  bfd_vma start = i_phdrs[i].p_offset;         /* Octets.  */
1887
0
  bfd_vma end = start + i_phdrs[i].p_filesz;   /* Octets.  */
1888
0
  bfd_vma vaddr = i_phdrs[i].p_vaddr;          /* Octets.  */
1889
1890
  /* Extend the beginning of the first pt_load to cover file
1891
     header and program headers, if we proved earlier that its
1892
     aligned offset is 0.  */
1893
0
  if (first_phdr == &i_phdrs[i])
1894
0
    {
1895
0
      vaddr -= start;
1896
0
      start = 0;
1897
0
    }
1898
  /* Extend the end of the last pt_load to cover section headers.  */
1899
0
  if (last_phdr == &i_phdrs[i])
1900
0
    end = high_offset;
1901
0
  err = target_read_memory (loadbase + vaddr / opb,
1902
0
          contents + start, end - start);
1903
0
  if (err)
1904
0
    {
1905
0
      free (x_phdrs);
1906
0
      free (contents);
1907
0
      bfd_set_error (bfd_error_system_call);
1908
0
      errno = err;
1909
0
      return NULL;
1910
0
    }
1911
0
      }
1912
0
  free (x_phdrs);
1913
1914
  /* If the segments visible in memory didn't include the section headers,
1915
     then clear them from the file header.  */
1916
0
  if (high_offset < shdr_end)
1917
0
    {
1918
0
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1919
0
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1920
0
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1921
0
    }
1922
1923
  /* This will normally have been in the first PT_LOAD segment.  But it
1924
     conceivably could be missing, and we might have just changed it.  */
1925
0
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1926
1927
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1928
0
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1929
0
  if (bim == NULL)
1930
0
    {
1931
0
      free (contents);
1932
0
      return NULL;
1933
0
    }
1934
0
  nbfd = _bfd_new_bfd ();
1935
0
  if (nbfd == NULL
1936
0
      || !bfd_set_filename (nbfd, "<in-memory>"))
1937
0
    {
1938
0
      free (bim);
1939
0
      free (contents);
1940
0
      return NULL;
1941
0
    }
1942
0
  nbfd->xvec = templ->xvec;
1943
0
  bim->size = high_offset;
1944
0
  bim->buffer = contents;
1945
0
  nbfd->iostream = bim;
1946
0
  nbfd->flags = BFD_IN_MEMORY;
1947
0
  nbfd->iovec = &_bfd_memory_iovec;
1948
0
  nbfd->origin = 0;
1949
0
  nbfd->direction = read_direction;
1950
0
  nbfd->mtime = time (NULL);
1951
0
  nbfd->mtime_set = true;
1952
1953
0
  if (loadbasep)
1954
0
    *loadbasep = loadbase;
1955
0
  return nbfd;
1956
0
}
Unexecuted instantiation: _bfd_elf64_bfd_from_remote_memory
Unexecuted instantiation: _bfd_elf32_bfd_from_remote_memory
1957
1958
/* Function for ELF_R_INFO.  */
1959
1960
bfd_vma
1961
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
1962
0
{
1963
0
  return ELF_R_INFO (sym, type);
1964
0
}
Unexecuted instantiation: elf64_r_info
Unexecuted instantiation: elf32_r_info
1965
1966
/* Function for ELF_R_SYM.  */
1967
1968
bfd_vma
1969
NAME(elf,r_sym) (bfd_vma r_info)
1970
2.70k
{
1971
2.70k
  return ELF_R_SYM (r_info);
1972
2.70k
}
elf64_r_sym
Line
Count
Source
1970
2.65k
{
1971
2.65k
  return ELF_R_SYM (r_info);
1972
2.65k
}
elf32_r_sym
Line
Count
Source
1970
53
{
1971
53
  return ELF_R_SYM (r_info);
1972
53
}
1973

1974
#include "elfcore.h"
1975

1976
/* Size-dependent data and functions.  */
1977
const struct elf_size_info NAME(_bfd_elf,size_info) = {
1978
  sizeof (Elf_External_Ehdr),
1979
  sizeof (Elf_External_Phdr),
1980
  sizeof (Elf_External_Shdr),
1981
  sizeof (Elf_External_Rel),
1982
  sizeof (Elf_External_Rela),
1983
  sizeof (Elf_External_Sym),
1984
  sizeof (Elf_External_Dyn),
1985
  sizeof (Elf_External_Note),
1986
  4,
1987
  1,
1988
  ARCH_SIZE, LOG_FILE_ALIGN,
1989
  ELFCLASS, EV_CURRENT,
1990
  elf_write_out_phdrs,
1991
  elf_write_shdrs_and_ehdr,
1992
  elf_checksum_contents,
1993
  elf_write_relocs,
1994
  elf_swap_symbol_in,
1995
  elf_swap_symbol_out,
1996
  elf_slurp_reloc_table,
1997
  elf_slurp_symbol_table,
1998
  elf_swap_dyn_in,
1999
  elf_swap_dyn_out,
2000
  elf_swap_reloc_in,
2001
  elf_swap_reloc_out,
2002
  elf_swap_reloca_in,
2003
  elf_swap_reloca_out
2004
};