Coverage Report

Created: 2026-09-14 08:07

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
35.7M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
1.46k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
32.0M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
2.10M
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
0
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
1.16k
#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
30.5k
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
115k
#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
65
#define elf_swap_reloca_out   NAME(bfd_elf,swap_reloca_out)
99
#define elf_swap_symbol_in    NAME(bfd_elf,swap_symbol_in)
100
#define elf_swap_symbol_out   NAME(bfd_elf,swap_symbol_out)
101
2.05M
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
541
#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
401
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
264k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
2.20M
#define ELFCLASS  ELFCLASS64
134
#define FILE_ALIGN  8
135
#define LOG_FILE_ALIGN  3
136
#endif
137
#if ARCH_SIZE == 32
138
510
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
139
106k
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
8.50M
#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
13.1k
#define H_PUT_WORD    H_PUT_64
159
827
#define H_PUT_SIGNED_WORD H_PUT_S64
160
8.61M
#define H_GET_WORD    H_GET_64
161
483k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
14.6k
#define H_PUT_WORD    H_PUT_32
165
821
#define H_PUT_SIGNED_WORD H_PUT_S32
166
19.9M
#define H_GET_WORD    H_GET_32
167
1.00M
#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
187k
{
179
187k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
187k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
187k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
187k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
187k
  if (signed_vma)
185
20.2k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
167k
  else
187
167k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
187k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
187k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
187k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
187k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
187k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
2.54k
    {
194
2.54k
      if (shndx == NULL)
195
516
  return false;
196
2.03k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
2.03k
    }
198
185k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
4.89k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
187k
  dst->st_target_internal = 0;
201
187k
  return true;
202
187k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
125k
{
179
125k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
125k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
125k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
125k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
125k
  if (signed_vma)
185
9.13k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
116k
  else
187
116k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
125k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
125k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
125k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
125k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
125k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
568
    {
194
568
      if (shndx == NULL)
195
324
  return false;
196
244
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
244
    }
198
124k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
3.23k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
125k
  dst->st_target_internal = 0;
201
  return true;
202
125k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
62.3k
{
179
62.3k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
62.3k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
62.3k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
62.3k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
62.3k
  if (signed_vma)
185
11.0k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
51.2k
  else
187
51.2k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
62.3k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
62.3k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
62.3k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
62.3k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
62.3k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
1.97k
    {
194
1.97k
      if (shndx == NULL)
195
192
  return false;
196
1.78k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
1.78k
    }
198
60.3k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
1.65k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
62.1k
  dst->st_target_internal = 0;
201
  return true;
202
62.3k
}
203
204
/* Translate an ELF symbol in internal format into an ELF symbol in external
205
   format.  */
206
207
void
208
elf_swap_symbol_out (bfd *abfd,
209
         const Elf_Internal_Sym *src,
210
         void *cdst,
211
         void *shndx)
212
1.46k
{
213
1.46k
  unsigned int tmp;
214
1.46k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.46k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.46k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.46k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.46k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.46k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.46k
  tmp = src->st_shndx;
221
1.46k
  if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
222
0
    {
223
0
      if (shndx == NULL)
224
0
  abort ();
225
0
      H_PUT_32 (abfd, tmp, shndx);
226
0
      tmp = SHN_XINDEX & 0xffff;
227
0
    }
228
1.46k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.46k
}
bfd_elf64_swap_symbol_out
Line
Count
Source
212
983
{
213
983
  unsigned int tmp;
214
983
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
983
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
983
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
983
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
983
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
983
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
983
  tmp = src->st_shndx;
221
983
  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
983
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
983
}
bfd_elf32_swap_symbol_out
Line
Count
Source
212
481
{
213
481
  unsigned int tmp;
214
481
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
481
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
481
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
481
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
481
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
481
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
481
  tmp = src->st_shndx;
221
481
  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
481
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
481
}
230
231
/* Translate an ELF file header in external format into an ELF file header in
232
   internal format.  */
233
234
static void
235
elf_swap_ehdr_in (bfd *abfd,
236
      const Elf_External_Ehdr *src,
237
      Elf_Internal_Ehdr *dst)
238
3.45M
{
239
3.45M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.45M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.45M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.45M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.45M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.45M
  if (signed_vma)
245
380k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
3.07M
  else
247
3.07M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.45M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.45M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.45M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.45M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.45M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.45M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.45M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.45M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.45M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.45M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
394k
{
239
394k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
394k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
394k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
394k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
394k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
394k
  if (signed_vma)
245
56.6k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
337k
  else
247
337k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
394k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
394k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
394k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
394k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
394k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
394k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
394k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
394k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
394k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
394k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
3.06M
{
239
3.06M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.06M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.06M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.06M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.06M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.06M
  if (signed_vma)
245
324k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.73M
  else
247
2.73M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.06M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.06M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.06M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.06M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.06M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.06M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.06M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.06M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.06M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.06M
}
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
484
{
267
484
  unsigned int tmp;
268
484
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
484
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
484
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
484
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
484
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
484
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
484
  if (signed_vma)
276
484
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
432
  else
278
484
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
484
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
484
  if (no_section_header)
281
484
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
484
  else
283
484
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
484
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
484
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
484
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
484
  tmp = src->e_phnum;
288
484
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
484
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
484
  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
484
  else
298
484
    {
299
484
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
484
      tmp = src->e_shnum;
301
484
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
484
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
484
      tmp = src->e_shstrndx;
305
484
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
484
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
484
    }
309
484
}
elf64.c:elf_swap_ehdr_out
Line
Count
Source
266
173
{
267
173
  unsigned int tmp;
268
173
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
173
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
173
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
173
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
173
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
173
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
173
  if (signed_vma)
276
173
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
145
  else
278
173
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
173
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
173
  if (no_section_header)
281
173
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
173
  else
283
173
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
173
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
173
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
173
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
173
  tmp = src->e_phnum;
288
173
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
173
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
173
  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
173
  else
298
173
    {
299
173
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
173
      tmp = src->e_shnum;
301
173
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
173
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
173
      tmp = src->e_shstrndx;
305
173
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
173
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
173
    }
309
173
}
elf32.c:elf_swap_ehdr_out
Line
Count
Source
266
311
{
267
311
  unsigned int tmp;
268
311
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
311
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
311
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
311
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
311
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
311
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
311
  if (signed_vma)
276
311
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
287
  else
278
311
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
311
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
311
  if (no_section_header)
281
311
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
311
  else
283
311
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
311
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
311
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
311
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
311
  tmp = src->e_phnum;
288
311
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
311
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
311
  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
311
  else
298
311
    {
299
311
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
311
      tmp = src->e_shnum;
301
311
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
311
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
311
      tmp = src->e_shstrndx;
305
311
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
311
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
311
    }
309
311
}
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.07M
{
319
1.07M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
1.07M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
1.07M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
1.07M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
1.07M
  if (signed_vma)
325
259k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
816k
  else
327
816k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
1.07M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
1.07M
  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.07M
  if (dst->sh_type != SHT_NOBITS)
334
1.05M
    {
335
1.05M
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
1.05M
      if (filesize != 0
338
1.05M
    && ((ufile_ptr) dst->sh_offset > filesize
339
780k
        || dst->sh_size > filesize - dst->sh_offset)
340
368k
    && !abfd->read_only)
341
77.7k
  {
342
77.7k
    _bfd_error_handler (_("warning: %pB has a section "
343
77.7k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
77.7k
    if (abfd->is_linker_input)
346
0
      return false;
347
77.7k
    abfd->read_only = 1;
348
77.7k
  }
349
1.05M
    }
350
1.07M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
1.07M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
1.07M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
1.07M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
1.07M
  dst->bfd_section = NULL;
355
1.07M
  dst->contents = NULL;
356
1.07M
  return true;
357
1.07M
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
580k
{
319
580k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
580k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
580k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
580k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
580k
  if (signed_vma)
325
84.2k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
496k
  else
327
496k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
580k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
580k
  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
580k
  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
447k
        || dst->sh_size > filesize - dst->sh_offset)
340
171k
    && !abfd->read_only)
341
32.0k
  {
342
32.0k
    _bfd_error_handler (_("warning: %pB has a section "
343
32.0k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
32.0k
    if (abfd->is_linker_input)
346
0
      return false;
347
32.0k
    abfd->read_only = 1;
348
32.0k
  }
349
574k
    }
350
580k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
580k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
580k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
580k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
580k
  dst->bfd_section = NULL;
355
580k
  dst->contents = NULL;
356
  return true;
357
580k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
495k
{
319
495k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
495k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
495k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
495k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
495k
  if (signed_vma)
325
175k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
319k
  else
327
319k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
495k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
495k
  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
495k
  if (dst->sh_type != SHT_NOBITS)
334
483k
    {
335
483k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
483k
      if (filesize != 0
338
483k
    && ((ufile_ptr) dst->sh_offset > filesize
339
333k
        || dst->sh_size > filesize - dst->sh_offset)
340
197k
    && !abfd->read_only)
341
45.7k
  {
342
45.7k
    _bfd_error_handler (_("warning: %pB has a section "
343
45.7k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
45.7k
    if (abfd->is_linker_input)
346
0
      return false;
347
45.7k
    abfd->read_only = 1;
348
45.7k
  }
349
483k
    }
350
495k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
495k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
495k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
495k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
495k
  dst->bfd_section = NULL;
355
495k
  dst->contents = NULL;
356
  return true;
357
495k
}
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.89k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
2.89k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
2.89k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
2.89k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
2.89k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
2.89k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
2.89k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
2.89k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
2.89k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
2.89k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
2.89k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
2.89k
}
elf64.c:elf_swap_shdr_out
Line
Count
Source
366
1.33k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.33k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.33k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.33k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.33k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.33k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.33k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.33k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.33k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.33k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.33k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.33k
}
elf32.c:elf_swap_shdr_out
Line
Count
Source
366
1.55k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.55k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.55k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.55k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.55k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.55k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.55k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.55k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.55k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.55k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.55k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.55k
}
379
380
/* Translate an ELF program header table entry in external format into an
381
   ELF program header table entry in internal format.  */
382
383
void
384
elf_swap_phdr_in (bfd *abfd,
385
      const Elf_External_Phdr *src,
386
      Elf_Internal_Phdr *dst)
387
2.05M
{
388
2.05M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
2.05M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
2.05M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
2.05M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
2.05M
  if (signed_vma)
394
352k
    {
395
352k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
352k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
352k
    }
398
1.70M
  else
399
1.70M
    {
400
1.70M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.70M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.70M
    }
403
2.05M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
2.05M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
2.05M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
2.05M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
387
626k
{
388
626k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
626k
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
626k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
626k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
626k
  if (signed_vma)
394
115k
    {
395
115k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
115k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
115k
    }
398
510k
  else
399
510k
    {
400
510k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
510k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
510k
    }
403
626k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
626k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
626k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
626k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
387
1.42M
{
388
1.42M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.42M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.42M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.42M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.42M
  if (signed_vma)
394
236k
    {
395
236k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
236k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
236k
    }
398
1.19M
  else
399
1.19M
    {
400
1.19M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.19M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.19M
    }
403
1.42M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.42M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.42M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.42M
}
407
408
void
409
elf_swap_phdr_out (bfd *abfd,
410
       const Elf_Internal_Phdr *src,
411
       Elf_External_Phdr *dst)
412
541
{
413
541
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
541
  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
541
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
541
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
541
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
541
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
541
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
541
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
541
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
541
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
541
}
bfd_elf64_swap_phdr_out
Line
Count
Source
412
197
{
413
197
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
197
  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
197
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
197
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
197
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
197
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
197
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
197
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
197
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
197
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
197
}
bfd_elf32_swap_phdr_out
Line
Count
Source
412
344
{
413
344
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
344
  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
344
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
344
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
344
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
344
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
344
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
344
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
344
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
344
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
344
}
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
30.5k
{
433
30.5k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
30.5k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
30.5k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
30.5k
  dst->r_addend = 0;
437
30.5k
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
bfd_elf32_swap_reloc_in
Line
Count
Source
432
30.5k
{
433
30.5k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
30.5k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
30.5k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
30.5k
  dst->r_addend = 0;
437
30.5k
}
438
439
void
440
elf_swap_reloca_in (bfd *abfd,
441
        const bfd_byte *s,
442
        Elf_Internal_Rela *dst)
443
118k
{
444
118k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
118k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
118k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
118k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
118k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
443
101k
{
444
101k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
101k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
101k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
101k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
101k
}
bfd_elf32_swap_reloca_in
Line
Count
Source
443
16.7k
{
444
16.7k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
16.7k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
16.7k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
16.7k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
16.7k
}
449
450
/* Translate an ELF reloc from internal format to external format.  */
451
void
452
elf_swap_reloc_out (bfd *abfd,
453
        const Elf_Internal_Rela *src,
454
        bfd_byte *d)
455
0
{
456
0
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
457
0
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
458
0
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
459
0
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
Unexecuted instantiation: bfd_elf32_swap_reloc_out
460
461
void
462
elf_swap_reloca_out (bfd *abfd,
463
         const Elf_Internal_Rela *src,
464
         bfd_byte *d)
465
1.16k
{
466
1.16k
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
1.16k
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
1.16k
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
1.16k
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
1.16k
}
bfd_elf64_swap_reloca_out
Line
Count
Source
465
654
{
466
654
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
654
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
654
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
654
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
654
}
bfd_elf32_swap_reloca_out
Line
Count
Source
465
510
{
466
510
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
510
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
510
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
510
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
510
}
471
472
void
473
elf_swap_dyn_in (bfd *abfd,
474
     const void *p,
475
     Elf_Internal_Dyn *dst)
476
74.2k
{
477
74.2k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
74.2k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
74.2k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
74.2k
}
bfd_elf64_swap_dyn_in
Line
Count
Source
476
57.1k
{
477
57.1k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
57.1k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
57.1k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
57.1k
}
bfd_elf32_swap_dyn_in
Line
Count
Source
476
17.1k
{
477
17.1k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
17.1k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
17.1k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
17.1k
}
482
483
void
484
elf_swap_dyn_out (bfd *abfd,
485
      const Elf_Internal_Dyn *src,
486
      void *p)
487
0
{
488
0
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
489
490
0
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
491
0
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
492
0
}
Unexecuted instantiation: bfd_elf64_swap_dyn_out
Unexecuted instantiation: bfd_elf32_swap_dyn_out
493

494
/* ELF .o/exec file reading */
495
496
/* Begin processing a given object.
497
498
   First we validate the file by reading in the ELF header and checking
499
   the magic number.  */
500
501
static inline bool
502
elf_file_p (Elf_External_Ehdr *x_ehdrp)
503
32.0M
{
504
32.0M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
10.9M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
10.9M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
10.9M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
32.0M
}
elf64.c:elf_file_p
Line
Count
Source
503
6.95M
{
504
6.95M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
2.25M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
2.24M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
2.24M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
6.95M
}
elf32.c:elf_file_p
Line
Count
Source
503
25.0M
{
504
25.0M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
8.66M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
8.66M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
8.65M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
25.0M
}
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
32.0M
{
521
32.0M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
32.0M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
32.0M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
32.0M
  Elf_Internal_Shdr i_shdr;
525
32.0M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
32.0M
  unsigned int shindex;
527
32.0M
  elf_backend_data *ebd;
528
32.0M
  asection *s;
529
32.0M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
32.0M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
3.61M
    {
535
3.61M
      if (bfd_get_error () != bfd_error_system_call)
536
3.56M
  goto got_wrong_format_error;
537
47.5k
      else
538
47.5k
  goto got_no_match;
539
3.61M
    }
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
28.3M
  if (! elf_file_p (&x_ehdr)
548
8.16M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
7.98M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
23.5M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
4.87M
  switch (x_ehdr.e_ident[EI_DATA])
554
4.87M
    {
555
1.66M
    case ELFDATA2MSB:   /* Big-endian */
556
1.66M
      if (! bfd_header_big_endian (abfd))
557
833k
  goto got_wrong_format_error;
558
830k
      break;
559
3.20M
    case ELFDATA2LSB:   /* Little-endian */
560
3.20M
      if (! bfd_header_little_endian (abfd))
561
1.57M
  goto got_wrong_format_error;
562
1.62M
      break;
563
1.62M
    case ELFDATANONE:   /* No data encoding specified */
564
1.76k
    default:      /* Unknown data encoding specified */
565
1.76k
      goto got_wrong_format_error;
566
4.87M
    }
567
568
2.45M
  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.45M
  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.45M
  i_ehdrp = elf_elfheader (abfd);
578
2.45M
  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.45M
  if (i_ehdrp->e_type == ET_CORE)
585
697k
    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.76M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
28.2k
    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.73M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
54.8k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.67M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
713
    goto got_wrong_format_error;
601
602
1.67M
  ebd = get_elf_backend_data (abfd);
603
1.67M
  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.67M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.60M
      && (ebd->elf_machine_alt1 == 0
610
409k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.59M
      && (ebd->elf_machine_alt2 == 0
612
52.3k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.59M
      && ebd->elf_machine_code != EM_NONE)
614
1.56M
    goto got_wrong_format_error;
615
616
115k
  if (i_ehdrp->e_type == ET_EXEC)
617
4.87k
    abfd->flags |= EXEC_P;
618
110k
  else if (i_ehdrp->e_type == ET_DYN)
619
4.36k
    abfd->flags |= DYNAMIC;
620
621
115k
  if (i_ehdrp->e_phnum > 0)
622
46.4k
    abfd->flags |= D_PAGED;
623
624
115k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
36.4k
    {
626
      /* It's OK if this fails for the generic target.  */
627
36.4k
      if (ebd->elf_machine_code != EM_NONE)
628
15
  goto got_no_match;
629
36.4k
    }
630
631
115k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
9.72k
    goto got_wrong_format_error;
633
634
105k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
88.1k
    {
636
88.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
88.1k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
602
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
87.5k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
85.8k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
1.66k
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
85.8k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
23.7k
  {
652
23.7k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
23.7k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
23.5k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
23.0k
        || i_ehdrp->e_shnum  == 0)
656
967
      goto got_wrong_format_error;
657
23.7k
  }
658
659
      /* And similarly for the string table index.  */
660
84.8k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
1.12k
  {
662
1.12k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
1.12k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
1.12k
  }
666
667
      /* And program headers.  */
668
84.8k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
871
  {
670
871
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
871
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
871
  }
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
84.8k
      if (i_ehdrp->e_shnum != 1)
678
82.7k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
82.7k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
81.8k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
1.15k
      goto got_wrong_format_error;
683
684
81.6k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
81.6k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
81.6k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
81.6k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
1.31k
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
80.3k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
80.3k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
80.3k
  }
698
84.8k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
100k
  if (i_ehdrp->e_shnum != 0)
703
82.4k
    {
704
82.4k
      Elf_Internal_Shdr *shdrp;
705
82.4k
      unsigned int num_sec;
706
82.4k
      size_t amt;
707
708
82.4k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
82.4k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
82.4k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
82.4k
      num_sec = i_ehdrp->e_shnum;
714
82.4k
      elf_numsections (abfd) = num_sec;
715
82.4k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
82.4k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
82.4k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
82.4k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
82.4k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
82.4k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
1.17M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
1.09M
  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.06M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
990k
  {
732
990k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
990k
        || !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
990k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
5.14k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
5.14k
        switch (ebd->elf_machine_code)
742
5.14k
    {
743
536
    case EM_386:
744
613
    case EM_IAMCU:
745
2.73k
    case EM_X86_64:
746
2.73k
    case EM_OLD_SPARCV9:
747
2.73k
    case EM_SPARC32PLUS:
748
3.11k
    case EM_SPARCV9:
749
3.24k
    case EM_SPARC:
750
3.24k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.40k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
2.23k
        break;
753
      /* Otherwise fall through.  */
754
2.90k
    default:
755
2.90k
      goto got_wrong_format_error;
756
5.14k
    }
757
5.14k
      }
758
759
987k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
844k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
798k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
211k
        && i_shdrp[shindex].sh_info >= num_sec)
763
837
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
986k
    if (i_shdrp[shindex].sh_size != 0
768
829k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
249k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
239k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
239k
       % ebd->minpagesize)
772
239k
      != 0))
773
150k
      abfd->flags &= ~D_PAGED;
774
986k
  }
775
776
78.6k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
76.0k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
5.14k
  {
779
    /* PR 2257:
780
       We used to just goto got_wrong_format_error here
781
       but there are binaries in existance for which this test
782
       will prevent the binutils from working with them at all.
783
       So we are kind, and reset the string index value to 0
784
       so that at least some processing can be done.  */
785
5.14k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
5.14k
    if (!abfd->read_only)
787
589
      {
788
589
        _bfd_error_handler
789
589
    (_("warning: %pB has a corrupt string table index"), abfd);
790
589
        abfd->read_only = 1;
791
589
      }
792
5.14k
  }
793
78.6k
    }
794
17.6k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
4.37k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
91.9k
  if (i_ehdrp->e_phnum == 0)
799
58.6k
    elf_tdata (abfd)->phdr = NULL;
800
33.2k
  else
801
33.2k
    {
802
33.2k
      Elf_Internal_Phdr *i_phdr;
803
33.2k
      unsigned int i;
804
33.2k
      ufile_ptr filesize;
805
33.2k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
33.2k
      filesize = bfd_get_file_size (abfd);
810
33.2k
      if (filesize != 0
811
33.2k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
1.47k
  goto got_wrong_format_error;
813
31.7k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
31.7k
      elf_tdata (abfd)->phdr
816
31.7k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
31.7k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
31.7k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
144
  goto got_no_match;
821
31.7k
      bool eu_strip_broken_phdrs = false;
822
31.6k
      i_phdr = elf_tdata (abfd)->phdr;
823
691k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
661k
  {
825
661k
    Elf_External_Phdr x_phdr;
826
827
661k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
1.52k
      goto got_no_match;
829
660k
    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
660k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
434k
      {
834
434k
        i_phdr->p_align &= -i_phdr->p_align;
835
434k
        if (!abfd->read_only)
836
8.45k
    {
837
8.45k
      _bfd_error_handler (_("warning: %pB has a program header "
838
8.45k
          "with invalid alignment"), abfd);
839
8.45k
      abfd->read_only = 1;
840
8.45k
    }
841
434k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
660k
    if (i_phdr->p_filesz != 0
845
500k
        && (i_phdr->p_filesz > filesize
846
96.4k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
440k
      eu_strip_broken_phdrs = true;
848
660k
  }
849
30.1k
      if (!eu_strip_broken_phdrs
850
6.15k
    && i_ehdrp->e_shoff == 0
851
4.80k
    && i_ehdrp->e_shstrndx == 0)
852
4.80k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
4.80k
    i_phdr = elf_tdata (abfd)->phdr;
856
17.1k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
16.6k
      if (i_phdr->p_type == PT_DYNAMIC)
858
4.31k
        {
859
4.31k
    if (i_phdr->p_filesz != 0
860
4.15k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
4.15k
                  elf_tdata (abfd)->phdr,
862
4.15k
                  i_ehdrp->e_phnum,
863
4.15k
                  filesize))
864
3.96k
      goto got_no_match;
865
354
    break;
866
4.31k
        }
867
4.80k
  }
868
30.1k
    }
869
870
84.8k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
73.3k
    {
872
73.3k
      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
73.3k
      num_sec = elf_numsections (abfd);
878
878k
      for (shindex = 1; shindex < num_sec; shindex++)
879
824k
  if (!bfd_section_from_shdr (abfd, shindex))
880
18.9k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
54.3k
      if (! _bfd_elf_setup_sections (abfd))
884
6.45k
  goto got_wrong_format_error;
885
54.3k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
59.3k
  if (ebd->elf_backend_object_p)
890
35.8k
    {
891
35.8k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
4.99k
  goto got_wrong_format_error;
893
35.8k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
54.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
374k
  for (s = abfd->sections; s != NULL; s = s->next)
901
319k
    {
902
319k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
317k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
14.2k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
12.3k
  {
906
12.3k
    unsigned long targ_index;
907
12.3k
    asection *targ_sec;
908
909
12.3k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
12.3k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
12.3k
    if (targ_sec != NULL
912
10.4k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.92k
      s->flags |= SEC_DEBUGGING;
914
12.3k
  }
915
319k
    }
916
54.3k
  return _bfd_no_cleanup;
917
918
31.8M
 got_wrong_format_error:
919
31.8M
  bfd_set_error (bfd_error_wrong_format);
920
921
31.9M
 got_no_match:
922
31.9M
  if (abfd->sections != NULL)
923
    /* Unlike most early section processing, the object attribute v2
924
       code uses bfd_malloc rather than bfd_alloc.  Free memory
925
       containing attributes.  */
926
26.4k
    _bfd_elf_cleanup_object_attributes (abfd);
927
31.9M
  return NULL;
928
31.8M
}
bfd_elf64_object_p
Line
Count
Source
520
7.49M
{
521
7.49M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
7.49M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
7.49M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
7.49M
  Elf_Internal_Shdr i_shdr;
525
7.49M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
7.49M
  unsigned int shindex;
527
7.49M
  elf_backend_data *ebd;
528
7.49M
  asection *s;
529
7.49M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
7.49M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
1.29M
    {
535
1.29M
      if (bfd_get_error () != bfd_error_system_call)
536
1.26M
  goto got_wrong_format_error;
537
23.3k
      else
538
23.3k
  goto got_no_match;
539
1.29M
    }
540
541
  /* Now check to see if we have a valid ELF file, and one that BFD can
542
     make use of.  The magic number must match, the address size ('class')
543
     and byte-swapping must match our XVEC entry, and it must have a
544
     section header table (FIXME: See comments re sections at top of this
545
     file).  */
546
547
6.20M
  if (! elf_file_p (&x_ehdr)
548
1.69M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
1.65M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
5.55M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
649k
  switch (x_ehdr.e_ident[EI_DATA])
554
649k
    {
555
104k
    case ELFDATA2MSB:   /* Big-endian */
556
104k
      if (! bfd_header_big_endian (abfd))
557
55.0k
  goto got_wrong_format_error;
558
49.8k
      break;
559
544k
    case ELFDATA2LSB:   /* Little-endian */
560
544k
      if (! bfd_header_little_endian (abfd))
561
251k
  goto got_wrong_format_error;
562
292k
      break;
563
292k
    case ELFDATANONE:   /* No data encoding specified */
564
247
    default:      /* Unknown data encoding specified */
565
247
      goto got_wrong_format_error;
566
649k
    }
567
568
342k
  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
342k
  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
342k
  i_ehdrp = elf_elfheader (abfd);
578
342k
  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
342k
  if (i_ehdrp->e_type == ET_CORE)
585
27.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
314k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
918
    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
313k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
5.72k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
307k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
185
    goto got_wrong_format_error;
601
602
307k
  ebd = get_elf_backend_data (abfd);
603
307k
  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
307k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
274k
      && (ebd->elf_machine_alt1 == 0
610
36.0k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
273k
      && (ebd->elf_machine_alt2 == 0
612
26.8k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
273k
      && ebd->elf_machine_code != EM_NONE)
614
258k
    goto got_wrong_format_error;
615
616
49.1k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.61k
    abfd->flags |= EXEC_P;
618
46.5k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.28k
    abfd->flags |= DYNAMIC;
620
621
49.1k
  if (i_ehdrp->e_phnum > 0)
622
17.8k
    abfd->flags |= D_PAGED;
623
624
49.1k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
15.4k
    {
626
      /* It's OK if this fails for the generic target.  */
627
15.4k
      if (ebd->elf_machine_code != EM_NONE)
628
0
  goto got_no_match;
629
15.4k
    }
630
631
49.1k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
6.22k
    goto got_wrong_format_error;
633
634
42.9k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
36.1k
    {
636
36.1k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
36.1k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
602
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
35.5k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
34.7k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
786
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
34.7k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
1.40k
  {
652
1.40k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
1.40k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
1.30k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
821
        || i_ehdrp->e_shnum  == 0)
656
674
      goto got_wrong_format_error;
657
1.40k
  }
658
659
      /* And similarly for the string table index.  */
660
34.1k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
475
  {
662
475
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
475
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
475
  }
666
667
      /* And program headers.  */
668
34.1k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
359
  {
670
359
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
359
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
359
  }
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
34.1k
      if (i_ehdrp->e_shnum != 1)
678
33.4k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
33.4k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
33.1k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
322
      goto got_wrong_format_error;
683
684
33.0k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
33.0k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
33.0k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
33.0k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
617
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
32.4k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
32.4k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
32.4k
  }
698
34.1k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
39.9k
  if (i_ehdrp->e_shnum != 0)
703
33.1k
    {
704
33.1k
      Elf_Internal_Shdr *shdrp;
705
33.1k
      unsigned int num_sec;
706
33.1k
      size_t amt;
707
708
33.1k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
33.1k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
33.1k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
33.1k
      num_sec = i_ehdrp->e_shnum;
714
33.1k
      elf_numsections (abfd) = num_sec;
715
33.1k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
33.1k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
33.1k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
33.1k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
33.1k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
33.1k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
624k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
591k
  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
546k
  {
732
546k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
546k
        || !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
546k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
3.15k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
3.15k
        switch (ebd->elf_machine_code)
742
3.15k
    {
743
0
    case EM_386:
744
0
    case EM_IAMCU:
745
1.98k
    case EM_X86_64:
746
1.98k
    case EM_OLD_SPARCV9:
747
1.98k
    case EM_SPARC32PLUS:
748
2.36k
    case EM_SPARCV9:
749
2.36k
    case EM_SPARC:
750
2.36k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
999
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
1.66k
        break;
753
      /* Otherwise fall through.  */
754
1.49k
    default:
755
1.49k
      goto got_wrong_format_error;
756
3.15k
    }
757
3.15k
      }
758
759
544k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
449k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
408k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
136k
        && i_shdrp[shindex].sh_info >= num_sec)
763
373
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
544k
    if (i_shdrp[shindex].sh_size != 0
768
472k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
156k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
153k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
153k
       % ebd->minpagesize)
772
153k
      != 0))
773
94.9k
      abfd->flags &= ~D_PAGED;
774
544k
  }
775
776
31.2k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
30.3k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
1.89k
  {
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
1.89k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
1.89k
    if (!abfd->read_only)
787
144
      {
788
144
        _bfd_error_handler
789
144
    (_("warning: %pB has a corrupt string table index"), abfd);
790
144
        abfd->read_only = 1;
791
144
      }
792
1.89k
  }
793
31.2k
    }
794
6.76k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
123
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
37.9k
  if (i_ehdrp->e_phnum == 0)
799
24.7k
    elf_tdata (abfd)->phdr = NULL;
800
13.2k
  else
801
13.2k
    {
802
13.2k
      Elf_Internal_Phdr *i_phdr;
803
13.2k
      unsigned int i;
804
13.2k
      ufile_ptr filesize;
805
13.2k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
13.2k
      filesize = bfd_get_file_size (abfd);
810
13.2k
      if (filesize != 0
811
13.2k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
596
  goto got_wrong_format_error;
813
12.6k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
12.6k
      elf_tdata (abfd)->phdr
816
12.6k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
12.6k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
12.6k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
144
  goto got_no_match;
821
12.6k
      bool eu_strip_broken_phdrs = false;
822
12.4k
      i_phdr = elf_tdata (abfd)->phdr;
823
292k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
280k
  {
825
280k
    Elf_External_Phdr x_phdr;
826
827
280k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
587
      goto got_no_match;
829
280k
    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
280k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
195k
      {
834
195k
        i_phdr->p_align &= -i_phdr->p_align;
835
195k
        if (!abfd->read_only)
836
5.61k
    {
837
5.61k
      _bfd_error_handler (_("warning: %pB has a program header "
838
5.61k
          "with invalid alignment"), abfd);
839
5.61k
      abfd->read_only = 1;
840
5.61k
    }
841
195k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
280k
    if (i_phdr->p_filesz != 0
845
219k
        && (i_phdr->p_filesz > filesize
846
34.7k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
195k
      eu_strip_broken_phdrs = true;
848
280k
  }
849
11.8k
      if (!eu_strip_broken_phdrs
850
4.03k
    && i_ehdrp->e_shoff == 0
851
3.40k
    && i_ehdrp->e_shstrndx == 0)
852
3.40k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
3.40k
    i_phdr = elf_tdata (abfd)->phdr;
856
12.5k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
12.3k
      if (i_phdr->p_type == PT_DYNAMIC)
858
3.21k
        {
859
3.21k
    if (i_phdr->p_filesz != 0
860
3.15k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
3.15k
                  elf_tdata (abfd)->phdr,
862
3.15k
                  i_ehdrp->e_phnum,
863
3.15k
                  filesize))
864
2.96k
      goto got_no_match;
865
253
    break;
866
3.21k
        }
867
3.40k
  }
868
11.8k
    }
869
870
33.6k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
29.3k
    {
872
29.3k
      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
29.3k
      num_sec = elf_numsections (abfd);
878
457k
      for (shindex = 1; shindex < num_sec; shindex++)
879
439k
  if (!bfd_section_from_shdr (abfd, shindex))
880
11.0k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
18.2k
      if (! _bfd_elf_setup_sections (abfd))
884
3.47k
  goto got_wrong_format_error;
885
18.2k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
19.1k
  if (ebd->elf_backend_object_p)
890
11.2k
    {
891
11.2k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
25
  goto got_wrong_format_error;
893
11.2k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
19.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
177k
  for (s = abfd->sections; s != NULL; s = s->next)
901
158k
    {
902
158k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
158k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
11.1k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
10.2k
  {
906
10.2k
    unsigned long targ_index;
907
10.2k
    asection *targ_sec;
908
909
10.2k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
10.2k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
10.2k
    if (targ_sec != NULL
912
8.64k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
1.79k
      s->flags |= SEC_DEBUGGING;
914
10.2k
  }
915
158k
    }
916
19.0k
  return _bfd_no_cleanup;
917
918
7.43M
 got_wrong_format_error:
919
7.43M
  bfd_set_error (bfd_error_wrong_format);
920
921
7.47M
 got_no_match:
922
7.47M
  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.9k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
7.43M
}
bfd_elf32_object_p
Line
Count
Source
520
24.5M
{
521
24.5M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
24.5M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
24.5M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
24.5M
  Elf_Internal_Shdr i_shdr;
525
24.5M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
24.5M
  unsigned int shindex;
527
24.5M
  elf_backend_data *ebd;
528
24.5M
  asection *s;
529
24.5M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
24.5M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
2.32M
    {
535
2.32M
      if (bfd_get_error () != bfd_error_system_call)
536
2.30M
  goto got_wrong_format_error;
537
24.1k
      else
538
24.1k
  goto got_no_match;
539
2.32M
    }
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
22.1M
  if (! elf_file_p (&x_ehdr)
548
6.46M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
6.32M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
17.9M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
4.22M
  switch (x_ehdr.e_ident[EI_DATA])
554
4.22M
    {
555
1.55M
    case ELFDATA2MSB:   /* Big-endian */
556
1.55M
      if (! bfd_header_big_endian (abfd))
557
778k
  goto got_wrong_format_error;
558
780k
      break;
559
2.66M
    case ELFDATA2LSB:   /* Little-endian */
560
2.66M
      if (! bfd_header_little_endian (abfd))
561
1.32M
  goto got_wrong_format_error;
562
1.33M
      break;
563
1.33M
    case ELFDATANONE:   /* No data encoding specified */
564
1.51k
    default:      /* Unknown data encoding specified */
565
1.51k
      goto got_wrong_format_error;
566
4.22M
    }
567
568
2.11M
  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.11M
  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.11M
  i_ehdrp = elf_elfheader (abfd);
578
2.11M
  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.11M
  if (i_ehdrp->e_type == ET_CORE)
585
669k
    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.44M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
27.3k
    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.42M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
49.1k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.37M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
528
    goto got_wrong_format_error;
601
602
1.37M
  ebd = get_elf_backend_data (abfd);
603
1.37M
  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.37M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.32M
      && (ebd->elf_machine_alt1 == 0
610
373k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.32M
      && (ebd->elf_machine_alt2 == 0
612
25.5k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.32M
      && ebd->elf_machine_code != EM_NONE)
614
1.30M
    goto got_wrong_format_error;
615
616
66.3k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.25k
    abfd->flags |= EXEC_P;
618
64.0k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.08k
    abfd->flags |= DYNAMIC;
620
621
66.3k
  if (i_ehdrp->e_phnum > 0)
622
28.6k
    abfd->flags |= D_PAGED;
623
624
66.3k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
21.0k
    {
626
      /* It's OK if this fails for the generic target.  */
627
21.0k
      if (ebd->elf_machine_code != EM_NONE)
628
15
  goto got_no_match;
629
21.0k
    }
630
631
66.2k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
3.49k
    goto got_wrong_format_error;
633
634
62.7k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
51.9k
    {
636
51.9k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
51.9k
      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
51.9k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
51.0k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
882
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
51.0k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
22.3k
  {
652
22.3k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
22.3k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
22.2k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
22.2k
        || i_ehdrp->e_shnum  == 0)
656
293
      goto got_wrong_format_error;
657
22.3k
  }
658
659
      /* And similarly for the string table index.  */
660
50.7k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
649
  {
662
649
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
649
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
649
  }
666
667
      /* And program headers.  */
668
50.7k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
512
  {
670
512
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
512
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
512
  }
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
50.7k
      if (i_ehdrp->e_shnum != 1)
678
49.3k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
49.3k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
48.6k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
835
      goto got_wrong_format_error;
683
684
48.5k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
48.5k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
48.5k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
48.5k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
698
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
47.8k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
47.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
47.8k
  }
698
50.7k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
60.0k
  if (i_ehdrp->e_shnum != 0)
703
49.2k
    {
704
49.2k
      Elf_Internal_Shdr *shdrp;
705
49.2k
      unsigned int num_sec;
706
49.2k
      size_t amt;
707
708
49.2k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
49.2k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
49.2k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
49.2k
      num_sec = i_ehdrp->e_shnum;
714
49.2k
      elf_numsections (abfd) = num_sec;
715
49.2k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
49.2k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
49.2k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
49.2k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
49.2k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
49.2k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
553k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
504k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
491k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
444k
  {
732
444k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
444k
        || !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
444k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
1.98k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
1.98k
        switch (ebd->elf_machine_code)
742
1.98k
    {
743
536
    case EM_386:
744
613
    case EM_IAMCU:
745
747
    case EM_X86_64:
746
747
    case EM_OLD_SPARCV9:
747
747
    case EM_SPARC32PLUS:
748
747
    case EM_SPARCV9:
749
882
    case EM_SPARC:
750
882
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
407
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
578
        break;
753
      /* Otherwise fall through.  */
754
1.41k
    default:
755
1.41k
      goto got_wrong_format_error;
756
1.98k
    }
757
1.98k
      }
758
759
442k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
394k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
390k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
74.8k
        && i_shdrp[shindex].sh_info >= num_sec)
763
464
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
442k
    if (i_shdrp[shindex].sh_size != 0
768
356k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
93.1k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
86.1k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
86.1k
       % ebd->minpagesize)
772
86.1k
      != 0))
773
55.2k
      abfd->flags &= ~D_PAGED;
774
442k
  }
775
776
47.3k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
45.7k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
3.24k
  {
779
    /* PR 2257:
780
       We used to just goto got_wrong_format_error here
781
       but there are binaries in existance for which this test
782
       will prevent the binutils from working with them at all.
783
       So we are kind, and reset the string index value to 0
784
       so that at least some processing can be done.  */
785
3.24k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
3.24k
    if (!abfd->read_only)
787
445
      {
788
445
        _bfd_error_handler
789
445
    (_("warning: %pB has a corrupt string table index"), abfd);
790
445
        abfd->read_only = 1;
791
445
      }
792
3.24k
  }
793
47.3k
    }
794
10.8k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
4.24k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
53.9k
  if (i_ehdrp->e_phnum == 0)
799
33.9k
    elf_tdata (abfd)->phdr = NULL;
800
20.0k
  else
801
20.0k
    {
802
20.0k
      Elf_Internal_Phdr *i_phdr;
803
20.0k
      unsigned int i;
804
20.0k
      ufile_ptr filesize;
805
20.0k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
20.0k
      filesize = bfd_get_file_size (abfd);
810
20.0k
      if (filesize != 0
811
20.0k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
881
  goto got_wrong_format_error;
813
19.1k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
19.1k
      elf_tdata (abfd)->phdr
816
19.1k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
19.1k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
19.1k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
0
  goto got_no_match;
821
19.1k
      bool eu_strip_broken_phdrs = false;
822
19.1k
      i_phdr = elf_tdata (abfd)->phdr;
823
399k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
380k
  {
825
380k
    Elf_External_Phdr x_phdr;
826
827
380k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
934
      goto got_no_match;
829
379k
    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
379k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
239k
      {
834
239k
        i_phdr->p_align &= -i_phdr->p_align;
835
239k
        if (!abfd->read_only)
836
2.84k
    {
837
2.84k
      _bfd_error_handler (_("warning: %pB has a program header "
838
2.84k
          "with invalid alignment"), abfd);
839
2.84k
      abfd->read_only = 1;
840
2.84k
    }
841
239k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
379k
    if (i_phdr->p_filesz != 0
845
280k
        && (i_phdr->p_filesz > filesize
846
61.7k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
245k
      eu_strip_broken_phdrs = true;
848
379k
  }
849
18.2k
      if (!eu_strip_broken_phdrs
850
2.11k
    && i_ehdrp->e_shoff == 0
851
1.39k
    && i_ehdrp->e_shstrndx == 0)
852
1.39k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
1.39k
    i_phdr = elf_tdata (abfd)->phdr;
856
4.63k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
4.33k
      if (i_phdr->p_type == PT_DYNAMIC)
858
1.09k
        {
859
1.09k
    if (i_phdr->p_filesz != 0
860
994
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
994
                  elf_tdata (abfd)->phdr,
862
994
                  i_ehdrp->e_phnum,
863
994
                  filesize))
864
994
      goto got_no_match;
865
101
    break;
866
1.09k
        }
867
1.39k
  }
868
18.2k
    }
869
870
51.1k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
43.9k
    {
872
43.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
43.9k
      num_sec = elf_numsections (abfd);
878
421k
      for (shindex = 1; shindex < num_sec; shindex++)
879
385k
  if (!bfd_section_from_shdr (abfd, shindex))
880
7.91k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
36.0k
      if (! _bfd_elf_setup_sections (abfd))
884
2.98k
  goto got_wrong_format_error;
885
36.0k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
40.2k
  if (ebd->elf_backend_object_p)
890
24.6k
    {
891
24.6k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
4.97k
  goto got_wrong_format_error;
893
24.6k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
35.2k
  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
196k
  for (s = abfd->sections; s != NULL; s = s->next)
901
161k
    {
902
161k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
158k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
3.05k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
2.13k
  {
906
2.13k
    unsigned long targ_index;
907
2.13k
    asection *targ_sec;
908
909
2.13k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
2.13k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
2.13k
    if (targ_sec != NULL
912
1.77k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
131
      s->flags |= SEC_DEBUGGING;
914
2.13k
  }
915
161k
    }
916
35.2k
  return _bfd_no_cleanup;
917
918
24.4M
 got_wrong_format_error:
919
24.4M
  bfd_set_error (bfd_error_wrong_format);
920
921
24.4M
 got_no_match:
922
24.4M
  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
13.4k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
24.4M
}
929

930
/* ELF .o/exec file writing */
931
932
/* Write out the relocs.  */
933
934
void
935
elf_write_relocs (bfd *abfd, asection *sec, void *data)
936
1.52k
{
937
1.52k
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
1.52k
  bool *failedp = (bool *) data;
939
1.52k
  Elf_Internal_Shdr *rela_hdr;
940
1.52k
  bfd_vma addr_offset;
941
1.52k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
1.52k
  size_t extsize;
943
1.52k
  bfd_byte *dst_rela;
944
1.52k
  unsigned int idx;
945
1.52k
  asymbol *last_sym;
946
1.52k
  int last_sym_idx;
947
1.52k
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
1.52k
  if (*failedp)
951
0
    return;
952
953
1.52k
  if ((sec->flags & SEC_RELOC) == 0)
954
1.45k
    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
70
  if (sec->reloc_count == 0)
961
5
    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
65
  if (sec->orelocation == NULL)
967
0
    return;
968
969
65
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
65
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
65
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
65
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
65
      || (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
65
  if (rela_hdr->sh_type == SHT_RELA)
984
65
    {
985
65
      swap_out = elf_swap_reloca_out;
986
65
      extsize = sizeof (Elf_External_Rela);
987
65
    }
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
65
  addr_offset = 0;
1002
65
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
7
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
65
  last_sym = 0;
1007
65
  last_sym_idx = 0;
1008
65
  dst_rela = rela_hdr->contents;
1009
1010
976
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
911
    {
1012
911
      Elf_Internal_Rela src_rela;
1013
911
      arelent *ptr;
1014
911
      asymbol *sym;
1015
911
      int n;
1016
1017
911
      ptr = sec->orelocation[idx];
1018
911
      sym = *ptr->sym_ptr_ptr;
1019
911
      if (sym == last_sym)
1020
34
  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
877
      else if (bfd_is_abs_section (sym->section)
1026
292
         && sym->value == 0
1027
271
         && (sym->flags & BSF_RELC) == 0)
1028
271
  n = STN_UNDEF;
1029
606
      else
1030
606
  {
1031
606
    last_sym = sym;
1032
606
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
606
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
606
    last_sym_idx = n;
1039
606
  }
1040
1041
911
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
641
    && (*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
911
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
#if defined(BFD64) && ARCH_SIZE == 32
1056
510
      if (rela_hdr->sh_type == SHT_RELA
1057
510
    && ptr->howto->bitsize > 32
1058
16
    && 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
510
      src_rela.r_offset = ptr->address + addr_offset;
1070
911
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
401
      src_rela.r_addend = ptr->addend;
1072
401
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
401
    }
1074
1075
65
  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
65
}
bfd_elf64_write_relocs
Line
Count
Source
936
684
{
937
684
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
684
  bool *failedp = (bool *) data;
939
684
  Elf_Internal_Shdr *rela_hdr;
940
684
  bfd_vma addr_offset;
941
684
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
684
  size_t extsize;
943
684
  bfd_byte *dst_rela;
944
684
  unsigned int idx;
945
684
  asymbol *last_sym;
946
684
  int last_sym_idx;
947
684
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
684
  if (*failedp)
951
0
    return;
952
953
684
  if ((sec->flags & SEC_RELOC) == 0)
954
630
    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
54
  if (sec->reloc_count == 0)
961
3
    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
51
  if (sec->orelocation == NULL)
967
0
    return;
968
969
51
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
51
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
51
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
51
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
51
      || (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
51
  if (rela_hdr->sh_type == SHT_RELA)
984
51
    {
985
51
      swap_out = elf_swap_reloca_out;
986
51
      extsize = sizeof (Elf_External_Rela);
987
51
    }
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
51
  addr_offset = 0;
1002
51
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
4
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
51
  last_sym = 0;
1007
51
  last_sym_idx = 0;
1008
51
  dst_rela = rela_hdr->contents;
1009
1010
452
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
401
    {
1012
401
      Elf_Internal_Rela src_rela;
1013
401
      arelent *ptr;
1014
401
      asymbol *sym;
1015
401
      int n;
1016
1017
401
      ptr = sec->orelocation[idx];
1018
401
      sym = *ptr->sym_ptr_ptr;
1019
401
      if (sym == last_sym)
1020
32
  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
369
      else if (bfd_is_abs_section (sym->section)
1026
69
         && sym->value == 0
1027
57
         && (sym->flags & BSF_RELC) == 0)
1028
57
  n = STN_UNDEF;
1029
312
      else
1030
312
  {
1031
312
    last_sym = sym;
1032
312
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
312
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
312
    last_sym_idx = n;
1039
312
  }
1040
1041
401
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
345
    && (*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
401
      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
401
      src_rela.r_offset = ptr->address + addr_offset;
1070
401
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
401
      src_rela.r_addend = ptr->addend;
1072
401
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
401
    }
1074
1075
51
  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
51
}
bfd_elf32_write_relocs
Line
Count
Source
936
841
{
937
841
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
841
  bool *failedp = (bool *) data;
939
841
  Elf_Internal_Shdr *rela_hdr;
940
841
  bfd_vma addr_offset;
941
841
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
841
  size_t extsize;
943
841
  bfd_byte *dst_rela;
944
841
  unsigned int idx;
945
841
  asymbol *last_sym;
946
841
  int last_sym_idx;
947
841
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
841
  if (*failedp)
951
0
    return;
952
953
841
  if ((sec->flags & SEC_RELOC) == 0)
954
825
    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
16
  if (sec->reloc_count == 0)
961
2
    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
14
  if (sec->orelocation == NULL)
967
0
    return;
968
969
14
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
14
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
14
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
14
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
14
      || (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
14
  if (rela_hdr->sh_type == SHT_RELA)
984
14
    {
985
14
      swap_out = elf_swap_reloca_out;
986
14
      extsize = sizeof (Elf_External_Rela);
987
14
    }
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
14
  addr_offset = 0;
1002
14
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
3
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
14
  last_sym = 0;
1007
14
  last_sym_idx = 0;
1008
14
  dst_rela = rela_hdr->contents;
1009
1010
524
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
510
    {
1012
510
      Elf_Internal_Rela src_rela;
1013
510
      arelent *ptr;
1014
510
      asymbol *sym;
1015
510
      int n;
1016
1017
510
      ptr = sec->orelocation[idx];
1018
510
      sym = *ptr->sym_ptr_ptr;
1019
510
      if (sym == last_sym)
1020
2
  n = last_sym_idx;
1021
      /* If the relocation is against an absolute symbol whoes value is
1022
   zero, then the symbol can be dropped, simplifying the reloc.
1023
   PR 31106: Except for complex relocations where the symbols
1024
   itself might be significant.  */
1025
508
      else if (bfd_is_abs_section (sym->section)
1026
223
         && sym->value == 0
1027
214
         && (sym->flags & BSF_RELC) == 0)
1028
214
  n = STN_UNDEF;
1029
294
      else
1030
294
  {
1031
294
    last_sym = sym;
1032
294
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
294
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
294
    last_sym_idx = n;
1039
294
  }
1040
1041
510
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
296
    && (*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
510
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
510
#if defined(BFD64) && ARCH_SIZE == 32
1056
510
      if (rela_hdr->sh_type == SHT_RELA
1057
510
    && ptr->howto->bitsize > 32
1058
16
    && 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
510
#endif
1068
1069
510
      src_rela.r_offset = ptr->address + addr_offset;
1070
510
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
510
      src_rela.r_addend = ptr->addend;
1072
510
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
510
    }
1074
1075
14
  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
14
}
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
106
{
1090
647
  while (count--)
1091
541
    {
1092
541
      Elf_External_Phdr extphdr;
1093
1094
541
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
541
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
541
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
541
      phdr++;
1099
541
    }
1100
106
  return 0;
1101
106
}
bfd_elf64_write_out_phdrs
Line
Count
Source
1089
35
{
1090
232
  while (count--)
1091
197
    {
1092
197
      Elf_External_Phdr extphdr;
1093
1094
197
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
197
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
197
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
197
      phdr++;
1099
197
    }
1100
35
  return 0;
1101
35
}
bfd_elf32_write_out_phdrs
Line
Count
Source
1089
71
{
1090
415
  while (count--)
1091
344
    {
1092
344
      Elf_External_Phdr extphdr;
1093
1094
344
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
344
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
344
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
344
      phdr++;
1099
344
    }
1100
71
  return 0;
1101
71
}
1102
1103
/* Write out the section headers and the ELF file header.  */
1104
1105
bool
1106
elf_write_shdrs_and_ehdr (bfd *abfd)
1107
484
{
1108
484
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
484
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
484
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
484
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
484
  unsigned int count;
1113
484
  size_t amt;
1114
1115
484
  i_ehdrp = elf_elfheader (abfd);
1116
484
  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
484
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
484
  amt = sizeof (x_ehdr);
1125
484
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
484
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
484
  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
484
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
484
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
484
  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
484
  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
484
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
484
  if (!x_shdrp)
1149
0
    return false;
1150
1151
3.37k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
2.89k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
2.89k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
2.89k
    }
1158
484
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
484
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
484
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
484
  return true;
1166
484
}
bfd_elf64_write_shdrs_and_ehdr
Line
Count
Source
1107
173
{
1108
173
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
173
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
173
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
173
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
173
  unsigned int count;
1113
173
  size_t amt;
1114
1115
173
  i_ehdrp = elf_elfheader (abfd);
1116
173
  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
173
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
173
  amt = sizeof (x_ehdr);
1125
173
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
173
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
173
  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
173
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
173
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
173
  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
173
  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
173
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
173
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.50k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.33k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.33k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.33k
    }
1158
173
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
173
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
173
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
173
  return true;
1166
173
}
bfd_elf32_write_shdrs_and_ehdr
Line
Count
Source
1107
311
{
1108
311
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
311
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
311
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
311
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
311
  unsigned int count;
1113
311
  size_t amt;
1114
1115
311
  i_ehdrp = elf_elfheader (abfd);
1116
311
  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
311
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
311
  amt = sizeof (x_ehdr);
1125
311
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
311
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
311
  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
311
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
311
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
311
  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
311
  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
311
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
311
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.87k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.55k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.55k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.55k
    }
1158
311
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
311
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
311
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
311
  return true;
1166
311
}
1167
1168
bool
1169
elf_checksum_contents (bfd *abfd,
1170
           void (*process) (const void *, size_t, void *),
1171
           void *arg)
1172
0
{
1173
0
  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1174
0
  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1175
0
  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1176
0
  unsigned int count, num;
1177
1178
0
  {
1179
0
    Elf_External_Ehdr x_ehdr;
1180
0
    Elf_Internal_Ehdr i_ehdr;
1181
1182
0
    i_ehdr = *i_ehdrp;
1183
0
    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1184
0
    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1185
0
    (*process) (&x_ehdr, sizeof x_ehdr, arg);
1186
0
  }
1187
1188
0
  num = i_ehdrp->e_phnum;
1189
0
  for (count = 0; count < num; count++)
1190
0
    {
1191
0
      Elf_External_Phdr x_phdr;
1192
0
      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1193
0
      (*process) (&x_phdr, sizeof x_phdr, arg);
1194
0
    }
1195
1196
0
  num = elf_numsections (abfd);
1197
0
  for (count = 0; count < num; count++)
1198
0
    {
1199
0
      Elf_Internal_Shdr i_shdr;
1200
0
      Elf_External_Shdr x_shdr;
1201
0
      bfd_byte *contents, *free_contents;
1202
0
      asection *sec = NULL;
1203
1204
0
      i_shdr = *i_shdrp[count];
1205
0
      i_shdr.sh_offset = 0;
1206
1207
0
      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1208
0
      (*process) (&x_shdr, sizeof x_shdr, arg);
1209
1210
      /* Process the section's contents, if it has some.
1211
   PR ld/12451: Read them in if necessary.  */
1212
0
      if (i_shdr.sh_type == SHT_NOBITS)
1213
0
  continue;
1214
0
      free_contents = NULL;
1215
0
      contents = i_shdr.contents;
1216
0
      if (contents == NULL)
1217
0
  {
1218
0
    sec = bfd_section_from_elf_index (abfd, count);
1219
0
    if (sec != NULL)
1220
0
      {
1221
0
        contents = sec->contents;
1222
0
        if (contents == NULL)
1223
0
    {
1224
      /* Force rereading from file.  */
1225
0
      sec->flags &= ~SEC_IN_MEMORY;
1226
0
      if (!_bfd_elf_mmap_section_contents (abfd, sec, &free_contents))
1227
0
        continue;
1228
0
      contents = free_contents;
1229
0
    }
1230
0
      }
1231
0
  }
1232
0
      if (contents != NULL)
1233
0
  {
1234
0
    (*process) (contents, i_shdr.sh_size, arg);
1235
0
    _bfd_elf_munmap_section_contents (sec, free_contents);
1236
0
  }
1237
0
    }
1238
1239
0
  return true;
1240
0
}
Unexecuted instantiation: bfd_elf64_checksum_contents
Unexecuted instantiation: bfd_elf32_checksum_contents
1241
1242
long
1243
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bool dynamic)
1244
8.55k
{
1245
8.55k
  Elf_Internal_Shdr *hdr;
1246
8.55k
  Elf_Internal_Shdr *verhdr;
1247
8.55k
  unsigned long symcount; /* Number of external ELF symbols */
1248
8.55k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
8.55k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
8.55k
  Elf_Internal_Sym *isym;
1251
8.55k
  Elf_Internal_Sym *isymend;
1252
8.55k
  Elf_Internal_Sym *isymbuf = NULL;
1253
8.55k
  Elf_External_Versym *xver;
1254
8.55k
  Elf_External_Versym *xverbuf = NULL;
1255
8.55k
  elf_backend_data *ebd;
1256
8.55k
  size_t amt;
1257
1258
  /* Read each raw ELF symbol, converting from external ELF form to
1259
     internal ELF form, and then using the information to create a
1260
     canonical bfd symbol table entry.
1261
1262
     Note that we allocate the initial bfd canonical symbol buffer
1263
     based on a one-to-one mapping of the ELF symbols to canonical
1264
     symbols.  We actually use all the ELF symbols, so there will be no
1265
     space left over at the end.  When we have all the symbols, we
1266
     build the caller's pointer vector.  */
1267
8.55k
  ebd = get_elf_backend_data (abfd);
1268
1269
8.55k
  if (! dynamic)
1270
8.27k
    {
1271
8.27k
      hdr = &elf_symtab_hdr (abfd);
1272
8.27k
      verhdr = NULL;
1273
8.27k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
8.27k
    }
1275
271
  else
1276
271
    {
1277
271
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
271
      if (elf_dynversym (abfd) == 0)
1279
42
  verhdr = NULL;
1280
229
      else
1281
229
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
271
      if ((elf_dynverdef (abfd) != 0
1283
107
     && elf_tdata (abfd)->verdef == NULL)
1284
175
    || (elf_dynverref (abfd) != 0
1285
112
        && elf_tdata (abfd)->verref == NULL)
1286
123
    || elf_tdata (abfd)->dt_verdef != NULL
1287
123
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
150
  {
1289
150
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
115
      return -1;
1291
150
  }
1292
1293
156
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
156
    }
1295
1296
8.43k
  if (symcount == 0)
1297
814
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
8.43k
  if (symcount == 0)
1300
664
    sym = symbase = NULL;
1301
7.77k
  else
1302
7.77k
    {
1303
7.77k
      size_t i;
1304
1305
7.77k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
7.77k
              NULL, NULL, NULL);
1307
7.77k
      if (isymbuf == NULL)
1308
897
  return -1;
1309
1310
6.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
6.87k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
6.87k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
6.87k
      if (verhdr != NULL
1321
109
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
27
  {
1323
27
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
27
      (_("%pB: version count (%" PRId64 ")"
1326
27
         " does not match symbol count (%ld)"),
1327
27
       abfd,
1328
27
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
27
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
27
    verhdr = NULL;
1334
27
  }
1335
1336
6.87k
      if (verhdr != NULL)
1337
82
  {
1338
82
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
3
      goto error_return;
1340
79
    xverbuf = (Elf_External_Versym *)
1341
79
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
79
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
2
      goto error_return;
1344
79
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
6.86k
      xver = xverbuf;
1348
6.86k
      if (xver != NULL)
1349
77
  ++xver;
1350
6.86k
      isymend = isymbuf + symcount;
1351
6.86k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
171k
     isym < isymend;
1353
164k
     isym++, sym++, i++)
1354
164k
  {
1355
164k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
164k
    sym->symbol.the_bfd = abfd;
1358
164k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
164k
    else
1362
164k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
164k
    sym->symbol.value = isym->st_value;
1364
1365
164k
    if (isym->st_shndx == SHN_UNDEF)
1366
81.0k
      {
1367
81.0k
        sym->symbol.section = bfd_und_section_ptr;
1368
81.0k
      }
1369
83.5k
    else if (isym->st_shndx == SHN_ABS)
1370
2.37k
      {
1371
2.37k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.37k
      }
1373
81.1k
    else if (isym->st_shndx == SHN_COMMON)
1374
93
      {
1375
93
        sym->symbol.section = bfd_com_section_ptr;
1376
93
        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
93
        sym->symbol.value = isym->st_size;
1395
93
      }
1396
81.0k
    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
81.0k
    else
1406
81.0k
      {
1407
81.0k
        sym->symbol.section
1408
81.0k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
81.0k
        if (sym->symbol.section == NULL)
1410
34.6k
    {
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
34.6k
      sym->symbol.section = bfd_abs_section_ptr;
1418
34.6k
    }
1419
81.0k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
164k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
16.5k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
164k
    switch (ELF_ST_BIND (isym->st_info))
1427
164k
      {
1428
102k
      case STB_LOCAL:
1429
102k
        sym->symbol.flags |= BSF_LOCAL;
1430
102k
        break;
1431
43.3k
      case STB_GLOBAL:
1432
43.3k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
11.1k
    sym->symbol.flags |= BSF_GLOBAL;
1434
43.3k
        break;
1435
10.1k
      case STB_WEAK:
1436
10.1k
        sym->symbol.flags |= BSF_WEAK;
1437
10.1k
        break;
1438
1.48k
      case STB_GNU_UNIQUE:
1439
1.48k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
1.48k
        break;
1441
164k
      }
1442
1443
164k
    switch (ELF_ST_TYPE (isym->st_info))
1444
164k
      {
1445
27.1k
      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.1k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
27.1k
            | BSF_DEBUGGING
1452
27.1k
            | BSF_SECTION_SYM_USED);
1453
27.1k
        break;
1454
4.44k
      case STT_FILE:
1455
4.44k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
4.44k
        break;
1457
14.2k
      case STT_FUNC:
1458
14.2k
        sym->symbol.flags |= BSF_FUNCTION;
1459
14.2k
        break;
1460
1.00k
      case STT_COMMON:
1461
        /* FIXME: Do we have to put the size field into the value field
1462
     as we do with symbols in SHN_COMMON sections (see above) ?  */
1463
1.00k
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
9.95k
      case STT_OBJECT:
1466
9.95k
        sym->symbol.flags |= BSF_OBJECT;
1467
9.95k
        break;
1468
1.75k
      case STT_TLS:
1469
1.75k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.75k
        break;
1471
1.42k
      case STT_RELC:
1472
1.42k
        sym->symbol.flags |= BSF_RELC;
1473
1.42k
        break;
1474
964
      case STT_SRELC:
1475
964
        sym->symbol.flags |= BSF_SRELC;
1476
964
        break;
1477
1.78k
      case STT_GNU_IFUNC:
1478
1.78k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
1.78k
        break;
1480
164k
      }
1481
1482
164k
    if (dynamic)
1483
1.29k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
164k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
164k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
164k
    else if (xver != NULL)
1489
895
      {
1490
895
        Elf_Internal_Versym iversym;
1491
1492
895
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
895
        sym->version = iversym.vs_vers;
1494
895
        xver++;
1495
895
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
164k
    if (ebd->elf_backend_symbol_processing)
1499
70.8k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
164k
  }
1501
6.86k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
7.53k
  if (ebd->elf_backend_symbol_table_processing)
1505
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1506
1507
  /* We rely on the zalloc to clear out the final symbol entry.  */
1508
1509
7.53k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
7.53k
  if (symptrs)
1513
7.53k
    {
1514
7.53k
      long l = symcount;
1515
1516
7.53k
      sym = symbase;
1517
172k
      while (l-- > 0)
1518
164k
  {
1519
164k
    *symptrs++ = &sym->symbol;
1520
164k
    sym++;
1521
164k
  }
1522
7.53k
      *symptrs = 0;   /* Final null pointer */
1523
7.53k
    }
1524
1525
7.53k
  free (xverbuf);
1526
7.53k
  if (hdr->contents != (unsigned char *) isymbuf
1527
6.86k
      && !elf_use_dt_symtab_p (abfd))
1528
6.86k
    free (isymbuf);
1529
7.53k
  return symcount;
1530
1531
5
 error_return:
1532
5
  free (xverbuf);
1533
5
  if (hdr->contents != (unsigned char *) isymbuf
1534
5
      && !elf_use_dt_symtab_p (abfd))
1535
5
    free (isymbuf);
1536
5
  return -1;
1537
8.43k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1244
4.44k
{
1245
4.44k
  Elf_Internal_Shdr *hdr;
1246
4.44k
  Elf_Internal_Shdr *verhdr;
1247
4.44k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.44k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.44k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.44k
  Elf_Internal_Sym *isym;
1251
4.44k
  Elf_Internal_Sym *isymend;
1252
4.44k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.44k
  Elf_External_Versym *xver;
1254
4.44k
  Elf_External_Versym *xverbuf = NULL;
1255
4.44k
  elf_backend_data *ebd;
1256
4.44k
  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.44k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.44k
  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
189
  else
1276
189
    {
1277
189
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
189
      if (elf_dynversym (abfd) == 0)
1279
34
  verhdr = NULL;
1280
155
      else
1281
155
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
189
      if ((elf_dynverdef (abfd) != 0
1283
61
     && elf_tdata (abfd)->verdef == NULL)
1284
138
    || (elf_dynverref (abfd) != 0
1285
93
        && elf_tdata (abfd)->verref == NULL)
1286
100
    || elf_tdata (abfd)->dt_verdef != NULL
1287
100
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
91
  {
1289
91
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
76
      return -1;
1291
91
  }
1292
1293
113
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
113
    }
1295
1296
4.37k
  if (symcount == 0)
1297
485
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.37k
  if (symcount == 0)
1300
378
    sym = symbase = NULL;
1301
3.99k
  else
1302
3.99k
    {
1303
3.99k
      size_t i;
1304
1305
3.99k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
3.99k
              NULL, NULL, NULL);
1307
3.99k
      if (isymbuf == NULL)
1308
562
  return -1;
1309
1310
3.43k
      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.43k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.43k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.43k
      if (verhdr != NULL
1321
80
    && 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
3.43k
      if (verhdr != NULL)
1337
70
  {
1338
70
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
3
      goto error_return;
1340
67
    xverbuf = (Elf_External_Versym *)
1341
67
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
67
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
1
      goto error_return;
1344
67
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.42k
      xver = xverbuf;
1348
3.42k
      if (xver != NULL)
1349
66
  ++xver;
1350
3.42k
      isymend = isymbuf + symcount;
1351
3.42k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
112k
     isym < isymend;
1353
109k
     isym++, sym++, i++)
1354
109k
  {
1355
109k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
109k
    sym->symbol.the_bfd = abfd;
1358
109k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
109k
    else
1362
109k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
109k
    sym->symbol.value = isym->st_value;
1364
1365
109k
    if (isym->st_shndx == SHN_UNDEF)
1366
55.6k
      {
1367
55.6k
        sym->symbol.section = bfd_und_section_ptr;
1368
55.6k
      }
1369
53.4k
    else if (isym->st_shndx == SHN_ABS)
1370
2.29k
      {
1371
2.29k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.29k
      }
1373
51.1k
    else if (isym->st_shndx == SHN_COMMON)
1374
48
      {
1375
48
        sym->symbol.section = bfd_com_section_ptr;
1376
48
        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
48
        sym->symbol.value = isym->st_size;
1395
48
      }
1396
51.1k
    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
51.1k
    else
1406
51.1k
      {
1407
51.1k
        sym->symbol.section
1408
51.1k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
51.1k
        if (sym->symbol.section == NULL)
1410
12.4k
    {
1411
      /* This symbol is in a section for which we did not
1412
         create a BFD section.  Just use bfd_abs_section,
1413
         although it is wrong.  FIXME.  Note - there is
1414
         code in elf.c:swap_out_syms that calls
1415
         symbol_section_index() in the elf backend for
1416
         cases like this.  */
1417
12.4k
      sym->symbol.section = bfd_abs_section_ptr;
1418
12.4k
    }
1419
51.1k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
109k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
12.0k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
109k
    switch (ELF_ST_BIND (isym->st_info))
1427
109k
      {
1428
64.1k
      case STB_LOCAL:
1429
64.1k
        sym->symbol.flags |= BSF_LOCAL;
1430
64.1k
        break;
1431
36.8k
      case STB_GLOBAL:
1432
36.8k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
5.90k
    sym->symbol.flags |= BSF_GLOBAL;
1434
36.8k
        break;
1435
5.61k
      case STB_WEAK:
1436
5.61k
        sym->symbol.flags |= BSF_WEAK;
1437
5.61k
        break;
1438
432
      case STB_GNU_UNIQUE:
1439
432
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
432
        break;
1441
109k
      }
1442
1443
109k
    switch (ELF_ST_TYPE (isym->st_info))
1444
109k
      {
1445
24.0k
      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.0k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
24.0k
            | BSF_DEBUGGING
1452
24.0k
            | BSF_SECTION_SYM_USED);
1453
24.0k
        break;
1454
3.60k
      case STT_FILE:
1455
3.60k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
3.60k
        break;
1457
9.92k
      case STT_FUNC:
1458
9.92k
        sym->symbol.flags |= BSF_FUNCTION;
1459
9.92k
        break;
1460
414
      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
414
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
7.64k
      case STT_OBJECT:
1466
7.64k
        sym->symbol.flags |= BSF_OBJECT;
1467
7.64k
        break;
1468
1.39k
      case STT_TLS:
1469
1.39k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.39k
        break;
1471
312
      case STT_RELC:
1472
312
        sym->symbol.flags |= BSF_RELC;
1473
312
        break;
1474
463
      case STT_SRELC:
1475
463
        sym->symbol.flags |= BSF_SRELC;
1476
463
        break;
1477
744
      case STT_GNU_IFUNC:
1478
744
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
744
        break;
1480
109k
      }
1481
1482
109k
    if (dynamic)
1483
1.05k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
109k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
109k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
109k
    else if (xver != NULL)
1489
792
      {
1490
792
        Elf_Internal_Versym iversym;
1491
1492
792
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
792
        sym->version = iversym.vs_vers;
1494
792
        xver++;
1495
792
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
109k
    if (ebd->elf_backend_symbol_processing)
1499
54.0k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
109k
  }
1501
3.42k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
3.80k
  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.80k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
3.80k
  if (symptrs)
1513
3.80k
    {
1514
3.80k
      long l = symcount;
1515
1516
3.80k
      sym = symbase;
1517
112k
      while (l-- > 0)
1518
109k
  {
1519
109k
    *symptrs++ = &sym->symbol;
1520
109k
    sym++;
1521
109k
  }
1522
3.80k
      *symptrs = 0;   /* Final null pointer */
1523
3.80k
    }
1524
1525
3.80k
  free (xverbuf);
1526
3.80k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.42k
      && !elf_use_dt_symtab_p (abfd))
1528
3.42k
    free (isymbuf);
1529
3.80k
  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
4.37k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1244
4.10k
{
1245
4.10k
  Elf_Internal_Shdr *hdr;
1246
4.10k
  Elf_Internal_Shdr *verhdr;
1247
4.10k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.10k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.10k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.10k
  Elf_Internal_Sym *isym;
1251
4.10k
  Elf_Internal_Sym *isymend;
1252
4.10k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.10k
  Elf_External_Versym *xver;
1254
4.10k
  Elf_External_Versym *xverbuf = NULL;
1255
4.10k
  elf_backend_data *ebd;
1256
4.10k
  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.10k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.10k
  if (! dynamic)
1270
4.02k
    {
1271
4.02k
      hdr = &elf_symtab_hdr (abfd);
1272
4.02k
      verhdr = NULL;
1273
4.02k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
4.02k
    }
1275
82
  else
1276
82
    {
1277
82
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
82
      if (elf_dynversym (abfd) == 0)
1279
8
  verhdr = NULL;
1280
74
      else
1281
74
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
82
      if ((elf_dynverdef (abfd) != 0
1283
46
     && elf_tdata (abfd)->verdef == NULL)
1284
37
    || (elf_dynverref (abfd) != 0
1285
19
        && elf_tdata (abfd)->verref == NULL)
1286
23
    || elf_tdata (abfd)->dt_verdef != NULL
1287
23
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
59
  {
1289
59
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
39
      return -1;
1291
59
  }
1292
1293
43
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
43
    }
1295
1296
4.06k
  if (symcount == 0)
1297
329
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.06k
  if (symcount == 0)
1300
286
    sym = symbase = NULL;
1301
3.77k
  else
1302
3.77k
    {
1303
3.77k
      size_t i;
1304
1305
3.77k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
3.77k
              NULL, NULL, NULL);
1307
3.77k
      if (isymbuf == NULL)
1308
335
  return -1;
1309
1310
3.44k
      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.44k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.44k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.44k
      if (verhdr != NULL
1321
29
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
17
  {
1323
17
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
17
      (_("%pB: version count (%" PRId64 ")"
1326
17
         " does not match symbol count (%ld)"),
1327
17
       abfd,
1328
17
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
17
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
17
    verhdr = NULL;
1334
17
  }
1335
1336
3.44k
      if (verhdr != NULL)
1337
12
  {
1338
12
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
0
      goto error_return;
1340
12
    xverbuf = (Elf_External_Versym *)
1341
12
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
12
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
1
      goto error_return;
1344
12
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.44k
      xver = xverbuf;
1348
3.44k
      if (xver != NULL)
1349
11
  ++xver;
1350
3.44k
      isymend = isymbuf + symcount;
1351
3.44k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
58.9k
     isym < isymend;
1353
55.5k
     isym++, sym++, i++)
1354
55.5k
  {
1355
55.5k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
55.5k
    sym->symbol.the_bfd = abfd;
1358
55.5k
    if (elf_use_dt_symtab_p (abfd))
1359
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
0
        + isym->st_name);
1361
55.5k
    else
1362
55.5k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
55.5k
    sym->symbol.value = isym->st_value;
1364
1365
55.5k
    if (isym->st_shndx == SHN_UNDEF)
1366
25.4k
      {
1367
25.4k
        sym->symbol.section = bfd_und_section_ptr;
1368
25.4k
      }
1369
30.1k
    else if (isym->st_shndx == SHN_ABS)
1370
82
      {
1371
82
        sym->symbol.section = bfd_abs_section_ptr;
1372
82
      }
1373
30.0k
    else if (isym->st_shndx == SHN_COMMON)
1374
45
      {
1375
45
        sym->symbol.section = bfd_com_section_ptr;
1376
45
        if ((abfd->flags & BFD_PLUGIN) != 0)
1377
0
    {
1378
0
      asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1379
1380
0
      if (xc == NULL)
1381
0
        {
1382
0
          flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1383
0
          | SEC_EXCLUDE);
1384
0
          xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1385
0
          if (xc == NULL)
1386
0
      goto error_return;
1387
0
        }
1388
0
      sym->symbol.section = xc;
1389
0
    }
1390
        /* Elf puts the alignment into the `value' field, and
1391
     the size into the `size' field.  BFD wants to see the
1392
     size in the value field, and doesn't care (at the
1393
     moment) about the alignment.  */
1394
45
        sym->symbol.value = isym->st_size;
1395
45
      }
1396
29.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
29.9k
    else
1406
29.9k
      {
1407
29.9k
        sym->symbol.section
1408
29.9k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
29.9k
        if (sym->symbol.section == NULL)
1410
22.1k
    {
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
22.1k
      sym->symbol.section = bfd_abs_section_ptr;
1418
22.1k
    }
1419
29.9k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
55.5k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
4.55k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
55.5k
    switch (ELF_ST_BIND (isym->st_info))
1427
55.5k
      {
1428
38.4k
      case STB_LOCAL:
1429
38.4k
        sym->symbol.flags |= BSF_LOCAL;
1430
38.4k
        break;
1431
6.45k
      case STB_GLOBAL:
1432
6.45k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
5.22k
    sym->symbol.flags |= BSF_GLOBAL;
1434
6.45k
        break;
1435
4.53k
      case STB_WEAK:
1436
4.53k
        sym->symbol.flags |= BSF_WEAK;
1437
4.53k
        break;
1438
1.05k
      case STB_GNU_UNIQUE:
1439
1.05k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
1.05k
        break;
1441
55.5k
      }
1442
1443
55.5k
    switch (ELF_ST_TYPE (isym->st_info))
1444
55.5k
      {
1445
3.19k
      case STT_SECTION:
1446
        /* Mark the input section symbol as used since it may be
1447
           used for relocation and section group.
1448
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1449
     be cleared by objcopy for non-relocatable inputs.  */
1450
3.19k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
3.19k
            | BSF_DEBUGGING
1452
3.19k
            | BSF_SECTION_SYM_USED);
1453
3.19k
        break;
1454
840
      case STT_FILE:
1455
840
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
840
        break;
1457
4.31k
      case STT_FUNC:
1458
4.31k
        sym->symbol.flags |= BSF_FUNCTION;
1459
4.31k
        break;
1460
595
      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
595
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
2.31k
      case STT_OBJECT:
1466
2.31k
        sym->symbol.flags |= BSF_OBJECT;
1467
2.31k
        break;
1468
360
      case STT_TLS:
1469
360
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
360
        break;
1471
1.11k
      case STT_RELC:
1472
1.11k
        sym->symbol.flags |= BSF_RELC;
1473
1.11k
        break;
1474
501
      case STT_SRELC:
1475
501
        sym->symbol.flags |= BSF_SRELC;
1476
501
        break;
1477
1.03k
      case STT_GNU_IFUNC:
1478
1.03k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
1.03k
        break;
1480
55.5k
      }
1481
1482
55.5k
    if (dynamic)
1483
237
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
55.5k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
55.5k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
55.5k
    else if (xver != NULL)
1489
103
      {
1490
103
        Elf_Internal_Versym iversym;
1491
1492
103
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
103
        sym->version = iversym.vs_vers;
1494
103
        xver++;
1495
103
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
55.5k
    if (ebd->elf_backend_symbol_processing)
1499
16.8k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
55.5k
  }
1501
3.44k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
3.72k
  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.72k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
3.72k
  if (symptrs)
1513
3.72k
    {
1514
3.72k
      long l = symcount;
1515
1516
3.72k
      sym = symbase;
1517
59.2k
      while (l-- > 0)
1518
55.5k
  {
1519
55.5k
    *symptrs++ = &sym->symbol;
1520
55.5k
    sym++;
1521
55.5k
  }
1522
3.72k
      *symptrs = 0;   /* Final null pointer */
1523
3.72k
    }
1524
1525
3.72k
  free (xverbuf);
1526
3.72k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.44k
      && !elf_use_dt_symtab_p (abfd))
1528
3.44k
    free (isymbuf);
1529
3.72k
  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
4.06k
}
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.8k
{
1551
13.8k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
13.8k
  void *allocated = NULL;
1553
13.8k
  bfd_byte *native_relocs;
1554
13.8k
  arelent *relent;
1555
13.8k
  unsigned int i;
1556
13.8k
  int entsize;
1557
13.8k
  unsigned int symcount;
1558
1559
13.8k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
134
    return false;
1561
13.6k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
13.6k
  if (allocated == NULL)
1563
456
    return false;
1564
1565
13.2k
  native_relocs = (bfd_byte *) allocated;
1566
1567
13.2k
  entsize = rel_hdr->sh_entsize;
1568
13.2k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
13.2k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
13.2k
  if (dynamic)
1572
120
    symcount = bfd_get_dynamic_symcount (abfd);
1573
13.1k
  else
1574
13.1k
    symcount = bfd_get_symcount (abfd);
1575
1576
13.2k
  for (i = 0, relent = relents;
1577
156k
       i < reloc_count;
1578
143k
       i++, relent++, native_relocs += entsize)
1579
146k
    {
1580
146k
      bool res;
1581
146k
      Elf_Internal_Rela rela;
1582
1583
146k
      if (entsize == sizeof (Elf_External_Rela))
1584
115k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
30.5k
      else
1586
30.5k
  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
146k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
143k
  relent->address = rela.r_offset;
1594
2.82k
      else
1595
2.82k
  relent->address = rela.r_offset - asect->vma;
1596
1597
146k
      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
34.7k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
111k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
32.0k
  {
1603
32.0k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
32.0k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
32.0k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
32.0k
    bfd_set_error (bfd_error_bad_value);
1608
32.0k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
32.0k
  }
1610
79.2k
      else
1611
79.2k
  {
1612
79.2k
    asymbol **ps;
1613
1614
79.2k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
79.2k
    relent->sym_ptr_ptr = ps;
1617
79.2k
  }
1618
1619
146k
      relent->addend = rela.r_addend;
1620
1621
146k
      res = false;
1622
146k
      if ((entsize == sizeof (Elf_External_Rela)
1623
30.5k
     || ebd->elf_info_to_howto_rel == NULL)
1624
136k
    && ebd->elf_info_to_howto != NULL)
1625
135k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
10.5k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
10.5k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
146k
      if (! res || relent->howto == NULL)
1630
3.04k
  goto error_return;
1631
146k
    }
1632
1633
10.2k
  free (allocated);
1634
10.2k
  return true;
1635
1636
3.04k
 error_return:
1637
3.04k
  free (allocated);
1638
3.04k
  return false;
1639
13.2k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
11.3k
{
1551
11.3k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
11.3k
  void *allocated = NULL;
1553
11.3k
  bfd_byte *native_relocs;
1554
11.3k
  arelent *relent;
1555
11.3k
  unsigned int i;
1556
11.3k
  int entsize;
1557
11.3k
  unsigned int symcount;
1558
1559
11.3k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
134
    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
296
    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
107
    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
107k
       i < reloc_count;
1578
96.8k
       i++, relent++, native_relocs += entsize)
1579
98.7k
    {
1580
98.7k
      bool res;
1581
98.7k
      Elf_Internal_Rela rela;
1582
1583
98.7k
      if (entsize == sizeof (Elf_External_Rela))
1584
98.7k
  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
98.7k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
96.3k
  relent->address = rela.r_offset;
1594
2.41k
      else
1595
2.41k
  relent->address = rela.r_offset - asect->vma;
1596
1597
98.7k
      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
16.7k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
82.0k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
17.2k
  {
1603
17.2k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
17.2k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
17.2k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
17.2k
    bfd_set_error (bfd_error_bad_value);
1608
17.2k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
17.2k
  }
1610
64.8k
      else
1611
64.8k
  {
1612
64.8k
    asymbol **ps;
1613
1614
64.8k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
64.8k
    relent->sym_ptr_ptr = ps;
1617
64.8k
  }
1618
1619
98.7k
      relent->addend = rela.r_addend;
1620
1621
98.7k
      res = false;
1622
98.7k
      if ((entsize == sizeof (Elf_External_Rela)
1623
0
     || ebd->elf_info_to_howto_rel == NULL)
1624
98.7k
    && ebd->elf_info_to_howto != NULL)
1625
98.7k
  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
98.7k
      if (! res || relent->howto == NULL)
1630
1.98k
  goto error_return;
1631
98.7k
    }
1632
1633
8.93k
  free (allocated);
1634
8.93k
  return true;
1635
1636
1.98k
 error_return:
1637
1.98k
  free (allocated);
1638
  return false;
1639
10.9k
}
elf32.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
2.49k
{
1551
2.49k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
2.49k
  void *allocated = NULL;
1553
2.49k
  bfd_byte *native_relocs;
1554
2.49k
  arelent *relent;
1555
2.49k
  unsigned int i;
1556
2.49k
  int entsize;
1557
2.49k
  unsigned int symcount;
1558
1559
2.49k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
0
    return false;
1561
2.49k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
2.49k
  if (allocated == NULL)
1563
160
    return false;
1564
1565
2.33k
  native_relocs = (bfd_byte *) allocated;
1566
1567
2.33k
  entsize = rel_hdr->sh_entsize;
1568
2.33k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
2.33k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
2.33k
  if (dynamic)
1572
13
    symcount = bfd_get_dynamic_symcount (abfd);
1573
2.31k
  else
1574
2.31k
    symcount = bfd_get_symcount (abfd);
1575
1576
2.33k
  for (i = 0, relent = relents;
1577
48.6k
       i < reloc_count;
1578
46.2k
       i++, relent++, native_relocs += entsize)
1579
47.3k
    {
1580
47.3k
      bool res;
1581
47.3k
      Elf_Internal_Rela rela;
1582
1583
47.3k
      if (entsize == sizeof (Elf_External_Rela))
1584
16.7k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
30.5k
      else
1586
30.5k
  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
47.3k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
46.9k
  relent->address = rela.r_offset;
1594
402
      else
1595
402
  relent->address = rela.r_offset - asect->vma;
1596
1597
47.3k
      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.0k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
29.3k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
14.8k
  {
1603
14.8k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
14.8k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
14.8k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
14.8k
    bfd_set_error (bfd_error_bad_value);
1608
14.8k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
14.8k
  }
1610
14.4k
      else
1611
14.4k
  {
1612
14.4k
    asymbol **ps;
1613
1614
14.4k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
14.4k
    relent->sym_ptr_ptr = ps;
1617
14.4k
  }
1618
1619
47.3k
      relent->addend = rela.r_addend;
1620
1621
47.3k
      res = false;
1622
47.3k
      if ((entsize == sizeof (Elf_External_Rela)
1623
30.5k
     || ebd->elf_info_to_howto_rel == NULL)
1624
38.1k
    && ebd->elf_info_to_howto != NULL)
1625
36.7k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
10.5k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
10.5k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
47.3k
      if (! res || relent->howto == NULL)
1630
1.06k
  goto error_return;
1631
47.3k
    }
1632
1633
1.27k
  free (allocated);
1634
1.27k
  return true;
1635
1636
1.06k
 error_return:
1637
1.06k
  free (allocated);
1638
  return false;
1639
2.33k
}
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
18.6k
{
1649
18.6k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
18.6k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
18.6k
  Elf_Internal_Shdr *rel_hdr;
1652
18.6k
  Elf_Internal_Shdr *rel_hdr2;
1653
18.6k
  bfd_size_type reloc_count;
1654
18.6k
  bfd_size_type reloc_count2;
1655
18.6k
  arelent *relents;
1656
18.6k
  size_t amt;
1657
1658
18.6k
  if (asect->relocation != NULL)
1659
2.52k
    return true;
1660
1661
16.1k
  if (! dynamic)
1662
15.9k
    {
1663
15.9k
      if ((asect->flags & SEC_RELOC) == 0
1664
13.8k
    || asect->reloc_count == 0)
1665
2.27k
  return true;
1666
1667
13.7k
      rel_hdr = d->rel.hdr;
1668
13.7k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
13.7k
      rel_hdr2 = d->rela.hdr;
1670
13.7k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
13.7k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
13.7k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
13.7k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
13.7k
    }
1679
124
  else
1680
124
    {
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
124
      if (asect->size == 0)
1686
4
  return true;
1687
1688
120
      rel_hdr = &d->this_hdr;
1689
120
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
120
      rel_hdr2 = NULL;
1691
120
      reloc_count2 = 0;
1692
120
    }
1693
1694
13.8k
  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.8k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
13.8k
  if (relents == NULL)
1701
0
    return false;
1702
1703
13.8k
  if (rel_hdr
1704
1.87k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
1.87k
                rel_hdr, reloc_count,
1706
1.87k
                relents,
1707
1.87k
                symbols, dynamic))
1708
685
    return false;
1709
1710
13.1k
  if (rel_hdr2
1711
11.9k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
11.9k
                rel_hdr2, reloc_count2,
1713
11.9k
                relents + reloc_count,
1714
11.9k
                symbols, dynamic))
1715
2.94k
    return false;
1716
1717
10.2k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
36
    return false;
1719
1720
10.1k
  asect->relocation = relents;
1721
10.1k
  return true;
1722
10.2k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1648
14.6k
{
1649
14.6k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
14.6k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
14.6k
  Elf_Internal_Shdr *rel_hdr;
1652
14.6k
  Elf_Internal_Shdr *rel_hdr2;
1653
14.6k
  bfd_size_type reloc_count;
1654
14.6k
  bfd_size_type reloc_count2;
1655
14.6k
  arelent *relents;
1656
14.6k
  size_t amt;
1657
1658
14.6k
  if (asect->relocation != NULL)
1659
2.36k
    return true;
1660
1661
12.2k
  if (! dynamic)
1662
12.1k
    {
1663
12.1k
      if ((asect->flags & SEC_RELOC) == 0
1664
11.3k
    || asect->reloc_count == 0)
1665
949
  return true;
1666
1667
11.2k
      rel_hdr = d->rel.hdr;
1668
11.2k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
11.2k
      rel_hdr2 = d->rela.hdr;
1670
11.2k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
11.2k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
11.2k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
11.2k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
11.2k
    }
1679
111
  else
1680
111
    {
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
111
      if (asect->size == 0)
1686
4
  return true;
1687
1688
107
      rel_hdr = &d->this_hdr;
1689
107
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
107
      rel_hdr2 = NULL;
1691
107
      reloc_count2 = 0;
1692
107
    }
1693
1694
11.3k
  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.3k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
11.3k
  if (relents == NULL)
1701
0
    return false;
1702
1703
11.3k
  if (rel_hdr
1704
107
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
107
                rel_hdr, reloc_count,
1706
107
                relents,
1707
107
                symbols, dynamic))
1708
17
    return false;
1709
1710
11.3k
  if (rel_hdr2
1711
11.2k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
11.2k
                rel_hdr2, reloc_count2,
1713
11.2k
                relents + reloc_count,
1714
11.2k
                symbols, dynamic))
1715
2.39k
    return false;
1716
1717
8.93k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
36
    return false;
1719
1720
8.89k
  asect->relocation = relents;
1721
  return true;
1722
8.93k
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1648
3.96k
{
1649
3.96k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
3.96k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
3.96k
  Elf_Internal_Shdr *rel_hdr;
1652
3.96k
  Elf_Internal_Shdr *rel_hdr2;
1653
3.96k
  bfd_size_type reloc_count;
1654
3.96k
  bfd_size_type reloc_count2;
1655
3.96k
  arelent *relents;
1656
3.96k
  size_t amt;
1657
1658
3.96k
  if (asect->relocation != NULL)
1659
154
    return true;
1660
1661
3.81k
  if (! dynamic)
1662
3.79k
    {
1663
3.79k
      if ((asect->flags & SEC_RELOC) == 0
1664
2.50k
    || asect->reloc_count == 0)
1665
1.32k
  return true;
1666
1667
2.47k
      rel_hdr = d->rel.hdr;
1668
2.47k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
2.47k
      rel_hdr2 = d->rela.hdr;
1670
2.47k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
2.47k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
2.47k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
2.47k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
2.47k
    }
1679
13
  else
1680
13
    {
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
13
      if (asect->size == 0)
1686
0
  return true;
1687
1688
13
      rel_hdr = &d->this_hdr;
1689
13
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
13
      rel_hdr2 = NULL;
1691
13
      reloc_count2 = 0;
1692
13
    }
1693
1694
2.49k
  if (_bfd_mul_overflow (reloc_count + reloc_count2, sizeof (arelent), &amt))
1695
0
    {
1696
0
      bfd_set_error (bfd_error_file_too_big);
1697
0
      return false;
1698
0
    }
1699
2.49k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
2.49k
  if (relents == NULL)
1701
0
    return false;
1702
1703
2.49k
  if (rel_hdr
1704
1.76k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
1.76k
                rel_hdr, reloc_count,
1706
1.76k
                relents,
1707
1.76k
                symbols, dynamic))
1708
668
    return false;
1709
1710
1.82k
  if (rel_hdr2
1711
722
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
722
                rel_hdr2, reloc_count2,
1713
722
                relents + reloc_count,
1714
722
                symbols, dynamic))
1715
552
    return false;
1716
1717
1.27k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
0
    return false;
1719
1720
1.27k
  asect->relocation = relents;
1721
  return true;
1722
1.27k
}
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.22k
{
2052
1.22k
  return ELF_R_SYM (r_info);
2053
1.22k
}
elf32_r_sym
Line
Count
Source
2051
30
{
2052
30
  return ELF_R_SYM (r_info);
2053
30
}
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
};