Coverage Report

Created: 2026-10-02 09:53

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.8M
#define Elf_External_Ehdr NAME(Elf,External_Ehdr)
78
1.60k
#define Elf_External_Sym  NAME(Elf,External_Sym)
79
32.6M
#define Elf_External_Shdr NAME(Elf,External_Shdr)
80
2.19M
#define Elf_External_Phdr NAME(Elf,External_Phdr)
81
256
#define Elf_External_Rel  NAME(Elf,External_Rel)
82
1.14k
#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
39.9k
#define elf_swap_reloc_in   NAME(bfd_elf,swap_reloc_in)
96
128k
#define elf_swap_reloca_in    NAME(bfd_elf,swap_reloca_in)
97
1
#define elf_swap_reloc_out    NAME(bfd_elf,swap_reloc_out)
98
102
#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.15M
#define elf_swap_phdr_in    NAME(bfd_elf,swap_phdr_in)
102
258
#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
469
#define ELF_R_INFO(X,Y) ELF64_R_INFO(X,Y)
131
292k
#define ELF_R_SYM(X)  ELF64_R_SYM(X)
132
#define ELF_R_TYPE(X) ELF64_R_TYPE(X)
133
2.26M
#define ELFCLASS  ELFCLASS64
134
#define FILE_ALIGN  8
135
#define LOG_FILE_ALIGN  3
136
#endif
137
#if ARCH_SIZE == 32
138
936
#define ELF_R_INFO(X,Y) ELF32_R_INFO(X,Y)
139
129k
#define ELF_R_SYM(X)  ELF32_R_SYM(X)
140
#define ELF_R_TYPE(X) ELF32_R_TYPE(X)
141
8.71M
#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
11.6k
#define H_PUT_WORD    H_PUT_64
159
619
#define H_PUT_SIGNED_WORD H_PUT_S64
160
9.39M
#define H_GET_WORD    H_GET_64
161
580k
#define H_GET_SIGNED_WORD H_GET_S64
162
#endif
163
#if ARCH_SIZE == 32
164
12.1k
#define H_PUT_WORD    H_PUT_32
165
914
#define H_PUT_SIGNED_WORD H_PUT_S32
166
20.7M
#define H_GET_WORD    H_GET_32
167
1.10M
#define H_GET_SIGNED_WORD H_GET_S32
168
#endif
169
170
/* Translate an ELF symbol in external format into an ELF symbol in internal
171
   format.  */
172
173
bool
174
elf_swap_symbol_in (bfd *abfd,
175
        const void *psrc,
176
        const void *pshn,
177
        Elf_Internal_Sym *dst)
