Coverage Report

Created: 2026-07-12 09:22

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
33.4M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
1.39k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
29.7M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
1.89M
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
999
#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
26.1k
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
108k
#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
136
#define elf_swap_reloca_out   NAME(bfd_elf,swap_reloca_out)
99
#define elf_swap_symbol_in    NAME(bfd_elf,swap_symbol_in)
100
#define elf_swap_symbol_out   NAME(bfd_elf,swap_symbol_out)
101
1.86M
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
478
#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
684
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
271k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
1.78M
#define ELFCLASS  ELFCLASS64
134
#define FILE_ALIGN  8
135
#define LOG_FILE_ALIGN  3
136
#endif
137
#if ARCH_SIZE == 32
138
315
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
139
68.0k
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
7.00M
#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.2k
#define H_PUT_WORD    H_PUT_64
159
863
#define H_PUT_SIGNED_WORD H_PUT_S64
160
8.60M
#define H_GET_WORD    H_GET_64
161
562k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
11.3k
#define H_PUT_WORD    H_PUT_32
165
634
#define H_PUT_SIGNED_WORD H_PUT_S32
166
16.3M
#define H_GET_WORD    H_GET_32
167
899k
#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
181k
{
179
181k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
181k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
181k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
181k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
181k
  if (signed_vma)
185
17.8k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
164k
  else
187
164k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
181k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
181k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
181k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
181k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
181k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
2.52k
    {
194
2.52k
      if (shndx == NULL)
195
467
  return false;
196
2.05k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
2.05k
    }
198
179k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
4.74k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
181k
  dst->st_target_internal = 0;
201
181k
  return true;
202
181k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
126k
{
179
126k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
126k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
126k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
126k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
126k
  if (signed_vma)
185
8.02k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
118k
  else
187
118k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
126k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
126k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
126k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
126k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
126k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
542
    {
194
542
      if (shndx == NULL)
195
271
  return false;
196
271
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
271
    }
198
126k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
3.27k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
126k
  dst->st_target_internal = 0;
201
  return true;
202
126k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
55.2k
{
179
55.2k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
55.2k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
55.2k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
55.2k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
55.2k
  if (signed_vma)
185
9.85k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
45.4k
  else
187
45.4k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
55.2k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
55.2k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
55.2k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
55.2k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
55.2k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
1.97k
    {
194
1.97k
      if (shndx == NULL)
195
196
  return false;
196
1.78k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1.78k
    }
198
53.3k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
1.47k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
55.0k
  dst->st_target_internal = 0;
201
  return true;
202
55.2k
}
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.39k
{
213
1.39k
  unsigned int tmp;
214
1.39k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.39k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.39k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.39k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.39k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.39k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.39k
  tmp = src->st_shndx;
221
1.39k
  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.39k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.39k
}
bfd_elf64_swap_symbol_out
Line
Count
Source
212
1.25k
{
213
1.25k
  unsigned int tmp;
214
1.25k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.25k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.25k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.25k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.25k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.25k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.25k
  tmp = src->st_shndx;
221
1.25k
  if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
222
0
    {
223
0
      if (shndx == NULL)
224
0
  abort ();
225
0
      H_PUT_32 (abfd, tmp, shndx);
226
0
      tmp = SHN_XINDEX & 0xffff;
227
0
    }
228
1.25k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.25k
}
bfd_elf32_swap_symbol_out
Line
Count
Source
212
140
{
213
140
  unsigned int tmp;
214
140
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
140
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
140
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
140
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
140
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
140
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
140
  tmp = src->st_shndx;
221
140
  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
140
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
140
}
230
231
/* Translate an ELF file header in external format into an ELF file header in
232
   internal format.  */
233
234
static void
235
elf_swap_ehdr_in (bfd *abfd,
236
      const Elf_External_Ehdr *src,
237
      Elf_Internal_Ehdr *dst)
238
2.75M
{
239
2.75M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
2.75M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
2.75M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
2.75M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
2.75M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
2.75M
  if (signed_vma)
245
305k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.44M
  else
247
2.44M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
2.75M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
2.75M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
2.75M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
2.75M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
2.75M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
2.75M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
2.75M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
2.75M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
2.75M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
2.75M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
372k
{
239
372k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
372k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
372k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
372k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
372k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
372k
  if (signed_vma)
245
53.3k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
318k
  else
247
318k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
372k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
372k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
372k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
372k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
372k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
372k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
372k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
372k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
372k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
372k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
2.37M
{
239
2.37M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
2.37M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
2.37M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
2.37M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
2.37M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
2.37M
  if (signed_vma)
245
252k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.12M
  else
247
2.12M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
2.37M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
2.37M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
2.37M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
2.37M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
2.37M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
2.37M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
2.37M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
2.37M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
2.37M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
2.37M
}
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
498
{
267
498
  unsigned int tmp;
268
498
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
498
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
498
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
498
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
498
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
498
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
498
  if (signed_vma)
276
498
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
440
  else
278
498
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
498
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
498
  if (no_section_header)
281
498
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
498
  else
283
498
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
498
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
498
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
498
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
498
  tmp = src->e_phnum;
288
498
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
498
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
498
  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
498
  else
298
498
    {
299
498
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
498
      tmp = src->e_shnum;
301
498
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
498
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
498
      tmp = src->e_shstrndx;
305
498
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
498
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
498
    }
309
498
}
elf64.c:elf_swap_ehdr_out
Line
Count
Source
266
179
{
267
179
  unsigned int tmp;
268
179
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
179
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
179
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
179
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
179
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
179
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
179
  if (signed_vma)
276
179
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
150
  else
278
179
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
179
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
179
  if (no_section_header)
281
179
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
179
  else
283
179
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
179
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
179
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
179
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
179
  tmp = src->e_phnum;
288
179
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
179
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
179
  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
179
  else
298
179
    {
299
179
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
179
      tmp = src->e_shnum;
301
179
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
179
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
179
      tmp = src->e_shstrndx;
305
179
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
179
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
179
    }
309
179
}
elf32.c:elf_swap_ehdr_out
Line
Count
Source
266
319
{
267
319
  unsigned int tmp;
268
319
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
319
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
319
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
319
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
319
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
319
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
319
  if (signed_vma)
276
319
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
290
  else
278
319
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
319
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
319
  if (no_section_header)
281
319
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
319
  else
283
319
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
319
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
319
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
319
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
319
  tmp = src->e_phnum;
288
319
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
319
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
319
  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
319
  else
298
319
    {
299
319
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
319
      tmp = src->e_shnum;
301
319
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
319
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
319
      tmp = src->e_shstrndx;
305
319
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
319
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
319
    }
309
319
}
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.01M
{
319
1.01M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
1.01M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
1.01M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
1.01M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
1.01M
  if (signed_vma)
325
253k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
762k
  else
327
762k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
1.01M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
1.01M
  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.01M
  if (dst->sh_type != SHT_NOBITS)
334
997k
    {
335
997k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
997k
      if (filesize != 0
338
997k
    && ((ufile_ptr) dst->sh_offset > filesize
339
731k
        || dst->sh_size > filesize - dst->sh_offset)
340
357k
    && !abfd->read_only)
341
69.6k
  {
342
69.6k
    _bfd_error_handler (_("warning: %pB has a section "
343
69.6k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
69.6k
    if (abfd->is_linker_input)
346
0
      return false;
347
69.6k
    abfd->read_only = 1;
348
69.6k
  }
349
997k
    }
350
1.01M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
1.01M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
1.01M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
1.01M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
1.01M
  dst->bfd_section = NULL;
355
1.01M
  dst->contents = NULL;
356
1.01M
  return true;
357
1.01M
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
581k
{
319
581k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
581k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
581k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
581k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
581k
  if (signed_vma)
325
90.4k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
490k
  else
327
490k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
581k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
581k
  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
581k
  if (dst->sh_type != SHT_NOBITS)
334
574k
    {
335
574k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
574k
      if (filesize != 0
338
574k
    && ((ufile_ptr) dst->sh_offset > filesize
339
442k
        || dst->sh_size > filesize - dst->sh_offset)
340
178k
    && !abfd->read_only)
341
31.1k
  {
342
31.1k
    _bfd_error_handler (_("warning: %pB has a section "
343
31.1k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
31.1k
    if (abfd->is_linker_input)
346
0
      return false;
347
31.1k
    abfd->read_only = 1;
348
31.1k
  }
349
574k
    }
350
581k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
581k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
581k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
581k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
581k
  dst->bfd_section = NULL;
355
581k
  dst->contents = NULL;
356
  return true;
357
581k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
434k
{
319
434k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
434k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
434k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
434k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
434k
  if (signed_vma)
325
162k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
271k
  else
327
271k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
434k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
434k
  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
434k
  if (dst->sh_type != SHT_NOBITS)
334
422k
    {
335
422k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
422k
      if (filesize != 0
338
422k
    && ((ufile_ptr) dst->sh_offset > filesize
339
288k
        || dst->sh_size > filesize - dst->sh_offset)
340
178k
    && !abfd->read_only)
341
38.4k
  {
342
38.4k
    _bfd_error_handler (_("warning: %pB has a section "
343
38.4k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
38.4k
    if (abfd->is_linker_input)
346
0
      return false;
347
38.4k
    abfd->read_only = 1;
348
38.4k
  }
349
422k
    }
350
434k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
434k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
434k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
434k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
434k
  dst->bfd_section = NULL;
355
434k
  dst->contents = NULL;
356
  return true;
357
434k
}
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.83k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
2.83k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
2.83k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
2.83k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
2.83k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
2.83k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
2.83k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
2.83k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
2.83k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
2.83k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
2.83k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
2.83k
}
elf64.c:elf_swap_shdr_out
Line
Count
Source
366
1.57k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.57k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.57k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.57k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.57k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.57k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.57k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.57k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.57k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.57k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.57k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.57k
}
elf32.c:elf_swap_shdr_out
Line
Count
Source
366
1.26k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.26k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.26k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.26k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.26k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.26k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.26k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.26k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.26k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.26k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.26k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.26k
}
379
380
/* Translate an ELF program header table entry in external format into an
381
   ELF program header table entry in internal format.  */
382
383
void
384
elf_swap_phdr_in (bfd *abfd,
385
      const Elf_External_Phdr *src,
386
      Elf_Internal_Phdr *dst)
387
1.86M
{
388
1.86M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.86M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.86M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.86M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.86M
  if (signed_vma)
394
387k
    {
395
387k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
387k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
387k
    }
398
1.47M
  else
399
1.47M
    {
400
1.47M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.47M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.47M
    }
403
1.86M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.86M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.86M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.86M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
387
648k
{
388
648k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
648k
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
648k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
648k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
648k
  if (signed_vma)
394
153k
    {
395
153k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
153k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
153k
    }
398
495k
  else
399
495k
    {
400
495k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
495k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
495k
    }
403
648k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
648k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
648k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
648k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
387
1.21M
{
388
1.21M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.21M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.21M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.21M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.21M
  if (signed_vma)
394
234k
    {
395
234k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
234k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
234k
    }
398
978k
  else
399
978k
    {
400
978k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
978k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
978k
    }
403
1.21M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.21M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.21M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.21M
}
407
408
void
409
elf_swap_phdr_out (bfd *abfd,
410
       const Elf_Internal_Phdr *src,
411
       Elf_External_Phdr *dst)
412
478
{
413
478
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
478
  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
478
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
478
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
478
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
478
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
478
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
478
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
478
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
478
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
478
}
bfd_elf64_swap_phdr_out
Line
Count
Source
412
210
{
413
210
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
210
  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
210
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
210
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
210
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
210
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
210
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
210
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
210
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
210
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
210
}
bfd_elf32_swap_phdr_out
Line
Count
Source
412
268
{
413
268
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
268
  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
268
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
268
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
268
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
268
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
268
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
268
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
268
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
268
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
268
}
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
26.1k
{
433
26.1k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
26.1k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
26.1k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
26.1k
  dst->r_addend = 0;
437
26.1k
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
bfd_elf32_swap_reloc_in
Line
Count
Source
432
26.1k
{
433
26.1k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
26.1k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
26.1k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
26.1k
  dst->r_addend = 0;
437
26.1k
}
438
439
void
440
elf_swap_reloca_in (bfd *abfd,
441
        const bfd_byte *s,
442
        Elf_Internal_Rela *dst)
443
110k
{
444
110k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
110k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
110k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
110k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
110k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
443
104k
{
444
104k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
104k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
104k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
104k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
104k
}
bfd_elf32_swap_reloca_in
Line
Count
Source
443
5.85k
{
444
5.85k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
5.85k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
5.85k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
5.85k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
5.85k
}
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
999
{
466
999
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
999
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
999
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
999
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
999
}
bfd_elf64_swap_reloca_out
Line
Count
Source
465
684
{
466
684
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
684
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
684
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
684
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
684
}
bfd_elf32_swap_reloca_out
Line
Count
Source
465
315
{
466
315
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
315
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
315
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
315
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
315
}
471
472
void
473
elf_swap_dyn_in (bfd *abfd,
474
     const void *p,
475
     Elf_Internal_Dyn *dst)
476
67.4k
{
477
67.4k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
67.4k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
67.4k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
67.4k
}
bfd_elf64_swap_dyn_in
Line
Count
Source
476
55.7k
{
477
55.7k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
55.7k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
55.7k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
55.7k
}
bfd_elf32_swap_dyn_in
Line
Count
Source
476
11.6k
{
477
11.6k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
11.6k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
11.6k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
11.6k
}
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
28.8M
{
504
28.8M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
8.98M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
8.97M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
8.96M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
28.8M
}
elf64.c:elf_file_p
Line
Count
Source
503
6.23M
{
504
6.23M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
1.82M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
1.82M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
1.81M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
6.23M
}
elf32.c:elf_file_p
Line
Count
Source
503
22.6M
{
504
22.6M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
7.16M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
7.15M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
7.14M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
22.6M
}
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
29.7M
{
521
29.7M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
29.7M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
29.7M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
29.7M
  Elf_Internal_Shdr i_shdr;
525
29.7M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
29.7M
  unsigned int shindex;
527
29.7M
  elf_backend_data *ebd;
528
29.7M
  asection *s;
529
29.7M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
29.7M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
3.93M
    {
535
3.93M
      if (bfd_get_error () != bfd_error_system_call)
536
3.91M
  goto got_wrong_format_error;
537
16.7k
      else
538
16.7k
  goto got_no_match;
539
3.93M
    }
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
25.8M
  if (! elf_file_p (&x_ehdr)
548
6.89M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
6.72M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
21.8M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
3.95M
  switch (x_ehdr.e_ident[EI_DATA])
554
3.95M
    {
555
1.15M
    case ELFDATA2MSB:   /* Big-endian */
556
1.15M
      if (! bfd_header_big_endian (abfd))
557
579k
  goto got_wrong_format_error;
558
576k
      break;
559
2.79M
    case ELFDATA2LSB:   /* Little-endian */
560
2.79M
      if (! bfd_header_little_endian (abfd))
561
1.37M
  goto got_wrong_format_error;
562
1.42M
      break;
563
1.42M
    case ELFDATANONE:   /* No data encoding specified */
564
1.93k
    default:      /* Unknown data encoding specified */
565
1.93k
      goto got_wrong_format_error;
566
3.95M
    }
567
568
2.00M
  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.00M
  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.00M
  i_ehdrp = elf_elfheader (abfd);
578
2.00M
  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.00M
  if (i_ehdrp->e_type == ET_CORE)
585
475k
    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.52M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
24.0k
    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.50M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
44.1k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.45M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
1.02k
    goto got_wrong_format_error;
601
602
1.45M
  ebd = get_elf_backend_data (abfd);
603
1.45M
  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.45M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.38M
      && (ebd->elf_machine_alt1 == 0
610
348k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.38M
      && (ebd->elf_machine_alt2 == 0
612
47.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.38M
      && ebd->elf_machine_code != EM_NONE)
614
1.35M
    goto got_wrong_format_error;
615
616
103k
  if (i_ehdrp->e_type == ET_EXEC)
617
3.97k
    abfd->flags |= EXEC_P;
618
99.7k
  else if (i_ehdrp->e_type == ET_DYN)
619
4.32k
    abfd->flags |= DYNAMIC;
620
621
103k
  if (i_ehdrp->e_phnum > 0)
622
43.9k
    abfd->flags |= D_PAGED;
623
624
103k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
32.9k
    {
626
      /* It's OK if this fails for the generic target.  */
627
32.9k
      if (ebd->elf_machine_code != EM_NONE)
628
14
  goto got_no_match;
629
32.9k
    }
630
631
103k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
9.04k
    goto got_wrong_format_error;
633
634
94.6k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
77.7k
    {
636
77.7k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
77.7k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
684
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
77.0k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
75.2k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
1.83k
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
75.2k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
18.6k
  {
652
18.6k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
18.6k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
18.4k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
17.8k
        || i_ehdrp->e_shnum  == 0)
656
1.12k
      goto got_wrong_format_error;
657
18.6k
  }
658
659
      /* And similarly for the string table index.  */
660
74.1k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
1.00k
  {
662
1.00k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
1.00k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
1.00k
  }
666
667
      /* And program headers.  */
668
74.1k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
794
  {
670
794
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
794
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
794
  }
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
74.1k
      if (i_ehdrp->e_shnum != 1)
678
71.9k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
71.9k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
71.1k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
1.12k
      goto got_wrong_format_error;
683
684
70.8k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
70.8k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
70.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
70.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
1.36k
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
69.5k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
69.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
69.5k
  }
698
74.1k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
88.4k
  if (i_ehdrp->e_shnum != 0)
703
71.6k
    {
704
71.6k
      Elf_Internal_Shdr *shdrp;
705
71.6k
      unsigned int num_sec;
706
71.6k
      size_t amt;
707
708
71.6k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
71.6k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
71.6k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
71.6k
      num_sec = i_ehdrp->e_shnum;
714
71.6k
      elf_numsections (abfd) = num_sec;
715
71.6k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
71.6k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
71.6k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
71.6k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
71.6k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
71.6k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
1.10M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
1.03M
  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.00M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
940k
  {
732
940k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
940k
        || !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
940k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
5.44k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
5.44k
        switch (ebd->elf_machine_code)
742
5.44k
    {
743
538
    case EM_386:
744
611
    case EM_IAMCU:
745
2.82k
    case EM_X86_64:
746
2.82k
    case EM_OLD_SPARCV9:
747
2.82k
    case EM_SPARC32PLUS:
748
3.21k
    case EM_SPARCV9:
749
3.35k
    case EM_SPARC:
750
3.35k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.58k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
2.12k
        break;
753
      /* Otherwise fall through.  */
754
3.31k
    default:
755
3.31k
      goto got_wrong_format_error;
756
5.44k
    }
757
5.44k
      }
758
759
936k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
799k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
757k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
200k
        && i_shdrp[shindex].sh_info >= num_sec)
763
623
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
936k
    if (i_shdrp[shindex].sh_size != 0
768
777k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
238k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
228k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
228k
       % ebd->minpagesize)
772
228k
      != 0))
773
141k
      abfd->flags &= ~D_PAGED;
774
936k
  }
775
776
67.7k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
65.2k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
4.79k
  {
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
4.79k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
4.79k
    if (!abfd->read_only)
787
546
      {
788
546
        _bfd_error_handler
789
546
    (_("warning: %pB has a corrupt string table index"), abfd);
790
546
        abfd->read_only = 1;
791
546
      }
792
4.79k
  }
793
67.7k
    }
794
16.8k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
3.95k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
80.6k
  if (i_ehdrp->e_phnum == 0)
799
49.6k
    elf_tdata (abfd)->phdr = NULL;
800
30.9k
  else
801
30.9k
    {
802
30.9k
      Elf_Internal_Phdr *i_phdr;
803
30.9k
      unsigned int i;
804
30.9k
      ufile_ptr filesize;
805
30.9k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
30.9k
      filesize = bfd_get_file_size (abfd);
810
30.9k
      if (filesize != 0
811
30.9k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
1.34k
  goto got_wrong_format_error;
813
29.5k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
29.5k
      elf_tdata (abfd)->phdr
816
29.5k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
29.5k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
29.5k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
162
  goto got_no_match;
821
29.5k
      bool eu_strip_broken_phdrs = false;
822
29.4k
      i_phdr = elf_tdata (abfd)->phdr;
823
734k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
706k
  {
825
706k
    Elf_External_Phdr x_phdr;
826
827
706k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
1.52k
      goto got_no_match;
829
705k
    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
705k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
468k
      {
834
468k
        i_phdr->p_align &= -i_phdr->p_align;
835
468k
        if (!abfd->read_only)
836
7.94k
    {
837
7.94k
      _bfd_error_handler (_("warning: %pB has a program header "
838
7.94k
          "with invalid alignment"), abfd);
839
7.94k
      abfd->read_only = 1;
840
7.94k
    }
841
468k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
705k
    if (i_phdr->p_filesz != 0
845
535k
        && (i_phdr->p_filesz > filesize
846
95.9k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
477k
      eu_strip_broken_phdrs = true;
848
705k
  }
849
27.9k
      if (!eu_strip_broken_phdrs
850
5.49k
    && i_ehdrp->e_shoff == 0
851
4.23k
    && i_ehdrp->e_shstrndx == 0)
852
4.23k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
4.23k
    i_phdr = elf_tdata (abfd)->phdr;
856
15.3k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
14.8k
      if (i_phdr->p_type == PT_DYNAMIC)
858
3.79k
        {
859
3.79k
    if (i_phdr->p_filesz != 0
860
3.63k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
3.63k
                  elf_tdata (abfd)->phdr,
862
3.63k
                  i_ehdrp->e_phnum,
863
3.63k
                  filesize))
864
3.46k
      goto got_no_match;
865
333
    break;
866
3.79k
        }
867
4.23k
  }
868
27.9k
    }
869
870
74.1k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
62.7k
    {
872
62.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
62.7k
      num_sec = elf_numsections (abfd);
878
815k
      for (shindex = 1; shindex < num_sec; shindex++)
879
770k
  if (!bfd_section_from_shdr (abfd, shindex))
880
18.4k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
44.2k
      if (! _bfd_elf_setup_sections (abfd))
884
5.92k
  goto got_wrong_format_error;
885
44.2k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
49.7k
  if (ebd->elf_backend_object_p)
890
31.1k
    {
891
31.1k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
4.24k
  goto got_wrong_format_error;
893
31.1k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
45.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
341k
  for (s = abfd->sections; s != NULL; s = s->next)
901
296k
    {
902
296k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
293k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
15.4k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
13.6k
  {
906
13.6k
    unsigned long targ_index;
907
13.6k
    asection *targ_sec;
908
909
13.6k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
13.6k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
13.6k
    if (targ_sec != NULL
912
11.2k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
2.03k
      s->flags |= SEC_DEBUGGING;
914
13.6k
  }
915
296k
    }
916
45.4k
  return _bfd_no_cleanup;
917
918
29.6M
 got_wrong_format_error:
919
29.6M
  bfd_set_error (bfd_error_wrong_format);
920
921
29.7M
 got_no_match:
922
29.7M
  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
24.8k
    _bfd_elf_cleanup_object_attributes (abfd);
927
29.7M
  return NULL;
928
29.6M
}
bfd_elf64_object_p
Line
Count
Source
520
6.96M
{
521
6.96M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
6.96M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
6.96M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
6.96M
  Elf_Internal_Shdr i_shdr;
525
6.96M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
6.96M
  unsigned int shindex;
527
6.96M
  elf_backend_data *ebd;
528
6.96M
  asection *s;
529
6.96M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
6.96M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
1.34M
    {
535
1.34M
      if (bfd_get_error () != bfd_error_system_call)
536
1.33M
  goto got_wrong_format_error;
537
12.6k
      else
538
12.6k
  goto got_no_match;
539
1.34M
    }
540
541
  /* Now check to see if we have a valid ELF file, and one that BFD can
542
     make use of.  The magic number must match, the address size ('class')
543
     and byte-swapping must match our XVEC entry, and it must have a
544
     section header table (FIXME: See comments re sections at top of this
545
     file).  */
546
547
5.61M
  if (! elf_file_p (&x_ehdr)
548
1.42M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
1.38M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
4.99M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
620k
  switch (x_ehdr.e_ident[EI_DATA])
554
620k
    {
555
90.9k
    case ELFDATA2MSB:   /* Big-endian */
556
90.9k
      if (! bfd_header_big_endian (abfd))
557
47.7k
  goto got_wrong_format_error;
558
43.1k
      break;
559
528k
    case ELFDATA2LSB:   /* Little-endian */
560
528k
      if (! bfd_header_little_endian (abfd))
561
243k
  goto got_wrong_format_error;
562
285k
      break;
563
285k
    case ELFDATANONE:   /* No data encoding specified */
564
287
    default:      /* Unknown data encoding specified */
565
287
      goto got_wrong_format_error;
566
620k
    }
567
568
328k
  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
328k
  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
328k
  i_ehdrp = elf_elfheader (abfd);
578
328k
  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
328k
  if (i_ehdrp->e_type == ET_CORE)
585
19.9k
    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
308k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
591
    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
307k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
5.19k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
302k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
228
    goto got_wrong_format_error;
601
602
302k
  ebd = get_elf_backend_data (abfd);
603
302k
  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
302k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
270k
      && (ebd->elf_machine_alt1 == 0
610
34.3k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
269k
      && (ebd->elf_machine_alt2 == 0
612
26.1k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
268k
      && ebd->elf_machine_code != EM_NONE)
614
254k
    goto got_wrong_format_error;
615
616
48.0k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.23k
    abfd->flags |= EXEC_P;
618
45.7k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.37k
    abfd->flags |= DYNAMIC;
620
621
48.0k
  if (i_ehdrp->e_phnum > 0)
622
17.6k
    abfd->flags |= D_PAGED;
623
624
48.0k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
15.1k
    {
626
      /* It's OK if this fails for the generic target.  */
627
15.1k
      if (ebd->elf_machine_code != EM_NONE)
628
0
  goto got_no_match;
629
15.1k
    }
630
631
48.0k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
6.14k
    goto got_wrong_format_error;
633
634
41.8k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
35.3k
    {
636
35.3k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
35.3k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
684
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
34.6k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
33.8k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
815
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
33.8k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
1.48k
  {
652
1.48k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
1.48k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
1.38k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
743
        || i_ehdrp->e_shnum  == 0)
656
838
      goto got_wrong_format_error;
657
1.48k
  }
658
659
      /* And similarly for the string table index.  */
660
33.0k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
542
  {
662
542
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
542
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
542
  }
666
667
      /* And program headers.  */
668
33.0k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
360
  {
670
360
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
360
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
360
  }
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
33.0k
      if (i_ehdrp->e_shnum != 1)
678
32.1k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
32.1k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
31.9k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
302
      goto got_wrong_format_error;
683
684
31.8k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
31.8k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
31.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
31.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
602
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
31.2k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
31.2k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
31.2k
  }
698
33.0k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
38.6k
  if (i_ehdrp->e_shnum != 0)
703
32.1k
    {
704
32.1k
      Elf_Internal_Shdr *shdrp;
705
32.1k
      unsigned int num_sec;
706
32.1k
      size_t amt;
707
708
32.1k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
32.1k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
32.1k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
32.1k
      num_sec = i_ehdrp->e_shnum;
714
32.1k
      elf_numsections (abfd) = num_sec;
715
32.1k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
32.1k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
32.1k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
32.1k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
32.1k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
32.1k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
625k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
593k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
577k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
547k
  {
732
547k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
547k
        || !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
547k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
3.48k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
3.48k
        switch (ebd->elf_machine_code)
742
3.48k
    {
743
0
    case EM_386:
744
0
    case EM_IAMCU:
745
2.12k
    case EM_X86_64:
746
2.12k
    case EM_OLD_SPARCV9:
747
2.12k
    case EM_SPARC32PLUS:
748
2.51k
    case EM_SPARCV9:
749
2.51k
    case EM_SPARC:
750
2.51k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.19k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
1.58k
        break;
753
      /* Otherwise fall through.  */
754
1.90k
    default:
755
1.90k
      goto got_wrong_format_error;
756
3.48k
    }
757
3.48k
      }
758
759
545k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
452k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
412k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
133k
        && i_shdrp[shindex].sh_info >= num_sec)
763
191
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
545k
    if (i_shdrp[shindex].sh_size != 0
768
467k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
156k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
152k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
152k
       % ebd->minpagesize)
772
152k
      != 0))
773
93.3k
      abfd->flags &= ~D_PAGED;
774
545k
  }
775
776
30.0k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
28.9k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
2.00k
  {
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.00k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
2.00k
    if (!abfd->read_only)
787
146
      {
788
146
        _bfd_error_handler
789
146
    (_("warning: %pB has a corrupt string table index"), abfd);
790
146
        abfd->read_only = 1;
791
146
      }
792
2.00k
  }
793
30.0k
    }
794
6.51k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
152
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
36.3k
  if (i_ehdrp->e_phnum == 0)
799
23.5k
    elf_tdata (abfd)->phdr = NULL;
800
12.8k
  else
801
12.8k
    {
802
12.8k
      Elf_Internal_Phdr *i_phdr;
803
12.8k
      unsigned int i;
804
12.8k
      ufile_ptr filesize;
805
12.8k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
12.8k
      filesize = bfd_get_file_size (abfd);
810
12.8k
      if (filesize != 0
811
12.8k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
574
  goto got_wrong_format_error;
813
12.2k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
12.2k
      elf_tdata (abfd)->phdr
816
12.2k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
12.2k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
12.2k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
162
  goto got_no_match;
821
12.2k
      bool eu_strip_broken_phdrs = false;
822
12.0k
      i_phdr = elf_tdata (abfd)->phdr;
823
364k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
352k
  {
825
352k
    Elf_External_Phdr x_phdr;
826
827
352k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
642
      goto got_no_match;
829
352k
    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
352k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
242k
      {
834
242k
        i_phdr->p_align &= -i_phdr->p_align;
835
242k
        if (!abfd->read_only)
836
5.29k
    {
837
5.29k
      _bfd_error_handler (_("warning: %pB has a program header "
838
5.29k
          "with invalid alignment"), abfd);
839
5.29k
      abfd->read_only = 1;
840
5.29k
    }
841
242k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
352k
    if (i_phdr->p_filesz != 0
845
273k
        && (i_phdr->p_filesz > filesize
846
39.5k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
247k
      eu_strip_broken_phdrs = true;
848
352k
  }
849
11.4k
      if (!eu_strip_broken_phdrs
850
3.79k
    && i_ehdrp->e_shoff == 0
851
3.09k
    && i_ehdrp->e_shstrndx == 0)
852
3.09k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
3.09k
    i_phdr = elf_tdata (abfd)->phdr;
856
11.6k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
11.5k
      if (i_phdr->p_type == PT_DYNAMIC)
858
2.91k
        {
859
2.91k
    if (i_phdr->p_filesz != 0
860
2.85k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
2.85k
                  elf_tdata (abfd)->phdr,
862
2.85k
                  i_ehdrp->e_phnum,
863
2.85k
                  filesize))
864
2.67k
      goto got_no_match;
865
236
    break;
866
2.91k
        }
867
3.09k
  }
868
11.4k
    }
869
870
32.3k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
27.9k
    {
872
27.9k
      unsigned int num_sec;
873
874
      /* Once all of the section headers have been read and converted, we
875
   can start processing them.  Note that the first section header is
876
   a dummy placeholder entry, so we ignore it.  */
877
27.9k
      num_sec = elf_numsections (abfd);
878
450k
      for (shindex = 1; shindex < num_sec; shindex++)
879
433k
  if (!bfd_section_from_shdr (abfd, shindex))
880
11.2k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
16.7k
      if (! _bfd_elf_setup_sections (abfd))
884
3.00k
  goto got_wrong_format_error;
885
16.7k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
18.1k
  if (ebd->elf_backend_object_p)
890
10.6k
    {
891
10.6k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
20
  goto got_wrong_format_error;
893
10.6k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
18.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
178k
  for (s = abfd->sections; s != NULL; s = s->next)
901
160k
    {
902
160k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
160k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
12.7k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
11.7k
  {
906
11.7k
    unsigned long targ_index;
907
11.7k
    asection *targ_sec;
908
909
11.7k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
11.7k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
11.7k
    if (targ_sec != NULL
912
9.67k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.91k
      s->flags |= SEC_DEBUGGING;
914
11.7k
  }
915
160k
    }
916
18.0k
  return _bfd_no_cleanup;
917
918
6.92M
 got_wrong_format_error:
919
6.92M
  bfd_set_error (bfd_error_wrong_format);
920
921
6.94M
 got_no_match:
922
6.94M
  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
12.6k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
6.92M
}
bfd_elf32_object_p
Line
Count
Source
520
22.7M
{
521
22.7M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
22.7M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
22.7M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
22.7M
  Elf_Internal_Shdr i_shdr;
525
22.7M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
22.7M
  unsigned int shindex;
527
22.7M
  elf_backend_data *ebd;
528
22.7M
  asection *s;
529
22.7M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
22.7M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
2.58M
    {
535
2.58M
      if (bfd_get_error () != bfd_error_system_call)
536
2.58M
  goto got_wrong_format_error;
537
4.09k
      else
538
4.09k
  goto got_no_match;
539
2.58M
    }
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
20.1M
  if (! elf_file_p (&x_ehdr)
548
5.47M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
5.34M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
16.8M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
3.33M
  switch (x_ehdr.e_ident[EI_DATA])
554
3.33M
    {
555
1.06M
    case ELFDATA2MSB:   /* Big-endian */
556
1.06M
      if (! bfd_header_big_endian (abfd))
557
532k
  goto got_wrong_format_error;
558
533k
      break;
559
2.27M
    case ELFDATA2LSB:   /* Little-endian */
560
2.27M
      if (! bfd_header_little_endian (abfd))
561
1.13M
  goto got_wrong_format_error;
562
1.14M
      break;
563
1.14M
    case ELFDATANONE:   /* No data encoding specified */
564
1.65k
    default:      /* Unknown data encoding specified */
565
1.65k
      goto got_wrong_format_error;
566
3.33M
    }
567
568
1.67M
  target = abfd->xvec;
569
570
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
571
     the tdata pointer in the bfd.  */
572
573
1.67M
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
574
0
    goto got_no_match;
575
576
  /* Now that we know the byte order, swap in the rest of the header */
577
1.67M
  i_ehdrp = elf_elfheader (abfd);
578
1.67M
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
579
#if DEBUG & 1
580
  elf_debug_file (i_ehdrp);
581
#endif
582
583
  /* Reject ET_CORE (header indicates core file, not object file) */
584
1.67M
  if (i_ehdrp->e_type == ET_CORE)
585
455k
    goto got_wrong_format_error;
586
587
  /* If this is a relocatable file and there is no section header
588
     table, then we're hosed.  */
589
1.21M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
23.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.19M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
38.9k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.15M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
792
    goto got_wrong_format_error;
601
602
1.15M
  ebd = get_elf_backend_data (abfd);
603
1.15M
  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.15M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.11M
      && (ebd->elf_machine_alt1 == 0
610
314k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.11M
      && (ebd->elf_machine_alt2 == 0
612
21.0k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.11M
      && ebd->elf_machine_code != EM_NONE)
614
1.09M
    goto got_wrong_format_error;
615
616
55.6k
  if (i_ehdrp->e_type == ET_EXEC)
617
1.74k
    abfd->flags |= EXEC_P;
618
53.9k
  else if (i_ehdrp->e_type == ET_DYN)
619
1.95k
    abfd->flags |= DYNAMIC;
620
621
55.6k
  if (i_ehdrp->e_phnum > 0)
622
26.3k
    abfd->flags |= D_PAGED;
623
624
55.6k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
17.7k
    {
626
      /* It's OK if this fails for the generic target.  */
627
17.7k
      if (ebd->elf_machine_code != EM_NONE)
628
14
  goto got_no_match;
629
17.7k
    }
630
631
55.6k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
2.90k
    goto got_wrong_format_error;
633
634
52.7k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
42.4k
    {
636
42.4k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
42.4k
      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
42.4k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
41.4k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
1.01k
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
41.4k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
17.2k
  {
652
17.2k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
17.2k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
17.0k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
17.0k
        || i_ehdrp->e_shnum  == 0)
656
289
      goto got_wrong_format_error;
657
17.2k
  }
658
659
      /* And similarly for the string table index.  */
660
41.1k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
465
  {
662
465
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
465
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
465
  }
666
667
      /* And program headers.  */
668
41.1k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
434
  {
670
434
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
434
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
434
  }
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
41.1k
      if (i_ehdrp->e_shnum != 1)
678
39.7k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
39.7k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
39.1k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
825
      goto got_wrong_format_error;
683
684
38.9k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
38.9k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
38.9k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
38.9k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
758
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
38.2k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
38.2k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
38.2k
  }
698
41.1k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
49.8k
  if (i_ehdrp->e_shnum != 0)
703
39.5k
    {
704
39.5k
      Elf_Internal_Shdr *shdrp;
705
39.5k
      unsigned int num_sec;
706
39.5k
      size_t amt;
707
708
39.5k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
39.5k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
39.5k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
39.5k
      num_sec = i_ehdrp->e_shnum;
714
39.5k
      elf_numsections (abfd) = num_sec;
715
39.5k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
39.5k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
39.5k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
39.5k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
39.5k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
39.5k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
482k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
443k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
430k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
392k
  {
732
392k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
392k
        || !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
392k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
1.95k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
1.95k
        switch (ebd->elf_machine_code)
742
1.95k
    {
743
538
    case EM_386:
744
611
    case EM_IAMCU:
745
698
    case EM_X86_64:
746
698
    case EM_OLD_SPARCV9:
747
698
    case EM_SPARC32PLUS:
748
698
    case EM_SPARCV9:
749
839
    case EM_SPARC:
750
839
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
393
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
540
        break;
753
      /* Otherwise fall through.  */
754
1.41k
    default:
755
1.41k
      goto got_wrong_format_error;
756
1.95k
    }
757
1.95k
      }
758
759
391k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
347k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
345k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
67.7k
        && i_shdrp[shindex].sh_info >= num_sec)
763
432
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
390k
    if (i_shdrp[shindex].sh_size != 0
768
310k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
82.4k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
75.6k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
75.6k
       % ebd->minpagesize)
772
75.6k
      != 0))
773
48.1k
      abfd->flags &= ~D_PAGED;
774
390k
  }
775
776
37.6k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
36.3k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
2.79k
  {
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.79k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
2.79k
    if (!abfd->read_only)
787
400
      {
788
400
        _bfd_error_handler
789
400
    (_("warning: %pB has a corrupt string table index"), abfd);
790
400
        abfd->read_only = 1;
791
400
      }
792
2.79k
  }
793
37.6k
    }
794
10.3k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
3.80k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
44.2k
  if (i_ehdrp->e_phnum == 0)
799
26.1k
    elf_tdata (abfd)->phdr = NULL;
800
18.1k
  else
801
18.1k
    {
802
18.1k
      Elf_Internal_Phdr *i_phdr;
803
18.1k
      unsigned int i;
804
18.1k
      ufile_ptr filesize;
805
18.1k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
18.1k
      filesize = bfd_get_file_size (abfd);
810
18.1k
      if (filesize != 0
811
18.1k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
772
  goto got_wrong_format_error;
813
17.3k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
17.3k
      elf_tdata (abfd)->phdr
816
17.3k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
17.3k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
17.3k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
0
  goto got_no_match;
821
17.3k
      bool eu_strip_broken_phdrs = false;
822
17.3k
      i_phdr = elf_tdata (abfd)->phdr;
823
370k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
354k
  {
825
354k
    Elf_External_Phdr x_phdr;
826
827
354k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
885
      goto got_no_match;
829
353k
    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
353k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
225k
      {
834
225k
        i_phdr->p_align &= -i_phdr->p_align;
835
225k
        if (!abfd->read_only)
836
2.65k
    {
837
2.65k
      _bfd_error_handler (_("warning: %pB has a program header "
838
2.65k
          "with invalid alignment"), abfd);
839
2.65k
      abfd->read_only = 1;
840
2.65k
    }
841
225k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
353k
    if (i_phdr->p_filesz != 0
845
261k
        && (i_phdr->p_filesz > filesize
846
56.3k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
230k
      eu_strip_broken_phdrs = true;
848
353k
  }
849
16.4k
      if (!eu_strip_broken_phdrs
850
1.70k
    && i_ehdrp->e_shoff == 0
851
1.14k
    && i_ehdrp->e_shstrndx == 0)
852
1.14k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
1.14k
    i_phdr = elf_tdata (abfd)->phdr;
856
3.64k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
3.38k
      if (i_phdr->p_type == PT_DYNAMIC)
858
878
        {
859
878
    if (i_phdr->p_filesz != 0
860
781
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
781
                  elf_tdata (abfd)->phdr,
862
781
                  i_ehdrp->e_phnum,
863
781
                  filesize))
864
781
      goto got_no_match;
865
97
    break;
866
878
        }
867
1.14k
  }
868
16.4k
    }
869
870
41.7k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
34.7k
    {
872
34.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
34.7k
      num_sec = elf_numsections (abfd);
878
364k
      for (shindex = 1; shindex < num_sec; shindex++)
879
337k
  if (!bfd_section_from_shdr (abfd, shindex))
880
7.26k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
27.4k
      if (! _bfd_elf_setup_sections (abfd))
884
2.92k
  goto got_wrong_format_error;
885
27.4k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
31.5k
  if (ebd->elf_backend_object_p)
890
20.4k
    {
891
20.4k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
4.22k
  goto got_wrong_format_error;
893
20.4k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
27.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
162k
  for (s = abfd->sections; s != NULL; s = s->next)
901
135k
    {
902
135k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
132k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
2.73k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
1.86k
  {
906
1.86k
    unsigned long targ_index;
907
1.86k
    asection *targ_sec;
908
909
1.86k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
1.86k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
1.86k
    if (targ_sec != NULL
912
1.56k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
114
      s->flags |= SEC_DEBUGGING;
914
1.86k
  }
915
135k
    }
916
27.3k
  return _bfd_no_cleanup;
917
918
22.7M
 got_wrong_format_error:
919
22.7M
  bfd_set_error (bfd_error_wrong_format);
920
921
22.7M
 got_no_match:
922
22.7M
  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
12.2k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
22.7M
}
929

930
/* ELF .o/exec file writing */
931
932
/* Write out the relocs.  */
933
934
void
935
elf_write_relocs (bfd *abfd, asection *sec, void *data)
936
1.41k
{
937
1.41k
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
1.41k
  bool *failedp = (bool *) data;
939
1.41k
  Elf_Internal_Shdr *rela_hdr;
940
1.41k
  bfd_vma addr_offset;
941
1.41k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
1.41k
  size_t extsize;
943
1.41k
  bfd_byte *dst_rela;
944
1.41k
  unsigned int idx;
945
1.41k
  asymbol *last_sym;
946
1.41k
  int last_sym_idx;
947
1.41k
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
1.41k
  if (*failedp)
951
0
    return;
952
953
1.41k
  if ((sec->flags & SEC_RELOC) == 0)
954
1.27k
    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
137
  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
136
  if (sec->orelocation == NULL)
967
0
    return;
968
969
136
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
136
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
136
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
136
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
136
      || (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
136
  if (rela_hdr->sh_type == SHT_RELA)
984
136
    {
985
136
      swap_out = elf_swap_reloca_out;
986
136
      extsize = sizeof (Elf_External_Rela);
987
136
    }
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
136
  addr_offset = 0;
1002
136
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
2
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
136
  last_sym = 0;
1007
136
  last_sym_idx = 0;
1008
136
  dst_rela = rela_hdr->contents;
1009
1010
1.13k
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
999
    {
1012
999
      Elf_Internal_Rela src_rela;
1013
999
      arelent *ptr;
1014
999
      asymbol *sym;
1015
999
      int n;
1016
1017
999
      ptr = sec->orelocation[idx];
1018
999
      sym = *ptr->sym_ptr_ptr;
1019
999
      if (sym == last_sym)
1020
175
  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
824
      else if (bfd_is_abs_section (sym->section)
1026
225
         && sym->value == 0
1027
207
         && (sym->flags & BSF_RELC) == 0)
1028
207
  n = STN_UNDEF;
1029
617
      else
1030
617
  {
1031
617
    last_sym = sym;
1032
617
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
617
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
617
    last_sym_idx = n;
1039
617
  }
1040
1041
999
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
796
    && (*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
999
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
#if defined(BFD64) && ARCH_SIZE == 32
1056
315
      if (rela_hdr->sh_type == SHT_RELA
1057
315
    && ptr->howto->bitsize > 32
1058
9
    && 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
684
      src_rela.r_offset = ptr->address + addr_offset;
1070
999
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
684
      src_rela.r_addend = ptr->addend;
1072
684
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
684
    }
1074
1075
136
  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
136
}
bfd_elf64_write_relocs
Line
Count
Source
936
842
{
937
842
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
842
  bool *failedp = (bool *) data;
939
842
  Elf_Internal_Shdr *rela_hdr;
940
842
  bfd_vma addr_offset;
941
842
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
842
  size_t extsize;
943
842
  bfd_byte *dst_rela;
944
842
  unsigned int idx;
945
842
  asymbol *last_sym;
946
842
  int last_sym_idx;
947
842
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
842
  if (*failedp)
951
0
    return;
952
953
842
  if ((sec->flags & SEC_RELOC) == 0)
954
713
    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
129
  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
128
  if (sec->orelocation == NULL)
967
0
    return;
968
969
128
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
128
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
128
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
128
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
128
      || (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
128
  if (rela_hdr->sh_type == SHT_RELA)
984
128
    {
985
128
      swap_out = elf_swap_reloca_out;
986
128
      extsize = sizeof (Elf_External_Rela);
987
128
    }
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
128
  addr_offset = 0;
1002
128
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
2
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
128
  last_sym = 0;
1007
128
  last_sym_idx = 0;
1008
128
  dst_rela = rela_hdr->contents;
1009
1010
812
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
684
    {
1012
684
      Elf_Internal_Rela src_rela;
1013
684
      arelent *ptr;
1014
684
      asymbol *sym;
1015
684
      int n;
1016
1017
684
      ptr = sec->orelocation[idx];
1018
684
      sym = *ptr->sym_ptr_ptr;
1019
684
      if (sym == last_sym)
1020
175
  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
509
      else if (bfd_is_abs_section (sym->section)
1026
139
         && sym->value == 0
1027
123
         && (sym->flags & BSF_RELC) == 0)
1028
123
  n = STN_UNDEF;
1029
386
      else
1030
386
  {
1031
386
    last_sym = sym;
1032
386
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
386
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
386
    last_sym_idx = n;
1039
386
  }
1040
1041
684
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
565
    && (*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
684
      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
684
      src_rela.r_offset = ptr->address + addr_offset;
1070
684
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
684
      src_rela.r_addend = ptr->addend;
1072
684
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
684
    }
1074
1075
128
  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
128
}
bfd_elf32_write_relocs
Line
Count
Source
936
572
{
937
572
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
572
  bool *failedp = (bool *) data;
939
572
  Elf_Internal_Shdr *rela_hdr;
940
572
  bfd_vma addr_offset;
941
572
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
572
  size_t extsize;
943
572
  bfd_byte *dst_rela;
944
572
  unsigned int idx;
945
572
  asymbol *last_sym;
946
572
  int last_sym_idx;
947
572
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
572
  if (*failedp)
951
0
    return;
952
953
572
  if ((sec->flags & SEC_RELOC) == 0)
954
564
    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
8
  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
8
  if (sec->orelocation == NULL)
967
0
    return;
968
969
8
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
8
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
8
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
8
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
8
      || (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
8
  if (rela_hdr->sh_type == SHT_RELA)
984
8
    {
985
8
      swap_out = elf_swap_reloca_out;
986
8
      extsize = sizeof (Elf_External_Rela);
987
8
    }
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
8
  addr_offset = 0;
1002
8
  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
8
  last_sym = 0;
1007
8
  last_sym_idx = 0;
1008
8
  dst_rela = rela_hdr->contents;
1009
1010
323
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
315
    {
1012
315
      Elf_Internal_Rela src_rela;
1013
315
      arelent *ptr;
1014
315
      asymbol *sym;
1015
315
      int n;
1016
1017
315
      ptr = sec->orelocation[idx];
1018
315
      sym = *ptr->sym_ptr_ptr;
1019
315
      if (sym == last_sym)
1020
0
  n = last_sym_idx;
1021
      /* If the relocation is against an absolute symbol whoes value is
1022
   zero, then the symbol can be dropped, simplifying the reloc.
1023
   PR 31106: Except for complex relocations where the symbols
1024
   itself might be significant.  */
1025
315
      else if (bfd_is_abs_section (sym->section)
1026
86
         && sym->value == 0
1027
84
         && (sym->flags & BSF_RELC) == 0)
1028
84
  n = STN_UNDEF;
1029
231
      else
1030
231
  {
1031
231
    last_sym = sym;
1032
231
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
231
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
231
    last_sym_idx = n;
1039
231
  }
1040
1041
315
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
231
    && (*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
315
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
315
#if defined(BFD64) && ARCH_SIZE == 32
1056
315
      if (rela_hdr->sh_type == SHT_RELA
1057
315
    && ptr->howto->bitsize > 32
1058
9
    && 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
315
#endif
1068
1069
315
      src_rela.r_offset = ptr->address + addr_offset;
1070
315
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
315
      src_rela.r_addend = ptr->addend;
1072
315
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
315
    }
1074
1075
8
  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
8
}
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
135
{
1090
613
  while (count--)
1091
478
    {
1092
478
      Elf_External_Phdr extphdr;
1093
1094
478
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
478
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
478
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
478
      phdr++;
1099
478
    }
1100
135
  return 0;
1101
135
}
bfd_elf64_write_out_phdrs
Line
Count
Source
1089
49
{
1090
259
  while (count--)
1091
210
    {
1092
210
      Elf_External_Phdr extphdr;
1093
1094
210
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
210
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
210
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
210
      phdr++;
1099
210
    }
1100
49
  return 0;
1101
49
}
bfd_elf32_write_out_phdrs
Line
Count
Source
1089
86
{
1090
354
  while (count--)
1091
268
    {
1092
268
      Elf_External_Phdr extphdr;
1093
1094
268
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
268
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
268
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
268
      phdr++;
1099
268
    }
1100
86
  return 0;
1101
86
}
1102
1103
/* Write out the section headers and the ELF file header.  */
1104
1105
bool
1106
elf_write_shdrs_and_ehdr (bfd *abfd)
1107
498
{
1108
498
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
498
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
498
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
498
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
498
  unsigned int count;
1113
498
  size_t amt;
1114
1115
498
  i_ehdrp = elf_elfheader (abfd);
1116
498
  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
498
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
498
  amt = sizeof (x_ehdr);
1125
498
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
498
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
498
  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
498
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
498
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
498
  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
498
  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
498
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
498
  if (!x_shdrp)
1149
0
    return false;
1150
1151
3.33k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
2.83k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
2.83k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
2.83k
    }
1158
498
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
498
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
498
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
498
  return true;
1166
498
}
bfd_elf64_write_shdrs_and_ehdr
Line
Count
Source
1107
179
{
1108
179
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
179
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
179
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
179
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
179
  unsigned int count;
1113
179
  size_t amt;
1114
1115
179
  i_ehdrp = elf_elfheader (abfd);
1116
179
  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
179
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
179
  amt = sizeof (x_ehdr);
1125
179
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
179
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
179
  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
179
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
179
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
179
  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
179
  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
179
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
179
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.75k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.57k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.57k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.57k
    }
1158
179
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
179
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
179
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
179
  return true;
1166
179
}
bfd_elf32_write_shdrs_and_ehdr
Line
Count
Source
1107
319
{
1108
319
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
319
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
319
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
319
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
319
  unsigned int count;
1113
319
  size_t amt;
1114
1115
319
  i_ehdrp = elf_elfheader (abfd);
1116
319
  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
319
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
319
  amt = sizeof (x_ehdr);
1125
319
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
319
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
319
  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
319
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
319
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
319
  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
319
  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
319
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
319
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.58k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.26k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.26k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.26k
    }
1158
319
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
319
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
319
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
319
  return true;
1166
319
}
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
7.50k
{
1245
7.50k
  Elf_Internal_Shdr *hdr;
1246
7.50k
  Elf_Internal_Shdr *verhdr;
1247
7.50k
  unsigned long symcount; /* Number of external ELF symbols */
1248
7.50k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
7.50k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
7.50k
  Elf_Internal_Sym *isym;
1251
7.50k
  Elf_Internal_Sym *isymend;
1252
7.50k
  Elf_Internal_Sym *isymbuf = NULL;
1253
7.50k
  Elf_External_Versym *xver;
1254
7.50k
  Elf_External_Versym *xverbuf = NULL;
1255
7.50k
  elf_backend_data *ebd;
1256
7.50k
  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
7.50k
  ebd = get_elf_backend_data (abfd);
1268
1269
7.50k
  if (! dynamic)
1270
7.31k
    {
1271
7.31k
      hdr = &elf_symtab_hdr (abfd);
1272
7.31k
      verhdr = NULL;
1273
7.31k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
7.31k
    }
1275
198
  else
1276
198
    {
1277
198
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
198
      if (elf_dynversym (abfd) == 0)
1279
38
  verhdr = NULL;
1280
160
      else
1281
160
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
198
      if ((elf_dynverdef (abfd) != 0
1283
57
     && elf_tdata (abfd)->verdef == NULL)
1284
141
    || (elf_dynverref (abfd) != 0
1285
100
        && elf_tdata (abfd)->verref == NULL)
1286
90
    || elf_tdata (abfd)->dt_verdef != NULL
1287
90
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
110
  {
1289
110
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
77
      return -1;
1291
110
  }
1292
1293
121
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
121
    }
1295
1296
7.43k
  if (symcount == 0)
1297
786
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
7.43k
  if (symcount == 0)
1300
671
    sym = symbase = NULL;
1301
6.76k
  else
1302
6.76k
    {
1303
6.76k
      size_t i;
1304
1305
6.76k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
6.76k
              NULL, NULL, NULL);
1307
6.76k
      if (isymbuf == NULL)
1308
884
  return -1;
1309
1310
5.87k
      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
5.87k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
5.87k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
5.87k
      if (verhdr != NULL
1321
81
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
10
  {
1323
10
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
10
      (_("%pB: version count (%" PRId64 ")"
1326
10
         " does not match symbol count (%ld)"),
1327
10
       abfd,
1328
10
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
10
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
10
    verhdr = NULL;
1334
10
  }
1335
1336
5.87k
      if (verhdr != NULL)
1337
71
  {
1338
71
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
2
      goto error_return;
1340
69
    xverbuf = (Elf_External_Versym *)
1341
69
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
69
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
2
      goto error_return;
1344
69
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
5.87k
      xver = xverbuf;
1348
5.87k
      if (xver != NULL)
1349
67
  ++xver;
1350
5.87k
      isymend = isymbuf + symcount;
1351
5.87k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
166k
     isym < isymend;
1353
160k
     isym++, sym++, i++)
1354
160k
  {
1355
160k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
160k
    sym->symbol.the_bfd = abfd;
1358
160k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
160k
    else
1362
160k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
160k
    sym->symbol.value = isym->st_value;
1364
1365
160k
    if (isym->st_shndx == SHN_UNDEF)
1366
79.1k
      {
1367
79.1k
        sym->symbol.section = bfd_und_section_ptr;
1368
79.1k
      }
1369
81.7k
    else if (isym->st_shndx == SHN_ABS)
1370
2.53k
      {
1371
2.53k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.53k
      }
1373
79.2k
    else if (isym->st_shndx == SHN_COMMON)
1374
55
      {
1375
55
        sym->symbol.section = bfd_com_section_ptr;
1376
55
        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
55
        sym->symbol.value = isym->st_size;
1395
55
      }
1396
79.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
79.2k
    else
1406
79.2k
      {
1407
79.2k
        sym->symbol.section
1408
79.2k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
79.2k
        if (sym->symbol.section == NULL)
1410
32.8k
    {
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
32.8k
      sym->symbol.section = bfd_abs_section_ptr;
1418
32.8k
    }
1419
79.2k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
160k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
15.8k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
160k
    switch (ELF_ST_BIND (isym->st_info))
1427
160k
      {
1428
101k
      case STB_LOCAL:
1429
101k
        sym->symbol.flags |= BSF_LOCAL;
1430
101k
        break;
1431
41.8k
      case STB_GLOBAL:
1432
41.8k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
9.20k
    sym->symbol.flags |= BSF_GLOBAL;
1434
41.8k
        break;
1435
10.0k
      case STB_WEAK:
1436
10.0k
        sym->symbol.flags |= BSF_WEAK;
1437
10.0k
        break;
1438
1.54k
      case STB_GNU_UNIQUE:
1439
1.54k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
1.54k
        break;
1441
160k
      }
1442
1443
160k
    switch (ELF_ST_TYPE (isym->st_info))
1444
160k
      {
1445
27.4k
      case STT_SECTION:
1446
        /* Mark the input section symbol as used since it may be
1447
           used for relocation and section group.
1448
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1449
     be cleared by objcopy for non-relocatable inputs.  */
1450
27.4k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
27.4k
            | BSF_DEBUGGING
1452
27.4k
            | BSF_SECTION_SYM_USED);
1453
27.4k
        break;
1454
4.49k
      case STT_FILE:
1455
4.49k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
4.49k
        break;
1457
13.0k
      case STT_FUNC:
1458
13.0k
        sym->symbol.flags |= BSF_FUNCTION;
1459
13.0k
        break;
1460
996
      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
996
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
9.80k
      case STT_OBJECT:
1466
9.80k
        sym->symbol.flags |= BSF_OBJECT;
1467
9.80k
        break;
1468
1.68k
      case STT_TLS:
1469
1.68k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.68k
        break;
1471
1.34k
      case STT_RELC:
1472
1.34k
        sym->symbol.flags |= BSF_RELC;
1473
1.34k
        break;
1474
820
      case STT_SRELC:
1475
820
        sym->symbol.flags |= BSF_SRELC;
1476
820
        break;
1477
1.47k
      case STT_GNU_IFUNC:
1478
1.47k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
1.47k
        break;
1480
160k
      }
1481
1482
160k
    if (dynamic)
1483
1.11k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
160k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
160k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
160k
    else if (xver != NULL)
1489
807
      {
1490
807
        Elf_Internal_Versym iversym;
1491
1492
807
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
807
        sym->version = iversym.vs_vers;
1494
807
        xver++;
1495
807
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
160k
    if (ebd->elf_backend_symbol_processing)
1499
68.4k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
160k
  }
1501
5.87k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
6.54k
  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
6.54k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
6.54k
  if (symptrs)
1513
6.54k
    {
1514
6.54k
      long l = symcount;
1515
1516
6.54k
      sym = symbase;
1517
167k
      while (l-- > 0)
1518
160k
  {
1519
160k
    *symptrs++ = &sym->symbol;
1520
160k
    sym++;
1521
160k
  }
1522
6.54k
      *symptrs = 0;   /* Final null pointer */
1523
6.54k
    }
1524
1525
6.54k
  free (xverbuf);
1526
6.54k
  if (hdr->contents != (unsigned char *) isymbuf
1527
5.87k
      && !elf_use_dt_symtab_p (abfd))
1528
5.86k
    free (isymbuf);
1529
6.54k
  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
7.43k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1244
4.39k
{
1245
4.39k
  Elf_Internal_Shdr *hdr;
1246
4.39k
  Elf_Internal_Shdr *verhdr;
1247
4.39k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.39k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.39k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.39k
  Elf_Internal_Sym *isym;
1251
4.39k
  Elf_Internal_Sym *isymend;
1252
4.39k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.39k
  Elf_External_Versym *xver;
1254
4.39k
  Elf_External_Versym *xverbuf = NULL;
1255
4.39k
  elf_backend_data *ebd;
1256
4.39k
  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.39k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.39k
  if (! dynamic)
1270
4.25k
    {
1271
4.25k
      hdr = &elf_symtab_hdr (abfd);
1272
4.25k
      verhdr = NULL;
1273
4.25k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
4.25k
    }
1275
140
  else
1276
140
    {
1277
140
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
140
      if (elf_dynversym (abfd) == 0)
1279
28
  verhdr = NULL;
1280
112
      else
1281
112
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
140
      if ((elf_dynverdef (abfd) != 0
1283
30
     && elf_tdata (abfd)->verdef == NULL)
1284
110
    || (elf_dynverref (abfd) != 0
1285
83
        && elf_tdata (abfd)->verref == NULL)
1286
70
    || elf_tdata (abfd)->dt_verdef != NULL
1287
70
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
72
  {
1289
72
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
55
      return -1;
1291
72
  }
1292
1293
85
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
85
    }
1295
1296
4.33k
  if (symcount == 0)
1297
446
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.33k
  if (symcount == 0)
1300
367
    sym = symbase = NULL;
1301
3.96k
  else
1302
3.96k
    {
1303
3.96k
      size_t i;
1304
1305
3.96k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
3.96k
              NULL, NULL, NULL);
1307
3.96k
      if (isymbuf == NULL)
1308
624
  return -1;
1309
1310
3.34k
      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.34k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.34k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.34k
      if (verhdr != NULL
1321
60
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
3
  {
1323
3
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
3
      (_("%pB: version count (%" PRId64 ")"
1326
3
         " does not match symbol count (%ld)"),
1327
3
       abfd,
1328
3
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
3
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
3
    verhdr = NULL;
1334
3
  }
1335
1336
3.34k
      if (verhdr != NULL)
1337
57
  {
1338
57
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
2
      goto error_return;
1340
55
    xverbuf = (Elf_External_Versym *)
1341
55
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
55
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
1
      goto error_return;
1344
55
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.34k
      xver = xverbuf;
1348
3.34k
      if (xver != NULL)
1349
54
  ++xver;
1350
3.34k
      isymend = isymbuf + symcount;
1351
3.34k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
114k
     isym < isymend;
1353
111k
     isym++, sym++, i++)
1354
111k
  {
1355
111k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
111k
    sym->symbol.the_bfd = abfd;
1358
111k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
111k
    else
1362
111k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
111k
    sym->symbol.value = isym->st_value;
1364
1365
111k
    if (isym->st_shndx == SHN_UNDEF)
1366
56.7k
      {
1367
56.7k
        sym->symbol.section = bfd_und_section_ptr;
1368
56.7k
      }
1369
54.7k
    else if (isym->st_shndx == SHN_ABS)
1370
2.46k
      {
1371
2.46k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.46k
      }
1373
52.2k
    else if (isym->st_shndx == SHN_COMMON)
1374
39
      {
1375
39
        sym->symbol.section = bfd_com_section_ptr;
1376
39
        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
39
        sym->symbol.value = isym->st_size;
1395
39
      }
1396
52.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
52.2k
    else
1406
52.2k
      {
1407
52.2k
        sym->symbol.section
1408
52.2k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
52.2k
        if (sym->symbol.section == NULL)
1410
12.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
12.0k
      sym->symbol.section = bfd_abs_section_ptr;
1418
12.0k
    }
1419
52.2k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
111k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
12.2k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
111k
    switch (ELF_ST_BIND (isym->st_info))
1427
111k
      {
1428
65.8k
      case STB_LOCAL:
1429
65.8k
        sym->symbol.flags |= BSF_LOCAL;
1430
65.8k
        break;
1431
37.6k
      case STB_GLOBAL:
1432
37.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
5.90k
    sym->symbol.flags |= BSF_GLOBAL;
1434
37.6k
        break;
1435
5.74k
      case STB_WEAK:
1436
5.74k
        sym->symbol.flags |= BSF_WEAK;
1437
5.74k
        break;
1438
383
      case STB_GNU_UNIQUE:
1439
383
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
383
        break;
1441
111k
      }
1442
1443
111k
    switch (ELF_ST_TYPE (isym->st_info))
1444
111k
      {
1445
24.9k
      case STT_SECTION:
1446
        /* Mark the input section symbol as used since it may be
1447
           used for relocation and section group.
1448
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1449
     be cleared by objcopy for non-relocatable inputs.  */
1450
24.9k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
24.9k
            | BSF_DEBUGGING
1452
24.9k
            | BSF_SECTION_SYM_USED);
1453
24.9k
        break;
1454
3.60k
      case STT_FILE:
1455
3.60k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
3.60k
        break;
1457
10.0k
      case STT_FUNC:
1458
10.0k
        sym->symbol.flags |= BSF_FUNCTION;
1459
10.0k
        break;
1460
408
      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
408
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
7.91k
      case STT_OBJECT:
1466
7.91k
        sym->symbol.flags |= BSF_OBJECT;
1467
7.91k
        break;
1468
1.34k
      case STT_TLS:
1469
1.34k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.34k
        break;
1471
277
      case STT_RELC:
1472
277
        sym->symbol.flags |= BSF_RELC;
1473
277
        break;
1474
338
      case STT_SRELC:
1475
338
        sym->symbol.flags |= BSF_SRELC;
1476
338
        break;
1477
547
      case STT_GNU_IFUNC:
1478
547
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
547
        break;
1480
111k
      }
1481
1482
111k
    if (dynamic)
1483
867
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
111k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
111k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
111k
    else if (xver != NULL)
1489
656
      {
1490
656
        Elf_Internal_Versym iversym;
1491
1492
656
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
656
        sym->version = iversym.vs_vers;
1494
656
        xver++;
1495
656
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
111k
    if (ebd->elf_backend_symbol_processing)
1499
55.6k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
111k
  }
1501
3.34k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
3.70k
  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.70k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
3.70k
  if (symptrs)
1513
3.70k
    {
1514
3.70k
      long l = symcount;
1515
1516
3.70k
      sym = symbase;
1517
115k
      while (l-- > 0)
1518
111k
  {
1519
111k
    *symptrs++ = &sym->symbol;
1520
111k
    sym++;
1521
111k
  }
1522
3.70k
      *symptrs = 0;   /* Final null pointer */
1523
3.70k
    }
1524
1525
3.70k
  free (xverbuf);
1526
3.70k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.34k
      && !elf_use_dt_symtab_p (abfd))
1528
3.33k
    free (isymbuf);
1529
3.70k
  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.33k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1244
3.11k
{
1245
3.11k
  Elf_Internal_Shdr *hdr;
1246
3.11k
  Elf_Internal_Shdr *verhdr;
1247
3.11k
  unsigned long symcount; /* Number of external ELF symbols */
1248
3.11k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
3.11k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
3.11k
  Elf_Internal_Sym *isym;
1251
3.11k
  Elf_Internal_Sym *isymend;
1252
3.11k
  Elf_Internal_Sym *isymbuf = NULL;
1253
3.11k
  Elf_External_Versym *xver;
1254
3.11k
  Elf_External_Versym *xverbuf = NULL;
1255
3.11k
  elf_backend_data *ebd;
1256
3.11k
  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.11k
  ebd = get_elf_backend_data (abfd);
1268
1269
3.11k
  if (! dynamic)
1270
3.06k
    {
1271
3.06k
      hdr = &elf_symtab_hdr (abfd);
1272
3.06k
      verhdr = NULL;
1273
3.06k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
3.06k
    }
1275
58
  else
1276
58
    {
1277
58
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
58
      if (elf_dynversym (abfd) == 0)
1279
10
  verhdr = NULL;
1280
48
      else
1281
48
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
58
      if ((elf_dynverdef (abfd) != 0
1283
27
     && elf_tdata (abfd)->verdef == NULL)
1284
31
    || (elf_dynverref (abfd) != 0
1285
17
        && elf_tdata (abfd)->verref == NULL)
1286
20
    || elf_tdata (abfd)->dt_verdef != NULL
1287
20
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
38
  {
1289
38
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
22
      return -1;
1291
38
  }
1292
1293
36
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
36
    }
1295
1296
3.09k
  if (symcount == 0)
1297
340
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
3.09k
  if (symcount == 0)
1300
304
    sym = symbase = NULL;
1301
2.79k
  else
1302
2.79k
    {
1303
2.79k
      size_t i;
1304
1305
2.79k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
2.79k
              NULL, NULL, NULL);
1307
2.79k
      if (isymbuf == NULL)
1308
260
  return -1;
1309
1310
2.53k
      if (_bfd_mul_overflow (symcount, sizeof (elf_symbol_type), &amt))
1311
0
  {
1312
0
    bfd_set_error (bfd_error_file_too_big);
1313
0
    goto error_return;
1314
0
  }
1315
2.53k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
2.53k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
2.53k
      if (verhdr != NULL
1321
21
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
7
  {
1323
7
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
7
      (_("%pB: version count (%" PRId64 ")"
1326
7
         " does not match symbol count (%ld)"),
1327
7
       abfd,
1328
7
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
7
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
7
    verhdr = NULL;
1334
7
  }
1335
1336
2.53k
      if (verhdr != NULL)
1337
14
  {
1338
14
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
0
      goto error_return;
1340
14
    xverbuf = (Elf_External_Versym *)
1341
14
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
14
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
1
      goto error_return;
1344
14
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
2.53k
      xver = xverbuf;
1348
2.53k
      if (xver != NULL)
1349
13
  ++xver;
1350
2.53k
      isymend = isymbuf + symcount;
1351
2.53k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
51.9k
     isym < isymend;
1353
49.4k
     isym++, sym++, i++)
1354
49.4k
  {
1355
49.4k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
49.4k
    sym->symbol.the_bfd = abfd;
1358
49.4k
    if (elf_use_dt_symtab_p (abfd))
1359
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
0
        + isym->st_name);
1361
49.4k
    else
1362
49.4k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
49.4k
    sym->symbol.value = isym->st_value;
1364
1365
49.4k
    if (isym->st_shndx == SHN_UNDEF)
1366
22.3k
      {
1367
22.3k
        sym->symbol.section = bfd_und_section_ptr;
1368
22.3k
      }
1369
27.0k
    else if (isym->st_shndx == SHN_ABS)
1370
69
      {
1371
69
        sym->symbol.section = bfd_abs_section_ptr;
1372
69
      }
1373
26.9k
    else if (isym->st_shndx == SHN_COMMON)
1374
16
      {
1375
16
        sym->symbol.section = bfd_com_section_ptr;
1376
16
        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
16
        sym->symbol.value = isym->st_size;
1395
16
      }
1396
26.9k
    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
26.9k
    else
1406
26.9k
      {
1407
26.9k
        sym->symbol.section
1408
26.9k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
26.9k
        if (sym->symbol.section == NULL)
1410
20.8k
    {
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
20.8k
      sym->symbol.section = bfd_abs_section_ptr;
1418
20.8k
    }
1419
26.9k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
49.4k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
3.61k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
49.4k
    switch (ELF_ST_BIND (isym->st_info))
1427
49.4k
      {
1428
35.2k
      case STB_LOCAL:
1429
35.2k
        sym->symbol.flags |= BSF_LOCAL;
1430
35.2k
        break;
1431
4.22k
      case STB_GLOBAL:
1432
4.22k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
3.30k
    sym->symbol.flags |= BSF_GLOBAL;
1434
4.22k
        break;
1435
4.28k
      case STB_WEAK:
1436
4.28k
        sym->symbol.flags |= BSF_WEAK;
1437
4.28k
        break;
1438
1.15k
      case STB_GNU_UNIQUE:
1439
1.15k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
1.15k
        break;
1441
49.4k
      }
1442
1443
49.4k
    switch (ELF_ST_TYPE (isym->st_info))
1444
49.4k
      {
1445
2.52k
      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
2.52k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
2.52k
            | BSF_DEBUGGING
1452
2.52k
            | BSF_SECTION_SYM_USED);
1453
2.52k
        break;
1454
886
      case STT_FILE:
1455
886
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
886
        break;
1457
2.98k
      case STT_FUNC:
1458
2.98k
        sym->symbol.flags |= BSF_FUNCTION;
1459
2.98k
        break;
1460
588
      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
588
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
1.89k
      case STT_OBJECT:
1466
1.89k
        sym->symbol.flags |= BSF_OBJECT;
1467
1.89k
        break;
1468
342
      case STT_TLS:
1469
342
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
342
        break;
1471
1.07k
      case STT_RELC:
1472
1.07k
        sym->symbol.flags |= BSF_RELC;
1473
1.07k
        break;
1474
482
      case STT_SRELC:
1475
482
        sym->symbol.flags |= BSF_SRELC;
1476
482
        break;
1477
931
      case STT_GNU_IFUNC:
1478
931
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
931
        break;
1480
49.4k
      }
1481
1482
49.4k
    if (dynamic)
1483
244
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
49.4k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
49.4k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
49.4k
    else if (xver != NULL)
1489
151
      {
1490
151
        Elf_Internal_Versym iversym;
1491
1492
151
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
151
        sym->version = iversym.vs_vers;
1494
151
        xver++;
1495
151
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
49.4k
    if (ebd->elf_backend_symbol_processing)
1499
12.8k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
49.4k
  }
1501
2.53k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
2.83k
  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
2.83k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
2.83k
  if (symptrs)
1513
2.83k
    {
1514
2.83k
      long l = symcount;
1515
1516
2.83k
      sym = symbase;
1517
52.2k
      while (l-- > 0)
1518
49.4k
  {
1519
49.4k
    *symptrs++ = &sym->symbol;
1520
49.4k
    sym++;
1521
49.4k
  }
1522
2.83k
      *symptrs = 0;   /* Final null pointer */
1523
2.83k
    }
1524
1525
2.83k
  free (xverbuf);
1526
2.83k
  if (hdr->contents != (unsigned char *) isymbuf
1527
2.53k
      && !elf_use_dt_symtab_p (abfd))
1528
2.53k
    free (isymbuf);
1529
2.83k
  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.09k
}
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
13.2k
{
1551
13.2k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
13.2k
  void *allocated = NULL;
1553
13.2k
  bfd_byte *native_relocs;
1554
13.2k
  arelent *relent;
1555
13.2k
  unsigned int i;
1556
13.2k
  int entsize;
1557
13.2k
  unsigned int symcount;
1558
1559
13.2k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
164
    return false;
1561
13.0k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
13.0k
  if (allocated == NULL)
1563
348
    return false;
1564
1565
12.7k
  native_relocs = (bfd_byte *) allocated;
1566
1567
12.7k
  entsize = rel_hdr->sh_entsize;
1568
12.7k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
12.7k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
12.7k
  if (dynamic)
1572
115
    symcount = bfd_get_dynamic_symcount (abfd);
1573
12.6k
  else
1574
12.6k
    symcount = bfd_get_symcount (abfd);
1575
1576
12.7k
  for (i = 0, relent = relents;
1577
144k
       i < reloc_count;
1578
131k
       i++, relent++, native_relocs += entsize)
1579
134k
    {
1580
134k
      bool res;
1581
134k
      Elf_Internal_Rela rela;
1582
1583
134k
      if (entsize == sizeof (Elf_External_Rela))
1584
108k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
26.1k
      else
1586
26.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
134k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
132k
  relent->address = rela.r_offset;
1594
1.81k
      else
1595
1.81k
  relent->address = rela.r_offset - asect->vma;
1596
1597
134k
      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
32.1k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
102k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
25.9k
  {
1603
25.9k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
25.9k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
25.9k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
25.9k
    bfd_set_error (bfd_error_bad_value);
1608
25.9k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
25.9k
  }
1610
76.0k
      else
1611
76.0k
  {
1612
76.0k
    asymbol **ps;
1613
1614
76.0k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
76.0k
    relent->sym_ptr_ptr = ps;
1617
76.0k
  }
1618
1619
134k
      relent->addend = rela.r_addend;
1620
1621
134k
      res = false;
1622
134k
      if ((entsize == sizeof (Elf_External_Rela)
1623
26.1k
     || ebd->elf_info_to_howto_rel == NULL)
1624
128k
    && ebd->elf_info_to_howto != NULL)
1625
127k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
6.24k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
6.23k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
134k
      if (! res || relent->howto == NULL)
1630
2.37k
  goto error_return;
1631
134k
    }
1632
1633
10.3k
  free (allocated);
1634
10.3k
  return true;
1635
1636
2.37k
 error_return:
1637
2.37k
  free (allocated);
1638
2.37k
  return false;
1639
12.7k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
11.4k
{
1551
11.4k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
11.4k
  void *allocated = NULL;
1553
11.4k
  bfd_byte *native_relocs;
1554
11.4k
  arelent *relent;
1555
11.4k
  unsigned int i;
1556
11.4k
  int entsize;
1557
11.4k
  unsigned int symcount;
1558
1559
11.4k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
164
    return false;
1561
11.2k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
11.2k
  if (allocated == NULL)
1563
286
    return false;
1564
1565
10.9k
  native_relocs = (bfd_byte *) allocated;
1566
1567
10.9k
  entsize = rel_hdr->sh_entsize;
1568
10.9k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
10.9k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
10.9k
  if (dynamic)
1572
100
    symcount = bfd_get_dynamic_symcount (abfd);
1573
10.8k
  else
1574
10.8k
    symcount = bfd_get_symcount (abfd);
1575
1576
10.9k
  for (i = 0, relent = relents;
1577
111k
       i < reloc_count;
1578
100k
       i++, relent++, native_relocs += entsize)
1579
102k
    {
1580
102k
      bool res;
1581
102k
      Elf_Internal_Rela rela;
1582
1583
102k
      if (entsize == sizeof (Elf_External_Rela))
1584
102k
  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
102k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
100k
  relent->address = rela.r_offset;
1594
1.67k
      else
1595
1.67k
  relent->address = rela.r_offset - asect->vma;
1596
1597
102k
      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.2k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
84.0k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
15.8k
  {
1603
15.8k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
15.8k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
15.8k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
15.8k
    bfd_set_error (bfd_error_bad_value);
1608
15.8k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
15.8k
  }
1610
68.1k
      else
1611
68.1k
  {
1612
68.1k
    asymbol **ps;
1613
1614
68.1k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
68.1k
    relent->sym_ptr_ptr = ps;
1617
68.1k
  }
1618
1619
102k
      relent->addend = rela.r_addend;
1620
1621
102k
      res = false;
1622
102k
      if ((entsize == sizeof (Elf_External_Rela)
1623
0
     || ebd->elf_info_to_howto_rel == NULL)
1624
102k
    && ebd->elf_info_to_howto != NULL)
1625
102k
  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
102k
      if (! res || relent->howto == NULL)
1630
1.69k
  goto error_return;
1631
102k
    }
1632
1633
9.28k
  free (allocated);
1634
9.28k
  return true;
1635
1636
1.69k
 error_return:
1637
1.69k
  free (allocated);
1638
  return false;
1639
10.9k
}
elf32.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
1.80k
{
1551
1.80k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
1.80k
  void *allocated = NULL;
1553
1.80k
  bfd_byte *native_relocs;
1554
1.80k
  arelent *relent;
1555
1.80k
  unsigned int i;
1556
1.80k
  int entsize;
1557
1.80k
  unsigned int symcount;
1558
1559
1.80k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
0
    return false;
1561
1.80k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
1.80k
  if (allocated == NULL)
1563
62
    return false;
1564
1565
1.74k
  native_relocs = (bfd_byte *) allocated;
1566
1567
1.74k
  entsize = rel_hdr->sh_entsize;
1568
1.74k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
1.74k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
1.74k
  if (dynamic)
1572
15
    symcount = bfd_get_dynamic_symcount (abfd);
1573
1.72k
  else
1574
1.72k
    symcount = bfd_get_symcount (abfd);
1575
1576
1.74k
  for (i = 0, relent = relents;
1577
33.0k
       i < reloc_count;
1578
31.2k
       i++, relent++, native_relocs += entsize)
1579
31.9k
    {
1580
31.9k
      bool res;
1581
31.9k
      Elf_Internal_Rela rela;
1582
1583
31.9k
      if (entsize == sizeof (Elf_External_Rela))
1584
5.85k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
26.1k
      else
1586
26.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
31.9k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
31.8k
  relent->address = rela.r_offset;
1594
133
      else
1595
133
  relent->address = rela.r_offset - asect->vma;
1596
1597
31.9k
      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
13.9k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
18.0k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
10.1k
  {
1603
10.1k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
10.1k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
10.1k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
10.1k
    bfd_set_error (bfd_error_bad_value);
1608
10.1k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
10.1k
  }
1610
7.88k
      else
1611
7.88k
  {
1612
7.88k
    asymbol **ps;
1613
1614
7.88k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
7.88k
    relent->sym_ptr_ptr = ps;
1617
7.88k
  }
1618
1619
31.9k
      relent->addend = rela.r_addend;
1620
1621
31.9k
      res = false;
1622
31.9k
      if ((entsize == sizeof (Elf_External_Rela)
1623
26.1k
     || ebd->elf_info_to_howto_rel == NULL)
1624
26.0k
    && ebd->elf_info_to_howto != NULL)
1625
25.7k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
6.23k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
6.23k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
31.9k
      if (! res || relent->howto == NULL)
1630
684
  goto error_return;
1631
31.9k
    }
1632
1633
1.05k
  free (allocated);
1634
1.05k
  return true;
1635
1636
684
 error_return:
1637
684
  free (allocated);
1638
  return false;
1639
1.74k
}
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
17.1k
{
1649
17.1k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
17.1k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
17.1k
  Elf_Internal_Shdr *rel_hdr;
1652
17.1k
  Elf_Internal_Shdr *rel_hdr2;
1653
17.1k
  bfd_size_type reloc_count;
1654
17.1k
  bfd_size_type reloc_count2;
1655
17.1k
  arelent *relents;
1656
17.1k
  size_t amt;
1657
1658
17.1k
  if (asect->relocation != NULL)
1659
2.47k
    return true;
1660
1661
14.6k
  if (! dynamic)
1662
14.5k
    {
1663
14.5k
      if ((asect->flags & SEC_RELOC) == 0
1664
13.2k
    || asect->reloc_count == 0)
1665
1.41k
  return true;
1666
1667
13.1k
      rel_hdr = d->rel.hdr;
1668
13.1k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
13.1k
      rel_hdr2 = d->rela.hdr;
1670
13.1k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
13.1k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
13.1k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
13.1k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
13.1k
    }
1679
119
  else
1680
119
    {
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
119
      if (asect->size == 0)
1686
4
  return true;
1687
1688
115
      rel_hdr = &d->this_hdr;
1689
115
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
115
      rel_hdr2 = NULL;
1691
115
      reloc_count2 = 0;
1692
115
    }
1693
1694
13.2k
  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
13.2k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
13.2k
  if (relents == NULL)
1701
0
    return false;
1702
1703
13.2k
  if (rel_hdr
1704
1.64k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
1.64k
                rel_hdr, reloc_count,
1706
1.64k
                relents,
1707
1.64k
                symbols, dynamic))
1708
568
    return false;
1709
1710
12.6k
  if (rel_hdr2
1711
11.5k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
11.5k
                rel_hdr2, reloc_count2,
1713
11.5k
                relents + reloc_count,
1714
11.5k
                symbols, dynamic))
1715
2.32k
    return false;
1716
1717
10.3k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
31
    return false;
1719
1720
10.3k
  asect->relocation = relents;
1721
10.3k
  return true;
1722
10.3k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1648
14.8k
{
1649
14.8k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
14.8k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
14.8k
  Elf_Internal_Shdr *rel_hdr;
1652
14.8k
  Elf_Internal_Shdr *rel_hdr2;
1653
14.8k
  bfd_size_type reloc_count;
1654
14.8k
  bfd_size_type reloc_count2;
1655
14.8k
  arelent *relents;
1656
14.8k
  size_t amt;
1657
1658
14.8k
  if (asect->relocation != NULL)
1659
2.33k
    return true;
1660
1661
12.5k
  if (! dynamic)
1662
12.4k
    {
1663
12.4k
      if ((asect->flags & SEC_RELOC) == 0
1664
11.4k
    || asect->reloc_count == 0)
1665
1.06k
  return true;
1666
1667
11.3k
      rel_hdr = d->rel.hdr;
1668
11.3k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
11.3k
      rel_hdr2 = d->rela.hdr;
1670
11.3k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
11.3k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
11.3k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
11.3k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
11.3k
    }
1679
104
  else
1680
104
    {
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
104
      if (asect->size == 0)
1686
4
  return true;
1687
1688
100
      rel_hdr = &d->this_hdr;
1689
100
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
100
      rel_hdr2 = NULL;
1691
100
      reloc_count2 = 0;
1692
100
    }
1693
1694
11.4k
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1695
0
    {
1696
0
      bfd_set_error (bfd_error_file_too_big);
1697
0
      return false;
1698
0
    }
1699
11.4k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
11.4k
  if (relents == NULL)
1701
0
    return false;
1702
1703
11.4k
  if (rel_hdr
1704
100
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
100
                rel_hdr, reloc_count,
1706
100
                relents,
1707
100
                symbols, dynamic))
1708
14
    return false;
1709
1710
11.4k
  if (rel_hdr2
1711
11.3k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
11.3k
                rel_hdr2, reloc_count2,
1713
11.3k
                relents + reloc_count,
1714
11.3k
                symbols, dynamic))
1715
2.13k
    return false;
1716
1717
9.28k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
31
    return false;
1719
1720
9.25k
  asect->relocation = relents;
1721
  return true;
1722
9.28k
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1648
2.28k
{
1649
2.28k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
2.28k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
2.28k
  Elf_Internal_Shdr *rel_hdr;
1652
2.28k
  Elf_Internal_Shdr *rel_hdr2;
1653
2.28k
  bfd_size_type reloc_count;
1654
2.28k
  bfd_size_type reloc_count2;
1655
2.28k
  arelent *relents;
1656
2.28k
  size_t amt;
1657
1658
2.28k
  if (asect->relocation != NULL)
1659
139
    return true;
1660
1661
2.14k
  if (! dynamic)
1662
2.13k
    {
1663
2.13k
      if ((asect->flags & SEC_RELOC) == 0
1664
1.82k
    || asect->reloc_count == 0)
1665
345
  return true;
1666
1667
1.78k
      rel_hdr = d->rel.hdr;
1668
1.78k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
1.78k
      rel_hdr2 = d->rela.hdr;
1670
1.78k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
1.78k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
1.78k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
1.78k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
1.78k
    }
1679
15
  else
1680
15
    {
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
15
      if (asect->size == 0)
1686
0
  return true;
1687
1688
15
      rel_hdr = &d->this_hdr;
1689
15
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
15
      rel_hdr2 = NULL;
1691
15
      reloc_count2 = 0;
1692
15
    }
1693
1694
1.80k
  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
1.80k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
1.80k
  if (relents == NULL)
1701
0
    return false;
1702
1703
1.80k
  if (rel_hdr
1704
1.54k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
1.54k
                rel_hdr, reloc_count,
1706
1.54k
                relents,
1707
1.54k
                symbols, dynamic))
1708
554
    return false;
1709
1710
1.24k
  if (rel_hdr2
1711
254
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
254
                rel_hdr2, reloc_count2,
1713
254
                relents + reloc_count,
1714
254
                symbols, dynamic))
1715
192
    return false;
1716
1717
1.05k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
0
    return false;
1719
1720
1.05k
  asect->relocation = relents;
1721
  return true;
1722
1.05k
}
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.25k
{
2052
1.25k
  return ELF_R_SYM (r_info);
2053
1.25k
}
elf64_r_sym
Line
Count
Source
2051
1.24k
{
2052
1.24k
  return ELF_R_SYM (r_info);
2053
1.24k
}
elf32_r_sym
Line
Count
Source
2051
12
{
2052
12
  return ELF_R_SYM (r_info);
2053
12
}
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
};