Coverage Report

Created: 2023-08-28 06:31

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