178
221k
{
179
221k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
221k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
221k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
221k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
221k
  if (signed_vma)
185
24.6k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
197k
  else
187
197k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
221k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
221k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
221k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
221k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
221k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
3.11k
    {
194
3.11k
      if (shndx == NULL)
195
518
  return false;
196
2.59k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
2.59k
    }
198
218k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
5.64k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
221k
  dst->st_target_internal = 0;
201
221k
  return true;
202
221k
}
bfd_elf64_swap_symbol_in
Line
Count
Source
178
143k
{
179
143k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
143k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
143k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
143k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
143k
  if (signed_vma)
185
11.5k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
131k
  else
187
131k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
143k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
143k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
143k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
143k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
143k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
591
    {
194
591
      if (shndx == NULL)
195
321
  return false;
196
270
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
270
    }
198
142k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
3.76k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
143k
  dst->st_target_internal = 0;
201
  return true;
202
143k
}
bfd_elf32_swap_symbol_in
Line
Count
Source
178
78.5k
{
179
78.5k
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
180
78.5k
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
181
78.5k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
182
183
78.5k
  dst->st_name = H_GET_32 (abfd, src->st_name);
184
78.5k
  if (signed_vma)
185
13.0k
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
186
65.4k
  else
187
65.4k
    dst->st_value = H_GET_WORD (abfd, src->st_value);
188
78.5k
  dst->st_size = H_GET_WORD (abfd, src->st_size);
189
78.5k
  dst->st_info = H_GET_8 (abfd, src->st_info);
190
78.5k
  dst->st_other = H_GET_8 (abfd, src->st_other);
191
78.5k
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
192
78.5k
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
193
2.52k
    {
194
2.52k
      if (shndx == NULL)
195
197
  return false;
196
2.32k
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
197
2.32k
    }
198
75.9k
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
199
1.88k
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
200
78.3k
  dst->st_target_internal = 0;
201
  return true;
202
78.5k
}
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.60k
{
213
1.60k
  unsigned int tmp;
214
1.60k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.60k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.60k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.60k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.60k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.60k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.60k
  tmp = src->st_shndx;
221
1.60k
  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.60k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.60k
}
bfd_elf64_swap_symbol_out
Line
Count
Source
212
1.01k
{
213
1.01k
  unsigned int tmp;
214
1.01k
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
1.01k
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
1.01k
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
1.01k
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
1.01k
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
1.01k
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
1.01k
  tmp = src->st_shndx;
221
1.01k
  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.01k
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
1.01k
}
bfd_elf32_swap_symbol_out
Line
Count
Source
212
585
{
213
585
  unsigned int tmp;
214
585
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
215
585
  H_PUT_32 (abfd, src->st_name, dst->st_name);
216
585
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
217
585
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
218
585
  H_PUT_8 (abfd, src->st_info, dst->st_info);
219
585
  H_PUT_8 (abfd, src->st_other, dst->st_other);
220
585
  tmp = src->st_shndx;
221
585
  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
585
  H_PUT_16 (abfd, tmp, dst->st_shndx);
229
585
}
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.52M
{
239
3.52M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.52M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.52M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.52M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.52M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.52M
  if (signed_vma)
245
389k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
3.13M
  else
247
3.13M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.52M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.52M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.52M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.52M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.52M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.52M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.52M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.52M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.52M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.52M
}
elf64.c:elf_swap_ehdr_in
Line
Count
Source
238
411k
{
239
411k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
411k
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
411k
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
411k
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
411k
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
411k
  if (signed_vma)
245
59.2k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
352k
  else
247
352k
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
411k
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
411k
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
411k
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
411k
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
411k
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
411k
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
411k
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
411k
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
411k
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
411k
}
elf32.c:elf_swap_ehdr_in
Line
Count
Source
238
3.11M
{
239
3.11M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
240
3.11M
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
241
3.11M
  dst->e_type = H_GET_16 (abfd, src->e_type);
242
3.11M
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
243
3.11M
  dst->e_version = H_GET_32 (abfd, src->e_version);
244
3.11M
  if (signed_vma)
245
329k
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
246
2.78M
  else
247
2.78M
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
248
3.11M
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
249
3.11M
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
250
3.11M
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
251
3.11M
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
252
3.11M
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
253
3.11M
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
254
3.11M
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
255
3.11M
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
256
3.11M
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
257
3.11M
}
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
384
{
267
384
  unsigned int tmp;
268
384
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
384
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
384
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
384
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
384
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
384
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
384
  if (signed_vma)
276
384
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
341
  else
278
384
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
384
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
384
  if (no_section_header)
281
384
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
384
  else
283
384
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
384
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
384
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
384
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
384
  tmp = src->e_phnum;
288
384
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
384
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
384
  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
384
  else
298
384
    {
299
384
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
384
      tmp = src->e_shnum;
301
384
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
384
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
384
      tmp = src->e_shstrndx;
305
384
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
384
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
384
    }
309
384
}
elf64.c:elf_swap_ehdr_out
Line
Count
Source
266
150
{
267
150
  unsigned int tmp;
268
150
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
150
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
150
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
150
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
150
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
150
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
150
  if (signed_vma)
276
150
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
117
  else
278
150
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
150
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
150
  if (no_section_header)
281
150
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
150
  else
283
150
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
150
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
150
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
150
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
150
  tmp = src->e_phnum;
288
150
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
150
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
150
  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
150
  else
298
150
    {
299
150
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
150
      tmp = src->e_shnum;
301
150
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
150
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
150
      tmp = src->e_shstrndx;
305
150
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
150
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
150
    }
309
150
}
elf32.c:elf_swap_ehdr_out
Line
Count
Source
266
234
{
267
234
  unsigned int tmp;
268
234
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
269
234
  bool no_section_header = (abfd->flags & BFD_NO_SECTION_HEADER) != 0;
270
234
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
234
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
234
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
234
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
234
  if (signed_vma)
276
234
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
224
  else
278
234
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
234
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
234
  if (no_section_header)
281
234
    H_PUT_WORD (abfd, 0, dst->e_shoff);
282
234
  else
283
234
    H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
284
234
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
285
234
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
286
234
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
287
234
  tmp = src->e_phnum;
288
234
  if (tmp > PN_XNUM)
289
0
    tmp = PN_XNUM;
290
234
  H_PUT_16 (abfd, tmp, dst->e_phnum);
291
234
  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
234
  else
298
234
    {
299
234
      H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
300
234
      tmp = src->e_shnum;
301
234
      if (tmp >= (SHN_LORESERVE & 0xffff))
302
0
  tmp = SHN_UNDEF;
303
234
      H_PUT_16 (abfd, tmp, dst->e_shnum);
304
234
      tmp = src->e_shstrndx;
305
234
      if (tmp >= (SHN_LORESERVE & 0xffff))
306
0
  tmp = SHN_XINDEX & 0xffff;
307
234
      H_PUT_16 (abfd, tmp, dst->e_shstrndx);
308
234
    }
309
234
}
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.20M
{
319
1.20M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
1.20M
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
1.20M
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
1.20M
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
1.20M
  if (signed_vma)
325
298k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
908k
  else
327
908k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
1.20M
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
1.20M
  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.20M
  if (dst->sh_type != SHT_NOBITS)
334
1.18M
    {
335
1.18M
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
1.18M
      if (filesize != 0
338
1.18M
    && ((ufile_ptr) dst->sh_offset > filesize
339
868k
        || dst->sh_size > filesize - dst->sh_offset)
340
421k
    && !abfd->read_only)
341
85.5k
  {
342
85.5k
    _bfd_error_handler (_("warning: %pB has a section "
343
85.5k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
85.5k
    if (abfd->is_linker_input)
346
0
      return false;
347
85.5k
    abfd->read_only = 1;
348
85.5k
  }
349
1.18M
    }
350
1.20M
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
1.20M
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
1.20M
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
1.20M
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
1.20M
  dst->bfd_section = NULL;
355
1.20M
  dst->contents = NULL;
356
1.20M
  return true;
357
1.20M
}
elf64.c:elf_swap_shdr_in
Line
Count
Source
318
643k
{
319
643k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
643k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
643k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
643k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
643k
  if (signed_vma)
325
100k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
543k
  else
327
543k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
643k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
643k
  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
643k
  if (dst->sh_type != SHT_NOBITS)
334
635k
    {
335
635k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
635k
      if (filesize != 0
338
635k
    && ((ufile_ptr) dst->sh_offset > filesize
339
494k
        || dst->sh_size > filesize - dst->sh_offset)
340
191k
    && !abfd->read_only)
341
35.2k
  {
342
35.2k
    _bfd_error_handler (_("warning: %pB has a section "
343
35.2k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
35.2k
    if (abfd->is_linker_input)
346
0
      return false;
347
35.2k
    abfd->read_only = 1;
348
35.2k
  }
349
635k
    }
350
643k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
643k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
643k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
643k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
643k
  dst->bfd_section = NULL;
355
643k
  dst->contents = NULL;
356
  return true;
357
643k
}
elf32.c:elf_swap_shdr_in
Line
Count
Source
318
564k
{
319
564k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
320
321
564k
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
322
564k
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
323
564k
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
324
564k
  if (signed_vma)
325
198k
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
326
365k
  else
327
365k
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
328
564k
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
329
564k
  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
564k
  if (dst->sh_type != SHT_NOBITS)
334
549k
    {
335
549k
      ufile_ptr filesize = bfd_get_file_size (abfd);
336
337
549k
      if (filesize != 0
338
549k
    && ((ufile_ptr) dst->sh_offset > filesize
339
374k
        || dst->sh_size > filesize - dst->sh_offset)
340
230k
    && !abfd->read_only)
341
50.2k
  {
342
50.2k
    _bfd_error_handler (_("warning: %pB has a section "
343
50.2k
        "extending past end of file"), abfd);
344
    /* PR ld/33457: Don't match corrupt section header.  */
345
50.2k
    if (abfd->is_linker_input)
346
0
      return false;
347
50.2k
    abfd->read_only = 1;
348
50.2k
  }
349
549k
    }
350
564k
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
351
564k
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
352
564k
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
353
564k
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
354
564k
  dst->bfd_section = NULL;
355
564k
  dst->contents = NULL;
356
  return true;
357
564k
}
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.43k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
2.43k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
2.43k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
2.43k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
2.43k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
2.43k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
2.43k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
2.43k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
2.43k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
2.43k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
2.43k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
2.43k
}
elf64.c:elf_swap_shdr_out
Line
Count
Source
366
1.22k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.22k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.22k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.22k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.22k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.22k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.22k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.22k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.22k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.22k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.22k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.22k
}
elf32.c:elf_swap_shdr_out
Line
Count
Source
366
1.20k
{
367
  /* note that all elements of dst are *arrays of unsigned char* already...  */
368
1.20k
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
369
1.20k
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
370
1.20k
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
371
1.20k
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
372
1.20k
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
373
1.20k
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
374
1.20k
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
375
1.20k
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
376
1.20k
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
377
1.20k
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
378
1.20k
}
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.15M
{
388
2.15M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
2.15M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
2.15M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
2.15M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
2.15M
  if (signed_vma)
394
420k
    {
395
420k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
420k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
420k
    }
398
1.73M
  else
399
1.73M
    {
400
1.73M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.73M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.73M
    }
403
2.15M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
2.15M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
2.15M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
2.15M
}
bfd_elf64_swap_phdr_in
Line
Count
Source
387
690k
{
388
690k
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
690k
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
690k
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
690k
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
690k
  if (signed_vma)
394
148k
    {
395
148k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
148k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
148k
    }
398
541k
  else
399
541k
    {
400
541k
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
541k
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
541k
    }
403
690k
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
690k
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
690k
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
690k
}
bfd_elf32_swap_phdr_in
Line
Count
Source
387
1.46M
{
388
1.46M
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
389
390
1.46M
  dst->p_type = H_GET_32 (abfd, src->p_type);
391
1.46M
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
392
1.46M
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
393
1.46M
  if (signed_vma)
394
271k
    {
395
271k
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
396
271k
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
397
271k
    }
398
1.18M
  else
399
1.18M
    {
400
1.18M
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
401
1.18M
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
402
1.18M
    }
403
1.46M
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
404
1.46M
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
405
1.46M
  dst->p_align = H_GET_WORD (abfd, src->p_align);
406
1.46M
}
407
408
void
409
elf_swap_phdr_out (bfd *abfd,
410
       const Elf_Internal_Phdr *src,
411
       Elf_External_Phdr *dst)
412
258
{
413
258
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
258
  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
258
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
258
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
258
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
258
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
258
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
258
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
258
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
258
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
258
}
bfd_elf64_swap_phdr_out
Line
Count
Source
412
112
{
413
112
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
112
  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
112
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
112
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
112
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
112
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
112
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
112
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
112
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
112
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
112
}
bfd_elf32_swap_phdr_out
Line
Count
Source
412
146
{
413
146
  elf_backend_data *bed = get_elf_backend_data (abfd);
414
146
  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
146
  H_PUT_32 (abfd, src->p_type, dst->p_type);
418
146
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
419
146
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
420
146
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
421
146
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
422
146
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
423
146
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
424
146
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
425
146
}
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
39.9k
{
433
39.9k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
39.9k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
39.9k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
39.9k
  dst->r_addend = 0;
437
39.9k
}
Unexecuted instantiation: bfd_elf64_swap_reloc_in
bfd_elf32_swap_reloc_in
Line
Count
Source
432
39.9k
{
433
39.9k
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
434
39.9k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
435
39.9k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
436
39.9k
  dst->r_addend = 0;
437
39.9k
}
438
439
void
440
elf_swap_reloca_in (bfd *abfd,
441
        const bfd_byte *s,
442
        Elf_Internal_Rela *dst)
443
130k
{
444
130k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
130k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
130k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
130k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
130k
}
bfd_elf64_swap_reloca_in
Line
Count
Source
443
112k
{
444
112k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
112k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
112k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
112k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
112k
}
bfd_elf32_swap_reloca_in
Line
Count
Source
443
18.5k
{
444
18.5k
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
445
18.5k
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
446
18.5k
  dst->r_info = H_GET_WORD (abfd, src->r_info);
447
18.5k
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
448
18.5k
}
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
256
{
456
256
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
457
256
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
458
256
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
459
256
}
Unexecuted instantiation: bfd_elf64_swap_reloc_out
bfd_elf32_swap_reloc_out
Line
Count
Source
455
256
{
456
256
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
457
256
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
458
256
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
459
256
}
460
461
void
462
elf_swap_reloca_out (bfd *abfd,
463
         const Elf_Internal_Rela *src,
464
         bfd_byte *d)
465
1.14k
{
466
1.14k
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
1.14k
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
1.14k
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
1.14k
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
1.14k
}
bfd_elf64_swap_reloca_out
Line
Count
Source
465
469
{
466
469
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
469
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
469
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
469
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
469
}
bfd_elf32_swap_reloca_out
Line
Count
Source
465
680
{
466
680
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
467
680
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
468
680
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
469
680
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
470
680
}
471
472
void
473
elf_swap_dyn_in (bfd *abfd,
474
     const void *p,
475
     Elf_Internal_Dyn *dst)
476
71.3k
{
477
71.3k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
71.3k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
71.3k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
71.3k
}
bfd_elf64_swap_dyn_in
Line
Count
Source
476
57.8k
{
477
57.8k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
57.8k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
57.8k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
57.8k
}
bfd_elf32_swap_dyn_in
Line
Count
Source
476
13.4k
{
477
13.4k
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
478
479
13.4k
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
480
13.4k
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
481
13.4k
}
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
31.9M
{
504
31.9M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
11.1M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
11.1M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
11.1M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
31.9M
}
elf64.c:elf_file_p
Line
Count
Source
503
6.93M
{
504
6.93M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
2.30M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
2.29M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
2.29M
    && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
508
6.93M
}
elf32.c:elf_file_p
Line
Count
Source
503
25.0M
{
504
25.0M
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
505
8.85M
    && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
506
8.84M
    && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
507
8.83M
    && (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.6M
{
521
32.6M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
32.6M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
32.6M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
32.6M
  Elf_Internal_Shdr i_shdr;
525
32.6M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
32.6M
  unsigned int shindex;
527
32.6M
  elf_backend_data *ebd;
528
32.6M
  asection *s;
529
32.6M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
32.6M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
3.78M
    {
535
3.78M
      if (bfd_get_error () != bfd_error_system_call)
536
3.73M
  goto got_wrong_format_error;
537
45.7k
      else
538
45.7k
  goto got_no_match;
539
3.78M
    }
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.9M
  if (! elf_file_p (&x_ehdr)
548
8.53M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
8.38M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
23.8M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
5.08M
  switch (x_ehdr.e_ident[EI_DATA])
554
5.08M
    {
555
1.66M
    case ELFDATA2MSB:   /* Big-endian */
556
1.66M
      if (! bfd_header_big_endian (abfd))
557
834k
  goto got_wrong_format_error;
558
830k
      break;
559
3.41M
    case ELFDATA2LSB:   /* Little-endian */
560
3.41M
      if (! bfd_header_little_endian (abfd))
561
1.68M
  goto got_wrong_format_error;
562
1.73M
      break;
563
1.73M
    case ELFDATANONE:   /* No data encoding specified */
564
2.02k
    default:      /* Unknown data encoding specified */
565
2.02k
      goto got_wrong_format_error;
566
5.08M
    }
567
568
2.56M
  target = abfd->xvec;
569
570
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
571
     the tdata pointer in the bfd.  */
572
573
2.56M
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
574
0
    goto got_no_match;
575
576
  /* Now that we know the byte order, swap in the rest of the header */
577
2.56M
  i_ehdrp = elf_elfheader (abfd);
578
2.56M
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
579
#if DEBUG & 1
580
  elf_debug_file (i_ehdrp);
581
#endif
582
583
  /* Reject ET_CORE (header indicates core file, not object file) */
584
2.56M
  if (i_ehdrp->e_type == ET_CORE)
585
684k
    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.88M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
28.6k
    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.85M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
58.6k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.79M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
538
    goto got_wrong_format_error;
601
602
1.79M
  ebd = get_elf_backend_data (abfd);
603
1.79M
  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.79M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.71M
      && (ebd->elf_machine_alt1 == 0
610
436k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.70M
      && (ebd->elf_machine_alt2 == 0
612
55.9k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.70M
      && ebd->elf_machine_code != EM_NONE)
614
1.67M
    goto got_wrong_format_error;
615
616
124k
  if (i_ehdrp->e_type == ET_EXEC)
617
4.76k
    abfd->flags |= EXEC_P;
618
119k
  else if (i_ehdrp->e_type == ET_DYN)
619
4.45k
    abfd->flags |= DYNAMIC;
620
621
124k
  if (i_ehdrp->e_phnum > 0)
622
49.4k
    abfd->flags |= D_PAGED;
623
624
124k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
39.1k
    {
626
      /* It's OK if this fails for the generic target.  */
627
39.1k
      if (ebd->elf_machine_code != EM_NONE)
628
11
  goto got_no_match;
629
39.1k
    }
630
631
124k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
10.8k
    goto got_wrong_format_error;
633
634
113k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
96.0k
    {
636
96.0k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
96.0k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
628
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
95.3k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
93.6k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
1.69k
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
93.6k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
24.2k
  {
652
24.2k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
24.2k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
24.0k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
23.8k
        || i_ehdrp->e_shnum  == 0)
656
678
      goto got_wrong_format_error;
657
24.2k
  }
658
659
      /* And similarly for the string table index.  */
660
93.0k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
1.04k
  {
662
1.04k
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
1.04k
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
1.04k
  }
666
667
      /* And program headers.  */
668
93.0k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
945
  {
670
945
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
945
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
945
  }
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
93.0k
      if (i_ehdrp->e_shnum != 1)
678
90.9k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
90.9k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
89.9k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
1.27k
      goto got_wrong_format_error;
683
684
89.7k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
89.7k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
89.7k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
89.7k
    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
88.4k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
88.4k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
88.4k
  }
698
93.0k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
107k
  if (i_ehdrp->e_shnum != 0)
703
90.4k
    {
704
90.4k
      Elf_Internal_Shdr *shdrp;
705
90.4k
      unsigned int num_sec;
706
90.4k
      size_t amt;
707
708
90.4k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
90.4k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
90.4k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
90.4k
      num_sec = i_ehdrp->e_shnum;
714
90.4k
      elf_numsections (abfd) = num_sec;
715
90.4k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
90.4k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
90.4k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
90.4k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
90.4k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
90.4k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
1.31M
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
1.22M
  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.20M
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
1.11M
  {
732
1.11M
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
1.11M
        || !elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex))
734
0
      goto got_no_match;
735
736
    /* Sanity check sh_link and sh_info.  */
737
1.11M
    if (i_shdrp[shindex].sh_link >= num_sec)
738
5.79k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
5.79k
        switch (ebd->elf_machine_code)
742
5.79k
    {
743
735
    case EM_386:
744
812
    case EM_IAMCU:
745
3.04k
    case EM_X86_64:
746
3.04k
    case EM_OLD_SPARCV9:
747
3.04k
    case EM_SPARC32PLUS:
748
3.48k
    case EM_SPARCV9:
749
3.61k
    case EM_SPARC:
750
3.61k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.65k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
2.39k
        break;
753
      /* Otherwise fall through.  */
754
3.40k
    default:
755
3.40k
      goto got_wrong_format_error;
756
5.79k
    }
757
5.79k
      }
758
759
1.11M
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
954k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
901k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
236k
        && i_shdrp[shindex].sh_info >= num_sec)
763
709
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
1.10M
    if (i_shdrp[shindex].sh_size != 0
768
938k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
279k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
266k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
266k
       % ebd->minpagesize)
772
266k
      != 0))
773
167k
      abfd->flags &= ~D_PAGED;
774
1.10M
  }
775
776
86.3k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
83.7k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
5.38k
  {
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.38k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
5.38k
    if (!abfd->read_only)
787
514
      {
788
514
        _bfd_error_handler
789
514
    (_("warning: %pB has a corrupt string table index"), abfd);
790
514
        abfd->read_only = 1;
791
514
      }
792
5.38k
  }
793
86.3k
    }
794
17.5k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
4.46k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
99.3k
  if (i_ehdrp->e_phnum == 0)
799
63.9k
    elf_tdata (abfd)->phdr = NULL;
800
35.3k
  else
