Coverage Report

Created: 2023-08-28 06:26

/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
844k
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
16.7k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
805k
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
264k
#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
0
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
71.4k
#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
264k
#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
214k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
21.4k
#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
0
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
64.9k
#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
2.10M
#define H_GET_WORD    H_GET_64
161
72.6k
#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
189k
#define H_GET_WORD    H_GET_32
167
13.4k
#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
43.4k
{
179
43.4k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
43.4k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
43.4k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
43.4k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
43.4k
  if (signed_vma)
185
8.32k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
35.1k
  else
187
35.1k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
43.4k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
43.4k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
43.4k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
43.4k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
43.4k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
5
    {
194
5
      if (shndx == NULL)
195
5
  return false;
196
0
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
0
    }
198
43.4k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
357
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
43.4k
  dst->st_target_internal = 0;
201
43.4k
  return true;
202
43.4k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
17.9k
{
179
17.9k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
17.9k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
17.9k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
17.9k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
17.9k
  if (signed_vma)
185
0
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
17.9k
  else
187
17.9k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
17.9k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
17.9k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
17.9k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
17.9k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
17.9k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
1
    {
194
1
      if (shndx == NULL)
195
1
  return false;
196
0
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
0
    }
198
17.9k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
78
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
17.9k
  dst->st_target_internal = 0;
201
17.9k
  return true;
202
17.9k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
25.4k
{
179
25.4k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
25.4k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
25.4k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
25.4k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
25.4k
  if (signed_vma)
185
8.32k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
17.1k
  else
187
17.1k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
25.4k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
25.4k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
25.4k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
25.4k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
25.4k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
4
    {
194
4
      if (shndx == NULL)
195
4
  return false;
196
0
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
0
    }
198
25.4k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
279
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
25.4k
  dst->st_target_internal = 0;
201
25.4k
  return true;
202
25.4k
}
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
15.2k
{
239
15.2k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
15.2k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
15.2k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
15.2k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
15.2k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
15.2k
  if (signed_vma)
245
1.78k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
13.4k
  else
247
13.4k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
15.2k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
15.2k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
15.2k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
15.2k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
15.2k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
15.2k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
15.2k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
15.2k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
15.2k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
15.2k
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
9.86k
{
239
9.86k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
9.86k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
9.86k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
9.86k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
9.86k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
9.86k
  if (signed_vma)
245
1.21k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
8.65k
  else
247
8.65k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
9.86k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
9.86k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
9.86k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
9.86k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
9.86k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
9.86k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
9.86k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
9.86k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
9.86k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
9.86k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
5.40k
{
239
5.40k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
5.40k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
5.40k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
5.40k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
5.40k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
5.40k
  if (signed_vma)
245
575
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
4.83k
  else
247
4.83k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
5.40k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
5.40k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
5.40k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
5.40k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
5.40k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
5.40k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
5.40k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
5.40k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
5.40k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
5.40k
}
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
74.2k
{
319
74.2k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
74.2k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
74.2k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
74.2k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
74.2k
  if (signed_vma)
325
3.60k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
70.6k
  else
327
70.6k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
74.2k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
74.2k
  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
74.2k
  if (dst->sh_type != SHT_NOBITS)
334
73.8k
    {
335
73.8k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
73.8k
      if (filesize != 0
338
73.8k
    && ((ufile_ptr) dst->sh_offset > filesize
339
73.8k
        || dst->sh_size > filesize - dst->sh_offset)
340
73.8k
    && !abfd->read_only)
341
1.22k
  {
342
1.22k
    _bfd_error_handler (_("warning: %pB has a section "
343
1.22k
        "extending past end of file"), abfd);
344
1.22k
    abfd->read_only = 1;
345
1.22k
  }
346
73.8k
    }
347
74.2k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
74.2k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
74.2k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
74.2k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
74.2k
  dst->bfd_section = NULL;
352
74.2k
  dst->contents = NULL;
353
74.2k
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
65.5k
{
319
65.5k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
65.5k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
65.5k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
65.5k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
65.5k
  if (signed_vma)
325
12
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
65.5k
  else
327
65.5k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
65.5k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
65.5k
  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
65.5k
  if (dst->sh_type != SHT_NOBITS)
334
65.4k
    {
335
65.4k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
65.4k
      if (filesize != 0
338
65.4k
    && ((ufile_ptr) dst->sh_offset > filesize
339
65.4k
        || dst->sh_size > filesize - dst->sh_offset)
340
65.4k
    && !abfd->read_only)
341
1.20k
  {
342
1.20k
    _bfd_error_handler (_("warning: %pB has a section "
343
1.20k
        "extending past end of file"), abfd);
344
1.20k
    abfd->read_only = 1;
345
1.20k
  }
346
65.4k
    }
347
65.5k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
65.5k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
65.5k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
65.5k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
65.5k
  dst->bfd_section = NULL;
352
65.5k
  dst->contents = NULL;
353
65.5k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
8.63k
{
319
8.63k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
8.63k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
8.63k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
8.63k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
8.63k
  if (signed_vma)
325
3.59k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
5.04k
  else
327
5.04k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
8.63k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
8.63k
  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
8.63k
  if (dst->sh_type != SHT_NOBITS)
334
8.38k
    {
335
8.38k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
8.38k
      if (filesize != 0
338
8.38k
    && ((ufile_ptr) dst->sh_offset > filesize
339
8.38k
        || dst->sh_size > filesize - dst->sh_offset)
340
8.38k
    && !abfd->read_only)
341
21
  {
342
21
    _bfd_error_handler (_("warning: %pB has a section "
343
21
        "extending past end of file"), abfd);
344
21
    abfd->read_only = 1;
345
21
  }
346
8.38k
    }
347
8.63k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
348
8.63k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
349
8.63k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
350
8.63k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
351
8.63k
  dst->bfd_section = NULL;
352
8.63k
  dst->contents = NULL;
353
8.63k
}
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
264k
{
384
264k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
264k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
264k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
264k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
264k
  if (signed_vma)
390
474
    {
391
474
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
474
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
474
    }
394
263k
  else
395
263k
    {
396
263k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
263k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
263k
    }
399
264k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
264k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
264k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
264k
}
bfd_elf64_swap_phdr_in
Line
Count
Source
383
250k
{
384
250k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
250k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
250k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
250k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
250k
  if (signed_vma)
390
0
    {
391
0
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
0
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
0
    }
394
250k
  else
395
250k
    {
396
250k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
250k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
250k
    }
399
250k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
250k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
250k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
250k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
383
13.9k
{
384
13.9k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
385
386
13.9k
  dst->p_type = H_GET_32 (abfd, src->p_type);
387
13.9k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
388
13.9k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
389
13.9k
  if (signed_vma)
390
474
    {
391
474
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
392
474
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
393
474
    }
394
13.4k
  else
395
13.4k
    {
396
13.4k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
397
13.4k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
398
13.4k
    }
399
13.9k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
400
13.9k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
401
13.9k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
402
13.9k
}
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
0
{
432
0
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
433
0
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
434
0
  dst->r_info = H_GET_WORD (abfd, src->r_info);
435
0
  dst->r_addend = 0;
436
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
Unexecuted instantiation: bfd_elf32_swap_reloc_in
437
438
void
439
elf_swap_reloca_in (bfd *abfd,
440
        const bfd_byte *s,
441
        Elf_Internal_Rela *dst)
442
71.4k
{
443
71.4k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
71.4k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
71.4k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
71.4k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
71.4k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
442
71.4k
{
443
71.4k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
444
71.4k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
445
71.4k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
446
71.4k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
447
71.4k
}
Unexecuted instantiation: bfd_elf32_swap_reloca_in
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
0
{
476
0
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
477
478
0
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
479
0
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
480
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_in
Unexecuted instantiation: bfd_elf32_swap_dyn_in
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
842k
{
503
842k
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
842k
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
842k
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
842k
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
842k
}
elf64.c:elf_file_p
Line
Count
Source
502
208k
{
503
208k
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
208k
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
208k
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
208k
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
208k
}
elf32.c:elf_file_p
Line
Count
Source
502
634k
{
503
634k
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
504
634k
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
505
634k
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
506
634k
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
507
634k
}
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
804k
{
520
804k
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
804k
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
804k
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
804k
  Elf_Internal_Shdr i_shdr;
524
804k
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
804k
  unsigned int shindex;
526
804k
  const struct elf_backend_data *ebd;
527
804k
  asection *s;
528
804k
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
804k
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
1.28k
    {
534
1.28k
      if (bfd_get_error () != bfd_error_system_call)
535
1.28k
  goto got_wrong_format_error;
536
0
      else
537
0
  goto got_no_match;
538
1.28k
    }
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
803k
  if (! elf_file_p (&x_ehdr)
547
803k
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
803k
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
778k
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
24.9k
  switch (x_ehdr.e_ident[EI_DATA])
553
24.9k
    {
554
5.79k
    case ELFDATA2MSB:   /* Big-endian */
555
5.79k
      if (! bfd_header_big_endian (abfd))
556
2.88k
  goto got_wrong_format_error;
557
2.90k
      break;
558
19.1k
    case ELFDATA2LSB:   /* Little-endian */
559
19.1k
      if (! bfd_header_little_endian (abfd))
560
8.84k
  goto got_wrong_format_error;
561
10.3k
      break;
562
10.3k
    case ELFDATANONE:   /* No data encoding specified */
563
0
    default:      /* Unknown data encoding specified */
564
0
      goto got_wrong_format_error;
565
24.9k
    }
566
567
13.2k
  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
13.2k
  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
13.2k
  i_ehdrp = elf_elfheader (abfd);
577
13.2k
  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
13.2k
  if (i_ehdrp->e_type == ET_CORE)
584
379
    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.8k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
0
    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.8k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
0
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
12.8k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
0
    goto got_wrong_format_error;
600
601
12.8k
  ebd = get_elf_backend_data (abfd);
602
12.8k
  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
12.8k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
12.8k
      && (ebd->elf_machine_alt1 == 0
609
10.8k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
12.8k
      && (ebd->elf_machine_alt2 == 0
611
10.8k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
12.8k
      && ebd->elf_machine_code != EM_NONE)
613
10.4k
    goto got_wrong_format_error;
614
615
2.44k
  if (i_ehdrp->e_type == ET_EXEC)
616
109
    abfd->flags |= EXEC_P;
617
2.33k
  else if (i_ehdrp->e_type == ET_DYN)
618
161
    abfd->flags |= DYNAMIC;
619
620
2.44k
  if (i_ehdrp->e_phnum > 0)
621
468
    abfd->flags |= D_PAGED;
622
623
2.44k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
422
    {
625
      /* It's OK if this fails for the generic target.  */
626
422
      if (ebd->elf_machine_code != EM_NONE)
627
0
  goto got_no_match;
628
422
    }
629
630
2.44k
  if (ebd->elf_machine_code != EM_NONE
631
2.44k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
2.44k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
742
    goto got_wrong_format_error;
634
635
1.70k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
1.70k
    {
637
1.70k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
1.70k
      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
1.70k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
32
  goto got_no_match;
647
1.67k
      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
1.67k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
27
  {
653
27
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
27
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
27
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
27
        || i_ehdrp->e_shnum  == 0)
657
14
      goto got_wrong_format_error;
658
27
  }
659
660
      /* And similarly for the string table index.  */
661
1.65k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
6
  {
663
6
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
6
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
6
  }
667
668
      /* And program headers.  */
669
1.65k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
0
  {
671
0
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
0
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
0
  }
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
1.65k
      if (i_ehdrp->e_shnum != 1)
679
1.65k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
1.65k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
1.65k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
0
      goto got_wrong_format_error;
684
685
1.65k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
1.65k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
1.65k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
1.65k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
0
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
1.65k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
1.65k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
1.65k
  }
699
1.65k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
1.65k
  if (i_ehdrp->e_shnum != 0)
704
1.65k
    {
705
1.65k
      Elf_Internal_Shdr *shdrp;
706
1.65k
      unsigned int num_sec;
707
1.65k
      size_t amt;
708
709
1.65k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
1.65k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
1.65k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
1.65k
      num_sec = i_ehdrp->e_shnum;
715
1.65k
      elf_numsections (abfd) = num_sec;
716
1.65k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
1.65k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
1.65k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
1.65k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
1.65k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
1.65k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
79.9k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
78.2k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
74.0k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
72.5k
  {
733
72.5k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
72.5k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
72.5k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
110
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
110
        switch (ebd->elf_machine_code)
743
110
    {
744
3
    case EM_386:
745
3
    case EM_IAMCU:
746
65
    case EM_X86_64:
747
65
    case EM_OLD_SPARCV9:
748
65
    case EM_SPARC32PLUS:
749
67
    case EM_SPARCV9:
750
67
    case EM_SPARC:
751
67
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
67
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
5
        break;
754
      /* Otherwise fall through.  */
755
105
    default:
756
105
      goto got_wrong_format_error;
757
110
    }
758
110
      }
759
760
72.4k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
72.4k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
72.4k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
72.4k
        && i_shdrp[shindex].sh_info >= num_sec)
764
3
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
72.4k
    if (i_shdrp[shindex].sh_size != 0
769
72.4k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
72.4k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
72.4k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
29.4k
       % ebd->minpagesize)
773
29.4k
      != 0))
774
17.1k
      abfd->flags &= ~D_PAGED;
775
72.4k
  }
776
777
1.55k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
1.55k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
15
  {
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
15
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
15
    if (!abfd->read_only)
788
2
      {
789
2
        _bfd_error_handler
790
2
    (_("warning: %pB has a corrupt string table index"), abfd);
791
2
        abfd->read_only = 1;
792
2
      }
793
15
  }
794
1.55k
    }
795
1
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
0
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
1.55k
  if (i_ehdrp->e_phnum == 0)
800
1.21k
    elf_tdata (abfd)->phdr = NULL;
801
338
  else
802
338
    {
803
338
      Elf_Internal_Phdr *i_phdr;
804
338
      unsigned int i;
805
338
      ufile_ptr filesize;
806
338
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
338
      filesize = bfd_get_file_size (abfd);
811
338
      if (filesize != 0
812
338
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
0
  goto got_wrong_format_error;
814
338
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
338
      elf_tdata (abfd)->phdr
817
338
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
338
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
338
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
0
  goto got_no_match;
822
338
      bool eu_strip_broken_phdrs = false;
823
338
      i_phdr = elf_tdata (abfd)->phdr;
824
4.04k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
3.72k
  {
826
3.72k
    Elf_External_Phdr x_phdr;
827
828
3.72k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
10
      goto got_no_match;
830
3.71k
    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
3.71k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
1.04k
      {
835
1.04k
        i_phdr->p_align &= -i_phdr->p_align;
836
1.04k
        if (!abfd->read_only)
837
9
    {
838
9
      _bfd_error_handler (_("warning: %pB has a program header "
839
9
          "with invalid alignment"), abfd);
840
9
      abfd->read_only = 1;
841
9
    }
842
1.04k
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
3.71k
    if (i_phdr->p_filesz != 0
846
3.71k
        && (i_phdr->p_filesz > filesize
847
3.22k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
1.04k
      eu_strip_broken_phdrs = true;
849
3.71k
  }
850
328
      if (!eu_strip_broken_phdrs
851
328
    && i_ehdrp->e_shoff == 0
852
328
    && i_ehdrp->e_shstrndx == 0)
853
0
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
0
    i_phdr = elf_tdata (abfd)->phdr;
857
0
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
0
      if (i_phdr->p_type == PT_DYNAMIC)
859
0
        {
860
0
    if (i_phdr->p_filesz != 0
861
0
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
0
                  elf_tdata (abfd)->phdr,
863
0
                  i_ehdrp->e_phnum,
864
0
                  filesize))
865
0
      goto got_no_match;
866
0
    break;
867
0
        }
868
0
  }
869
328
    }
870
871
1.54k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
1.52k
    {
873
1.52k
      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
1.52k
      num_sec = elf_numsections (abfd);
879
41.5k
      for (shindex = 1; shindex < num_sec; shindex++)
880
40.9k
  if (!bfd_section_from_shdr (abfd, shindex))
881
917
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
612
      if (! _bfd_elf_setup_sections (abfd))
885
33
  goto got_wrong_format_error;
886
612
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
591
  if (ebd->elf_backend_object_p)
891
215
    {
892
215
      if (! (*ebd->elf_backend_object_p) (abfd))
893
32
  goto got_wrong_format_error;
894
215
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
559
  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
19.1k
  for (s = abfd->sections; s != NULL; s = s->next)
902
18.6k
    {
903
18.6k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
18.6k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
18.6k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
426
  {
907
426
    unsigned long targ_index;
908
426
    asection *targ_sec;
909
910
426
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
426
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
426
    if (targ_sec != NULL
913
426
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
426
  }
916
18.6k
    }
917
559
  return _bfd_no_cleanup;
918
919
803k
 got_wrong_format_error:
920
803k
  bfd_set_error (bfd_error_wrong_format);
921
922
804k
 got_no_match:
923
804k
  return NULL;
924
803k
}
bfd_elf64_object_p
Line
Count
Source
519
198k
{
520
198k
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
198k
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
198k
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
198k
  Elf_Internal_Shdr i_shdr;
524
198k
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
198k
  unsigned int shindex;
526
198k
  const struct elf_backend_data *ebd;
527
198k
  asection *s;
528
198k
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
198k
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
351
    {
534
351
      if (bfd_get_error () != bfd_error_system_call)
535
351
  goto got_wrong_format_error;
536
0
      else
537
0
  goto got_no_match;
538
351
    }
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
198k
  if (! elf_file_p (&x_ehdr)
547
198k
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
198k
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
182k
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
16.2k
  switch (x_ehdr.e_ident[EI_DATA])
553
16.2k
    {
554
133
    case ELFDATA2MSB:   /* Big-endian */
555
133
      if (! bfd_header_big_endian (abfd))
556
72
  goto got_wrong_format_error;
557
61
      break;
558
16.0k
    case ELFDATA2LSB:   /* Little-endian */
559
16.0k
      if (! bfd_header_little_endian (abfd))
560
7.30k
  goto got_wrong_format_error;
561
8.79k
      break;
562
8.79k
    case ELFDATANONE:   /* No data encoding specified */
563
0
    default:      /* Unknown data encoding specified */
564
0
      goto got_wrong_format_error;
565
16.2k
    }
566
567
8.85k
  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
8.85k
  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
8.85k
  i_ehdrp = elf_elfheader (abfd);
577
8.85k
  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
8.85k
  if (i_ehdrp->e_type == ET_CORE)
584
312
    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
8.54k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
0
    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
8.54k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
0
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
8.54k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
0
    goto got_wrong_format_error;
600
601
8.54k
  ebd = get_elf_backend_data (abfd);
602
8.54k
  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
8.54k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
8.54k
      && (ebd->elf_machine_alt1 == 0
609
6.78k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
8.54k
      && (ebd->elf_machine_alt2 == 0
611
6.78k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
8.54k
      && ebd->elf_machine_code != EM_NONE)
613
6.43k
    goto got_wrong_format_error;
614
615
2.11k
  if (i_ehdrp->e_type == ET_EXEC)
616
12
    abfd->flags |= EXEC_P;
617
2.09k
  else if (i_ehdrp->e_type == ET_DYN)
618
100
    abfd->flags |= DYNAMIC;
619
620
2.11k
  if (i_ehdrp->e_phnum > 0)
621
132
    abfd->flags |= D_PAGED;
622
623
2.11k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
358
    {
625
      /* It's OK if this fails for the generic target.  */
626
358
      if (ebd->elf_machine_code != EM_NONE)
627
0
  goto got_no_match;
628
358
    }
629
630
2.11k
  if (ebd->elf_machine_code != EM_NONE
631
2.11k
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
2.11k
      && ebd->elf_osabi != ELFOSABI_NONE)
633
683
    goto got_wrong_format_error;
634
635
1.42k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
1.42k
    {
637
1.42k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
1.42k
      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
1.42k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
26
  goto got_no_match;
647
1.40k
      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
1.40k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
21
  {
653
21
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
21
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
21
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
21
        || i_ehdrp->e_shnum  == 0)
657
14
      goto got_wrong_format_error;
658
21
  }
659
660
      /* And similarly for the string table index.  */
661
1.38k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
0
  {
663
0
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
0
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
0
  }
667
668
      /* And program headers.  */
669
1.38k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
0
  {
671
0
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
0
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
0
  }
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
1.38k
      if (i_ehdrp->e_shnum != 1)
679
1.38k
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
1.38k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
1.38k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
0
      goto got_wrong_format_error;
684
685
1.38k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
1.38k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
1.38k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
1.38k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
0
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
1.38k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
1.38k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
1.38k
  }
699
1.38k
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
1.38k
  if (i_ehdrp->e_shnum != 0)
704
1.38k
    {
705
1.38k
      Elf_Internal_Shdr *shdrp;
706
1.38k
      unsigned int num_sec;
707
1.38k
      size_t amt;
708
709
1.38k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
1.38k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
1.38k
      if (!i_shdrp)
713
0
  goto got_no_match;
714
1.38k
      num_sec = i_ehdrp->e_shnum;
715
1.38k
      elf_numsections (abfd) = num_sec;
716
1.38k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
1.38k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
1.38k
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
1.38k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
1.38k
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
1.38k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
70.5k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
69.1k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
65.4k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
64.1k
  {
733
64.1k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
64.1k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
64.1k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
97
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
97
        switch (ebd->elf_machine_code)
743
97
    {
744
0
    case EM_386:
745
0
    case EM_IAMCU:
746
62
    case EM_X86_64:
747
62
    case EM_OLD_SPARCV9:
748
62
    case EM_SPARC32PLUS:
749
64
    case EM_SPARCV9:
750
64
    case EM_SPARC:
751
64
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
64
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
5
        break;
754
      /* Otherwise fall through.  */
755
92
    default:
756
92
      goto got_wrong_format_error;
757
97
    }
758
97
      }
759
760
64.0k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
64.0k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
64.0k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
64.0k
        && i_shdrp[shindex].sh_info >= num_sec)
764
0
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
64.0k
    if (i_shdrp[shindex].sh_size != 0
769
64.0k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
64.0k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
64.0k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
23.8k
       % ebd->minpagesize)
773
23.8k
      != 0))
774
17.1k
      abfd->flags &= ~D_PAGED;
775
64.0k
  }
776
777
1.29k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
1.29k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
9
  {
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
9
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
9
    if (!abfd->read_only)
788
2
      {
789
2
        _bfd_error_handler
790
2
    (_("warning: %pB has a corrupt string table index"), abfd);
791
2
        abfd->read_only = 1;
792
2
      }
793
9
  }
794
1.29k
    }
795
1
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
0
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
1.29k
  if (i_ehdrp->e_phnum == 0)
800
1.21k
    elf_tdata (abfd)->phdr = NULL;
801
83
  else
802
83
    {
803
83
      Elf_Internal_Phdr *i_phdr;
804
83
      unsigned int i;
805
83
      ufile_ptr filesize;
806
83
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
83
      filesize = bfd_get_file_size (abfd);
811
83
      if (filesize != 0
812
83
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
0
  goto got_wrong_format_error;
814
83
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
83
      elf_tdata (abfd)->phdr
817
83
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
83
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
83
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
0
  goto got_no_match;
822
83
      bool eu_strip_broken_phdrs = false;
823
83
      i_phdr = elf_tdata (abfd)->phdr;
824
1.65k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
1.58k
  {
826
1.58k
    Elf_External_Phdr x_phdr;
827
828
1.58k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
4
      goto got_no_match;
830
1.57k
    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
1.57k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
544
      {
835
544
        i_phdr->p_align &= -i_phdr->p_align;
836
544
        if (!abfd->read_only)
837
5
    {
838
5
      _bfd_error_handler (_("warning: %pB has a program header "
839
5
          "with invalid alignment"), abfd);
840
5
      abfd->read_only = 1;
841
5
    }
842
544
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
1.57k
    if (i_phdr->p_filesz != 0
846
1.57k
        && (i_phdr->p_filesz > filesize
847
1.40k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
576
      eu_strip_broken_phdrs = true;
849
1.57k
  }
850
79
      if (!eu_strip_broken_phdrs
851
79
    && i_ehdrp->e_shoff == 0
852
79
    && i_ehdrp->e_shstrndx == 0)
853
0
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
0
    i_phdr = elf_tdata (abfd)->phdr;
857
0
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
0
      if (i_phdr->p_type == PT_DYNAMIC)
859
0
        {
860
0
    if (i_phdr->p_filesz != 0
861
0
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
0
                  elf_tdata (abfd)->phdr,
863
0
                  i_ehdrp->e_phnum,
864
0
                  filesize))
865
0
      goto got_no_match;
866
0
    break;
867
0
        }
868
0
  }
869
79
    }
870
871
1.29k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
1.28k
    {
873
1.28k
      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
1.28k
      num_sec = elf_numsections (abfd);
879
33.3k
      for (shindex = 1; shindex < num_sec; shindex++)
880
32.9k
  if (!bfd_section_from_shdr (abfd, shindex))
881
910
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
376
      if (! _bfd_elf_setup_sections (abfd))
885
33
  goto got_wrong_format_error;
886
376
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
349
  if (ebd->elf_backend_object_p)
891
92
    {
892
92
      if (! (*ebd->elf_backend_object_p) (abfd))
893
0
  goto got_wrong_format_error;
894
92
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
349
  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
12.8k
  for (s = abfd->sections; s != NULL; s = s->next)
902
12.5k
    {
903
12.5k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
12.5k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
12.5k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
23
  {
907
23
    unsigned long targ_index;
908
23
    asection *targ_sec;
909
910
23
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
23
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
23
    if (targ_sec != NULL
913
23
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
23
  }
916
12.5k
    }
917
349
  return _bfd_no_cleanup;
918
919
197k
 got_wrong_format_error:
920
197k
  bfd_set_error (bfd_error_wrong_format);
921
922
198k
 got_no_match:
923
198k
  return NULL;
924
197k
}
bfd_elf32_object_p
Line
Count
Source
519
605k
{
520
605k
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
521
605k
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
522
605k
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
523
605k
  Elf_Internal_Shdr i_shdr;
524
605k
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
525
605k
  unsigned int shindex;
526
605k
  const struct elf_backend_data *ebd;
527
605k
  asection *s;
528
605k
  const bfd_target *target;
529
530
  /* Read in the ELF header in external format.  */
531
532
605k
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
533
938
    {
534
938
      if (bfd_get_error () != bfd_error_system_call)
535
938
  goto got_wrong_format_error;
536
0
      else
537
0
  goto got_no_match;
538
938
    }
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
605k
  if (! elf_file_p (&x_ehdr)
547
605k
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
548
605k
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
549
596k
    goto got_wrong_format_error;
550
551
  /* Check that file's byte order matches xvec's */
552
8.75k
  switch (x_ehdr.e_ident[EI_DATA])
553
8.75k
    {
554
5.65k
    case ELFDATA2MSB:   /* Big-endian */
555
5.65k
      if (! bfd_header_big_endian (abfd))
556
2.81k
  goto got_wrong_format_error;
557
2.84k
      break;
558
3.09k
    case ELFDATA2LSB:   /* Little-endian */
559
3.09k
      if (! bfd_header_little_endian (abfd))
560
1.54k
  goto got_wrong_format_error;
561
1.55k
      break;
562
1.55k
    case ELFDATANONE:   /* No data encoding specified */
563
0
    default:      /* Unknown data encoding specified */
564
0
      goto got_wrong_format_error;
565
8.75k
    }
566
567
4.39k
  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
4.39k
  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
4.39k
  i_ehdrp = elf_elfheader (abfd);
577
4.39k
  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
4.39k
  if (i_ehdrp->e_type == ET_CORE)
584
67
    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
4.33k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
589
0
    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
4.33k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
595
0
    goto got_wrong_format_error;
596
597
  /* Further sanity check.  */
598
4.33k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
599
0
    goto got_wrong_format_error;
600
601
4.33k
  ebd = get_elf_backend_data (abfd);
602
4.33k
  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
4.33k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
608
4.33k
      && (ebd->elf_machine_alt1 == 0
609
4.06k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
610
4.33k
      && (ebd->elf_machine_alt2 == 0
611
4.05k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
612
4.33k
      && ebd->elf_machine_code != EM_NONE)
613
3.99k
    goto got_wrong_format_error;
614
615
336
  if (i_ehdrp->e_type == ET_EXEC)
616
97
    abfd->flags |= EXEC_P;
617
239
  else if (i_ehdrp->e_type == ET_DYN)
618
61
    abfd->flags |= DYNAMIC;
619
620
336
  if (i_ehdrp->e_phnum > 0)
621
336
    abfd->flags |= D_PAGED;
622
623
336
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
624
64
    {
625
      /* It's OK if this fails for the generic target.  */
626
64
      if (ebd->elf_machine_code != EM_NONE)
627
0
  goto got_no_match;
628
64
    }
629
630
336
  if (ebd->elf_machine_code != EM_NONE
631
336
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
632
336
      && ebd->elf_osabi != ELFOSABI_NONE)
633
59
    goto got_wrong_format_error;
634
635
277
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
636
277
    {
637
277
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
638
639
      /* Seek to the section header table in the file.  */
640
277
      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
277
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
646
6
  goto got_no_match;
647
271
      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
271
      if (i_ehdrp->e_shnum == SHN_UNDEF)
652
6
  {
653
6
    i_ehdrp->e_shnum = i_shdr.sh_size;
654
6
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
655
6
        || i_ehdrp->e_shnum != i_shdr.sh_size
656
6
        || i_ehdrp->e_shnum  == 0)
657
0
      goto got_wrong_format_error;
658
6
  }
659
660
      /* And similarly for the string table index.  */
661
271
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
662
6
  {
663
6
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
664
6
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
665
0
      goto got_wrong_format_error;
666
6
  }
667
668
      /* And program headers.  */
669
271
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
670
0
  {
671
0
    i_ehdrp->e_phnum = i_shdr.sh_info;
672
0
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
673
0
      goto got_wrong_format_error;
674
0
  }
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
271
      if (i_ehdrp->e_shnum != 1)
679
271
  {
680
    /* Check that we don't have a totally silly number of sections.  */
681
271
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
682
271
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
683
0
      goto got_wrong_format_error;
684
685
271
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
686
271
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
687
0
      goto got_wrong_format_error;
688
689
271
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
690
0
      goto got_no_match;
691
271
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
692
0
      goto got_no_match;
693
694
    /* Back to where we were.  */
695
271
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
696
271
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
697
0
      goto got_no_match;
698
271
  }
699
271
    }
700
701
  /* Allocate space for a copy of the section header table in
702
     internal form.  */
703
271
  if (i_ehdrp->e_shnum != 0)
704
271
    {
705
271
      Elf_Internal_Shdr *shdrp;
706
271
      unsigned int num_sec;
707
271
      size_t amt;
708
709
271
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
710
0
  goto got_wrong_format_error;
711
271
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
712
271
      if (!i_shdrp)
713
0
  goto got_no_match;
714
271
      num_sec = i_ehdrp->e_shnum;
715
271
      elf_numsections (abfd) = num_sec;
716
271
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
717
0
  goto got_wrong_format_error;
718
271
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
719
271
      if (!elf_elfsections (abfd))
720
0
  goto got_no_match;
721
271
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
722
271
      if (!elf_tdata (abfd)->being_created)
723
0
  goto got_no_match;
724
725
271
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
726
9.36k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
727
9.09k
  elf_elfsections (abfd)[shindex] = shdrp++;
728
729
      /* Read in the rest of the section header table and convert it
730
   to internal form.  */
731
8.62k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
732
8.36k
  {
733
8.36k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
734
0
      goto got_no_match;
735
8.36k
    elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
736
737
    /* Sanity check sh_link and sh_info.  */
738
8.36k
    if (i_shdrp[shindex].sh_link >= num_sec)
739
13
      {
740
        /* PR 10478: Accept Solaris binaries with a sh_link
741
     field set to SHN_BEFORE or SHN_AFTER.  */
742
13
        switch (ebd->elf_machine_code)
743
13
    {
744
3
    case EM_386:
745
3
    case EM_IAMCU:
746
3
    case EM_X86_64:
747
3
    case EM_OLD_SPARCV9:
748
3
    case EM_SPARC32PLUS:
749
3
    case EM_SPARCV9:
750
3
    case EM_SPARC:
751
3
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
752
3
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
753
0
        break;
754
      /* Otherwise fall through.  */
755
13
    default:
756
13
      goto got_wrong_format_error;
757
13
    }
758
13
      }
759
760
8.35k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
761
8.35k
         || i_shdrp[shindex].sh_type == SHT_RELA
762
8.35k
         || i_shdrp[shindex].sh_type == SHT_REL)
763
8.35k
        && i_shdrp[shindex].sh_info >= num_sec)
764
3
      goto got_wrong_format_error;
765
766
    /* If the section is loaded, but not page aligned, clear
767
       D_PAGED.  */
768
8.35k
    if (i_shdrp[shindex].sh_size != 0
769
8.35k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
770
8.35k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
771
8.35k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
772
5.63k
       % ebd->minpagesize)
773
5.63k
      != 0))
774
4
      abfd->flags &= ~D_PAGED;
775
8.35k
  }
776
777
255
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
778
255
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
779
6
  {
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
6
    i_ehdrp->e_shstrndx = SHN_UNDEF;
787
6
    if (!abfd->read_only)
788
0
      {
789
0
        _bfd_error_handler
790
0
    (_("warning: %pB has a corrupt string table index"), abfd);
791
0
        abfd->read_only = 1;
792
0
      }
793
6
  }
794
255
    }
795
0
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
796
0
    goto got_wrong_format_error;
797
798
  /* Read in the program headers.  */
799
255
  if (i_ehdrp->e_phnum == 0)
800
0
    elf_tdata (abfd)->phdr = NULL;
801
255
  else
802
255
    {
803
255
      Elf_Internal_Phdr *i_phdr;
804
255
      unsigned int i;
805
255
      ufile_ptr filesize;
806
255
      size_t amt;
807
808
      /* Check for a corrupt input file with an impossibly large number
809
   of program headers.  */
810
255
      filesize = bfd_get_file_size (abfd);
811
255
      if (filesize != 0
812
255
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
813
0
  goto got_wrong_format_error;
814
255
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
815
0
  goto got_wrong_format_error;
816
255
      elf_tdata (abfd)->phdr
817
255
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
818
255
      if (elf_tdata (abfd)->phdr == NULL)
819
0
  goto got_no_match;
820
255
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
821
0
  goto got_no_match;
822
255
      bool eu_strip_broken_phdrs = false;
823
255
      i_phdr = elf_tdata (abfd)->phdr;
824
2.38k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
825
2.14k
  {
826
2.14k
    Elf_External_Phdr x_phdr;
827
828
2.14k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
829
6
      goto got_no_match;
830
2.13k
    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.13k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
834
500
      {
835
500
        i_phdr->p_align &= -i_phdr->p_align;
836
500
        if (!abfd->read_only)
837
4
    {
838
4
      _bfd_error_handler (_("warning: %pB has a program header "
839
4
          "with invalid alignment"), abfd);
840
4
      abfd->read_only = 1;
841
4
    }
842
500
      }
843
    /* Detect eu-strip -f debug files, which have program
844
       headers that describe the original file.  */
845
2.13k
    if (i_phdr->p_filesz != 0
846
2.13k
        && (i_phdr->p_filesz > filesize
847
1.82k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
848
466
      eu_strip_broken_phdrs = true;
849
2.13k
  }
850
249
      if (!eu_strip_broken_phdrs
851
249
    && i_ehdrp->e_shoff == 0
852
249
    && i_ehdrp->e_shstrndx == 0)
853
0
  {
854
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
855
       segment if there is no section header.  */
856
0
    i_phdr = elf_tdata (abfd)->phdr;
857
0
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
858
0
      if (i_phdr->p_type == PT_DYNAMIC)
859
0
        {
860
0
    if (i_phdr->p_filesz != 0
861
0
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
862
0
                  elf_tdata (abfd)->phdr,
863
0
                  i_ehdrp->e_phnum,
864
0
                  filesize))
865
0
      goto got_no_match;
866
0
    break;
867
0
        }
868
0
  }
869
249
    }
870
871
249
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
872
243
    {
873
243
      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
243
      num_sec = elf_numsections (abfd);
879
8.21k
      for (shindex = 1; shindex < num_sec; shindex++)
880
7.97k
  if (!bfd_section_from_shdr (abfd, shindex))
881
7
    goto got_no_match;
882
883
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
884
236
      if (! _bfd_elf_setup_sections (abfd))
885
0
  goto got_wrong_format_error;
886
236
    }
887
888
  /* Let the backend double check the format and override global
889
     information.  */
890
242
  if (ebd->elf_backend_object_p)
891
123
    {
892
123
      if (! (*ebd->elf_backend_object_p) (abfd))
893
32
  goto got_wrong_format_error;
894
123
    }
895
896
  /* Remember the entry point specified in the ELF file header.  */
897
210
  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
6.26k
  for (s = abfd->sections; s != NULL; s = s->next)
902
6.05k
    {
903
6.05k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
904
6.05k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
905
6.05k
    && elf_section_data (s)->this_hdr.sh_info > 0)
906
403
  {
907
403
    unsigned long targ_index;
908
403
    asection *targ_sec;
909
910
403
    targ_index = elf_section_data (s)->this_hdr.sh_info;
911
403
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
912
403
    if (targ_sec != NULL
913
403
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
914
0
      s->flags |= SEC_DEBUGGING;
915
403
  }
916
6.05k
    }
917
210
  return _bfd_no_cleanup;
918
919
605k
 got_wrong_format_error:
920
605k
  bfd_set_error (bfd_error_wrong_format);
921
922
605k
 got_no_match:
923
605k
  return NULL;
924
605k
}
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
130
{
1236
130
  Elf_Internal_Shdr *hdr;
1237
130
  Elf_Internal_Shdr *verhdr;
1238
130
  unsigned long symcount; /* Number of external ELF symbols */
1239
130
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
130
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
130
  Elf_Internal_Sym *isym;
1242
130
  Elf_Internal_Sym *isymend;
1243
130
  Elf_Internal_Sym *isymbuf = NULL;
1244
130
  Elf_External_Versym *xver;
1245
130
  Elf_External_Versym *xverbuf = NULL;
1246
130
  const struct elf_backend_data *ebd;
1247
130
  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
130
  if (! dynamic)
1260
130
    {
1261
130
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
130
      verhdr = NULL;
1263
130
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
130
  ebd = get_elf_backend_data (abfd);
1284
130
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
130
  if (symcount == 0)
1286
130
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
130
  if (symcount == 0)
1288
16
    sym = symbase = NULL;
1289
114
  else
1290
114
    {
1291
114
      size_t i;
1292
1293
114
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
114
              NULL, NULL, NULL);
1295
114
      if (isymbuf == NULL)
1296
5
  return -1;
1297
1298
109
      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
109
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
109
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
109
      if (verhdr != NULL
1309
109
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
0
  {
1311
0
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
0
      (_("%pB: version count (%" PRId64 ")"
1314
0
         " does not match symbol count (%ld)"),
1315
0
       abfd,
1316
0
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
0
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
0
    verhdr = NULL;
1322
0
  }
1323
1324
109
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
109
      xver = xverbuf;
1336
109
      if (xver != NULL)
1337
0
  ++xver;
1338
109
      isymend = isymbuf + symcount;
1339
109
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
39.1k
     isym < isymend;
1341
39.0k
     isym++, sym++, i++)
1342
39.0k
  {
1343
39.0k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
39.0k
    sym->symbol.the_bfd = abfd;
1346
39.0k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
39.0k
    else
1350
39.0k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
39.0k
    sym->symbol.value = isym->st_value;
1352
1353
39.0k
    if (isym->st_shndx == SHN_UNDEF)
1354
9.32k
      {
1355
9.32k
        sym->symbol.section = bfd_und_section_ptr;
1356
9.32k
      }
1357
29.6k
    else if (isym->st_shndx == SHN_ABS)
1358
295
      {
1359
295
        sym->symbol.section = bfd_abs_section_ptr;
1360
295
      }
1361
29.3k
    else if (isym->st_shndx == SHN_COMMON)
1362
0
      {
1363
0
        sym->symbol.section = bfd_com_section_ptr;
1364
0
        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
0
        sym->symbol.value = isym->st_size;
1383
0
      }
1384
29.3k
    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
29.3k
    else
1394
29.3k
      {
1395
29.3k
        sym->symbol.section
1396
29.3k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
29.3k
        if (sym->symbol.section == NULL)
1398
15.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
15.9k
      sym->symbol.section = bfd_abs_section_ptr;
1406
15.9k
    }
1407
29.3k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
39.0k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
13.9k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
39.0k
    switch (ELF_ST_BIND (isym->st_info))
1415
39.0k
      {
1416
18.8k
      case STB_LOCAL:
1417
18.8k
        sym->symbol.flags |= BSF_LOCAL;
1418
18.8k
        break;
1419
8.00k
      case STB_GLOBAL:
1420
8.00k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
3.14k
    sym->symbol.flags |= BSF_GLOBAL;
1422
8.00k
        break;
1423
1.24k
      case STB_WEAK:
1424
1.24k
        sym->symbol.flags |= BSF_WEAK;
1425
1.24k
        break;
1426
486
      case STB_GNU_UNIQUE:
1427
486
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
486
        break;
1429
39.0k
      }
1430
1431
39.0k
    switch (ELF_ST_TYPE (isym->st_info))
1432
39.0k
      {
1433
3.93k
      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
3.93k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
3.93k
            | BSF_DEBUGGING
1440
3.93k
            | BSF_SECTION_SYM_USED);
1441
3.93k
        break;
1442
991
      case STT_FILE:
1443
991
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
991
        break;
1445
6.07k
      case STT_FUNC:
1446
6.07k
        sym->symbol.flags |= BSF_FUNCTION;
1447
6.07k
        break;
1448
1.47k
      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
1.47k
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
9.44k
      case STT_OBJECT:
1454
9.44k
        sym->symbol.flags |= BSF_OBJECT;
1455
9.44k
        break;
1456
557
      case STT_TLS:
1457
557
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
557
        break;
1459
626
      case STT_RELC:
1460
626
        sym->symbol.flags |= BSF_RELC;
1461
626
        break;
1462
1.07k
      case STT_SRELC:
1463
1.07k
        sym->symbol.flags |= BSF_SRELC;
1464
1.07k
        break;
1465
1.03k
      case STT_GNU_IFUNC:
1466
1.03k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
1.03k
        break;
1468
39.0k
      }
1469
1470
39.0k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
39.0k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
39.0k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
39.0k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
39.0k
    if (ebd->elf_backend_symbol_processing)
1487
21.6k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
39.0k
  }
1489
109
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
125
  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
125
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
125
  if (symptrs)
1501
125
    {
1502
125
      long l = symcount;
1503
1504
125
      sym = symbase;
1505
39.1k
      while (l-- > 0)
1506
39.0k
  {
1507
39.0k
    *symptrs++ = &sym->symbol;
1508
39.0k
    sym++;
1509
39.0k
  }
1510
125
      *symptrs = 0;   /* Final null pointer */
1511
125
    }
1512
1513
125
  free (xverbuf);
1514
125
  if (hdr->contents != (unsigned char *) isymbuf
1515
125
      && !elf_use_dt_symtab_p (abfd))
1516
109
    free (isymbuf);
1517
125
  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
130
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1235
84
{
1236
84
  Elf_Internal_Shdr *hdr;
1237
84
  Elf_Internal_Shdr *verhdr;
1238
84
  unsigned long symcount; /* Number of external ELF symbols */
1239
84
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
84
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
84
  Elf_Internal_Sym *isym;
1242
84
  Elf_Internal_Sym *isymend;
1243
84
  Elf_Internal_Sym *isymbuf = NULL;
1244
84
  Elf_External_Versym *xver;
1245
84
  Elf_External_Versym *xverbuf = NULL;
1246
84
  const struct elf_backend_data *ebd;
1247
84
  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
84
  if (! dynamic)
1260
84
    {
1261
84
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
84
      verhdr = NULL;
1263
84
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
84
  ebd = get_elf_backend_data (abfd);
1284
84
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
84
  if (symcount == 0)
1286
84
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
84
  if (symcount == 0)
1288
5
    sym = symbase = NULL;
1289
79
  else
1290
79
    {
1291
79
      size_t i;
1292
1293
79
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
79
              NULL, NULL, NULL);
1295
79
      if (isymbuf == NULL)
1296
1
  return -1;
1297
1298
78
      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
78
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
78
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
78
      if (verhdr != NULL
1309
78
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
0
  {
1311
0
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
0
      (_("%pB: version count (%" PRId64 ")"
1314
0
         " does not match symbol count (%ld)"),
1315
0
       abfd,
1316
0
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
0
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
0
    verhdr = NULL;
1322
0
  }
1323
1324
78
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
78
      xver = xverbuf;
1336
78
      if (xver != NULL)
1337
0
  ++xver;
1338
78
      isymend = isymbuf + symcount;
1339
78
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
14.0k
     isym < isymend;
1341
13.9k
     isym++, sym++, i++)
1342
13.9k
  {
1343
13.9k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
13.9k
    sym->symbol.the_bfd = abfd;
1346
13.9k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
13.9k
    else
1350
13.9k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
13.9k
    sym->symbol.value = isym->st_value;
1352
1353
13.9k
    if (isym->st_shndx == SHN_UNDEF)
1354
4.12k
      {
1355
4.12k
        sym->symbol.section = bfd_und_section_ptr;
1356
4.12k
      }
1357
9.83k
    else if (isym->st_shndx == SHN_ABS)
1358
68
      {
1359
68
        sym->symbol.section = bfd_abs_section_ptr;
1360
68
      }
1361
9.76k
    else if (isym->st_shndx == SHN_COMMON)
1362
0
      {
1363
0
        sym->symbol.section = bfd_com_section_ptr;
1364
0
        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
0
        sym->symbol.value = isym->st_size;
1383
0
      }
1384
9.76k
    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
9.76k
    else
1394
9.76k
      {
1395
9.76k
        sym->symbol.section
1396
9.76k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
9.76k
        if (sym->symbol.section == NULL)
1398
1.07k
    {
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
1.07k
      sym->symbol.section = bfd_abs_section_ptr;
1406
1.07k
    }
1407
9.76k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
13.9k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
890
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
13.9k
    switch (ELF_ST_BIND (isym->st_info))
1415
13.9k
      {
1416
9.63k
      case STB_LOCAL:
1417
9.63k
        sym->symbol.flags |= BSF_LOCAL;
1418
9.63k
        break;
1419
3.51k
      case STB_GLOBAL:
1420
3.51k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
569
    sym->symbol.flags |= BSF_GLOBAL;
1422
3.51k
        break;
1423
244
      case STB_WEAK:
1424
244
        sym->symbol.flags |= BSF_WEAK;
1425
244
        break;
1426
43
      case STB_GNU_UNIQUE:
1427
43
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
43
        break;
1429
13.9k
      }
1430
1431
13.9k
    switch (ELF_ST_TYPE (isym->st_info))
1432
13.9k
      {
1433
3.16k
      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
3.16k
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
3.16k
            | BSF_DEBUGGING
1440
3.16k
            | BSF_SECTION_SYM_USED);
1441
3.16k
        break;
1442
144
      case STT_FILE:
1443
144
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
144
        break;
1445
1.02k
      case STT_FUNC:
1446
1.02k
        sym->symbol.flags |= BSF_FUNCTION;
1447
1.02k
        break;
1448
92
      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
92
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
4.75k
      case STT_OBJECT:
1454
4.75k
        sym->symbol.flags |= BSF_OBJECT;
1455
4.75k
        break;
1456
97
      case STT_TLS:
1457
97
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
97
        break;
1459
68
      case STT_RELC:
1460
68
        sym->symbol.flags |= BSF_RELC;
1461
68
        break;
1462
27
      case STT_SRELC:
1463
27
        sym->symbol.flags |= BSF_SRELC;
1464
27
        break;
1465
37
      case STT_GNU_IFUNC:
1466
37
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
37
        break;
1468
13.9k
      }
1469
1470
13.9k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
13.9k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
13.9k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
13.9k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
13.9k
    if (ebd->elf_backend_symbol_processing)
1487
13.6k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
13.9k
  }
1489
78
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
83
  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
83
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
83
  if (symptrs)
1501
83
    {
1502
83
      long l = symcount;
1503
1504
83
      sym = symbase;
1505
14.0k
      while (l-- > 0)
1506
13.9k
  {
1507
13.9k
    *symptrs++ = &sym->symbol;
1508
13.9k
    sym++;
1509
13.9k
  }
1510
83
      *symptrs = 0;   /* Final null pointer */
1511
83
    }
1512
1513
83
  free (xverbuf);
1514
83
  if (hdr->contents != (unsigned char *) isymbuf
1515
83
      && !elf_use_dt_symtab_p (abfd))
1516
78
    free (isymbuf);
1517
83
  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
84
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1235
46
{
1236
46
  Elf_Internal_Shdr *hdr;
1237
46
  Elf_Internal_Shdr *verhdr;
1238
46
  unsigned long symcount; /* Number of external ELF symbols */
1239
46
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1240
46
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1241
46
  Elf_Internal_Sym *isym;
1242
46
  Elf_Internal_Sym *isymend;
1243
46
  Elf_Internal_Sym *isymbuf = NULL;
1244
46
  Elf_External_Versym *xver;
1245
46
  Elf_External_Versym *xverbuf = NULL;
1246
46
  const struct elf_backend_data *ebd;
1247
46
  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
46
  if (! dynamic)
1260
46
    {
1261
46
      hdr = &elf_tdata (abfd)->symtab_hdr;
1262
46
      verhdr = NULL;
1263
46
    }
1264
0
  else
1265
0
    {
1266
0
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1267
0
      if (elf_dynversym (abfd) == 0)
1268
0
  verhdr = NULL;
1269
0
      else
1270
0
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1271
0
      if ((elf_dynverdef (abfd) != 0
1272
0
     && elf_tdata (abfd)->verdef == NULL)
1273
0
    || (elf_dynverref (abfd) != 0
1274
0
        && elf_tdata (abfd)->verref == NULL)
1275
0
    || elf_tdata (abfd)->dt_verdef != NULL
1276
0
    || elf_tdata (abfd)->dt_verneed != NULL)
1277
0
  {
1278
0
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1279
0
      return -1;
1280
0
  }
1281
0
    }
1282
1283
46
  ebd = get_elf_backend_data (abfd);
1284
46
  symcount = elf_tdata (abfd)->dt_symtab_count;
1285
46
  if (symcount == 0)
1286
46
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1287
46
  if (symcount == 0)
1288
11
    sym = symbase = NULL;
1289
35
  else
1290
35
    {
1291
35
      size_t i;
1292
1293
35
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1294
35
              NULL, NULL, NULL);
1295
35
      if (isymbuf == NULL)
1296
4
  return -1;
1297
1298
31
      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
31
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1304
31
      if (symbase == (elf_symbol_type *) NULL)
1305
0
  goto error_return;
1306
1307
      /* Read the raw ELF version symbol information.  */
1308
31
      if (verhdr != NULL
1309
31
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1310
0
  {
1311
0
    _bfd_error_handler
1312
      /* xgettext:c-format */
1313
0
      (_("%pB: version count (%" PRId64 ")"
1314
0
         " does not match symbol count (%ld)"),
1315
0
       abfd,
1316
0
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1317
0
       symcount);
1318
1319
    /* Slurp in the symbols without the version information,
1320
       since that is more helpful than just quitting.  */
1321
0
    verhdr = NULL;
1322
0
  }
1323
1324
31
      if (verhdr != NULL)
1325
0
  {
1326
0
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1327
0
      goto error_return;
1328
0
    xverbuf = (Elf_External_Versym *)
1329
0
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1330
0
    if (xverbuf == NULL && verhdr->sh_size != 0)
1331
0
      goto error_return;
1332
0
  }
1333
1334
      /* Skip first symbol, which is a null dummy.  */
1335
31
      xver = xverbuf;
1336
31
      if (xver != NULL)
1337
0
  ++xver;
1338
31
      isymend = isymbuf + symcount;
1339
31
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1340
25.0k
     isym < isymend;
1341
25.0k
     isym++, sym++, i++)
1342
25.0k
  {
1343
25.0k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1344
1345
25.0k
    sym->symbol.the_bfd = abfd;
1346
25.0k
    if (elf_use_dt_symtab_p (abfd))
1347
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1348
0
        + isym->st_name);
1349
25.0k
    else
1350
25.0k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1351
25.0k
    sym->symbol.value = isym->st_value;
1352
1353
25.0k
    if (isym->st_shndx == SHN_UNDEF)
1354
5.20k
      {
1355
5.20k
        sym->symbol.section = bfd_und_section_ptr;
1356
5.20k
      }
1357
19.8k
    else if (isym->st_shndx == SHN_ABS)
1358
227
      {
1359
227
        sym->symbol.section = bfd_abs_section_ptr;
1360
227
      }
1361
19.6k
    else if (isym->st_shndx == SHN_COMMON)
1362
0
      {
1363
0
        sym->symbol.section = bfd_com_section_ptr;
1364
0
        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
0
        sym->symbol.value = isym->st_size;
1383
0
      }
1384
19.6k
    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
19.6k
    else
1394
19.6k
      {
1395
19.6k
        sym->symbol.section
1396
19.6k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1397
19.6k
        if (sym->symbol.section == NULL)
1398
14.8k
    {
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
14.8k
      sym->symbol.section = bfd_abs_section_ptr;
1406
14.8k
    }
1407
19.6k
      }
1408
1409
    /* If this is a relocatable file, then the symbol value is
1410
       already section relative.  */
1411
25.0k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1412
13.0k
      sym->symbol.value -= sym->symbol.section->vma;
1413
1414
25.0k
    switch (ELF_ST_BIND (isym->st_info))
1415
25.0k
      {
1416
9.26k
      case STB_LOCAL:
1417
9.26k
        sym->symbol.flags |= BSF_LOCAL;
1418
9.26k
        break;
1419
4.49k
      case STB_GLOBAL:
1420
4.49k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1421
2.57k
    sym->symbol.flags |= BSF_GLOBAL;
1422
4.49k
        break;
1423
997
      case STB_WEAK:
1424
997
        sym->symbol.flags |= BSF_WEAK;
1425
997
        break;
1426
443
      case STB_GNU_UNIQUE:
1427
443
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1428
443
        break;
1429
25.0k
      }
1430
1431
25.0k
    switch (ELF_ST_TYPE (isym->st_info))
1432
25.0k
      {
1433
771
      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
771
        sym->symbol.flags |= (BSF_SECTION_SYM
1439
771
            | BSF_DEBUGGING
1440
771
            | BSF_SECTION_SYM_USED);
1441
771
        break;
1442
847
      case STT_FILE:
1443
847
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1444
847
        break;
1445
5.04k
      case STT_FUNC:
1446
5.04k
        sym->symbol.flags |= BSF_FUNCTION;
1447
5.04k
        break;
1448
1.38k
      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
1.38k
        sym->symbol.flags |= BSF_ELF_COMMON;
1452
        /* Fall through.  */
1453
4.68k
      case STT_OBJECT:
1454
4.68k
        sym->symbol.flags |= BSF_OBJECT;
1455
4.68k
        break;
1456
460
      case STT_TLS:
1457
460
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1458
460
        break;
1459
558
      case STT_RELC:
1460
558
        sym->symbol.flags |= BSF_RELC;
1461
558
        break;
1462
1.04k
      case STT_SRELC:
1463
1.04k
        sym->symbol.flags |= BSF_SRELC;
1464
1.04k
        break;
1465
998
      case STT_GNU_IFUNC:
1466
998
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1467
998
        break;
1468
25.0k
      }
1469
1470
25.0k
    if (dynamic)
1471
0
      sym->symbol.flags |= BSF_DYNAMIC;
1472
1473
25.0k
    if (elf_tdata (abfd)->dt_versym)
1474
0
      sym->version = bfd_get_16 (abfd,
1475
25.0k
               elf_tdata (abfd)->dt_versym + 2 * i);
1476
25.0k
    else if (xver != NULL)
1477
0
      {
1478
0
        Elf_Internal_Versym iversym;
1479
1480
0
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1481
0
        sym->version = iversym.vs_vers;
1482
0
        xver++;
1483
0
      }
1484
1485
    /* Do some backend-specific processing on this symbol.  */
1486
25.0k
    if (ebd->elf_backend_symbol_processing)
1487
8.00k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1488
25.0k
  }
1489
31
    }
1490
1491
  /* Do some backend-specific processing on this symbol table.  */
1492
42
  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
42
  symcount = sym - symbase;
1498
1499
  /* Fill in the user's symbol pointer vector if needed.  */
1500
42
  if (symptrs)
1501
42
    {
1502
42
      long l = symcount;
1503
1504
42
      sym = symbase;
1505
25.0k
      while (l-- > 0)
1506
25.0k
  {
1507
25.0k
    *symptrs++ = &sym->symbol;
1508
25.0k
    sym++;
1509
25.0k
  }
1510
42
      *symptrs = 0;   /* Final null pointer */
1511
42
    }
1512
1513
42
  free (xverbuf);
1514
42
  if (hdr->contents != (unsigned char *) isymbuf
1515
42
      && !elf_use_dt_symtab_p (abfd))
1516
31
    free (isymbuf);
1517
42
  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
46
}
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
878
{
1539
878
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
878
  void *allocated = NULL;
1541
878
  bfd_byte *native_relocs;
1542
878
  arelent *relent;
1543
878
  unsigned int i;
1544
878
  int entsize;
1545
878
  unsigned int symcount;
1546
1547
878
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
0
    return false;
1549
878
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
878
  if (allocated == NULL)
1551
0
    return false;
1552
1553
878
  native_relocs = (bfd_byte *) allocated;
1554
1555
878
  entsize = rel_hdr->sh_entsize;
1556
878
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
878
        || entsize == sizeof (Elf_External_Rela));
1558
1559
878
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
878
  else
1562
878
    symcount = bfd_get_symcount (abfd);
1563
1564
878
  for (i = 0, relent = relents;
1565
72.2k
       i < reloc_count;
1566
71.4k
       i++, relent++, native_relocs += entsize)
1567
71.4k
    {
1568
71.4k
      bool res;
1569
71.4k
      Elf_Internal_Rela rela;
1570
1571
71.4k
      if (entsize == sizeof (Elf_External_Rela))
1572
71.4k
  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
71.4k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
71.4k
  relent->address = rela.r_offset;
1582
0
      else
1583
0
  relent->address = rela.r_offset - asect->vma;
1584
1585
71.4k
      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
29
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
71.3k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
52
  {
1591
52
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
52
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
52
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
52
    bfd_set_error (bfd_error_bad_value);
1596
52
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
52
  }
1598
71.3k
      else
1599
71.3k
  {
1600
71.3k
    asymbol **ps;
1601
1602
71.3k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
71.3k
    relent->sym_ptr_ptr = ps;
1605
71.3k
  }
1606
1607
71.4k
      relent->addend = rela.r_addend;
1608
1609
71.4k
      if ((entsize == sizeof (Elf_External_Rela)
1610
71.4k
     && ebd->elf_info_to_howto != NULL)
1611
71.4k
    || ebd->elf_info_to_howto_rel == NULL)
1612
71.4k
  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
71.4k
      if (! res || relent->howto == NULL)
1617
2
  goto error_return;
1618
71.4k
    }
1619
1620
876
  free (allocated);
1621
876
  return true;
1622
1623
2
 error_return:
1624
2
  free (allocated);
1625
2
  return false;
1626
878
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1538
878
{
1539
878
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1540
878
  void *allocated = NULL;
1541
878
  bfd_byte *native_relocs;
1542
878
  arelent *relent;
1543
878
  unsigned int i;
1544
878
  int entsize;
1545
878
  unsigned int symcount;
1546
1547
878
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1548
0
    return false;
1549
878
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1550
878
  if (allocated == NULL)
1551
0
    return false;
1552
1553
878
  native_relocs = (bfd_byte *) allocated;
1554
1555
878
  entsize = rel_hdr->sh_entsize;
1556
878
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1557
878
        || entsize == sizeof (Elf_External_Rela));
1558
1559
878
  if (dynamic)
1560
0
    symcount = bfd_get_dynamic_symcount (abfd);
1561
878
  else
1562
878
    symcount = bfd_get_symcount (abfd);
1563
1564
878
  for (i = 0, relent = relents;
1565
72.2k
       i < reloc_count;
1566
71.4k
       i++, relent++, native_relocs += entsize)
1567
71.4k
    {
1568
71.4k
      bool res;
1569
71.4k
      Elf_Internal_Rela rela;
1570
1571
71.4k
      if (entsize == sizeof (Elf_External_Rela))
1572
71.4k
  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
71.4k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1581
71.4k
  relent->address = rela.r_offset;
1582
0
      else
1583
0
  relent->address = rela.r_offset - asect->vma;
1584
1585
71.4k
      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
29
  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1589
71.3k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1590
52
  {
1591
52
    _bfd_error_handler
1592
      /* xgettext:c-format */
1593
52
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1594
52
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1595
52
    bfd_set_error (bfd_error_bad_value);
1596
52
    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1597
52
  }
1598
71.3k
      else
1599
71.3k
  {
1600
71.3k
    asymbol **ps;
1601
1602
71.3k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1603
1604
71.3k
    relent->sym_ptr_ptr = ps;
1605
71.3k
  }
1606
1607
71.4k
      relent->addend = rela.r_addend;
1608
1609
71.4k
      if ((entsize == sizeof (Elf_External_Rela)
1610
71.4k
     && ebd->elf_info_to_howto != NULL)
1611
71.4k
    || ebd->elf_info_to_howto_rel == NULL)
1612
71.4k
  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
71.4k
      if (! res || relent->howto == NULL)
1617
2
  goto error_return;
1618
71.4k
    }
1619
1620
876
  free (allocated);
1621
876
  return true;
1622
1623
2
 error_return:
1624
2
  free (allocated);
1625
2
  return false;
1626
878
}
Unexecuted instantiation: elf32.c:elf_slurp_reloc_table_from_section
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
2.10k
{
1636
2.10k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
2.10k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
2.10k
  Elf_Internal_Shdr *rel_hdr;
1639
2.10k
  Elf_Internal_Shdr *rel_hdr2;
1640
2.10k
  bfd_size_type reloc_count;
1641
2.10k
  bfd_size_type reloc_count2;
1642
2.10k
  arelent *relents;
1643
2.10k
  size_t amt;
1644
1645
2.10k
  if (asect->relocation != NULL)
1646
0
    return true;
1647
1648
2.10k
  if (! dynamic)
1649
2.10k
    {
1650
2.10k
      if ((asect->flags & SEC_RELOC) == 0
1651
2.10k
    || asect->reloc_count == 0)
1652
1.22k
  return true;
1653
1654
878
      rel_hdr = d->rel.hdr;
1655
878
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
878
      rel_hdr2 = d->rela.hdr;
1657
878
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
878
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
878
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
878
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
878
    }
1666
0
  else
1667
0
    {
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
0
      if (asect->size == 0)
1673
0
  return true;
1674
1675
0
      rel_hdr = &d->this_hdr;
1676
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1677
0
      rel_hdr2 = NULL;
1678
0
      reloc_count2 = 0;
1679
0
    }
1680
1681
878
  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
878
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
878
  if (relents == NULL)
1688
0
    return false;
1689
1690
878
  if (rel_hdr
1691
878
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1692
0
                rel_hdr, reloc_count,
1693
0
                relents,
1694
0
                symbols, dynamic))
1695
0
    return false;
1696
1697
878
  if (rel_hdr2
1698
878
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
878
                rel_hdr2, reloc_count2,
1700
878
                relents + reloc_count,
1701
878
                symbols, dynamic))
1702
2
    return false;
1703
1704
876
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
0
    return false;
1706
1707
876
  asect->relocation = relents;
1708
876
  return true;
1709
876
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1635
1.56k
{
1636
1.56k
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
1.56k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
1.56k
  Elf_Internal_Shdr *rel_hdr;
1639
1.56k
  Elf_Internal_Shdr *rel_hdr2;
1640
1.56k
  bfd_size_type reloc_count;
1641
1.56k
  bfd_size_type reloc_count2;
1642
1.56k
  arelent *relents;
1643
1.56k
  size_t amt;
1644
1645
1.56k
  if (asect->relocation != NULL)
1646
0
    return true;
1647
1648
1.56k
  if (! dynamic)
1649
1.56k
    {
1650
1.56k
      if ((asect->flags & SEC_RELOC) == 0
1651
1.56k
    || asect->reloc_count == 0)
1652
689
  return true;
1653
1654
878
      rel_hdr = d->rel.hdr;
1655
878
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1656
878
      rel_hdr2 = d->rela.hdr;
1657
878
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1658
1659
      /* PR 17512: file: 0b4f81b7.  */
1660
878
      if (asect->reloc_count != reloc_count + reloc_count2)
1661
0
  return false;
1662
878
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1663
878
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1664
1665
878
    }
1666
0
  else
1667
0
    {
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
0
      if (asect->size == 0)
1673
0
  return true;
1674
1675
0
      rel_hdr = &d->this_hdr;
1676
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1677
0
      rel_hdr2 = NULL;
1678
0
      reloc_count2 = 0;
1679
0
    }
1680
1681
878
  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
878
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
878
  if (relents == NULL)
1688
0
    return false;
1689
1690
878
  if (rel_hdr
1691
878
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1692
0
                rel_hdr, reloc_count,
1693
0
                relents,
1694
0
                symbols, dynamic))
1695
0
    return false;
1696
1697
878
  if (rel_hdr2
1698
878
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1699
878
                rel_hdr2, reloc_count2,
1700
878
                relents + reloc_count,
1701
878
                symbols, dynamic))
1702
2
    return false;
1703
1704
876
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
0
    return false;
1706
1707
876
  asect->relocation = relents;
1708
876
  return true;
1709
876
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1635
533
{
1636
533
  const struct elf_backend_data * const bed = get_elf_backend_data (abfd);
1637
533
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1638
533
  Elf_Internal_Shdr *rel_hdr;
1639
533
  Elf_Internal_Shdr *rel_hdr2;
1640
533
  bfd_size_type reloc_count;
1641
533
  bfd_size_type reloc_count2;
1642
533
  arelent *relents;
1643
533
  size_t amt;
1644
1645
533
  if (asect->relocation != NULL)
1646
0
    return true;
1647
1648
533
  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
0
  else
1667
0
    {
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
0
      if (asect->size == 0)
1673
0
  return true;
1674
1675
0
      rel_hdr = &d->this_hdr;
1676
0
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1677
0
      rel_hdr2 = NULL;
1678
0
      reloc_count2 = 0;
1679
0
    }
1680
1681
0
  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
0
  relents = (arelent *) bfd_alloc (abfd, amt);
1687
0
  if (relents == NULL)
1688
0
    return false;
1689
1690
0
  if (rel_hdr
1691
0
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1692
0
                rel_hdr, reloc_count,
1693
0
                relents,
1694
0
                symbols, dynamic))
1695
0
    return false;
1696
1697
0
  if (rel_hdr2
1698
0
      && !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
0
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1705
0
    return false;
1706
1707
0
  asect->relocation = relents;
1708
0
  return true;
1709
0
}
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
0
{
2039
0
  return ELF_R_SYM (r_info);
2040
0
}
Unexecuted instantiation: elf64_r_sym
Unexecuted instantiation: elf32_r_sym
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
};