Coverage Report

Created: 2026-07-25 10:20

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