801
35.3k
    {
802
35.3k
      Elf_Internal_Phdr *i_phdr;
803
35.3k
      unsigned int i;
804
35.3k
      ufile_ptr filesize;
805
35.3k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
35.3k
      filesize = bfd_get_file_size (abfd);
810
35.3k
      if (filesize != 0
811
35.3k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
1.29k
  goto got_wrong_format_error;
813
34.0k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
34.0k
      elf_tdata (abfd)->phdr
816
34.0k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
34.0k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
34.0k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
145
  goto got_no_match;
821
34.0k
      bool eu_strip_broken_phdrs = false;
822
33.9k
      i_phdr = elf_tdata (abfd)->phdr;
823
792k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
759k
  {
825
759k
    Elf_External_Phdr x_phdr;
826
827
759k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
1.49k
      goto got_no_match;
829
758k
    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
758k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
504k
      {
834
504k
        i_phdr->p_align &= -i_phdr->p_align;
835
504k
        if (!abfd->read_only)
836
8.64k
    {
837
8.64k
      _bfd_error_handler (_("warning: %pB has a program header "
838
8.64k
          "with invalid alignment"), abfd);
839
8.64k
      abfd->read_only = 1;
840
8.64k
    }
841
504k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
758k
    if (i_phdr->p_filesz != 0
845
577k
        && (i_phdr->p_filesz > filesize
846
102k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
515k
      eu_strip_broken_phdrs = true;
848
758k
  }
849
32.4k
      if (!eu_strip_broken_phdrs
850
5.84k
    && i_ehdrp->e_shoff == 0
851
4.42k
    && i_ehdrp->e_shstrndx == 0)
852
4.42k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
4.42k
    i_phdr = elf_tdata (abfd)->phdr;
856
16.2k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
15.7k
      if (i_phdr->p_type == PT_DYNAMIC)
858
3.91k
        {
859
3.91k
    if (i_phdr->p_filesz != 0
860
3.77k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
3.77k
                  elf_tdata (abfd)->phdr,
862
3.77k
                  i_ehdrp->e_phnum,
863
3.77k
                  filesize))
864
3.61k
      goto got_no_match;
865
300
    break;
866
3.91k
        }
867
4.42k
  }
868
32.4k
    }
869
870
92.8k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
80.7k
    {
872
80.7k
      unsigned int num_sec;
873
874
      /* Once all of the section headers have been read and converted, we
875
   can start processing them.  Note that the first section header is
876
   a dummy placeholder entry, so we ignore it.  */
877
80.7k
      num_sec = elf_numsections (abfd);
878
993k
      for (shindex = 1; shindex < num_sec; shindex++)
879
933k
  if (!bfd_section_from_shdr (abfd, shindex))
880
20.7k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
59.9k
      if (! _bfd_elf_setup_sections (abfd))
884
6.55k
  goto got_wrong_format_error;
885
59.9k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
65.4k
  if (ebd->elf_backend_object_p)
890
39.5k
    {
891
39.5k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
5.56k
  goto got_wrong_format_error;
893
39.5k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
59.8k
  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
434k
  for (s = abfd->sections; s != NULL; s = s->next)
901
374k
    {
902
374k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
371k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
15.6k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
13.7k
  {
906
13.7k
    unsigned long targ_index;
907
13.7k
    asection *targ_sec;
908
909
13.7k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
13.7k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
13.7k
    if (targ_sec != NULL
912
11.4k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
2.17k
      s->flags |= SEC_DEBUGGING;
914
13.7k
  }
915
374k
    }
916
59.8k
  return _bfd_no_cleanup;
917
918
32.5M
 got_wrong_format_error:
919
32.5M
  bfd_set_error (bfd_error_wrong_format);
920
921
32.6M
 got_no_match:
922
32.6M
  if (abfd->sections != NULL)
923
    /* Unlike most early section processing, the object attribute v2
924
       code uses bfd_malloc rather than bfd_alloc.  Free memory
925
       containing attributes.  */
926
28.6k
    _bfd_elf_cleanup_object_attributes (abfd);
927
32.6M
  return NULL;
928
32.5M
}
bfd_elf64_object_p
Line
Count
Source
520
7.66M
{
521
7.66M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
7.66M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
7.66M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
7.66M
  Elf_Internal_Shdr i_shdr;
525
7.66M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
7.66M
  unsigned int shindex;
527
7.66M
  elf_backend_data *ebd;
528
7.66M
  asection *s;
529
7.66M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
7.66M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
1.34M
    {
535
1.34M
      if (bfd_get_error () != bfd_error_system_call)
536
1.31M
  goto got_wrong_format_error;
537
23.5k
      else
538
23.5k
  goto got_no_match;
539
1.34M
    }
540
541
  /* Now check to see if we have a valid ELF file, and one that BFD can
542
     make use of.  The magic number must match, the address size ('class')
543
     and byte-swapping must match our XVEC entry, and it must have a
544
     section header table (FIXME: See comments re sections at top of this
545
     file).  */
546
547
6.31M
  if (! elf_file_p (&x_ehdr)
548
1.78M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
1.74M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
5.62M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
693k
  switch (x_ehdr.e_ident[EI_DATA])
554
693k
    {
555
107k
    case ELFDATA2MSB:   /* Big-endian */
556
107k
      if (! bfd_header_big_endian (abfd))
557
56.2k
  goto got_wrong_format_error;
558
51.0k
      break;
559
586k
    case ELFDATA2LSB:   /* Little-endian */
560
586k
      if (! bfd_header_little_endian (abfd))
561
271k
  goto got_wrong_format_error;
562
315k
      break;
563
315k
    case ELFDATANONE:   /* No data encoding specified */
564
247
    default:      /* Unknown data encoding specified */
565
247
      goto got_wrong_format_error;
566
693k
    }
567
568
366k
  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
366k
  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
366k
  i_ehdrp = elf_elfheader (abfd);
578
366k
  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
366k
  if (i_ehdrp->e_type == ET_CORE)
585
25.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
340k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
897
    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
339k
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
7.21k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
332k
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
142
    goto got_wrong_format_error;
601
602
331k
  ebd = get_elf_backend_data (abfd);
603
331k
  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
331k
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
296k
      && (ebd->elf_machine_alt1 == 0
610
38.3k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
295k
      && (ebd->elf_machine_alt2 == 0
612
28.7k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
294k
      && ebd->elf_machine_code != EM_NONE)
614
278k
    goto got_wrong_format_error;
615
616
53.2k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.54k
    abfd->flags |= EXEC_P;
618
50.7k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.21k
    abfd->flags |= DYNAMIC;
620
621
53.2k
  if (i_ehdrp->e_phnum > 0)
622
19.2k
    abfd->flags |= D_PAGED;
623
624
53.2k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
16.7k
    {
626
      /* It's OK if this fails for the generic target.  */
627
16.7k
      if (ebd->elf_machine_code != EM_NONE)
628
0
  goto got_no_match;
629
16.7k
    }
630
631
53.2k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
6.81k
    goto got_wrong_format_error;
633
634
46.4k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
39.5k
    {
636
39.5k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
39.5k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
628
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
38.8k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
38.1k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
789
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
38.1k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
1.06k
  {
652
1.06k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
1.06k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
998
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
743
        || i_ehdrp->e_shnum  == 0)
656
400
      goto got_wrong_format_error;
657
1.06k
  }
658
659
      /* And similarly for the string table index.  */
660
37.7k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
413
  {
662
413
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
413
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
413
  }
666
667
      /* And program headers.  */
668
37.7k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
374
  {
670
374
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
374
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
374
  }
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
37.7k
      if (i_ehdrp->e_shnum != 1)
678
37.1k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
37.1k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
36.8k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
281
      goto got_wrong_format_error;
683
684
36.8k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
36.8k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
36.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
36.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
624
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
36.2k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
36.2k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
36.2k
  }
698
37.7k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
43.7k
  if (i_ehdrp->e_shnum != 0)
703
36.7k
    {
704
36.7k
      Elf_Internal_Shdr *shdrp;
705
36.7k
      unsigned int num_sec;
706
36.7k
      size_t amt;
707
708
36.7k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
36.7k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
36.7k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
36.7k
      num_sec = i_ehdrp->e_shnum;
714
36.7k
      elf_numsections (abfd) = num_sec;
715
36.7k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
36.7k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
36.7k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
36.7k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
36.7k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
36.7k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
689k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
653k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
639k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
605k
  {
732
605k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
605k
        || !elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex))
734
0
      goto got_no_match;
735
736
    /* Sanity check sh_link and sh_info.  */
737
605k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
3.52k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
3.52k
        switch (ebd->elf_machine_code)
742
3.52k
    {
743
0
    case EM_386:
744
0
    case EM_IAMCU:
745
2.12k
    case EM_X86_64:
746
2.12k
    case EM_OLD_SPARCV9:
747
2.12k
    case EM_SPARC32PLUS:
748
2.56k
    case EM_SPARCV9:
749
2.56k
    case EM_SPARC:
750
2.56k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
1.08k
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
1.80k
        break;
753
      /* Otherwise fall through.  */
754
1.72k
    default:
755
1.72k
      goto got_wrong_format_error;
756
3.52k
    }
757
3.52k
      }
758
759
603k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
502k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
453k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
150k
        && 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
602k
    if (i_shdrp[shindex].sh_size != 0
768
523k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
172k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
167k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
167k
       % ebd->minpagesize)
772
167k
      != 0))
773
104k
      abfd->flags &= ~D_PAGED;
774
602k
  }
775
776
34.6k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
33.8k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
1.81k
  {
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.81k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
1.81k
    if (!abfd->read_only)
787
126
      {
788
126
        _bfd_error_handler
789
126
    (_("warning: %pB has a corrupt string table index"), abfd);
790
126
        abfd->read_only = 1;
791
126
      }
792
1.81k
  }
793
34.6k
    }
794
6.92k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
99
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
41.5k
  if (i_ehdrp->e_phnum == 0)
799
27.1k
    elf_tdata (abfd)->phdr = NULL;
800
14.4k
  else
801
14.4k
    {
802
14.4k
      Elf_Internal_Phdr *i_phdr;
803
14.4k
      unsigned int i;
804
14.4k
      ufile_ptr filesize;
805
14.4k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
14.4k
      filesize = bfd_get_file_size (abfd);
810
14.4k
      if (filesize != 0
811
14.4k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
521
  goto got_wrong_format_error;
813
13.8k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
13.8k
      elf_tdata (abfd)->phdr
816
13.8k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
13.8k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
13.8k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
145
  goto got_no_match;
821
13.8k
      bool eu_strip_broken_phdrs = false;
822
13.7k
      i_phdr = elf_tdata (abfd)->phdr;
823
369k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
356k
  {
825
356k
    Elf_External_Phdr x_phdr;
826
827
356k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
540
      goto got_no_match;
829
355k
    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
355k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
251k
      {
834
251k
        i_phdr->p_align &= -i_phdr->p_align;
835
251k
        if (!abfd->read_only)
836
5.93k
    {
837
5.93k
      _bfd_error_handler (_("warning: %pB has a program header "
838
5.93k
          "with invalid alignment"), abfd);
839
5.93k
      abfd->read_only = 1;
840
5.93k
    }
841
251k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
355k
    if (i_phdr->p_filesz != 0
845
280k
        && (i_phdr->p_filesz > filesize
846
37.8k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
255k
      eu_strip_broken_phdrs = true;
848
355k
  }
849
13.2k
      if (!eu_strip_broken_phdrs
850
3.96k
    && i_ehdrp->e_shoff == 0
851
3.25k
    && i_ehdrp->e_shstrndx == 0)
852
3.25k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
3.25k
    i_phdr = elf_tdata (abfd)->phdr;
856
11.6k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
11.4k
      if (i_phdr->p_type == PT_DYNAMIC)
858
3.03k
        {
859
3.03k
    if (i_phdr->p_filesz != 0
860
2.97k
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
2.97k
                  elf_tdata (abfd)->phdr,
862
2.97k
                  i_ehdrp->e_phnum,
863
2.97k
                  filesize))
864
2.82k
      goto got_no_match;
865
210
    break;
866
3.03k
        }
867
3.25k
  }
868
13.2k
    }
869
870
37.4k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
32.8k
    {
872
32.8k
      unsigned int num_sec;
873
874
      /* Once all of the section headers have been read and converted, we
875
   can start processing them.  Note that the first section header is
876
   a dummy placeholder entry, so we ignore it.  */
877
32.8k
      num_sec = elf_numsections (abfd);
878
506k
      for (shindex = 1; shindex < num_sec; shindex++)
879
486k
  if (!bfd_section_from_shdr (abfd, shindex))
880
12.5k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
20.2k
      if (! _bfd_elf_setup_sections (abfd))
884
3.47k
  goto got_wrong_format_error;
885
20.2k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
21.4k
  if (ebd->elf_backend_object_p)
890
12.4k
    {
891
12.4k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
23
  goto got_wrong_format_error;
893
12.4k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
21.4k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
897
898
  /* If we have created any reloc sections that are associated with
899
     debugging sections, mark the reloc sections as debugging as well.  */
900
199k
  for (s = abfd->sections; s != NULL; s = s->next)
901
177k
    {
902
177k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
177k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
12.3k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
11.3k
  {
906
11.3k
    unsigned long targ_index;
907
11.3k
    asection *targ_sec;
908
909
11.3k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
11.3k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
11.3k
    if (targ_sec != NULL
912
9.42k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
2.01k
      s->flags |= SEC_DEBUGGING;
914
11.3k
  }
915
177k
    }
916
21.4k
  return _bfd_no_cleanup;
917
918
7.59M
 got_wrong_format_error:
919
7.59M
  bfd_set_error (bfd_error_wrong_format);
920
921
7.63M
 got_no_match:
922
7.63M
  if (abfd->sections != NULL)
923
    /* Unlike most early section processing, the object attribute v2
924
       code uses bfd_malloc rather than bfd_alloc.  Free memory
925
       containing attributes.  */
926
14.2k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
7.59M
}
bfd_elf32_object_p
Line
Count
Source
520
25.0M
{
521
25.0M
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
522
25.0M
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
523
25.0M
  Elf_External_Shdr x_shdr;  /* Section header table entry, external form */
524
25.0M
  Elf_Internal_Shdr i_shdr;
525
25.0M
  Elf_Internal_Shdr *i_shdrp; /* Section header table, internal form */
526
25.0M
  unsigned int shindex;
527
25.0M
  elf_backend_data *ebd;
528
25.0M
  asection *s;
529
25.0M
  const bfd_target *target;
530
531
  /* Read in the ELF header in external format.  */
532
533
25.0M
  if (bfd_read (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
534
2.44M
    {
535
2.44M
      if (bfd_get_error () != bfd_error_system_call)
536
2.42M
  goto got_wrong_format_error;
537
22.1k
      else
538
22.1k
  goto got_no_match;
539
2.44M
    }
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.5M
  if (! elf_file_p (&x_ehdr)
548
6.75M
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
549
6.63M
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
550
18.2M
    goto got_wrong_format_error;
551
552
  /* Check that file's byte order matches xvec's */
553
4.39M
  switch (x_ehdr.e_ident[EI_DATA])
554
4.39M
    {
555
1.55M
    case ELFDATA2MSB:   /* Big-endian */
556
1.55M
      if (! bfd_header_big_endian (abfd))
557
778k
  goto got_wrong_format_error;
558
779k
      break;
559
2.83M
    case ELFDATA2LSB:   /* Little-endian */
560
2.83M
      if (! bfd_header_little_endian (abfd))
561
1.41M
  goto got_wrong_format_error;
562
1.42M
      break;
563
1.42M
    case ELFDATANONE:   /* No data encoding specified */
564
1.78k
    default:      /* Unknown data encoding specified */
565
1.78k
      goto got_wrong_format_error;
566
4.39M
    }
567
568
2.20M
  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.20M
  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.20M
  i_ehdrp = elf_elfheader (abfd);
578
2.20M
  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.20M
  if (i_ehdrp->e_type == ET_CORE)
585
658k
    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.54M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_type == ET_REL)
590
27.7k
    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.51M
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
596
51.4k
    goto got_wrong_format_error;
597
598
  /* Further sanity check.  */
599
1.46M
  if (i_ehdrp->e_shoff < sizeof (x_ehdr) && i_ehdrp->e_shnum != 0)
600
396
    goto got_wrong_format_error;
601
602
1.46M
  ebd = get_elf_backend_data (abfd);
603
1.46M
  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.46M
  if (ebd->elf_machine_code != i_ehdrp->e_machine
609
1.41M
      && (ebd->elf_machine_alt1 == 0
610
398k
    || i_ehdrp->e_machine != ebd->elf_machine_alt1)
611
1.41M
      && (ebd->elf_machine_alt2 == 0
612
27.2k
    || i_ehdrp->e_machine != ebd->elf_machine_alt2)
613
1.41M
      && ebd->elf_machine_code != EM_NONE)
614
1.39M
    goto got_wrong_format_error;
615
616
71.0k
  if (i_ehdrp->e_type == ET_EXEC)
617
2.22k
    abfd->flags |= EXEC_P;
618
68.8k
  else if (i_ehdrp->e_type == ET_DYN)
619
2.23k
    abfd->flags |= DYNAMIC;
620
621
71.0k
  if (i_ehdrp->e_phnum > 0)
622
30.2k
    abfd->flags |= D_PAGED;
623
624
71.0k
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
625
22.4k
    {
626
      /* It's OK if this fails for the generic target.  */
627
22.4k
      if (ebd->elf_machine_code != EM_NONE)
628
11
  goto got_no_match;
629
22.4k
    }
630
631
71.0k
  if (ebd->osabi_exact && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi)
632
3.99k
    goto got_wrong_format_error;
633
634
67.0k
  if (i_ehdrp->e_shoff >= sizeof (x_ehdr))
635
56.4k
    {
636
56.4k
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
637
638
      /* Seek to the section header table in the file.  */
639
56.4k
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
640
0
  goto got_no_match;
641
642
      /* Read the first section header at index 0, and convert to internal
643
   form.  */
644
56.4k
      if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
645
55.5k
    || !elf_swap_shdr_in (abfd, &x_shdr, &i_shdr))
646
907
  goto got_no_match;
647
648
      /* If the section count is zero, the actual count is in the first
649
   section header.  */
650
55.5k
      if (i_ehdrp->e_shnum == SHN_UNDEF)
651
23.2k
  {
652
23.2k
    i_ehdrp->e_shnum = i_shdr.sh_size;
653
23.2k
    if (i_ehdrp->e_shnum >= SHN_LORESERVE
654
23.0k
        || i_ehdrp->e_shnum != i_shdr.sh_size
655
23.0k
        || i_ehdrp->e_shnum  == 0)
656
278
      goto got_wrong_format_error;
657
23.2k
  }
658
659
      /* And similarly for the string table index.  */
660
55.3k
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
661
632
  {
662
632
    i_ehdrp->e_shstrndx = i_shdr.sh_link;
663
632
    if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
664
0
      goto got_wrong_format_error;
665
632
  }
666
667
      /* And program headers.  */
668
55.3k
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
669
571
  {
670
571
    i_ehdrp->e_phnum = i_shdr.sh_info;
671
571
    if (i_ehdrp->e_phnum != i_shdr.sh_info)
672
0
      goto got_wrong_format_error;
673
571
  }
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
55.3k
      if (i_ehdrp->e_shnum != 1)
678
53.8k
  {
679
    /* Check that we don't have a totally silly number of sections.  */
680
53.8k
    if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
681
53.0k
        || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
682
989
      goto got_wrong_format_error;
683
684
52.8k
    where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
685
52.8k
    if ((bfd_size_type) where <= i_ehdrp->e_shoff)
686
0
      goto got_wrong_format_error;
687
688
52.8k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
689
0
      goto got_no_match;
690
52.8k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
691
694
      goto got_no_match;
692
693
    /* Back to where we were.  */
694
52.1k
    where = i_ehdrp->e_shoff + sizeof (x_shdr);
695
52.1k
    if (bfd_seek (abfd, where, SEEK_SET) != 0)
696
0
      goto got_no_match;
697
52.1k
  }
698
55.3k
    }
699
700
  /* Allocate space for a copy of the section header table in
701
     internal form.  */
702
64.2k
  if (i_ehdrp->e_shnum != 0)
703
53.6k
    {
704
53.6k
      Elf_Internal_Shdr *shdrp;
705
53.6k
      unsigned int num_sec;
706
53.6k
      size_t amt;
707
708
53.6k
      if (_bfd_mul_overflow (i_ehdrp->e_shnum, sizeof (*i_shdrp), &amt))
709
0
  goto got_wrong_format_error;
710
53.6k
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
711
53.6k
      if (!i_shdrp)
712
0
  goto got_no_match;
713
53.6k
      num_sec = i_ehdrp->e_shnum;
714
53.6k
      elf_numsections (abfd) = num_sec;
715
53.6k
      if (_bfd_mul_overflow (num_sec, sizeof (i_shdrp), &amt))
716
0
  goto got_wrong_format_error;
717
53.6k
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
718
53.6k
      if (!elf_elfsections (abfd))
719
0
  goto got_no_match;
720
53.6k
      elf_tdata (abfd)->being_created = bfd_zalloc (abfd, num_sec);
721
53.6k
      if (!elf_tdata (abfd)->being_created)
722
0
  goto got_no_match;
723
724
53.6k
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
725
627k
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
726
573k
  elf_elfsections (abfd)[shindex] = shdrp++;
727
728
      /* Read in the rest of the section header table and convert it
729
   to internal form.  */
730
560k
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
731
508k
  {
732
508k
    if (bfd_read (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr)
733
508k
        || !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
508k
    if (i_shdrp[shindex].sh_link >= num_sec)
738
2.26k
      {
739
        /* PR 10478: Accept Solaris binaries with a sh_link
740
     field set to SHN_BEFORE or SHN_AFTER.  */
741
2.26k
        switch (ebd->elf_machine_code)
742
2.26k
    {
743
735
    case EM_386:
744
812
    case EM_IAMCU:
745
923
    case EM_X86_64:
746
923
    case EM_OLD_SPARCV9:
747
923
    case EM_SPARC32PLUS:
748
923
    case EM_SPARCV9:
749
1.05k
    case EM_SPARC:
750
1.05k
      if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
751
569
          || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
752
593
        break;
753
      /* Otherwise fall through.  */
754
1.67k
    default:
755
1.67k
      goto got_wrong_format_error;
756
2.26k
    }
757
2.26k
      }
758
759
507k
    if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
760
452k
         || i_shdrp[shindex].sh_type == SHT_RELA
761
447k
         || i_shdrp[shindex].sh_type == SHT_REL)
762
86.2k
        && i_shdrp[shindex].sh_info >= num_sec)
763
336
      goto got_wrong_format_error;
764
765
    /* If the section is loaded, but not page aligned, clear
766
       D_PAGED.  */
767
506k
    if (i_shdrp[shindex].sh_size != 0
768
415k
        && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
769
107k
        && i_shdrp[shindex].sh_type != SHT_NOBITS
770
98.8k
        && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
771
98.8k
       % ebd->minpagesize)
772
98.8k
      != 0))
773
63.0k
      abfd->flags &= ~D_PAGED;
774
506k
  }
775
776
51.6k
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd)
777
49.9k
    || i_shdrp[i_ehdrp->e_shstrndx].sh_type != SHT_STRTAB)
778
3.57k
  {
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.57k
    i_ehdrp->e_shstrndx = SHN_UNDEF;
786
3.57k
    if (!abfd->read_only)
787
388
      {
788
388
        _bfd_error_handler
789
388
    (_("warning: %pB has a corrupt string table index"), abfd);
790
388
        abfd->read_only = 1;
791
388
      }
792
3.57k
  }
793
51.6k
    }
794
10.5k
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
795
4.36k
    goto got_wrong_format_error;
796
797
  /* Read in the program headers.  */
798
57.8k
  if (i_ehdrp->e_phnum == 0)
799
36.8k
    elf_tdata (abfd)->phdr = NULL;
800
20.9k
  else
801
20.9k
    {
802
20.9k
      Elf_Internal_Phdr *i_phdr;
803
20.9k
      unsigned int i;
804
20.9k
      ufile_ptr filesize;
805
20.9k
      size_t amt;
806
807
      /* Check for a corrupt input file with an impossibly large number
808
   of program headers.  */
809
20.9k
      filesize = bfd_get_file_size (abfd);
810
20.9k
      if (filesize != 0
811
20.9k
    && i_ehdrp->e_phnum > filesize / sizeof (Elf_External_Phdr))
812
770
  goto got_wrong_format_error;
813
20.1k
      if (_bfd_mul_overflow (i_ehdrp->e_phnum, sizeof (*i_phdr), &amt))
814
0
  goto got_wrong_format_error;
815
20.1k
      elf_tdata (abfd)->phdr
816
20.1k
  = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
817
20.1k
      if (elf_tdata (abfd)->phdr == NULL)
818
0
  goto got_no_match;
819
20.1k
      if (bfd_seek (abfd, i_ehdrp->e_phoff, SEEK_SET) != 0)
820
0
  goto got_no_match;
821
20.1k
      bool eu_strip_broken_phdrs = false;
822
20.1k
      i_phdr = elf_tdata (abfd)->phdr;
823
422k
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
824
403k
  {
825
403k
    Elf_External_Phdr x_phdr;
826
827
403k
    if (bfd_read (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
828
958
      goto got_no_match;
829
402k
    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
402k
    if (i_phdr->p_align != (i_phdr->p_align & -i_phdr->p_align))
833
253k
      {
834
253k
        i_phdr->p_align &= -i_phdr->p_align;
835
253k
        if (!abfd->read_only)
836
2.71k
    {
837
2.71k
      _bfd_error_handler (_("warning: %pB has a program header "
838
2.71k
          "with invalid alignment"), abfd);
839
2.71k
      abfd->read_only = 1;
840
2.71k
    }
841
253k
      }
842
    /* Detect eu-strip -f debug files, which have program
843
       headers that describe the original file.  */
844
402k
    if (i_phdr->p_filesz != 0
845
296k
        && (i_phdr->p_filesz > filesize
846
64.4k
      || i_phdr->p_offset > filesize - i_phdr->p_filesz))
847
259k
      eu_strip_broken_phdrs = true;
848
402k
  }
849
19.2k
      if (!eu_strip_broken_phdrs
850
1.87k
    && i_ehdrp->e_shoff == 0
851
1.16k
    && i_ehdrp->e_shstrndx == 0)
852
1.16k
  {
853
    /* Try to reconstruct dynamic symbol table from PT_DYNAMIC
854
       segment if there is no section header.  */
855
1.16k
    i_phdr = elf_tdata (abfd)->phdr;
856
4.55k
    for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
857
4.26k
      if (i_phdr->p_type == PT_DYNAMIC)
858
882
        {
859
882
    if (i_phdr->p_filesz != 0
860
792
        && !_bfd_elf_get_dynamic_symbols (abfd, i_phdr,
861
792
                  elf_tdata (abfd)->phdr,
862
792
                  i_ehdrp->e_phnum,
863
792
                  filesize))
864
792
      goto got_no_match;
865
90
    break;
866
882
        }
867
1.16k
  }
868
19.2k
    }
869
870
55.3k
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff >= sizeof (x_ehdr))
871
47.8k
    {
872
47.8k
      unsigned int num_sec;
873
874
      /* Once all of the section headers have been read and converted, we
875
   can start processing them.  Note that the first section header is
876
   a dummy placeholder entry, so we ignore it.  */
877
47.8k
      num_sec = elf_numsections (abfd);
878
487k
      for (shindex = 1; shindex < num_sec; shindex++)
879
447k
  if (!bfd_section_from_shdr (abfd, shindex))
880
8.24k
    goto got_no_match;
881
882
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
883
39.6k
      if (! _bfd_elf_setup_sections (abfd))
884
3.07k
  goto got_wrong_format_error;
885
39.6k
    }
886
887
  /* Let the backend double check the format and override global
888
     information.  */
889
43.9k
  if (ebd->elf_backend_object_p)
890
27.0k
    {
891
27.0k
      if (! (*ebd->elf_backend_object_p) (abfd))
892
5.54k
  goto got_wrong_format_error;
893
27.0k
    }
894
895
  /* Remember the entry point specified in the ELF file header.  */
896
38.4k
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
897
898
  /* If we have created any reloc sections that are associated with
899
     debugging sections, mark the reloc sections as debugging as well.  */
900
235k
  for (s = abfd->sections; s != NULL; s = s->next)
901
196k
    {
902
196k
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
903
193k
     || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
904
3.37k
    && elf_section_data (s)->this_hdr.sh_info > 0)
905
2.39k
  {
906
2.39k
    unsigned long targ_index;
907
2.39k
    asection *targ_sec;
908
909
2.39k
    targ_index = elf_section_data (s)->this_hdr.sh_info;
910
2.39k
    targ_sec = bfd_section_from_elf_index (abfd, targ_index);
911
2.39k
    if (targ_sec != NULL
912
2.02k
        && (targ_sec->flags & SEC_DEBUGGING) != 0)
913
155
      s->flags |= SEC_DEBUGGING;
914
2.39k
  }
915
196k
    }
916
38.4k
  return _bfd_no_cleanup;
917
918
24.9M
 got_wrong_format_error:
919
24.9M
  bfd_set_error (bfd_error_wrong_format);
920
921
24.9M
 got_no_match:
922
24.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
14.4k
    _bfd_elf_cleanup_object_attributes (abfd);
927
  return NULL;
928
24.9M
}
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.17k
{
937
1.17k
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
1.17k
  bool *failedp = (bool *) data;
939
1.17k
  Elf_Internal_Shdr *rela_hdr;
940
1.17k
  bfd_vma addr_offset;
941
1.17k
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
1.17k
  size_t extsize;
943
1.17k
  bfd_byte *dst_rela;
944
1.17k
  unsigned int idx;
945
1.17k
  asymbol *last_sym;
946
1.17k
  int last_sym_idx;
947
1.17k
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
1.17k
  if (*failedp)
951
0
    return;
952
953
1.17k
  if ((sec->flags & SEC_RELOC) == 0)
954
1.06k
    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
108
  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
103
  if (sec->orelocation == NULL)
967
0
    return;
968
969
103
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
103
  if (rela_hdr == NULL)
971
1
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
103
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
103
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
103
      || (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
103
  if (rela_hdr->sh_type == SHT_RELA)
984
102
    {
985
102
      swap_out = elf_swap_reloca_out;
986
102
      extsize = sizeof (Elf_External_Rela);
987
102
    }
988
1
  else if (rela_hdr->sh_type == SHT_REL)
989
1
    {
990
1
      swap_out = elf_swap_reloc_out;
991
1
      extsize = sizeof (Elf_External_Rel);
992
1
    }
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
103
  addr_offset = 0;
1002
103
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
2
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
103
  last_sym = 0;
1007
103
  last_sym_idx = 0;
1008
103
  dst_rela = rela_hdr->contents;
1009
1010
1.50k
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
1.40k
    {
1012
1.40k
      Elf_Internal_Rela src_rela;
1013
1.40k
      arelent *ptr;
1014
1.40k
      asymbol *sym;
1015
1.40k
      int n;
1016
1017
1.40k
      ptr = sec->orelocation[idx];
1018
1.40k
      sym = *ptr->sym_ptr_ptr;
1019
1.40k
      if (sym == last_sym)
1020
146
  n = last_sym_idx;
1021
      /* If the relocation is against an absolute symbol whoes value is
1022
   zero, then the symbol can be dropped, simplifying the reloc.
1023
   PR 31106: Except for complex relocations where the symbols
1024
   itself might be significant.  */
1025
1.25k
      else if (bfd_is_abs_section (sym->section)
1026
850
         && sym->value == 0
1027
788
         && (sym->flags & BSF_RELC) == 0)
1028
788
  n = STN_UNDEF;
1029
471
      else
1030
471
  {
1031
471
    last_sym = sym;
1032
471
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
471
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
471
    last_sym_idx = n;
1039
471
  }
1040
1041
1.40k
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
621
    && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
1043
0
    && ! _bfd_elf_validate_reloc (abfd, ptr))
1044
0
  {
1045
0
    *failedp = true;
1046
0
    return;
1047
0
  }
1048
1049
1.40k
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
#if defined(BFD64) && ARCH_SIZE == 32
1056
936
      if (rela_hdr->sh_type == SHT_RELA
1057
680
    && ptr->howto->bitsize > 32
1058
5
    && 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
936
      src_rela.r_offset = ptr->address + addr_offset;
1070
1.40k
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
469
      src_rela.r_addend = ptr->addend;
1072
469
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
469
    }
1074
1075
103
  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
103
}
bfd_elf64_write_relocs
Line
Count
Source
936
563
{
937
563
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
563
  bool *failedp = (bool *) data;
939
563
  Elf_Internal_Shdr *rela_hdr;
940
563
  bfd_vma addr_offset;
941
563
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
563
  size_t extsize;
943
563
  bfd_byte *dst_rela;
944
563
  unsigned int idx;
945
563
  asymbol *last_sym;
946
563
  int last_sym_idx;
947
563
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
563
  if (*failedp)
951
0
    return;
952
953
563
  if ((sec->flags & SEC_RELOC) == 0)
954
480
    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
83
  if (sec->reloc_count == 0)
961
4
    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
79
  if (sec->orelocation == NULL)
967
0
    return;
968
969
79
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
79
  if (rela_hdr == NULL)
971
0
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
79
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
79
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
79
      || (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
79
  if (rela_hdr->sh_type == SHT_RELA)
984
79
    {
985
79
      swap_out = elf_swap_reloca_out;
986
79
      extsize = sizeof (Elf_External_Rela);
987
79
    }
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
79
  addr_offset = 0;
1002
79
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
1
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
79
  last_sym = 0;
1007
79
  last_sym_idx = 0;
1008
79
  dst_rela = rela_hdr->contents;
1009
1010
548
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
469
    {
1012
469
      Elf_Internal_Rela src_rela;
1013
469
      arelent *ptr;
1014
469
      asymbol *sym;
1015
469
      int n;
1016
1017
469
      ptr = sec->orelocation[idx];
1018
469
      sym = *ptr->sym_ptr_ptr;
1019
469
      if (sym == last_sym)
1020
144
  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
325
      else if (bfd_is_abs_section (sym->section)
1026
71
         && sym->value == 0
1027
34
         && (sym->flags & BSF_RELC) == 0)
1028
34
  n = STN_UNDEF;
1029
291
      else
1030
291
  {
1031
291
    last_sym = sym;
1032
291
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
291
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
291
    last_sym_idx = n;
1039
291
  }
1040
1041
469
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
439
    && (*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
469
      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
469
      src_rela.r_offset = ptr->address + addr_offset;
1070
469
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
469
      src_rela.r_addend = ptr->addend;
1072
469
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
469
    }
1074
1075
79
  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
79
}
bfd_elf32_write_relocs
Line
Count
Source
936
610
{
937
610
  elf_backend_data *bed = get_elf_backend_data (abfd);
938
610
  bool *failedp = (bool *) data;
939
610
  Elf_Internal_Shdr *rela_hdr;
940
610
  bfd_vma addr_offset;
941
610
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
942
610
  size_t extsize;
943
610
  bfd_byte *dst_rela;
944
610
  unsigned int idx;
945
610
  asymbol *last_sym;
946
610
  int last_sym_idx;
947
610
  size_t amt;
948
949
  /* If we have already failed, don't do anything.  */
950
610
  if (*failedp)
951
0
    return;
952
953
610
  if ((sec->flags & SEC_RELOC) == 0)
954
585
    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
25
  if (sec->reloc_count == 0)
961
1
    return;
962
963
  /* If we have opened an existing file for update, reloc_count may be
964
     set even though we are not linking.  In that case we have nothing
965
     to do.  */
966
24
  if (sec->orelocation == NULL)
967
0
    return;
968
969
24
  rela_hdr = elf_section_data (sec)->rela.hdr;
970
24
  if (rela_hdr == NULL)
971
1
    rela_hdr = elf_section_data (sec)->rel.hdr;
972
973
24
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
974
24
  if (_bfd_mul_overflow (sec->reloc_count, rela_hdr->sh_entsize, &amt)
975
24
      || (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
24
  if (rela_hdr->sh_type == SHT_RELA)
984
23
    {
985
23
      swap_out = elf_swap_reloca_out;
986
23
      extsize = sizeof (Elf_External_Rela);
987
23
    }
988
1
  else if (rela_hdr->sh_type == SHT_REL)
989
1
    {
990
1
      swap_out = elf_swap_reloc_out;
991
1
      extsize = sizeof (Elf_External_Rel);
992
1
    }
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
24
  addr_offset = 0;
1002
24
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1003
1
    addr_offset = sec->vma;
1004
1005
  /* orelocation has the data, reloc_count has the count...  */
1006
24
  last_sym = 0;
1007
24
  last_sym_idx = 0;
1008
24
  dst_rela = rela_hdr->contents;
1009
1010
960
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
1011
936
    {
1012
936
      Elf_Internal_Rela src_rela;
1013
936
      arelent *ptr;
1014
936
      asymbol *sym;
1015
936
      int n;
1016
1017
936
      ptr = sec->orelocation[idx];
1018
936
      sym = *ptr->sym_ptr_ptr;
1019
936
      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
934
      else if (bfd_is_abs_section (sym->section)
1026
779
         && sym->value == 0
1027
754
         && (sym->flags & BSF_RELC) == 0)
1028
754
  n = STN_UNDEF;
1029
180
      else
1030
180
  {
1031
180
    last_sym = sym;
1032
180
    n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
1033
180
    if (n < 0)
1034
0
      {
1035
0
        *failedp = true;
1036
0
        return;
1037
0
      }
1038
180
    last_sym_idx = n;
1039
180
  }
1040
1041
936
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
1042
182
    && (*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
936
      if (ptr->howto == NULL)
1050
0
  {
1051
0
    *failedp = true;
1052
0
    return;
1053
0
  }
1054
1055
936
#if defined(BFD64) && ARCH_SIZE == 32
1056
936
      if (rela_hdr->sh_type == SHT_RELA
1057
680
    && ptr->howto->bitsize > 32
1058
5
    && 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
936
#endif
1068
1069
936
      src_rela.r_offset = ptr->address + addr_offset;
1070
936
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
1071
936
      src_rela.r_addend = ptr->addend;
1072
936
      (*swap_out) (abfd, &src_rela, dst_rela);
1073
936
    }
1074
1075
24
  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
24
}
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
44
{
1090
302
  while (count--)
1091
258
    {
1092
258
      Elf_External_Phdr extphdr;
1093
1094
258
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
258
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
258
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
258
      phdr++;
1099
258
    }
1100
44
  return 0;
1101
44
}
bfd_elf64_write_out_phdrs
Line
Count
Source
1089
21
{
1090
133
  while (count--)
1091
112
    {
1092
112
      Elf_External_Phdr extphdr;
1093
1094
112
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
112
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
112
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
112
      phdr++;
1099
112
    }
1100
21
  return 0;
1101
21
}
bfd_elf32_write_out_phdrs
Line
Count
Source
1089
23
{
1090
169
  while (count--)
1091
146
    {
1092
146
      Elf_External_Phdr extphdr;
1093
1094
146
      elf_swap_phdr_out (abfd, phdr, &extphdr);
1095
146
      if (bfd_write (&extphdr, sizeof (Elf_External_Phdr), abfd)
1096
146
    != sizeof (Elf_External_Phdr))
1097
0
  return -1;
1098
146
      phdr++;
1099
146
    }
1100
23
  return 0;
1101
23
}
1102
1103
/* Write out the section headers and the ELF file header.  */
1104
1105
bool
1106
elf_write_shdrs_and_ehdr (bfd *abfd)
1107
384
{
1108
384
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
384
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
384
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
384
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
384
  unsigned int count;
1113
384
  size_t amt;
1114
1115
384
  i_ehdrp = elf_elfheader (abfd);
1116
384
  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
384
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
384
  amt = sizeof (x_ehdr);
1125
384
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
384
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
384
  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
384
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
384
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
384
  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
384
  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
384
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
384
  if (!x_shdrp)
1149
0
    return false;
1150
1151
2.82k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
2.43k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
2.43k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
2.43k
    }
1158
384
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
384
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
384
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
384
  return true;
1166
384
}
bfd_elf64_write_shdrs_and_ehdr
Line
Count
Source
1107
150
{
1108
150
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
150
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
150
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
150
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
150
  unsigned int count;
1113
150
  size_t amt;
1114
1115
150
  i_ehdrp = elf_elfheader (abfd);
1116
150
  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
150
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
150
  amt = sizeof (x_ehdr);
1125
150
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
150
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
150
  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
150
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
150
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
150
  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
150
  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
150
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
150
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.37k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.22k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.22k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.22k
    }
1158
150
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
150
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
150
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
150
  return true;
1166
150
}
bfd_elf32_write_shdrs_and_ehdr
Line
Count
Source
1107
234
{
1108
234
  Elf_External_Ehdr x_ehdr;  /* Elf file header, external form */
1109
234
  Elf_Internal_Ehdr *i_ehdrp; /* Elf file header, internal form */
1110
234
  Elf_External_Shdr *x_shdrp;  /* Section header table, external form */
1111
234
  Elf_Internal_Shdr **i_shdrp;  /* Section header table, internal form */
1112
234
  unsigned int count;
1113
234
  size_t amt;
1114
1115
234
  i_ehdrp = elf_elfheader (abfd);
1116
234
  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
234
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1124
234
  amt = sizeof (x_ehdr);
1125
234
  if (bfd_seek (abfd, 0, SEEK_SET) != 0
1126
234
      || bfd_write (&x_ehdr, amt, abfd) != amt)
1127
0
    return false;
1128
1129
234
  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
234
  if (i_ehdrp->e_phnum >= PN_XNUM)
1135
0
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1136
234
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1137
0
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1138
234
  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
234
  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
234
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1148
234
  if (!x_shdrp)
1149
0
    return false;
1150
1151
1.44k
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1152
1.20k
    {
1153
#if DEBUG & 2
1154
      elf_debug_section (count, *i_shdrp);
1155
#endif
1156
1.20k
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1157
1.20k
    }
1158
234
  amt = (bfd_size_type) i_ehdrp->e_shnum * sizeof (*x_shdrp);
1159
234
  if (bfd_seek (abfd, i_ehdrp->e_shoff, SEEK_SET) != 0
1160
234
      || bfd_write (x_shdrp, amt, abfd) != amt)
1161
0
    return false;
1162
1163
  /* need to dump the string table too...  */
1164
1165
234
  return true;
1166
234
}
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
9.82k
{
1245
9.82k
  Elf_Internal_Shdr *hdr;
1246
9.82k
  Elf_Internal_Shdr *verhdr;
1247
9.82k
  unsigned long symcount; /* Number of external ELF symbols */
1248
9.82k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
9.82k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
9.82k
  Elf_Internal_Sym *isym;
1251
9.82k
  Elf_Internal_Sym *isymend;
1252
9.82k
  Elf_Internal_Sym *isymbuf = NULL;
1253
9.82k
  Elf_External_Versym *xver;
1254
9.82k
  Elf_External_Versym *xverbuf = NULL;
1255
9.82k
  elf_backend_data *ebd;
1256
9.82k
  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
9.82k
  ebd = get_elf_backend_data (abfd);
1268
1269
9.82k
  if (! dynamic)
1270
9.52k
    {
1271
9.52k
      hdr = &elf_symtab_hdr (abfd);
1272
9.52k
      verhdr = NULL;
1273
9.52k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
9.52k
    }
1275
298
  else
1276
298
    {
1277
298
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
298
      if (elf_dynversym (abfd) == 0)
1279
49
  verhdr = NULL;
1280
249
      else
1281
249
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
298
      if ((elf_dynverdef (abfd) != 0
1283
113
     && elf_tdata (abfd)->verdef == NULL)
1284
197
    || (elf_dynverref (abfd) != 0
1285
120
        && elf_tdata (abfd)->verref == NULL)
1286
140
    || elf_tdata (abfd)->dt_verdef != NULL
1287
140
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
160
  {
1289
160
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
121
      return -1;
1291
160
  }
1292
1293
177
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
177
    }
1295
1296
9.70k
  if (symcount == 0)
1297
732
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
9.70k
  if (symcount == 0)
1300
561
    sym = symbase = NULL;
1301
9.14k
  else
1302
9.14k
    {
1303
9.14k
      size_t i;
1304
1305
9.14k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
9.14k
              NULL, NULL, NULL);
1307
9.14k
      if (isymbuf == NULL)
1308
1.04k
  return -1;
1309
1310
8.09k
      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
8.09k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
8.09k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
8.09k
      if (verhdr != NULL
1321
123
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
36
  {
1323
36
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
36
      (_("%pB: version count (%" PRId64 ")"
1326
36
         " does not match symbol count (%ld)"),
1327
36
       abfd,
1328
36
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
36
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
36
    verhdr = NULL;
1334
36
  }
1335
1336
8.09k
      if (verhdr != NULL)
1337
87
  {
1338
87
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
2
      goto error_return;
1340
85
    xverbuf = (Elf_External_Versym *)
1341
85
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
85
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
3
      goto error_return;
1344
85
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
8.09k
      xver = xverbuf;
1348
8.09k
      if (xver != NULL)
1349
82
  ++xver;
1350
8.09k
      isymend = isymbuf + symcount;
1351
8.09k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
204k
     isym < isymend;
1353
196k
     isym++, sym++, i++)
1354
196k
  {
1355
196k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
196k
    sym->symbol.the_bfd = abfd;
1358
196k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
196k
    else
1362
196k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
196k
    sym->symbol.value = isym->st_value;
1364
1365
196k
    if (isym->st_shndx == SHN_UNDEF)
1366
96.2k
      {
1367
96.2k
        sym->symbol.section = bfd_und_section_ptr;
1368
96.2k
      }
1369
99.9k
    else if (isym->st_shndx == SHN_ABS)
1370
2.82k
      {
1371
2.82k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.82k
      }
1373
97.1k
    else if (isym->st_shndx == SHN_COMMON)
1374
106
      {
1375
106
        sym->symbol.section = bfd_com_section_ptr;
1376
106
        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
106
        sym->symbol.value = isym->st_size;
1395
106
      }
1396
97.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
97.0k
    else
1406
97.0k
      {
1407
97.0k
        sym->symbol.section
1408
97.0k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
97.0k
        if (sym->symbol.section == NULL)
1410
45.0k
    {
1411
      /* This symbol is in a section for which we did not
1412
         create a BFD section.  Just use bfd_abs_section,
1413
         although it is wrong.  FIXME.  Note - there is
1414
         code in elf.c:swap_out_syms that calls
1415
         symbol_section_index() in the elf backend for
1416
         cases like this.  */
1417
45.0k
      sym->symbol.section = bfd_abs_section_ptr;
1418
45.0k
    }
1419
97.0k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
196k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
22.0k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
196k
    switch (ELF_ST_BIND (isym->st_info))
1427
196k
      {
1428
124k
      case STB_LOCAL:
1429
124k
        sym->symbol.flags |= BSF_LOCAL;
1430
124k
        break;
1431
47.9k
      case STB_GLOBAL:
1432
47.9k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
12.9k
    sym->symbol.flags |= BSF_GLOBAL;
1434
47.9k
        break;
1435
13.1k
      case STB_WEAK:
1436
13.1k
        sym->symbol.flags |= BSF_WEAK;
1437
13.1k
        break;
1438
1.90k
      case STB_GNU_UNIQUE:
1439
1.90k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
1.90k
        break;
1441
196k
      }
1442
1443
196k
    switch (ELF_ST_TYPE (isym->st_info))
1444
196k
      {
1445
30.3k
      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
30.3k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
30.3k
            | BSF_DEBUGGING
1452
30.3k
            | BSF_SECTION_SYM_USED);
1453
30.3k
        break;
1454
5.29k
      case STT_FILE:
1455
5.29k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
5.29k
        break;
1457
16.3k
      case STT_FUNC:
1458
16.3k
        sym->symbol.flags |= BSF_FUNCTION;
1459
16.3k
        break;
1460
1.27k
      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.27k
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
11.3k
      case STT_OBJECT:
1466
11.3k
        sym->symbol.flags |= BSF_OBJECT;
1467
11.3k
        break;
1468
2.06k
      case STT_TLS:
1469
2.06k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
2.06k
        break;
1471
1.85k
      case STT_RELC:
1472
1.85k
        sym->symbol.flags |= BSF_RELC;
1473
1.85k
        break;
1474
1.17k
      case STT_SRELC:
1475
1.17k
        sym->symbol.flags |= BSF_SRELC;
1476
1.17k
        break;
1477
2.29k
      case STT_GNU_IFUNC:
1478
2.29k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
2.29k
        break;
1480
196k
      }
1481
1482
196k
    if (dynamic)
1483
1.47k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
196k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
196k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
196k
    else if (xver != NULL)
1489
970
      {
1490
970
        Elf_Internal_Versym iversym;
1491
1492
970
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
970
        sym->version = iversym.vs_vers;
1494
970
        xver++;
1495
970
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
196k
    if (ebd->elf_backend_symbol_processing)
1499
77.2k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
196k
  }
1501
8.09k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
8.65k
  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
8.65k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
8.65k
  if (symptrs)
1513
8.65k
    {
1514
8.65k
      long l = symcount;
1515
1516
8.65k
      sym = symbase;
1517
204k
      while (l-- > 0)
1518
196k
  {
1519
196k
    *symptrs++ = &sym->symbol;
1520
196k
    sym++;
1521
196k
  }
1522
8.65k
      *symptrs = 0;   /* Final null pointer */
1523
8.65k
    }
1524
1525
8.65k
  free (xverbuf);
1526
8.65k
  if (hdr->contents != (unsigned char *) isymbuf
1527
8.09k
      && !elf_use_dt_symtab_p (abfd))
1528
8.09k
    free (isymbuf);
1529
8.65k
  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
9.70k
}
bfd_elf64_slurp_symbol_table
Line
Count
Source
1244
4.98k
{
1245
4.98k
  Elf_Internal_Shdr *hdr;
1246
4.98k
  Elf_Internal_Shdr *verhdr;
1247
4.98k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.98k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.98k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.98k
  Elf_Internal_Sym *isym;
1251
4.98k
  Elf_Internal_Sym *isymend;
1252
4.98k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.98k
  Elf_External_Versym *xver;
1254
4.98k
  Elf_External_Versym *xverbuf = NULL;
1255
4.98k
  elf_backend_data *ebd;
1256
4.98k
  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.98k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.98k
  if (! dynamic)
1270
4.79k
    {
1271
4.79k
      hdr = &elf_symtab_hdr (abfd);
1272
4.79k
      verhdr = NULL;
1273
4.79k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
4.79k
    }
1275
196
  else
1276
196
    {
1277
196
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
196
      if (elf_dynversym (abfd) == 0)
1279
35
  verhdr = NULL;
1280
161
      else
1281
161
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
196
      if ((elf_dynverdef (abfd) != 0
1283
62
     && elf_tdata (abfd)->verdef == NULL)
1284
145
    || (elf_dynverref (abfd) != 0
1285
98
        && elf_tdata (abfd)->verref == NULL)
1286
105
    || elf_tdata (abfd)->dt_verdef != NULL
1287
105
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
93
  {
1289
93
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
76
      return -1;
1291
93
  }
1292
1293
120
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
120
    }
1295
1296
4.91k
  if (symcount == 0)
1297
462
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.91k
  if (symcount == 0)
1300
348
    sym = symbase = NULL;
1301
4.56k
  else
1302
4.56k
    {
1303
4.56k
      size_t i;
1304
1305
4.56k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
4.56k
              NULL, NULL, NULL);
1307
4.56k
      if (isymbuf == NULL)
1308
656
  return -1;
1309
1310
3.90k
      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.90k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
3.90k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
3.90k
      if (verhdr != NULL
1321
86
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
11
  {
1323
11
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
11
      (_("%pB: version count (%" PRId64 ")"
1326
11
         " does not match symbol count (%ld)"),
1327
11
       abfd,
1328
11
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
11
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
11
    verhdr = NULL;
1334
11
  }
1335
1336
3.90k
      if (verhdr != NULL)
1337
75
  {
1338
75
    if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1339
2
      goto error_return;
1340
73
    xverbuf = (Elf_External_Versym *)
1341
73
      _bfd_malloc_and_read (abfd, verhdr->sh_size, verhdr->sh_size);
1342
73
    if (xverbuf == NULL && verhdr->sh_size != 0)
1343
2
      goto error_return;
1344
73
  }
1345
1346
      /* Skip first symbol, which is a null dummy.  */
1347
3.90k
      xver = xverbuf;
1348
3.90k
      if (xver != NULL)
1349
71
  ++xver;
1350
3.90k
      isymend = isymbuf + symcount;
1351
3.90k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
129k
     isym < isymend;
1353
125k
     isym++, sym++, i++)
1354
125k
  {
1355
125k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
125k
    sym->symbol.the_bfd = abfd;
1358
125k
    if (elf_use_dt_symtab_p (abfd))
1359
12
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
12
        + isym->st_name);
1361
125k
    else
1362
125k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
125k
    sym->symbol.value = isym->st_value;
1364
1365
125k
    if (isym->st_shndx == SHN_UNDEF)
1366
63.4k
      {
1367
63.4k
        sym->symbol.section = bfd_und_section_ptr;
1368
63.4k
      }
1369
62.0k
    else if (isym->st_shndx == SHN_ABS)
1370
2.73k
      {
1371
2.73k
        sym->symbol.section = bfd_abs_section_ptr;
1372
2.73k
      }
1373
59.3k
    else if (isym->st_shndx == SHN_COMMON)
1374
53
      {
1375
53
        sym->symbol.section = bfd_com_section_ptr;
1376
53
        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
53
        sym->symbol.value = isym->st_size;
1395
53
      }
1396
59.2k
    else if (elf_use_dt_symtab_p (abfd))
1397
1
      {
1398
1
        asection *sec;
1399
1
        sec = _bfd_elf_get_section_from_dynamic_symbol (abfd,
1400
1
                    isym);
1401
1
        if (sec == NULL)
1402
0
    goto error_return;
1403
1
        sym->symbol.section = sec;
1404
1
      }
1405
59.2k
    else
1406
59.2k
      {
1407
59.2k
        sym->symbol.section
1408
59.2k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
59.2k
        if (sym->symbol.section == NULL)
1410
16.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
16.4k
      sym->symbol.section = bfd_abs_section_ptr;
1418
16.4k
    }
1419
59.2k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
125k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
16.7k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
125k
    switch (ELF_ST_BIND (isym->st_info))
1427
125k
      {
1428
74.8k
      case STB_LOCAL:
1429
74.8k
        sym->symbol.flags |= BSF_LOCAL;
1430
74.8k
        break;
1431
40.6k
      case STB_GLOBAL:
1432
40.6k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
7.13k
    sym->symbol.flags |= BSF_GLOBAL;
1434
40.6k
        break;
1435
7.09k
      case STB_WEAK:
1436
7.09k
        sym->symbol.flags |= BSF_WEAK;
1437
7.09k
        break;
1438
521
      case STB_GNU_UNIQUE:
1439
521
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
521
        break;
1441
125k
      }
1442
1443
125k
    switch (ELF_ST_TYPE (isym->st_info))
1444
125k
      {
1445
26.5k
      case STT_SECTION:
1446
        /* Mark the input section symbol as used since it may be
1447
           used for relocation and section group.
1448
     NB: BSF_SECTION_SYM_USED is ignored by linker and may
1449
     be cleared by objcopy for non-relocatable inputs.  */
1450
26.5k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
26.5k
            | BSF_DEBUGGING
1452
26.5k
            | BSF_SECTION_SYM_USED);
1453
26.5k
        break;
1454
4.07k
      case STT_FILE:
1455
4.07k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
4.07k
        break;
1457
11.2k
      case STT_FUNC:
1458
11.2k
        sym->symbol.flags |= BSF_FUNCTION;
1459
11.2k
        break;
1460
503
      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
503
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
8.73k
      case STT_OBJECT:
1466
8.73k
        sym->symbol.flags |= BSF_OBJECT;
1467
8.73k
        break;
1468
1.55k
      case STT_TLS:
1469
1.55k
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
1.55k
        break;
1471
410
      case STT_RELC:
1472
410
        sym->symbol.flags |= BSF_RELC;
1473
410
        break;
1474
517
      case STT_SRELC:
1475
517
        sym->symbol.flags |= BSF_SRELC;
1476
517
        break;
1477
967
      case STT_GNU_IFUNC:
1478
967
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
967
        break;
1480
125k
      }
1481
1482
125k
    if (dynamic)
1483
1.13k
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
125k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
125k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
125k
    else if (xver != NULL)
1489
867
      {
1490
867
        Elf_Internal_Versym iversym;
1491
1492
867
        _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1493
867
        sym->version = iversym.vs_vers;
1494
867
        xver++;
1495
867
      }
1496
1497
    /* Do some backend-specific processing on this symbol.  */
1498
125k
    if (ebd->elf_backend_symbol_processing)
1499
57.4k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
125k
  }
1501
3.90k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
4.25k
  if (ebd->elf_backend_symbol_table_processing)
1505
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1506
1507
  /* We rely on the zalloc to clear out the final symbol entry.  */
1508
1509
4.25k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
4.25k
  if (symptrs)
1513
4.25k
    {
1514
4.25k
      long l = symcount;
1515
1516
4.25k
      sym = symbase;
1517
129k
      while (l-- > 0)
1518
125k
  {
1519
125k
    *symptrs++ = &sym->symbol;
1520
125k
    sym++;
1521
125k
  }
1522
4.25k
      *symptrs = 0;   /* Final null pointer */
1523
4.25k
    }
1524
1525
4.25k
  free (xverbuf);
1526
4.25k
  if (hdr->contents != (unsigned char *) isymbuf
1527
3.90k
      && !elf_use_dt_symtab_p (abfd))
1528
3.90k
    free (isymbuf);
1529
4.25k
  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.91k
}
bfd_elf32_slurp_symbol_table
Line
Count
Source
1244
4.83k
{
1245
4.83k
  Elf_Internal_Shdr *hdr;
1246
4.83k
  Elf_Internal_Shdr *verhdr;
1247
4.83k
  unsigned long symcount; /* Number of external ELF symbols */
1248
4.83k
  elf_symbol_type *sym;   /* Pointer to current bfd symbol */
1249
4.83k
  elf_symbol_type *symbase; /* Buffer for generated bfd symbols */
1250
4.83k
  Elf_Internal_Sym *isym;
1251
4.83k
  Elf_Internal_Sym *isymend;
1252
4.83k
  Elf_Internal_Sym *isymbuf = NULL;
1253
4.83k
  Elf_External_Versym *xver;
1254
4.83k
  Elf_External_Versym *xverbuf = NULL;
1255
4.83k
  elf_backend_data *ebd;
1256
4.83k
  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.83k
  ebd = get_elf_backend_data (abfd);
1268
1269
4.83k
  if (! dynamic)
1270
4.73k
    {
1271
4.73k
      hdr = &elf_symtab_hdr (abfd);
1272
4.73k
      verhdr = NULL;
1273
4.73k
      symcount = hdr->sh_size / ebd->s->sizeof_sym;
1274
4.73k
    }
1275
102
  else
1276
102
    {
1277
102
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1278
102
      if (elf_dynversym (abfd) == 0)
1279
14
  verhdr = NULL;
1280
88
      else
1281
88
  verhdr = &elf_tdata (abfd)->dynversym_hdr;
1282
102
      if ((elf_dynverdef (abfd) != 0
1283
51
     && elf_tdata (abfd)->verdef == NULL)
1284
52
    || (elf_dynverref (abfd) != 0
1285
22
        && elf_tdata (abfd)->verref == NULL)
1286
35
    || elf_tdata (abfd)->dt_verdef != NULL
1287
35
    || elf_tdata (abfd)->dt_verneed != NULL)
1288
67
  {
1289
67
    if (!_bfd_elf_slurp_version_tables (abfd, false))
1290
45
      return -1;
1291
67
  }
1292
1293
57
      symcount = elf_tdata (abfd)->dt_symtab_count;
1294
57
    }
1295
1296
4.79k
  if (symcount == 0)
1297
270
    symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1298
1299
4.79k
  if (symcount == 0)
1300
213
    sym = symbase = NULL;
1301
4.58k
  else
1302
4.58k
    {
1303
4.58k
      size_t i;
1304
1305
4.58k
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1306
4.58k
              NULL, NULL, NULL);
1307
4.58k
      if (isymbuf == NULL)
1308
389
  return -1;
1309
1310
4.19k
      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
4.19k
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1316
4.19k
      if (symbase == (elf_symbol_type *) NULL)
1317
0
  goto error_return;
1318
1319
      /* Read the raw ELF version symbol information.  */
1320
4.19k
      if (verhdr != NULL
1321
37
    && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1322
25
  {
1323
25
    _bfd_error_handler
1324
      /* xgettext:c-format */
1325
25
      (_("%pB: version count (%" PRId64 ")"
1326
25
         " does not match symbol count (%ld)"),
1327
25
       abfd,
1328
25
       (int64_t) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1329
25
       symcount);
1330
1331
    /* Slurp in the symbols without the version information,
1332
       since that is more helpful than just quitting.  */
1333
25
    verhdr = NULL;
1334
25
  }
1335
1336
4.19k
      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
4.19k
      xver = xverbuf;
1348
4.19k
      if (xver != NULL)
1349
11
  ++xver;
1350
4.19k
      isymend = isymbuf + symcount;
1351
4.19k
      for (isym = isymbuf + 1, sym = symbase, i = 1;
1352
74.7k
     isym < isymend;
1353
70.5k
     isym++, sym++, i++)
1354
70.5k
  {
1355
70.5k
    memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1356
1357
70.5k
    sym->symbol.the_bfd = abfd;
1358
70.5k
    if (elf_use_dt_symtab_p (abfd))
1359
0
      sym->symbol.name = (elf_tdata (abfd)->dt_strtab
1360
0
        + isym->st_name);
1361
70.5k
    else
1362
70.5k
      sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1363
70.5k
    sym->symbol.value = isym->st_value;
1364
1365
70.5k
    if (isym->st_shndx == SHN_UNDEF)
1366
32.7k
      {
1367
32.7k
        sym->symbol.section = bfd_und_section_ptr;
1368
32.7k
      }
1369
37.8k
    else if (isym->st_shndx == SHN_ABS)
1370
84
      {
1371
84
        sym->symbol.section = bfd_abs_section_ptr;
1372
84
      }
1373
37.7k
    else if (isym->st_shndx == SHN_COMMON)
1374
53
      {
1375
53
        sym->symbol.section = bfd_com_section_ptr;
1376
53
        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
53
        sym->symbol.value = isym->st_size;
1395
53
      }
1396
37.7k
    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
37.7k
    else
1406
37.7k
      {
1407
37.7k
        sym->symbol.section
1408
37.7k
    = bfd_section_from_elf_index (abfd, isym->st_shndx);
1409
37.7k
        if (sym->symbol.section == NULL)
1410
28.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
28.6k
      sym->symbol.section = bfd_abs_section_ptr;
1418
28.6k
    }
1419
37.7k
      }
1420
1421
    /* If this is a relocatable file, then the symbol value is
1422
       already section relative.  */
1423
70.5k
    if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1424
5.33k
      sym->symbol.value -= sym->symbol.section->vma;
1425
1426
70.5k
    switch (ELF_ST_BIND (isym->st_info))
1427
70.5k
      {
1428
49.4k
      case STB_LOCAL:
1429
49.4k
        sym->symbol.flags |= BSF_LOCAL;
1430
49.4k
        break;
1431
7.32k
      case STB_GLOBAL:
1432
7.32k
        if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1433
5.85k
    sym->symbol.flags |= BSF_GLOBAL;
1434
7.32k
        break;
1435
6.08k
      case STB_WEAK:
1436
6.08k
        sym->symbol.flags |= BSF_WEAK;
1437
6.08k
        break;
1438
1.38k
      case STB_GNU_UNIQUE:
1439
1.38k
        sym->symbol.flags |= BSF_GNU_UNIQUE;
1440
1.38k
        break;
1441
70.5k
      }
1442
1443
70.5k
    switch (ELF_ST_TYPE (isym->st_info))
1444
70.5k
      {
1445
3.85k
      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.85k
        sym->symbol.flags |= (BSF_SECTION_SYM
1451
3.85k
            | BSF_DEBUGGING
1452
3.85k
            | BSF_SECTION_SYM_USED);
1453
3.85k
        break;
1454
1.22k
      case STT_FILE:
1455
1.22k
        sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1456
1.22k
        break;
1457
5.07k
      case STT_FUNC:
1458
5.07k
        sym->symbol.flags |= BSF_FUNCTION;
1459
5.07k
        break;
1460
772
      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
772
        sym->symbol.flags |= BSF_ELF_COMMON;
1464
        /* Fall through.  */
1465
2.57k
      case STT_OBJECT:
1466
2.57k
        sym->symbol.flags |= BSF_OBJECT;
1467
2.57k
        break;
1468
511
      case STT_TLS:
1469
511
        sym->symbol.flags |= BSF_THREAD_LOCAL;
1470
511
        break;
1471
1.44k
      case STT_RELC:
1472
1.44k
        sym->symbol.flags |= BSF_RELC;
1473
1.44k
        break;
1474
657
      case STT_SRELC:
1475
657
        sym->symbol.flags |= BSF_SRELC;
1476
657
        break;
1477
1.32k
      case STT_GNU_IFUNC:
1478
1.32k
        sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1479
1.32k
        break;
1480
70.5k
      }
1481
1482
70.5k
    if (dynamic)
1483
341
      sym->symbol.flags |= BSF_DYNAMIC;
1484
1485
70.5k
    if (elf_tdata (abfd)->dt_versym)
1486
0
      sym->version = bfd_get_16 (abfd,
1487
70.5k
               elf_tdata (abfd)->dt_versym + 2 * i);
1488
70.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
70.5k
    if (ebd->elf_backend_symbol_processing)
1499
19.7k
      (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1500
70.5k
  }
1501
4.19k
    }
1502
1503
  /* Do some backend-specific processing on this symbol table.  */
1504
4.40k
  if (ebd->elf_backend_symbol_table_processing)
1505
0
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1506
1507
  /* We rely on the zalloc to clear out the final symbol entry.  */
1508
1509
4.40k
  symcount = sym - symbase;
1510
1511
  /* Fill in the user's symbol pointer vector if needed.  */
1512
4.40k
  if (symptrs)
1513
4.40k
    {
1514
4.40k
      long l = symcount;
1515
1516
4.40k
      sym = symbase;
1517
74.9k
      while (l-- > 0)
1518
70.5k
  {
1519
70.5k
    *symptrs++ = &sym->symbol;
1520
70.5k
    sym++;
1521
70.5k
  }
1522
4.40k
      *symptrs = 0;   /* Final null pointer */
1523
4.40k
    }
1524
1525
4.40k
  free (xverbuf);
1526
4.40k
  if (hdr->contents != (unsigned char *) isymbuf
1527
4.19k
      && !elf_use_dt_symtab_p (abfd))
1528
4.19k
    free (isymbuf);
1529
4.40k
  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.79k
}
1538
1539
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1540
   them.  */
1541
1542
static bool
1543
elf_slurp_reloc_table_from_section (bfd *abfd,
1544
            asection *asect,
1545
            Elf_Internal_Shdr *rel_hdr,
1546
            bfd_size_type reloc_count,
1547
            arelent *relents,
1548
            asymbol **symbols,
1549
            bool dynamic)
1550
15.3k
{
1551
15.3k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
15.3k
  void *allocated = NULL;
1553
15.3k
  bfd_byte *native_relocs;
1554
15.3k
  arelent *relent;
1555
15.3k
  unsigned int i;
1556
15.3k
  int entsize;
1557
15.3k
  unsigned int symcount;
1558
1559
15.3k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
163
    return false;
1561
15.2k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
15.2k
  if (allocated == NULL)
1563
541
    return false;
1564
1565
14.6k
  native_relocs = (bfd_byte *) allocated;
1566
1567
14.6k
  entsize = rel_hdr->sh_entsize;
1568
14.6k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
14.6k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
14.6k
  if (dynamic)
1572
127
    symcount = bfd_get_dynamic_symcount (abfd);
1573
14.5k
  else
1574
14.5k
    symcount = bfd_get_symcount (abfd);
1575
1576
14.6k
  for (i = 0, relent = relents;
1577
179k
       i < reloc_count;
1578
164k
       i++, relent++, native_relocs += entsize)
1579
168k
    {
1580
168k
      bool res;
1581
168k
      Elf_Internal_Rela rela;
1582
1583
168k
      if (entsize == sizeof (Elf_External_Rela))
1584
128k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
39.9k
      else
1586
39.9k
  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
168k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
165k
  relent->address = rela.r_offset;
1594
2.49k
      else
1595
2.49k
  relent->address = rela.r_offset - asect->vma;
1596
1597
168k
      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
42.1k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
126k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
39.5k
  {
1603
39.5k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
39.5k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
39.5k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
39.5k
    bfd_set_error (bfd_error_bad_value);
1608
39.5k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
39.5k
  }
1610
86.4k
      else
1611
86.4k
  {
1612
86.4k
    asymbol **ps;
1613
1614
86.4k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
86.4k
    relent->sym_ptr_ptr = ps;
1617
86.4k
  }
1618
1619
168k
      relent->addend = rela.r_addend;
1620
1621
168k
      res = false;
1622
168k
      if ((entsize == sizeof (Elf_External_Rela)
1623
39.9k
     || ebd->elf_info_to_howto_rel == NULL)
1624
157k
    && ebd->elf_info_to_howto != NULL)
1625
156k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
12.1k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
12.1k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
168k
      if (! res || relent->howto == NULL)
1630
3.31k
  goto error_return;
1631
168k
    }
1632
1633
11.3k
  free (allocated);
1634
11.3k
  return true;
1635
1636
3.31k
 error_return:
1637
3.31k
  free (allocated);
1638
3.31k
  return false;
1639
14.6k
}
elf64.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
12.3k
{
1551
12.3k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
12.3k
  void *allocated = NULL;
1553
12.3k
  bfd_byte *native_relocs;
1554
12.3k
  arelent *relent;
1555
12.3k
  unsigned int i;
1556
12.3k
  int entsize;
1557
12.3k
  unsigned int symcount;
1558
1559
12.3k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
163
    return false;
1561
12.1k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
12.1k
  if (allocated == NULL)
1563
371
    return false;
1564
1565
11.7k
  native_relocs = (bfd_byte *) allocated;
1566
1567
11.7k
  entsize = rel_hdr->sh_entsize;
1568
11.7k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
11.7k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
11.7k
  if (dynamic)
1572
114
    symcount = bfd_get_dynamic_symcount (abfd);
1573
11.6k
  else
1574
11.6k
    symcount = bfd_get_symcount (abfd);
1575
1576
11.7k
  for (i = 0, relent = relents;
1577
119k
       i < reloc_count;
1578
107k
       i++, relent++, native_relocs += entsize)
1579
109k
    {
1580
109k
      bool res;
1581
109k
      Elf_Internal_Rela rela;
1582
1583
109k
      if (entsize == sizeof (Elf_External_Rela))
1584
109k
  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
109k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
107k
  relent->address = rela.r_offset;
1594
2.23k
      else
1595
2.23k
  relent->address = rela.r_offset - asect->vma;
1596
1597
109k
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1598
  /* FIXME: This and the error case below mean that we have a
1599
     symbol on relocs that is not elf_symbol_type.  */
1600
19.0k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
90.6k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
20.6k
  {
1603
20.6k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
20.6k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
20.6k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
20.6k
    bfd_set_error (bfd_error_bad_value);
1608
20.6k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
20.6k
  }
1610
69.9k
      else
1611
69.9k
  {
1612
69.9k
    asymbol **ps;
1613
1614
69.9k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
69.9k
    relent->sym_ptr_ptr = ps;
1617
69.9k
  }
1618
1619
109k
      relent->addend = rela.r_addend;
1620
1621
109k
      res = false;
1622
109k
      if ((entsize == sizeof (Elf_External_Rela)
1623
0
     || ebd->elf_info_to_howto_rel == NULL)
1624
109k
    && ebd->elf_info_to_howto != NULL)
1625
109k
  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
109k
      if (! res || relent->howto == NULL)
1630
2.07k
  goto error_return;
1631
109k
    }
1632
1633
9.71k
  free (allocated);
1634
9.71k
  return true;
1635
1636
2.07k
 error_return:
1637
2.07k
  free (allocated);
1638
  return false;
1639
11.7k
}
elf32.c:elf_slurp_reloc_table_from_section
Line
Count
Source
1550
3.04k
{
1551
3.04k
  elf_backend_data *ebd = get_elf_backend_data (abfd);
1552
3.04k
  void *allocated = NULL;
1553
3.04k
  bfd_byte *native_relocs;
1554
3.04k
  arelent *relent;
1555
3.04k
  unsigned int i;
1556
3.04k
  int entsize;
1557
3.04k
  unsigned int symcount;
1558
1559
3.04k
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0)
1560
0
    return false;
1561
3.04k
  allocated = _bfd_malloc_and_read (abfd, rel_hdr->sh_size, rel_hdr->sh_size);
1562
3.04k
  if (allocated == NULL)
1563
170
    return false;
1564
1565
2.87k
  native_relocs = (bfd_byte *) allocated;
1566
1567
2.87k
  entsize = rel_hdr->sh_entsize;
1568
2.87k
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1569
2.87k
        || entsize == sizeof (Elf_External_Rela));
1570
1571
2.87k
  if (dynamic)
1572
13
    symcount = bfd_get_dynamic_symcount (abfd);
1573
2.86k
  else
1574
2.86k
    symcount = bfd_get_symcount (abfd);
1575
1576
2.87k
  for (i = 0, relent = relents;
1577
60.1k
       i < reloc_count;
1578
57.2k
       i++, relent++, native_relocs += entsize)
1579
58.5k
    {
1580
58.5k
      bool res;
1581
58.5k
      Elf_Internal_Rela rela;
1582
1583
58.5k
      if (entsize == sizeof (Elf_External_Rela))
1584
18.5k
  elf_swap_reloca_in (abfd, native_relocs, &rela);
1585
39.9k
      else
1586
39.9k
  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
58.5k
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1593
58.2k
  relent->address = rela.r_offset;
1594
254
      else
1595
254
  relent->address = rela.r_offset - asect->vma;
1596
1597
58.5k
      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
23.1k
  relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1601
35.4k
      else if (ELF_R_SYM (rela.r_info) > symcount)
1602
18.8k
  {
1603
18.8k
    _bfd_error_handler
1604
      /* xgettext:c-format */
1605
18.8k
      (_("%pB(%pA): relocation %d has invalid symbol index %ld"),
1606
18.8k
       abfd, asect, i, (long) ELF_R_SYM (rela.r_info));
1607
18.8k
    bfd_set_error (bfd_error_bad_value);
1608
18.8k
    relent->sym_ptr_ptr = &bfd_abs_section_ptr->symbol;
1609
18.8k
  }
1610
16.5k
      else
1611
16.5k
  {
1612
16.5k
    asymbol **ps;
1613
1614
16.5k
    ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1615
1616
16.5k
    relent->sym_ptr_ptr = ps;
1617
16.5k
  }
1618
1619
58.5k
      relent->addend = rela.r_addend;
1620
1621
58.5k
      res = false;
1622
58.5k
      if ((entsize == sizeof (Elf_External_Rela)
1623
39.9k
     || ebd->elf_info_to_howto_rel == NULL)
1624
48.1k
    && ebd->elf_info_to_howto != NULL)
1625
46.4k
  res = ebd->elf_info_to_howto (abfd, relent, &rela);
1626
12.1k
      else if (ebd->elf_info_to_howto_rel != NULL)
1627
12.1k
  res = ebd->elf_info_to_howto_rel (abfd, relent, &rela);
1628
1629
58.5k
      if (! res || relent->howto == NULL)
1630
1.23k
  goto error_return;
1631
58.5k
    }
1632
1633
1.63k
  free (allocated);
1634
1.63k
  return true;
1635
1636
1.23k
 error_return:
1637
1.23k
  free (allocated);
1638
  return false;
1639
2.87k
}
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
20.3k
{
1649
20.3k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
20.3k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
20.3k
  Elf_Internal_Shdr *rel_hdr;
1652
20.3k
  Elf_Internal_Shdr *rel_hdr2;
1653
20.3k
  bfd_size_type reloc_count;
1654
20.3k
  bfd_size_type reloc_count2;
1655
20.3k
  arelent *relents;
1656
20.3k
  size_t amt;
1657
1658
20.3k
  if (asect->relocation != NULL)
1659
2.80k
    return true;
1660
1661
17.5k
  if (! dynamic)
1662
17.4k
    {
1663
17.4k
      if ((asect->flags & SEC_RELOC) == 0
1664
15.3k
    || asect->reloc_count == 0)
1665
2.16k
  return true;
1666
1667
15.2k
      rel_hdr = d->rel.hdr;
1668
15.2k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
15.2k
      rel_hdr2 = d->rela.hdr;
1670
15.2k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
15.2k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
15.2k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
15.2k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
15.2k
    }
1679
132
  else
1680
132
    {
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
132
      if (asect->size == 0)
1686
5
  return true;
1687
1688
127
      rel_hdr = &d->this_hdr;
1689
127
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
127
      rel_hdr2 = NULL;
1691
127
      reloc_count2 = 0;
1692
127
    }
1693
1694
15.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
15.3k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
15.3k
  if (relents == NULL)
1701
0
    return false;
1702
1703
15.3k
  if (rel_hdr
1704
2.33k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
2.33k
                rel_hdr, reloc_count,
1706
2.33k
                relents,
1707
2.33k
                symbols, dynamic))
1708
809
    return false;
1709
1710
14.5k
  if (rel_hdr2
1711
13.0k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
13.0k
                rel_hdr2, reloc_count2,
1713
13.0k
                relents + reloc_count,
1714
13.0k
                symbols, dynamic))
1715
3.20k
    return false;
1716
1717
11.3k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
38
    return false;
1719
1720
11.3k
  asect->relocation = relents;
1721
11.3k
  return true;
1722
11.3k
}
bfd_elf64_slurp_reloc_table
Line
Count
Source
1648
15.8k
{
1649
15.8k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
15.8k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
15.8k
  Elf_Internal_Shdr *rel_hdr;
1652
15.8k
  Elf_Internal_Shdr *rel_hdr2;
1653
15.8k
  bfd_size_type reloc_count;
1654
15.8k
  bfd_size_type reloc_count2;
1655
15.8k
  arelent *relents;
1656
15.8k
  size_t amt;
1657
1658
15.8k
  if (asect->relocation != NULL)
1659
2.65k
    return true;
1660
1661
13.2k
  if (! dynamic)
1662
13.0k
    {
1663
13.0k
      if ((asect->flags & SEC_RELOC) == 0
1664
12.3k
    || asect->reloc_count == 0)
1665
880
  return true;
1666
1667
12.2k
      rel_hdr = d->rel.hdr;
1668
12.2k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
12.2k
      rel_hdr2 = d->rela.hdr;
1670
12.2k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
12.2k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
12.2k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
12.2k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
12.2k
    }
1679
119
  else
1680
119
    {
1681
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1682
   case because relocations against this section may use the
1683
   dynamic symbol table, and in that case bfd_section_from_shdr
1684
   in elf.c does not update the RELOC_COUNT.  */
1685
119
      if (asect->size == 0)
1686
5
  return true;
1687
1688
114
      rel_hdr = &d->this_hdr;
1689
114
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1690
114
      rel_hdr2 = NULL;
1691
114
      reloc_count2 = 0;
1692
114
    }
1693
1694
12.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
12.3k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
12.3k
  if (relents == NULL)
1701
0
    return false;
1702
1703
12.3k
  if (rel_hdr
1704
114
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
114
                rel_hdr, reloc_count,
1706
114
                relents,
1707
114
                symbols, dynamic))
1708
21
    return false;
1709
1710
12.3k
  if (rel_hdr2
1711
12.2k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
12.2k
                rel_hdr2, reloc_count2,
1713
12.2k
                relents + reloc_count,
1714
12.2k
                symbols, dynamic))
1715
2.58k
    return false;
1716
1717
9.71k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
38
    return false;
1719
1720
9.67k
  asect->relocation = relents;
1721
  return true;
1722
9.71k
}
bfd_elf32_slurp_reloc_table
Line
Count
Source
1648
4.48k
{
1649
4.48k
  elf_backend_data *bed = get_elf_backend_data (abfd);
1650
4.48k
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1651
4.48k
  Elf_Internal_Shdr *rel_hdr;
1652
4.48k
  Elf_Internal_Shdr *rel_hdr2;
1653
4.48k
  bfd_size_type reloc_count;
1654
4.48k
  bfd_size_type reloc_count2;
1655
4.48k
  arelent *relents;
1656
4.48k
  size_t amt;
1657
1658
4.48k
  if (asect->relocation != NULL)
1659
157
    return true;
1660
1661
4.33k
  if (! dynamic)
1662
4.31k
    {
1663
4.31k
      if ((asect->flags & SEC_RELOC) == 0
1664
3.05k
    || asect->reloc_count == 0)
1665
1.28k
  return true;
1666
1667
3.03k
      rel_hdr = d->rel.hdr;
1668
3.03k
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1669
3.03k
      rel_hdr2 = d->rela.hdr;
1670
3.03k
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1671
1672
      /* PR 17512: file: 0b4f81b7.  */
1673
3.03k
      if (asect->reloc_count != reloc_count + reloc_count2)
1674
0
  return false;
1675
3.03k
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1676
3.03k
      || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1677
1678
3.03k
    }
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
3.04k
  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
3.04k
  relents = (arelent *) bfd_alloc (abfd, amt);
1700
3.04k
  if (relents == NULL)
1701
0
    return false;
1702
1703
3.04k
  if (rel_hdr
1704
2.22k
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1705
2.22k
                rel_hdr, reloc_count,
1706
2.22k
                relents,
1707
2.22k
                symbols, dynamic))
1708
788
    return false;
1709
1710
2.25k
  if (rel_hdr2
1711
823
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1712
823
                rel_hdr2, reloc_count2,
1713
823
                relents + reloc_count,
1714
823
                symbols, dynamic))
1715
618
    return false;
1716
1717
1.63k
  if (!bed->slurp_secondary_relocs (abfd, asect, symbols, dynamic))
1718
0
    return false;
1719
1720
1.63k
  asect->relocation = relents;
1721
  return true;
1722
1.63k
}
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.29k
{
2052
1.29k
  return ELF_R_SYM (r_info);
2053
1.29k
}
elf64_r_sym
Line
Count
Source
2051
1.26k
{
2052
1.26k
  return ELF_R_SYM (r_info);
2053
1.26k
}
elf32_r_sym
Line
Count
Source
2051
31
{
2052
31
  return ELF_R_SYM (r_info);
2053
31
}
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
};