Subversion Repositories Kolibri OS

Rev

Rev 5197 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5197 Rev 6324
1
/* ELF executable support for BFD.
1
/* ELF executable support for BFD.
2
   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-
 
3
   2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
-
 
4
   Free Software Foundation, Inc.
2
   Copyright (C) 1991-2015 Free Software Foundation, Inc.
5
 
3
 
6
   Written by Fred Fish @ Cygnus Support, from information published
4
   Written by Fred Fish @ Cygnus Support, from information published
7
   in "UNIX System V Release 4, Programmers Guide: ANSI C and
5
   in "UNIX System V Release 4, Programmers Guide: ANSI C and
8
   Programming Support Tools".  Sufficient support for gdb.
6
   Programming Support Tools".  Sufficient support for gdb.
9
 
7
 
10
   Rewritten by Mark Eichin @ Cygnus Support, from information
8
   Rewritten by Mark Eichin @ Cygnus Support, from information
11
   published in "System V Application Binary Interface", chapters 4
9
   published in "System V Application Binary Interface", chapters 4
12
   and 5, as well as the various "Processor Supplement" documents
10
   and 5, as well as the various "Processor Supplement" documents
13
   derived from it. Added support for assembler and other object file
11
   derived from it. Added support for assembler and other object file
14
   utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
12
   utilities.  Further work done by Ken Raeburn (Cygnus Support), Michael
15
   Meissner (Open Software Foundation), and Peter Hoogenboom (University
13
   Meissner (Open Software Foundation), and Peter Hoogenboom (University
16
   of Utah) to finish and extend this.
14
   of Utah) to finish and extend this.
17
 
15
 
18
   This file is part of BFD, the Binary File Descriptor library.
16
   This file is part of BFD, the Binary File Descriptor library.
19
 
17
 
20
   This program is free software; you can redistribute it and/or modify
18
   This program is free software; you can redistribute it and/or modify
21
   it under the terms of the GNU General Public License as published by
19
   it under the terms of the GNU General Public License as published by
22
   the Free Software Foundation; either version 3 of the License, or
20
   the Free Software Foundation; either version 3 of the License, or
23
   (at your option) any later version.
21
   (at your option) any later version.
24
 
22
 
25
   This program is distributed in the hope that it will be useful,
23
   This program is distributed in the hope that it will be useful,
26
   but WITHOUT ANY WARRANTY; without even the implied warranty of
24
   but WITHOUT ANY WARRANTY; without even the implied warranty of
27
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28
   GNU General Public License for more details.
26
   GNU General Public License for more details.
29
 
27
 
30
   You should have received a copy of the GNU General Public License
28
   You should have received a copy of the GNU General Public License
31
   along with this program; if not, write to the Free Software
29
   along with this program; if not, write to the Free Software
32
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
30
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
33
   MA 02110-1301, USA.  */
31
   MA 02110-1301, USA.  */
34
 
32
 
35
 
33
 
36
/* Problems and other issues to resolve.
34
/* Problems and other issues to resolve.
37
 
35
 
38
   (1)	BFD expects there to be some fixed number of "sections" in
36
   (1)	BFD expects there to be some fixed number of "sections" in
39
	the object file.  I.E. there is a "section_count" variable in the
37
	the object file.  I.E. there is a "section_count" variable in the
40
	bfd structure which contains the number of sections.  However, ELF
38
	bfd structure which contains the number of sections.  However, ELF
41
	supports multiple "views" of a file.  In particular, with current
39
	supports multiple "views" of a file.  In particular, with current
42
	implementations, executable files typically have two tables, a
40
	implementations, executable files typically have two tables, a
43
	program header table and a section header table, both of which
41
	program header table and a section header table, both of which
44
	partition the executable.
42
	partition the executable.
45
 
43
 
46
	In ELF-speak, the "linking view" of the file uses the section header
44
	In ELF-speak, the "linking view" of the file uses the section header
47
	table to access "sections" within the file, and the "execution view"
45
	table to access "sections" within the file, and the "execution view"
48
	uses the program header table to access "segments" within the file.
46
	uses the program header table to access "segments" within the file.
49
	"Segments" typically may contain all the data from one or more
47
	"Segments" typically may contain all the data from one or more
50
	"sections".
48
	"sections".
51
 
49
 
52
	Note that the section header table is optional in ELF executables,
50
	Note that the section header table is optional in ELF executables,
53
	but it is this information that is most useful to gdb.  If the
51
	but it is this information that is most useful to gdb.  If the
54
	section header table is missing, then gdb should probably try
52
	section header table is missing, then gdb should probably try
55
	to make do with the program header table.  (FIXME)
53
	to make do with the program header table.  (FIXME)
56
 
54
 
57
   (2)  The code in this file is compiled twice, once in 32-bit mode and
55
   (2)  The code in this file is compiled twice, once in 32-bit mode and
58
	once in 64-bit mode.  More of it should be made size-independent
56
	once in 64-bit mode.  More of it should be made size-independent
59
	and moved into elf.c.
57
	and moved into elf.c.
60
 
58
 
61
   (3)	ELF section symbols are handled rather sloppily now.  This should
59
   (3)	ELF section symbols are handled rather sloppily now.  This should
62
	be cleaned up, and ELF section symbols reconciled with BFD section
60
	be cleaned up, and ELF section symbols reconciled with BFD section
63
	symbols.
61
	symbols.
64
 
62
 
65
   (4)  We need a published spec for 64-bit ELF.  We've got some stuff here
63
   (4)  We need a published spec for 64-bit ELF.  We've got some stuff here
66
	that we're using for SPARC V9 64-bit chips, but don't assume that
64
	that we're using for SPARC V9 64-bit chips, but don't assume that
67
	it's cast in stone.
65
	it's cast in stone.
68
 */
66
 */
69
 
67
 
70
#include "sysdep.h"
68
#include "sysdep.h"
71
#include "bfd.h"
69
#include "bfd.h"
72
#include "libiberty.h"
70
#include "libiberty.h"
73
#include "bfdlink.h"
71
#include "bfdlink.h"
74
#include "libbfd.h"
72
#include "libbfd.h"
75
#include "elf-bfd.h"
73
#include "elf-bfd.h"
-
 
74
#include "libiberty.h"
76
 
75
 
77
/* Renaming structures, typedefs, macros and functions to be size-specific.  */
76
/* Renaming structures, typedefs, macros and functions to be size-specific.  */
78
#define Elf_External_Ehdr	NAME(Elf,External_Ehdr)
77
#define Elf_External_Ehdr	NAME(Elf,External_Ehdr)
79
#define Elf_External_Sym	NAME(Elf,External_Sym)
78
#define Elf_External_Sym	NAME(Elf,External_Sym)
80
#define Elf_External_Shdr	NAME(Elf,External_Shdr)
79
#define Elf_External_Shdr	NAME(Elf,External_Shdr)
81
#define Elf_External_Phdr	NAME(Elf,External_Phdr)
80
#define Elf_External_Phdr	NAME(Elf,External_Phdr)
82
#define Elf_External_Rel	NAME(Elf,External_Rel)
81
#define Elf_External_Rel	NAME(Elf,External_Rel)
83
#define Elf_External_Rela	NAME(Elf,External_Rela)
82
#define Elf_External_Rela	NAME(Elf,External_Rela)
84
#define Elf_External_Dyn	NAME(Elf,External_Dyn)
83
#define Elf_External_Dyn	NAME(Elf,External_Dyn)
85
 
84
 
86
#define elf_core_file_failing_command	NAME(bfd_elf,core_file_failing_command)
85
#define elf_core_file_failing_command	NAME(bfd_elf,core_file_failing_command)
87
#define elf_core_file_failing_signal	NAME(bfd_elf,core_file_failing_signal)
86
#define elf_core_file_failing_signal	NAME(bfd_elf,core_file_failing_signal)
88
#define elf_core_file_matches_executable_p \
87
#define elf_core_file_matches_executable_p \
89
  NAME(bfd_elf,core_file_matches_executable_p)
88
  NAME(bfd_elf,core_file_matches_executable_p)
90
#define elf_core_file_pid		NAME(bfd_elf,core_file_pid)
89
#define elf_core_file_pid		NAME(bfd_elf,core_file_pid)
91
#define elf_object_p			NAME(bfd_elf,object_p)
90
#define elf_object_p			NAME(bfd_elf,object_p)
92
#define elf_core_file_p			NAME(bfd_elf,core_file_p)
91
#define elf_core_file_p			NAME(bfd_elf,core_file_p)
93
#define elf_get_symtab_upper_bound	NAME(bfd_elf,get_symtab_upper_bound)
92
#define elf_get_symtab_upper_bound	NAME(bfd_elf,get_symtab_upper_bound)
94
#define elf_get_dynamic_symtab_upper_bound \
93
#define elf_get_dynamic_symtab_upper_bound \
95
  NAME(bfd_elf,get_dynamic_symtab_upper_bound)
94
  NAME(bfd_elf,get_dynamic_symtab_upper_bound)
96
#define elf_swap_reloc_in		NAME(bfd_elf,swap_reloc_in)
95
#define elf_swap_reloc_in		NAME(bfd_elf,swap_reloc_in)
97
#define elf_swap_reloca_in		NAME(bfd_elf,swap_reloca_in)
96
#define elf_swap_reloca_in		NAME(bfd_elf,swap_reloca_in)
98
#define elf_swap_reloc_out		NAME(bfd_elf,swap_reloc_out)
97
#define elf_swap_reloc_out		NAME(bfd_elf,swap_reloc_out)
99
#define elf_swap_reloca_out		NAME(bfd_elf,swap_reloca_out)
98
#define elf_swap_reloca_out		NAME(bfd_elf,swap_reloca_out)
100
#define elf_swap_symbol_in		NAME(bfd_elf,swap_symbol_in)
99
#define elf_swap_symbol_in		NAME(bfd_elf,swap_symbol_in)
101
#define elf_swap_symbol_out		NAME(bfd_elf,swap_symbol_out)
100
#define elf_swap_symbol_out		NAME(bfd_elf,swap_symbol_out)
102
#define elf_swap_phdr_in		NAME(bfd_elf,swap_phdr_in)
101
#define elf_swap_phdr_in		NAME(bfd_elf,swap_phdr_in)
103
#define elf_swap_phdr_out		NAME(bfd_elf,swap_phdr_out)
102
#define elf_swap_phdr_out		NAME(bfd_elf,swap_phdr_out)
104
#define elf_swap_dyn_in			NAME(bfd_elf,swap_dyn_in)
103
#define elf_swap_dyn_in			NAME(bfd_elf,swap_dyn_in)
105
#define elf_swap_dyn_out		NAME(bfd_elf,swap_dyn_out)
104
#define elf_swap_dyn_out		NAME(bfd_elf,swap_dyn_out)
106
#define elf_get_reloc_upper_bound	NAME(bfd_elf,get_reloc_upper_bound)
105
#define elf_get_reloc_upper_bound	NAME(bfd_elf,get_reloc_upper_bound)
107
#define elf_canonicalize_reloc		NAME(bfd_elf,canonicalize_reloc)
106
#define elf_canonicalize_reloc		NAME(bfd_elf,canonicalize_reloc)
108
#define elf_slurp_symbol_table		NAME(bfd_elf,slurp_symbol_table)
107
#define elf_slurp_symbol_table		NAME(bfd_elf,slurp_symbol_table)
109
#define elf_canonicalize_symtab		NAME(bfd_elf,canonicalize_symtab)
108
#define elf_canonicalize_symtab		NAME(bfd_elf,canonicalize_symtab)
110
#define elf_canonicalize_dynamic_symtab \
109
#define elf_canonicalize_dynamic_symtab \
111
  NAME(bfd_elf,canonicalize_dynamic_symtab)
110
  NAME(bfd_elf,canonicalize_dynamic_symtab)
112
#define elf_get_synthetic_symtab \
111
#define elf_get_synthetic_symtab \
113
  NAME(bfd_elf,get_synthetic_symtab)
112
  NAME(bfd_elf,get_synthetic_symtab)
114
#define elf_make_empty_symbol		NAME(bfd_elf,make_empty_symbol)
113
#define elf_make_empty_symbol		NAME(bfd_elf,make_empty_symbol)
115
#define elf_get_symbol_info		NAME(bfd_elf,get_symbol_info)
114
#define elf_get_symbol_info		NAME(bfd_elf,get_symbol_info)
116
#define elf_get_lineno			NAME(bfd_elf,get_lineno)
115
#define elf_get_lineno			NAME(bfd_elf,get_lineno)
117
#define elf_set_arch_mach		NAME(bfd_elf,set_arch_mach)
116
#define elf_set_arch_mach		NAME(bfd_elf,set_arch_mach)
118
#define elf_find_nearest_line		NAME(bfd_elf,find_nearest_line)
117
#define elf_find_nearest_line		NAME(bfd_elf,find_nearest_line)
119
#define elf_sizeof_headers		NAME(bfd_elf,sizeof_headers)
118
#define elf_sizeof_headers		NAME(bfd_elf,sizeof_headers)
120
#define elf_set_section_contents	NAME(bfd_elf,set_section_contents)
119
#define elf_set_section_contents	NAME(bfd_elf,set_section_contents)
121
#define elf_no_info_to_howto		NAME(bfd_elf,no_info_to_howto)
120
#define elf_no_info_to_howto		NAME(bfd_elf,no_info_to_howto)
122
#define elf_no_info_to_howto_rel	NAME(bfd_elf,no_info_to_howto_rel)
121
#define elf_no_info_to_howto_rel	NAME(bfd_elf,no_info_to_howto_rel)
123
#define elf_find_section		NAME(bfd_elf,find_section)
122
#define elf_find_section		NAME(bfd_elf,find_section)
124
#define elf_write_shdrs_and_ehdr	NAME(bfd_elf,write_shdrs_and_ehdr)
123
#define elf_write_shdrs_and_ehdr	NAME(bfd_elf,write_shdrs_and_ehdr)
125
#define elf_write_out_phdrs		NAME(bfd_elf,write_out_phdrs)
124
#define elf_write_out_phdrs		NAME(bfd_elf,write_out_phdrs)
126
#define elf_checksum_contents		NAME(bfd_elf,checksum_contents)
125
#define elf_checksum_contents		NAME(bfd_elf,checksum_contents)
127
#define elf_write_relocs		NAME(bfd_elf,write_relocs)
126
#define elf_write_relocs		NAME(bfd_elf,write_relocs)
128
#define elf_slurp_reloc_table		NAME(bfd_elf,slurp_reloc_table)
127
#define elf_slurp_reloc_table		NAME(bfd_elf,slurp_reloc_table)
129
 
128
 
130
#if ARCH_SIZE == 64
129
#if ARCH_SIZE == 64
131
#define ELF_R_INFO(X,Y)	ELF64_R_INFO(X,Y)
130
#define ELF_R_INFO(X,Y)	ELF64_R_INFO(X,Y)
132
#define ELF_R_SYM(X)	ELF64_R_SYM(X)
131
#define ELF_R_SYM(X)	ELF64_R_SYM(X)
133
#define ELF_R_TYPE(X)	ELF64_R_TYPE(X)
132
#define ELF_R_TYPE(X)	ELF64_R_TYPE(X)
134
#define ELFCLASS	ELFCLASS64
133
#define ELFCLASS	ELFCLASS64
135
#define FILE_ALIGN	8
134
#define FILE_ALIGN	8
136
#define LOG_FILE_ALIGN	3
135
#define LOG_FILE_ALIGN	3
137
#endif
136
#endif
138
#if ARCH_SIZE == 32
137
#if ARCH_SIZE == 32
139
#define ELF_R_INFO(X,Y)	ELF32_R_INFO(X,Y)
138
#define ELF_R_INFO(X,Y)	ELF32_R_INFO(X,Y)
140
#define ELF_R_SYM(X)	ELF32_R_SYM(X)
139
#define ELF_R_SYM(X)	ELF32_R_SYM(X)
141
#define ELF_R_TYPE(X)	ELF32_R_TYPE(X)
140
#define ELF_R_TYPE(X)	ELF32_R_TYPE(X)
142
#define ELFCLASS	ELFCLASS32
141
#define ELFCLASS	ELFCLASS32
143
#define FILE_ALIGN	4
142
#define FILE_ALIGN	4
144
#define LOG_FILE_ALIGN	2
143
#define LOG_FILE_ALIGN	2
145
#endif
144
#endif
146
 
145
 
147
#if DEBUG & 2
146
#if DEBUG & 2
148
static void elf_debug_section (int, Elf_Internal_Shdr *);
147
static void elf_debug_section (int, Elf_Internal_Shdr *);
149
#endif
148
#endif
150
#if DEBUG & 1
149
#if DEBUG & 1
151
static void elf_debug_file (Elf_Internal_Ehdr *);
150
static void elf_debug_file (Elf_Internal_Ehdr *);
152
#endif
151
#endif
153

152

154
/* Structure swapping routines */
153
/* Structure swapping routines */
155
 
154
 
156
/* Should perhaps use put_offset, put_word, etc.  For now, the two versions
155
/* Should perhaps use put_offset, put_word, etc.  For now, the two versions
157
   can be handled by explicitly specifying 32 bits or "the long type".  */
156
   can be handled by explicitly specifying 32 bits or "the long type".  */
158
#if ARCH_SIZE == 64
157
#if ARCH_SIZE == 64
159
#define H_PUT_WORD		H_PUT_64
158
#define H_PUT_WORD		H_PUT_64
160
#define H_PUT_SIGNED_WORD	H_PUT_S64
159
#define H_PUT_SIGNED_WORD	H_PUT_S64
161
#define H_GET_WORD		H_GET_64
160
#define H_GET_WORD		H_GET_64
162
#define H_GET_SIGNED_WORD	H_GET_S64
161
#define H_GET_SIGNED_WORD	H_GET_S64
163
#endif
162
#endif
164
#if ARCH_SIZE == 32
163
#if ARCH_SIZE == 32
165
#define H_PUT_WORD		H_PUT_32
164
#define H_PUT_WORD		H_PUT_32
166
#define H_PUT_SIGNED_WORD	H_PUT_S32
165
#define H_PUT_SIGNED_WORD	H_PUT_S32
167
#define H_GET_WORD		H_GET_32
166
#define H_GET_WORD		H_GET_32
168
#define H_GET_SIGNED_WORD	H_GET_S32
167
#define H_GET_SIGNED_WORD	H_GET_S32
169
#endif
168
#endif
170
 
169
 
171
/* Translate an ELF symbol in external format into an ELF symbol in internal
170
/* Translate an ELF symbol in external format into an ELF symbol in internal
172
   format.  */
171
   format.  */
173
 
172
 
174
bfd_boolean
173
bfd_boolean
175
elf_swap_symbol_in (bfd *abfd,
174
elf_swap_symbol_in (bfd *abfd,
176
		    const void *psrc,
175
		    const void *psrc,
177
		    const void *pshn,
176
		    const void *pshn,
178
		    Elf_Internal_Sym *dst)
177
		    Elf_Internal_Sym *dst)
179
{
178
{
180
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
179
  const Elf_External_Sym *src = (const Elf_External_Sym *) psrc;
181
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
180
  const Elf_External_Sym_Shndx *shndx = (const Elf_External_Sym_Shndx *) pshn;
182
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
181
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
183
 
182
 
184
  dst->st_name = H_GET_32 (abfd, src->st_name);
183
  dst->st_name = H_GET_32 (abfd, src->st_name);
185
  if (signed_vma)
184
  if (signed_vma)
186
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
185
    dst->st_value = H_GET_SIGNED_WORD (abfd, src->st_value);
187
  else
186
  else
188
    dst->st_value = H_GET_WORD (abfd, src->st_value);
187
    dst->st_value = H_GET_WORD (abfd, src->st_value);
189
  dst->st_size = H_GET_WORD (abfd, src->st_size);
188
  dst->st_size = H_GET_WORD (abfd, src->st_size);
190
  dst->st_info = H_GET_8 (abfd, src->st_info);
189
  dst->st_info = H_GET_8 (abfd, src->st_info);
191
  dst->st_other = H_GET_8 (abfd, src->st_other);
190
  dst->st_other = H_GET_8 (abfd, src->st_other);
192
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
191
  dst->st_shndx = H_GET_16 (abfd, src->st_shndx);
193
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
192
  if (dst->st_shndx == (SHN_XINDEX & 0xffff))
194
    {
193
    {
195
      if (shndx == NULL)
194
      if (shndx == NULL)
196
	return FALSE;
195
	return FALSE;
197
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
196
      dst->st_shndx = H_GET_32 (abfd, shndx->est_shndx);
198
    }
197
    }
199
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
198
  else if (dst->st_shndx >= (SHN_LORESERVE & 0xffff))
200
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
199
    dst->st_shndx += SHN_LORESERVE - (SHN_LORESERVE & 0xffff);
201
  dst->st_target_internal = 0;
200
  dst->st_target_internal = 0;
202
  return TRUE;
201
  return TRUE;
203
}
202
}
204
 
203
 
205
/* Translate an ELF symbol in internal format into an ELF symbol in external
204
/* Translate an ELF symbol in internal format into an ELF symbol in external
206
   format.  */
205
   format.  */
207
 
206
 
208
void
207
void
209
elf_swap_symbol_out (bfd *abfd,
208
elf_swap_symbol_out (bfd *abfd,
210
		     const Elf_Internal_Sym *src,
209
		     const Elf_Internal_Sym *src,
211
		     void *cdst,
210
		     void *cdst,
212
		     void *shndx)
211
		     void *shndx)
213
{
212
{
214
  unsigned int tmp;
213
  unsigned int tmp;
215
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
214
  Elf_External_Sym *dst = (Elf_External_Sym *) cdst;
216
  H_PUT_32 (abfd, src->st_name, dst->st_name);
215
  H_PUT_32 (abfd, src->st_name, dst->st_name);
217
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
216
  H_PUT_WORD (abfd, src->st_value, dst->st_value);
218
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
217
  H_PUT_WORD (abfd, src->st_size, dst->st_size);
219
  H_PUT_8 (abfd, src->st_info, dst->st_info);
218
  H_PUT_8 (abfd, src->st_info, dst->st_info);
220
  H_PUT_8 (abfd, src->st_other, dst->st_other);
219
  H_PUT_8 (abfd, src->st_other, dst->st_other);
221
  tmp = src->st_shndx;
220
  tmp = src->st_shndx;
222
  if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
221
  if (tmp >= (SHN_LORESERVE & 0xffff) && tmp < SHN_LORESERVE)
223
    {
222
    {
224
      if (shndx == NULL)
223
      if (shndx == NULL)
225
	abort ();
224
	abort ();
226
      H_PUT_32 (abfd, tmp, shndx);
225
      H_PUT_32 (abfd, tmp, shndx);
227
      tmp = SHN_XINDEX & 0xffff;
226
      tmp = SHN_XINDEX & 0xffff;
228
    }
227
    }
229
  H_PUT_16 (abfd, tmp, dst->st_shndx);
228
  H_PUT_16 (abfd, tmp, dst->st_shndx);
230
}
229
}
231
 
230
 
232
/* Translate an ELF file header in external format into an ELF file header in
231
/* Translate an ELF file header in external format into an ELF file header in
233
   internal format.  */
232
   internal format.  */
234
 
233
 
235
static void
234
static void
236
elf_swap_ehdr_in (bfd *abfd,
235
elf_swap_ehdr_in (bfd *abfd,
237
		  const Elf_External_Ehdr *src,
236
		  const Elf_External_Ehdr *src,
238
		  Elf_Internal_Ehdr *dst)
237
		  Elf_Internal_Ehdr *dst)
239
{
238
{
240
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
239
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
241
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
240
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
242
  dst->e_type = H_GET_16 (abfd, src->e_type);
241
  dst->e_type = H_GET_16 (abfd, src->e_type);
243
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
242
  dst->e_machine = H_GET_16 (abfd, src->e_machine);
244
  dst->e_version = H_GET_32 (abfd, src->e_version);
243
  dst->e_version = H_GET_32 (abfd, src->e_version);
245
  if (signed_vma)
244
  if (signed_vma)
246
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
245
    dst->e_entry = H_GET_SIGNED_WORD (abfd, src->e_entry);
247
  else
246
  else
248
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
247
    dst->e_entry = H_GET_WORD (abfd, src->e_entry);
249
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
248
  dst->e_phoff = H_GET_WORD (abfd, src->e_phoff);
250
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
249
  dst->e_shoff = H_GET_WORD (abfd, src->e_shoff);
251
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
250
  dst->e_flags = H_GET_32 (abfd, src->e_flags);
252
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
251
  dst->e_ehsize = H_GET_16 (abfd, src->e_ehsize);
253
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
252
  dst->e_phentsize = H_GET_16 (abfd, src->e_phentsize);
254
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
253
  dst->e_phnum = H_GET_16 (abfd, src->e_phnum);
255
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
254
  dst->e_shentsize = H_GET_16 (abfd, src->e_shentsize);
256
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
255
  dst->e_shnum = H_GET_16 (abfd, src->e_shnum);
257
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
256
  dst->e_shstrndx = H_GET_16 (abfd, src->e_shstrndx);
258
}
257
}
259
 
258
 
260
/* Translate an ELF file header in internal format into an ELF file header in
259
/* Translate an ELF file header in internal format into an ELF file header in
261
   external format.  */
260
   external format.  */
262
 
261
 
263
static void
262
static void
264
elf_swap_ehdr_out (bfd *abfd,
263
elf_swap_ehdr_out (bfd *abfd,
265
		   const Elf_Internal_Ehdr *src,
264
		   const Elf_Internal_Ehdr *src,
266
		   Elf_External_Ehdr *dst)
265
		   Elf_External_Ehdr *dst)
267
{
266
{
268
  unsigned int tmp;
267
  unsigned int tmp;
269
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
268
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
270
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
269
  memcpy (dst->e_ident, src->e_ident, EI_NIDENT);
271
  /* note that all elements of dst are *arrays of unsigned char* already...  */
270
  /* note that all elements of dst are *arrays of unsigned char* already...  */
272
  H_PUT_16 (abfd, src->e_type, dst->e_type);
271
  H_PUT_16 (abfd, src->e_type, dst->e_type);
273
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
272
  H_PUT_16 (abfd, src->e_machine, dst->e_machine);
274
  H_PUT_32 (abfd, src->e_version, dst->e_version);
273
  H_PUT_32 (abfd, src->e_version, dst->e_version);
275
  if (signed_vma)
274
  if (signed_vma)
276
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
275
    H_PUT_SIGNED_WORD (abfd, src->e_entry, dst->e_entry);
277
  else
276
  else
278
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
277
    H_PUT_WORD (abfd, src->e_entry, dst->e_entry);
279
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
278
  H_PUT_WORD (abfd, src->e_phoff, dst->e_phoff);
280
  H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
279
  H_PUT_WORD (abfd, src->e_shoff, dst->e_shoff);
281
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
280
  H_PUT_32 (abfd, src->e_flags, dst->e_flags);
282
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
281
  H_PUT_16 (abfd, src->e_ehsize, dst->e_ehsize);
283
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
282
  H_PUT_16 (abfd, src->e_phentsize, dst->e_phentsize);
284
  tmp = src->e_phnum;
283
  tmp = src->e_phnum;
285
  if (tmp > PN_XNUM)
284
  if (tmp > PN_XNUM)
286
    tmp = PN_XNUM;
285
    tmp = PN_XNUM;
287
  H_PUT_16 (abfd, tmp, dst->e_phnum);
286
  H_PUT_16 (abfd, tmp, dst->e_phnum);
288
  H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
287
  H_PUT_16 (abfd, src->e_shentsize, dst->e_shentsize);
289
  tmp = src->e_shnum;
288
  tmp = src->e_shnum;
290
  if (tmp >= (SHN_LORESERVE & 0xffff))
289
  if (tmp >= (SHN_LORESERVE & 0xffff))
291
    tmp = SHN_UNDEF;
290
    tmp = SHN_UNDEF;
292
  H_PUT_16 (abfd, tmp, dst->e_shnum);
291
  H_PUT_16 (abfd, tmp, dst->e_shnum);
293
  tmp = src->e_shstrndx;
292
  tmp = src->e_shstrndx;
294
  if (tmp >= (SHN_LORESERVE & 0xffff))
293
  if (tmp >= (SHN_LORESERVE & 0xffff))
295
    tmp = SHN_XINDEX & 0xffff;
294
    tmp = SHN_XINDEX & 0xffff;
296
  H_PUT_16 (abfd, tmp, dst->e_shstrndx);
295
  H_PUT_16 (abfd, tmp, dst->e_shstrndx);
297
}
296
}
298
 
297
 
299
/* Translate an ELF section header table entry in external format into an
298
/* Translate an ELF section header table entry in external format into an
300
   ELF section header table entry in internal format.  */
299
   ELF section header table entry in internal format.  */
301
 
300
 
302
static void
301
static void
303
elf_swap_shdr_in (bfd *abfd,
302
elf_swap_shdr_in (bfd *abfd,
304
		  const Elf_External_Shdr *src,
303
		  const Elf_External_Shdr *src,
305
		  Elf_Internal_Shdr *dst)
304
		  Elf_Internal_Shdr *dst)
306
{
305
{
307
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
306
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
308
 
307
 
309
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
308
  dst->sh_name = H_GET_32 (abfd, src->sh_name);
310
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
309
  dst->sh_type = H_GET_32 (abfd, src->sh_type);
311
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
310
  dst->sh_flags = H_GET_WORD (abfd, src->sh_flags);
312
  if (signed_vma)
311
  if (signed_vma)
313
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
312
    dst->sh_addr = H_GET_SIGNED_WORD (abfd, src->sh_addr);
314
  else
313
  else
315
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
314
    dst->sh_addr = H_GET_WORD (abfd, src->sh_addr);
316
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
315
  dst->sh_offset = H_GET_WORD (abfd, src->sh_offset);
317
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
316
  dst->sh_size = H_GET_WORD (abfd, src->sh_size);
318
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
317
  dst->sh_link = H_GET_32 (abfd, src->sh_link);
319
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
318
  dst->sh_info = H_GET_32 (abfd, src->sh_info);
320
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
319
  dst->sh_addralign = H_GET_WORD (abfd, src->sh_addralign);
321
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
320
  dst->sh_entsize = H_GET_WORD (abfd, src->sh_entsize);
322
  dst->bfd_section = NULL;
321
  dst->bfd_section = NULL;
323
  dst->contents = NULL;
322
  dst->contents = NULL;
324
}
323
}
325
 
324
 
326
/* Translate an ELF section header table entry in internal format into an
325
/* Translate an ELF section header table entry in internal format into an
327
   ELF section header table entry in external format.  */
326
   ELF section header table entry in external format.  */
328
 
327
 
329
static void
328
static void
330
elf_swap_shdr_out (bfd *abfd,
329
elf_swap_shdr_out (bfd *abfd,
331
		   const Elf_Internal_Shdr *src,
330
		   const Elf_Internal_Shdr *src,
332
		   Elf_External_Shdr *dst)
331
		   Elf_External_Shdr *dst)
333
{
332
{
334
  /* note that all elements of dst are *arrays of unsigned char* already...  */
333
  /* note that all elements of dst are *arrays of unsigned char* already...  */
335
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
334
  H_PUT_32 (abfd, src->sh_name, dst->sh_name);
336
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
335
  H_PUT_32 (abfd, src->sh_type, dst->sh_type);
337
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
336
  H_PUT_WORD (abfd, src->sh_flags, dst->sh_flags);
338
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
337
  H_PUT_WORD (abfd, src->sh_addr, dst->sh_addr);
339
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
338
  H_PUT_WORD (abfd, src->sh_offset, dst->sh_offset);
340
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
339
  H_PUT_WORD (abfd, src->sh_size, dst->sh_size);
341
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
340
  H_PUT_32 (abfd, src->sh_link, dst->sh_link);
342
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
341
  H_PUT_32 (abfd, src->sh_info, dst->sh_info);
343
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
342
  H_PUT_WORD (abfd, src->sh_addralign, dst->sh_addralign);
344
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
343
  H_PUT_WORD (abfd, src->sh_entsize, dst->sh_entsize);
345
}
344
}
346
 
345
 
347
/* Translate an ELF program header table entry in external format into an
346
/* Translate an ELF program header table entry in external format into an
348
   ELF program header table entry in internal format.  */
347
   ELF program header table entry in internal format.  */
349
 
348
 
350
void
349
void
351
elf_swap_phdr_in (bfd *abfd,
350
elf_swap_phdr_in (bfd *abfd,
352
		  const Elf_External_Phdr *src,
351
		  const Elf_External_Phdr *src,
353
		  Elf_Internal_Phdr *dst)
352
		  Elf_Internal_Phdr *dst)
354
{
353
{
355
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
354
  int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma;
356
 
355
 
357
  dst->p_type = H_GET_32 (abfd, src->p_type);
356
  dst->p_type = H_GET_32 (abfd, src->p_type);
358
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
357
  dst->p_flags = H_GET_32 (abfd, src->p_flags);
359
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
358
  dst->p_offset = H_GET_WORD (abfd, src->p_offset);
360
  if (signed_vma)
359
  if (signed_vma)
361
    {
360
    {
362
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
361
      dst->p_vaddr = H_GET_SIGNED_WORD (abfd, src->p_vaddr);
363
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
362
      dst->p_paddr = H_GET_SIGNED_WORD (abfd, src->p_paddr);
364
    }
363
    }
365
  else
364
  else
366
    {
365
    {
367
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
366
      dst->p_vaddr = H_GET_WORD (abfd, src->p_vaddr);
368
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
367
      dst->p_paddr = H_GET_WORD (abfd, src->p_paddr);
369
    }
368
    }
370
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
369
  dst->p_filesz = H_GET_WORD (abfd, src->p_filesz);
371
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
370
  dst->p_memsz = H_GET_WORD (abfd, src->p_memsz);
372
  dst->p_align = H_GET_WORD (abfd, src->p_align);
371
  dst->p_align = H_GET_WORD (abfd, src->p_align);
373
}
372
}
374
 
373
 
375
void
374
void
376
elf_swap_phdr_out (bfd *abfd,
375
elf_swap_phdr_out (bfd *abfd,
377
		   const Elf_Internal_Phdr *src,
376
		   const Elf_Internal_Phdr *src,
378
		   Elf_External_Phdr *dst)
377
		   Elf_External_Phdr *dst)
379
{
378
{
380
  const struct elf_backend_data *bed;
379
  const struct elf_backend_data *bed;
381
  bfd_vma p_paddr;
380
  bfd_vma p_paddr;
382
 
381
 
383
  bed = get_elf_backend_data (abfd);
382
  bed = get_elf_backend_data (abfd);
384
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
383
  p_paddr = bed->want_p_paddr_set_to_zero ? 0 : src->p_paddr;
385
 
384
 
386
  /* note that all elements of dst are *arrays of unsigned char* already...  */
385
  /* note that all elements of dst are *arrays of unsigned char* already...  */
387
  H_PUT_32 (abfd, src->p_type, dst->p_type);
386
  H_PUT_32 (abfd, src->p_type, dst->p_type);
388
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
387
  H_PUT_WORD (abfd, src->p_offset, dst->p_offset);
389
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
388
  H_PUT_WORD (abfd, src->p_vaddr, dst->p_vaddr);
390
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
389
  H_PUT_WORD (abfd, p_paddr, dst->p_paddr);
391
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
390
  H_PUT_WORD (abfd, src->p_filesz, dst->p_filesz);
392
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
391
  H_PUT_WORD (abfd, src->p_memsz, dst->p_memsz);
393
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
392
  H_PUT_32 (abfd, src->p_flags, dst->p_flags);
394
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
393
  H_PUT_WORD (abfd, src->p_align, dst->p_align);
395
}
394
}
396
 
395
 
397
/* Translate an ELF reloc from external format to internal format.  */
396
/* Translate an ELF reloc from external format to internal format.  */
398
void
397
void
399
elf_swap_reloc_in (bfd *abfd,
398
elf_swap_reloc_in (bfd *abfd,
400
		   const bfd_byte *s,
399
		   const bfd_byte *s,
401
		   Elf_Internal_Rela *dst)
400
		   Elf_Internal_Rela *dst)
402
{
401
{
403
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
402
  const Elf_External_Rel *src = (const Elf_External_Rel *) s;
404
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
403
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
405
  dst->r_info = H_GET_WORD (abfd, src->r_info);
404
  dst->r_info = H_GET_WORD (abfd, src->r_info);
406
  dst->r_addend = 0;
405
  dst->r_addend = 0;
407
}
406
}
408
 
407
 
409
void
408
void
410
elf_swap_reloca_in (bfd *abfd,
409
elf_swap_reloca_in (bfd *abfd,
411
		    const bfd_byte *s,
410
		    const bfd_byte *s,
412
		    Elf_Internal_Rela *dst)
411
		    Elf_Internal_Rela *dst)
413
{
412
{
414
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
413
  const Elf_External_Rela *src = (const Elf_External_Rela *) s;
415
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
414
  dst->r_offset = H_GET_WORD (abfd, src->r_offset);
416
  dst->r_info = H_GET_WORD (abfd, src->r_info);
415
  dst->r_info = H_GET_WORD (abfd, src->r_info);
417
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
416
  dst->r_addend = H_GET_SIGNED_WORD (abfd, src->r_addend);
418
}
417
}
419
 
418
 
420
/* Translate an ELF reloc from internal format to external format.  */
419
/* Translate an ELF reloc from internal format to external format.  */
421
void
420
void
422
elf_swap_reloc_out (bfd *abfd,
421
elf_swap_reloc_out (bfd *abfd,
423
		    const Elf_Internal_Rela *src,
422
		    const Elf_Internal_Rela *src,
424
		    bfd_byte *d)
423
		    bfd_byte *d)
425
{
424
{
426
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
425
  Elf_External_Rel *dst = (Elf_External_Rel *) d;
427
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
426
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
428
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
427
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
429
}
428
}
430
 
429
 
431
void
430
void
432
elf_swap_reloca_out (bfd *abfd,
431
elf_swap_reloca_out (bfd *abfd,
433
		     const Elf_Internal_Rela *src,
432
		     const Elf_Internal_Rela *src,
434
		     bfd_byte *d)
433
		     bfd_byte *d)
435
{
434
{
436
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
435
  Elf_External_Rela *dst = (Elf_External_Rela *) d;
437
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
436
  H_PUT_WORD (abfd, src->r_offset, dst->r_offset);
438
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
437
  H_PUT_WORD (abfd, src->r_info, dst->r_info);
439
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
438
  H_PUT_SIGNED_WORD (abfd, src->r_addend, dst->r_addend);
440
}
439
}
441
 
440
 
442
void
441
void
443
elf_swap_dyn_in (bfd *abfd,
442
elf_swap_dyn_in (bfd *abfd,
444
		 const void *p,
443
		 const void *p,
445
		 Elf_Internal_Dyn *dst)
444
		 Elf_Internal_Dyn *dst)
446
{
445
{
447
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
446
  const Elf_External_Dyn *src = (const Elf_External_Dyn *) p;
448
 
447
 
449
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
448
  dst->d_tag = H_GET_WORD (abfd, src->d_tag);
450
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
449
  dst->d_un.d_val = H_GET_WORD (abfd, src->d_un.d_val);
451
}
450
}
452
 
451
 
453
void
452
void
454
elf_swap_dyn_out (bfd *abfd,
453
elf_swap_dyn_out (bfd *abfd,
455
		  const Elf_Internal_Dyn *src,
454
		  const Elf_Internal_Dyn *src,
456
		  void *p)
455
		  void *p)
457
{
456
{
458
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
457
  Elf_External_Dyn *dst = (Elf_External_Dyn *) p;
459
 
458
 
460
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
459
  H_PUT_WORD (abfd, src->d_tag, dst->d_tag);
461
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
460
  H_PUT_WORD (abfd, src->d_un.d_val, dst->d_un.d_val);
462
}
461
}
463

462

464
/* ELF .o/exec file reading */
463
/* ELF .o/exec file reading */
465
 
464
 
466
/* Begin processing a given object.
465
/* Begin processing a given object.
467
 
466
 
468
   First we validate the file by reading in the ELF header and checking
467
   First we validate the file by reading in the ELF header and checking
469
   the magic number.  */
468
   the magic number.  */
470
 
469
 
471
static inline bfd_boolean
470
static inline bfd_boolean
472
elf_file_p (Elf_External_Ehdr *x_ehdrp)
471
elf_file_p (Elf_External_Ehdr *x_ehdrp)
473
{
472
{
474
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
473
  return ((x_ehdrp->e_ident[EI_MAG0] == ELFMAG0)
475
	  && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
474
	  && (x_ehdrp->e_ident[EI_MAG1] == ELFMAG1)
476
	  && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
475
	  && (x_ehdrp->e_ident[EI_MAG2] == ELFMAG2)
477
	  && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
476
	  && (x_ehdrp->e_ident[EI_MAG3] == ELFMAG3));
478
}
477
}
479
 
478
 
480
/* Check to see if the file associated with ABFD matches the target vector
479
/* Check to see if the file associated with ABFD matches the target vector
481
   that ABFD points to.
480
   that ABFD points to.
482
 
481
 
483
   Note that we may be called several times with the same ABFD, but different
482
   Note that we may be called several times with the same ABFD, but different
484
   target vectors, most of which will not match.  We have to avoid leaving
483
   target vectors, most of which will not match.  We have to avoid leaving
485
   any side effects in ABFD, or any data it points to (like tdata), if the
484
   any side effects in ABFD, or any data it points to (like tdata), if the
486
   file does not match the target vector.  */
485
   file does not match the target vector.  */
487
 
486
 
488
const bfd_target *
487
const bfd_target *
489
elf_object_p (bfd *abfd)
488
elf_object_p (bfd *abfd)
490
{
489
{
491
  Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
490
  Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
492
  Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form */
491
  Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form */
493
  Elf_External_Shdr x_shdr;	/* Section header table entry, external form */
492
  Elf_External_Shdr x_shdr;	/* Section header table entry, external form */
494
  Elf_Internal_Shdr i_shdr;
493
  Elf_Internal_Shdr i_shdr;
495
  Elf_Internal_Shdr *i_shdrp;	/* Section header table, internal form */
494
  Elf_Internal_Shdr *i_shdrp;	/* Section header table, internal form */
496
  unsigned int shindex;
495
  unsigned int shindex;
497
  const struct elf_backend_data *ebd;
496
  const struct elf_backend_data *ebd;
498
  asection *s;
497
  asection *s;
499
  bfd_size_type amt;
498
  bfd_size_type amt;
500
  const bfd_target *target;
499
  const bfd_target *target;
501
 
500
 
502
  /* Read in the ELF header in external format.  */
501
  /* Read in the ELF header in external format.  */
503
 
502
 
504
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
503
  if (bfd_bread (&x_ehdr, sizeof (x_ehdr), abfd) != sizeof (x_ehdr))
505
    {
504
    {
506
      if (bfd_get_error () != bfd_error_system_call)
505
      if (bfd_get_error () != bfd_error_system_call)
507
	goto got_wrong_format_error;
506
	goto got_wrong_format_error;
508
      else
507
      else
509
	goto got_no_match;
508
	goto got_no_match;
510
    }
509
    }
511
 
510
 
512
  /* Now check to see if we have a valid ELF file, and one that BFD can
511
  /* Now check to see if we have a valid ELF file, and one that BFD can
513
     make use of.  The magic number must match, the address size ('class')
512
     make use of.  The magic number must match, the address size ('class')
514
     and byte-swapping must match our XVEC entry, and it must have a
513
     and byte-swapping must match our XVEC entry, and it must have a
515
     section header table (FIXME: See comments re sections at top of this
514
     section header table (FIXME: See comments re sections at top of this
516
     file).  */
515
     file).  */
517
 
516
 
518
  if (! elf_file_p (&x_ehdr)
517
  if (! elf_file_p (&x_ehdr)
519
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
518
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
520
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
519
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
521
    goto got_wrong_format_error;
520
    goto got_wrong_format_error;
522
 
521
 
523
  /* Check that file's byte order matches xvec's */
522
  /* Check that file's byte order matches xvec's */
524
  switch (x_ehdr.e_ident[EI_DATA])
523
  switch (x_ehdr.e_ident[EI_DATA])
525
    {
524
    {
526
    case ELFDATA2MSB:		/* Big-endian */
525
    case ELFDATA2MSB:		/* Big-endian */
527
      if (! bfd_header_big_endian (abfd))
526
      if (! bfd_header_big_endian (abfd))
528
	goto got_wrong_format_error;
527
	goto got_wrong_format_error;
529
      break;
528
      break;
530
    case ELFDATA2LSB:		/* Little-endian */
529
    case ELFDATA2LSB:		/* Little-endian */
531
      if (! bfd_header_little_endian (abfd))
530
      if (! bfd_header_little_endian (abfd))
532
	goto got_wrong_format_error;
531
	goto got_wrong_format_error;
533
      break;
532
      break;
534
    case ELFDATANONE:		/* No data encoding specified */
533
    case ELFDATANONE:		/* No data encoding specified */
535
    default:			/* Unknown data encoding specified */
534
    default:			/* Unknown data encoding specified */
536
      goto got_wrong_format_error;
535
      goto got_wrong_format_error;
537
    }
536
    }
538
 
537
 
539
  target = abfd->xvec;
538
  target = abfd->xvec;
540
 
539
 
541
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
540
  /* Allocate an instance of the elf_obj_tdata structure and hook it up to
542
     the tdata pointer in the bfd.  */
541
     the tdata pointer in the bfd.  */
543
 
542
 
544
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
543
  if (! (*target->_bfd_set_format[bfd_object]) (abfd))
545
    goto got_no_match;
544
    goto got_no_match;
546
 
545
 
547
  /* Now that we know the byte order, swap in the rest of the header */
546
  /* Now that we know the byte order, swap in the rest of the header */
548
  i_ehdrp = elf_elfheader (abfd);
547
  i_ehdrp = elf_elfheader (abfd);
549
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
548
  elf_swap_ehdr_in (abfd, &x_ehdr, i_ehdrp);
550
#if DEBUG & 1
549
#if DEBUG & 1
551
  elf_debug_file (i_ehdrp);
550
  elf_debug_file (i_ehdrp);
552
#endif
551
#endif
553
 
552
 
554
  /* Reject ET_CORE (header indicates core file, not object file) */
553
  /* Reject ET_CORE (header indicates core file, not object file) */
555
  if (i_ehdrp->e_type == ET_CORE)
554
  if (i_ehdrp->e_type == ET_CORE)
556
    goto got_wrong_format_error;
555
    goto got_wrong_format_error;
557
 
556
 
558
  /* If this is a relocatable file and there is no section header
557
  /* If this is a relocatable file and there is no section header
559
     table, then we're hosed.  */
558
     table, then we're hosed.  */
560
  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
559
  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_type == ET_REL)
561
    goto got_wrong_format_error;
560
    goto got_wrong_format_error;
562
 
561
 
563
  /* As a simple sanity check, verify that what BFD thinks is the
562
  /* As a simple sanity check, verify that what BFD thinks is the
564
     size of each section header table entry actually matches the size
563
     size of each section header table entry actually matches the size
565
     recorded in the file, but only if there are any sections.  */
564
     recorded in the file, but only if there are any sections.  */
566
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
565
  if (i_ehdrp->e_shentsize != sizeof (x_shdr) && i_ehdrp->e_shnum != 0)
567
    goto got_wrong_format_error;
566
    goto got_wrong_format_error;
568
 
567
 
569
  /* Further sanity check.  */
568
  /* Further sanity check.  */
570
  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_shnum != 0)
569
  if (i_ehdrp->e_shoff == 0 && i_ehdrp->e_shnum != 0)
571
    goto got_wrong_format_error;
570
    goto got_wrong_format_error;
572
 
571
 
573
  ebd = get_elf_backend_data (abfd);
572
  ebd = get_elf_backend_data (abfd);
574
  if (ebd->s->arch_size != ARCH_SIZE)
573
  if (ebd->s->arch_size != ARCH_SIZE)
575
    goto got_wrong_format_error;
574
    goto got_wrong_format_error;
576
 
575
 
577
  /* Check that the ELF e_machine field matches what this particular
576
  /* Check that the ELF e_machine field matches what this particular
578
     BFD format expects.  */
577
     BFD format expects.  */
579
  if (ebd->elf_machine_code != i_ehdrp->e_machine
578
  if (ebd->elf_machine_code != i_ehdrp->e_machine
580
      && (ebd->elf_machine_alt1 == 0
579
      && (ebd->elf_machine_alt1 == 0
581
	  || i_ehdrp->e_machine != ebd->elf_machine_alt1)
580
	  || i_ehdrp->e_machine != ebd->elf_machine_alt1)
582
      && (ebd->elf_machine_alt2 == 0
581
      && (ebd->elf_machine_alt2 == 0
583
	  || i_ehdrp->e_machine != ebd->elf_machine_alt2)
582
	  || i_ehdrp->e_machine != ebd->elf_machine_alt2)
584
      && ebd->elf_machine_code != EM_NONE)
583
      && ebd->elf_machine_code != EM_NONE)
585
    goto got_wrong_format_error;
584
    goto got_wrong_format_error;
586
 
585
 
587
  if (i_ehdrp->e_type == ET_EXEC)
586
  if (i_ehdrp->e_type == ET_EXEC)
588
    abfd->flags |= EXEC_P;
587
    abfd->flags |= EXEC_P;
589
  else if (i_ehdrp->e_type == ET_DYN)
588
  else if (i_ehdrp->e_type == ET_DYN)
590
    abfd->flags |= DYNAMIC;
589
    abfd->flags |= DYNAMIC;
591
 
590
 
592
  if (i_ehdrp->e_phnum > 0)
591
  if (i_ehdrp->e_phnum > 0)
593
    abfd->flags |= D_PAGED;
592
    abfd->flags |= D_PAGED;
594
 
593
 
595
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
594
  if (! bfd_default_set_arch_mach (abfd, ebd->arch, 0))
596
    {
595
    {
597
      /* It's OK if this fails for the generic target.  */
596
      /* It's OK if this fails for the generic target.  */
598
      if (ebd->elf_machine_code != EM_NONE)
597
      if (ebd->elf_machine_code != EM_NONE)
599
	goto got_no_match;
598
	goto got_no_match;
600
    }
599
    }
601
 
600
 
602
  if (ebd->elf_machine_code != EM_NONE
601
  if (ebd->elf_machine_code != EM_NONE
603
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
602
      && i_ehdrp->e_ident[EI_OSABI] != ebd->elf_osabi
604
      && ebd->elf_osabi != ELFOSABI_NONE)
603
      && ebd->elf_osabi != ELFOSABI_NONE)
605
    goto got_wrong_format_error;
604
    goto got_wrong_format_error;
606
 
605
 
607
  if (i_ehdrp->e_shoff != 0)
606
  if (i_ehdrp->e_shoff != 0)
608
    {
607
    {
609
      bfd_signed_vma where = i_ehdrp->e_shoff;
608
      file_ptr where = (file_ptr) i_ehdrp->e_shoff;
610
 
-
 
611
      if (where != (file_ptr) where)
-
 
612
	goto got_wrong_format_error;
-
 
613
 
609
 
614
      /* Seek to the section header table in the file.  */
610
      /* Seek to the section header table in the file.  */
615
      if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
611
      if (bfd_seek (abfd, where, SEEK_SET) != 0)
616
	goto got_no_match;
612
	goto got_no_match;
617
 
613
 
618
      /* Read the first section header at index 0, and convert to internal
614
      /* Read the first section header at index 0, and convert to internal
619
	 form.  */
615
	 form.  */
620
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
616
      if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
621
	goto got_no_match;
617
	goto got_no_match;
622
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
618
      elf_swap_shdr_in (abfd, &x_shdr, &i_shdr);
623
 
619
 
624
      /* If the section count is zero, the actual count is in the first
620
      /* If the section count is zero, the actual count is in the first
625
	 section header.  */
621
	 section header.  */
626
      if (i_ehdrp->e_shnum == SHN_UNDEF)
622
      if (i_ehdrp->e_shnum == SHN_UNDEF)
627
	{
623
	{
628
	  i_ehdrp->e_shnum = i_shdr.sh_size;
624
	  i_ehdrp->e_shnum = i_shdr.sh_size;
629
	  if (i_ehdrp->e_shnum >= SHN_LORESERVE
625
	  if (i_ehdrp->e_shnum >= SHN_LORESERVE
630
	      || i_ehdrp->e_shnum != i_shdr.sh_size
626
	      || i_ehdrp->e_shnum != i_shdr.sh_size
631
	      || i_ehdrp->e_shnum  == 0)
627
	      || i_ehdrp->e_shnum  == 0)
632
	    goto got_wrong_format_error;
628
	    goto got_wrong_format_error;
633
	}
629
	}
634
 
630
 
635
      /* And similarly for the string table index.  */
631
      /* And similarly for the string table index.  */
636
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
632
      if (i_ehdrp->e_shstrndx == (SHN_XINDEX & 0xffff))
637
	{
633
	{
638
	  i_ehdrp->e_shstrndx = i_shdr.sh_link;
634
	  i_ehdrp->e_shstrndx = i_shdr.sh_link;
639
	  if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
635
	  if (i_ehdrp->e_shstrndx != i_shdr.sh_link)
640
	    goto got_wrong_format_error;
636
	    goto got_wrong_format_error;
641
	}
637
	}
642
 
638
 
643
      /* And program headers.  */
639
      /* And program headers.  */
644
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
640
      if (i_ehdrp->e_phnum == PN_XNUM && i_shdr.sh_info != 0)
645
	{
641
	{
646
	  i_ehdrp->e_phnum = i_shdr.sh_info;
642
	  i_ehdrp->e_phnum = i_shdr.sh_info;
647
	  if (i_ehdrp->e_phnum != i_shdr.sh_info)
643
	  if (i_ehdrp->e_phnum != i_shdr.sh_info)
648
	    goto got_wrong_format_error;
644
	    goto got_wrong_format_error;
649
	}
645
	}
650
 
646
 
651
      /* Sanity check that we can read all of the section headers.
647
      /* Sanity check that we can read all of the section headers.
652
	 It ought to be good enough to just read the last one.  */
648
	 It ought to be good enough to just read the last one.  */
653
      if (i_ehdrp->e_shnum != 1)
649
      if (i_ehdrp->e_shnum != 1)
654
	{
650
	{
655
	  /* Check that we don't have a totally silly number of sections.  */
651
	  /* Check that we don't have a totally silly number of sections.  */
656
	  if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
652
	  if (i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (x_shdr)
657
	      || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
653
	      || i_ehdrp->e_shnum > (unsigned int) -1 / sizeof (i_shdr))
658
	    goto got_wrong_format_error;
654
	    goto got_wrong_format_error;
659
 
655
 
660
	  where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
656
	  where += (i_ehdrp->e_shnum - 1) * sizeof (x_shdr);
661
	  if (where != (file_ptr) where)
-
 
662
	    goto got_wrong_format_error;
-
 
663
	  if ((bfd_size_type) where <= i_ehdrp->e_shoff)
657
	  if ((bfd_size_type) where <= i_ehdrp->e_shoff)
664
	    goto got_wrong_format_error;
658
	    goto got_wrong_format_error;
665
 
659
 
666
	  if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
660
	  if (bfd_seek (abfd, where, SEEK_SET) != 0)
667
	    goto got_no_match;
661
	    goto got_no_match;
668
	  if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
662
	  if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
669
	    goto got_no_match;
663
	    goto got_no_match;
670
 
664
 
671
	  /* Back to where we were.  */
665
	  /* Back to where we were.  */
672
	  where = i_ehdrp->e_shoff + sizeof (x_shdr);
666
	  where = i_ehdrp->e_shoff + sizeof (x_shdr);
673
	  if (bfd_seek (abfd, (file_ptr) where, SEEK_SET) != 0)
667
	  if (bfd_seek (abfd, where, SEEK_SET) != 0)
674
	    goto got_no_match;
668
	    goto got_no_match;
675
	}
669
	}
676
    }
670
    }
677
 
671
 
678
  /* Allocate space for a copy of the section header table in
672
  /* Allocate space for a copy of the section header table in
679
     internal form.  */
673
     internal form.  */
680
  if (i_ehdrp->e_shnum != 0)
674
  if (i_ehdrp->e_shnum != 0)
681
    {
675
    {
682
      Elf_Internal_Shdr *shdrp;
676
      Elf_Internal_Shdr *shdrp;
683
      unsigned int num_sec;
677
      unsigned int num_sec;
-
 
678
 
-
 
679
#ifndef BFD64
-
 
680
      if (i_ehdrp->e_shnum > ((bfd_size_type) -1) / sizeof (*i_shdrp))
-
 
681
	goto got_wrong_format_error;
684
 
682
#endif
685
      amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
683
      amt = sizeof (*i_shdrp) * i_ehdrp->e_shnum;
686
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
684
      i_shdrp = (Elf_Internal_Shdr *) bfd_alloc (abfd, amt);
687
      if (!i_shdrp)
685
      if (!i_shdrp)
688
	goto got_no_match;
686
	goto got_no_match;
689
      num_sec = i_ehdrp->e_shnum;
687
      num_sec = i_ehdrp->e_shnum;
690
      elf_numsections (abfd) = num_sec;
688
      elf_numsections (abfd) = num_sec;
691
      amt = sizeof (i_shdrp) * num_sec;
689
      amt = sizeof (i_shdrp) * num_sec;
692
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
690
      elf_elfsections (abfd) = (Elf_Internal_Shdr **) bfd_alloc (abfd, amt);
693
      if (!elf_elfsections (abfd))
691
      if (!elf_elfsections (abfd))
694
	goto got_no_match;
692
	goto got_no_match;
695
 
693
 
696
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
694
      memcpy (i_shdrp, &i_shdr, sizeof (*i_shdrp));
697
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
695
      for (shdrp = i_shdrp, shindex = 0; shindex < num_sec; shindex++)
698
	elf_elfsections (abfd)[shindex] = shdrp++;
696
	elf_elfsections (abfd)[shindex] = shdrp++;
699
 
697
 
700
      /* Read in the rest of the section header table and convert it
698
      /* Read in the rest of the section header table and convert it
701
	 to internal form.  */
699
	 to internal form.  */
702
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
700
      for (shindex = 1; shindex < i_ehdrp->e_shnum; shindex++)
703
	{
701
	{
704
	  if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
702
	  if (bfd_bread (&x_shdr, sizeof x_shdr, abfd) != sizeof (x_shdr))
705
	    goto got_no_match;
703
	    goto got_no_match;
706
	  elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
704
	  elf_swap_shdr_in (abfd, &x_shdr, i_shdrp + shindex);
707
 
705
 
708
	  /* Sanity check sh_link and sh_info.  */
706
	  /* Sanity check sh_link and sh_info.  */
709
	  if (i_shdrp[shindex].sh_link >= num_sec)
707
	  if (i_shdrp[shindex].sh_link >= num_sec)
710
	    {
708
	    {
711
	      /* PR 10478: Accept Solaris binaries with a sh_link
709
	      /* PR 10478: Accept Solaris binaries with a sh_link
712
		 field set to SHN_BEFORE or SHN_AFTER.  */
710
		 field set to SHN_BEFORE or SHN_AFTER.  */
713
	      switch (ebd->elf_machine_code)
711
	      switch (ebd->elf_machine_code)
714
		{
712
		{
715
		case EM_386:
713
		case EM_386:
716
		case EM_486:
714
		case EM_IAMCU:
717
		case EM_X86_64:
715
		case EM_X86_64:
718
		case EM_OLD_SPARCV9:
716
		case EM_OLD_SPARCV9:
719
		case EM_SPARC32PLUS:
717
		case EM_SPARC32PLUS:
720
		case EM_SPARCV9:
718
		case EM_SPARCV9:
721
		case EM_SPARC:
719
		case EM_SPARC:
722
		  if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
720
		  if (i_shdrp[shindex].sh_link == (SHN_LORESERVE & 0xffff) /* SHN_BEFORE */
723
		      || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
721
		      || i_shdrp[shindex].sh_link == ((SHN_LORESERVE + 1) & 0xffff) /* SHN_AFTER */)
724
		    break;
722
		    break;
725
		  /* Otherwise fall through.  */
723
		  /* Otherwise fall through.  */
726
		default:
724
		default:
727
		  goto got_wrong_format_error;
725
		  goto got_wrong_format_error;
728
		}
726
		}
729
	    }
727
	    }
730
 
728
 
731
	  if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
729
	  if (((i_shdrp[shindex].sh_flags & SHF_INFO_LINK)
732
	       || i_shdrp[shindex].sh_type == SHT_RELA
730
	       || i_shdrp[shindex].sh_type == SHT_RELA
733
	       || i_shdrp[shindex].sh_type == SHT_REL)
731
	       || i_shdrp[shindex].sh_type == SHT_REL)
734
	      && i_shdrp[shindex].sh_info >= num_sec)
732
	      && i_shdrp[shindex].sh_info >= num_sec)
735
	    goto got_wrong_format_error;
733
	    goto got_wrong_format_error;
736
 
734
 
737
	  /* If the section is loaded, but not page aligned, clear
735
	  /* If the section is loaded, but not page aligned, clear
738
	     D_PAGED.  */
736
	     D_PAGED.  */
739
	  if (i_shdrp[shindex].sh_size != 0
737
	  if (i_shdrp[shindex].sh_size != 0
740
	      && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
738
	      && (i_shdrp[shindex].sh_flags & SHF_ALLOC) != 0
741
	      && i_shdrp[shindex].sh_type != SHT_NOBITS
739
	      && i_shdrp[shindex].sh_type != SHT_NOBITS
742
	      && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
740
	      && (((i_shdrp[shindex].sh_addr - i_shdrp[shindex].sh_offset)
743
		   % ebd->minpagesize)
741
		   % ebd->minpagesize)
744
		  != 0))
742
		  != 0))
745
	    abfd->flags &= ~D_PAGED;
743
	    abfd->flags &= ~D_PAGED;
746
	}
744
	}
747
    }
745
    }
748
 
746
 
749
  /* A further sanity check.  */
747
  /* A further sanity check.  */
750
  if (i_ehdrp->e_shnum != 0)
748
  if (i_ehdrp->e_shnum != 0)
751
    {
749
    {
752
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd))
750
      if (i_ehdrp->e_shstrndx >= elf_numsections (abfd))
753
	{
751
	{
754
	  /* PR 2257:
752
	  /* PR 2257:
755
	     We used to just goto got_wrong_format_error here
753
	     We used to just goto got_wrong_format_error here
756
	     but there are binaries in existance for which this test
754
	     but there are binaries in existance for which this test
757
	     will prevent the binutils from working with them at all.
755
	     will prevent the binutils from working with them at all.
758
	     So we are kind, and reset the string index value to 0
756
	     So we are kind, and reset the string index value to 0
759
	     so that at least some processing can be done.  */
757
	     so that at least some processing can be done.  */
760
	  i_ehdrp->e_shstrndx = SHN_UNDEF;
758
	  i_ehdrp->e_shstrndx = SHN_UNDEF;
761
	  _bfd_error_handler (_("warning: %s has a corrupt string table index - ignoring"), abfd->filename);
759
	  _bfd_error_handler (_("warning: %s has a corrupt string table index - ignoring"), abfd->filename);
762
	}
760
	}
763
    }
761
    }
764
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
762
  else if (i_ehdrp->e_shstrndx != SHN_UNDEF)
765
    goto got_wrong_format_error;
763
    goto got_wrong_format_error;
766
 
764
 
767
  /* Read in the program headers.  */
765
  /* Read in the program headers.  */
768
  if (i_ehdrp->e_phnum == 0)
766
  if (i_ehdrp->e_phnum == 0)
769
    elf_tdata (abfd)->phdr = NULL;
767
    elf_tdata (abfd)->phdr = NULL;
770
  else
768
  else
771
    {
769
    {
772
      Elf_Internal_Phdr *i_phdr;
770
      Elf_Internal_Phdr *i_phdr;
773
      unsigned int i;
771
      unsigned int i;
-
 
772
 
-
 
773
#ifndef BFD64
-
 
774
      if (i_ehdrp->e_phnum > ((bfd_size_type) -1) / sizeof (*i_phdr))
-
 
775
	goto got_wrong_format_error;
774
 
776
#endif
775
      amt = i_ehdrp->e_phnum * sizeof (Elf_Internal_Phdr);
777
      amt = i_ehdrp->e_phnum * sizeof (*i_phdr);
776
      elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
778
      elf_tdata (abfd)->phdr = (Elf_Internal_Phdr *) bfd_alloc (abfd, amt);
777
      if (elf_tdata (abfd)->phdr == NULL)
779
      if (elf_tdata (abfd)->phdr == NULL)
778
	goto got_no_match;
780
	goto got_no_match;
779
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
781
      if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_phoff, SEEK_SET) != 0)
780
	goto got_no_match;
782
	goto got_no_match;
781
      i_phdr = elf_tdata (abfd)->phdr;
783
      i_phdr = elf_tdata (abfd)->phdr;
782
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
784
      for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
783
	{
785
	{
784
	  Elf_External_Phdr x_phdr;
786
	  Elf_External_Phdr x_phdr;
785
 
787
 
786
	  if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
788
	  if (bfd_bread (&x_phdr, sizeof x_phdr, abfd) != sizeof x_phdr)
787
	    goto got_no_match;
789
	    goto got_no_match;
788
	  elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
790
	  elf_swap_phdr_in (abfd, &x_phdr, i_phdr);
789
	}
791
	}
790
    }
792
    }
791
 
793
 
792
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
794
  if (i_ehdrp->e_shstrndx != 0 && i_ehdrp->e_shoff != 0)
793
    {
795
    {
794
      unsigned int num_sec;
796
      unsigned int num_sec;
795
 
797
 
796
      /* Once all of the section headers have been read and converted, we
798
      /* Once all of the section headers have been read and converted, we
797
	 can start processing them.  Note that the first section header is
799
	 can start processing them.  Note that the first section header is
798
	 a dummy placeholder entry, so we ignore it.  */
800
	 a dummy placeholder entry, so we ignore it.  */
799
      num_sec = elf_numsections (abfd);
801
      num_sec = elf_numsections (abfd);
800
      for (shindex = 1; shindex < num_sec; shindex++)
802
      for (shindex = 1; shindex < num_sec; shindex++)
801
	if (!bfd_section_from_shdr (abfd, shindex))
803
	if (!bfd_section_from_shdr (abfd, shindex))
802
	  goto got_no_match;
804
	  goto got_no_match;
803
 
805
 
804
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
806
      /* Set up ELF sections for SHF_GROUP and SHF_LINK_ORDER.  */
805
      if (! _bfd_elf_setup_sections (abfd))
807
      if (! _bfd_elf_setup_sections (abfd))
806
	goto got_wrong_format_error;
808
	goto got_wrong_format_error;
807
    }
809
    }
808
 
810
 
809
  /* Let the backend double check the format and override global
811
  /* Let the backend double check the format and override global
810
     information.  */
812
     information.  */
811
  if (ebd->elf_backend_object_p)
813
  if (ebd->elf_backend_object_p)
812
    {
814
    {
813
      if (! (*ebd->elf_backend_object_p) (abfd))
815
      if (! (*ebd->elf_backend_object_p) (abfd))
814
	goto got_wrong_format_error;
816
	goto got_wrong_format_error;
815
    }
817
    }
816
 
818
 
817
  /* Remember the entry point specified in the ELF file header.  */
819
  /* Remember the entry point specified in the ELF file header.  */
818
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
820
  bfd_set_start_address (abfd, i_ehdrp->e_entry);
819
 
821
 
820
  /* If we have created any reloc sections that are associated with
822
  /* If we have created any reloc sections that are associated with
821
     debugging sections, mark the reloc sections as debugging as well.  */
823
     debugging sections, mark the reloc sections as debugging as well.  */
822
  for (s = abfd->sections; s != NULL; s = s->next)
824
  for (s = abfd->sections; s != NULL; s = s->next)
823
    {
825
    {
824
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
826
      if ((elf_section_data (s)->this_hdr.sh_type == SHT_REL
825
	   || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
827
	   || elf_section_data (s)->this_hdr.sh_type == SHT_RELA)
826
	  && elf_section_data (s)->this_hdr.sh_info > 0)
828
	  && elf_section_data (s)->this_hdr.sh_info > 0)
827
	{
829
	{
828
	  unsigned long targ_index;
830
	  unsigned long targ_index;
829
	  asection *targ_sec;
831
	  asection *targ_sec;
830
 
832
 
831
	  targ_index = elf_section_data (s)->this_hdr.sh_info;
833
	  targ_index = elf_section_data (s)->this_hdr.sh_info;
832
	  targ_sec = bfd_section_from_elf_index (abfd, targ_index);
834
	  targ_sec = bfd_section_from_elf_index (abfd, targ_index);
833
	  if (targ_sec != NULL
835
	  if (targ_sec != NULL
834
	      && (targ_sec->flags & SEC_DEBUGGING) != 0)
836
	      && (targ_sec->flags & SEC_DEBUGGING) != 0)
835
	    s->flags |= SEC_DEBUGGING;
837
	    s->flags |= SEC_DEBUGGING;
836
	}
838
	}
837
    }
839
    }
838
  return target;
840
  return target;
839
 
841
 
840
 got_wrong_format_error:
842
 got_wrong_format_error:
841
  bfd_set_error (bfd_error_wrong_format);
843
  bfd_set_error (bfd_error_wrong_format);
842
 
844
 
843
 got_no_match:
845
 got_no_match:
844
  return NULL;
846
  return NULL;
845
}
847
}
846

848

847
/* ELF .o/exec file writing */
849
/* ELF .o/exec file writing */
848
 
850
 
849
/* Write out the relocs.  */
851
/* Write out the relocs.  */
850
 
852
 
851
void
853
void
852
elf_write_relocs (bfd *abfd, asection *sec, void *data)
854
elf_write_relocs (bfd *abfd, asection *sec, void *data)
853
{
855
{
854
  bfd_boolean *failedp = (bfd_boolean *) data;
856
  bfd_boolean *failedp = (bfd_boolean *) data;
855
  Elf_Internal_Shdr *rela_hdr;
857
  Elf_Internal_Shdr *rela_hdr;
856
  bfd_vma addr_offset;
858
  bfd_vma addr_offset;
857
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
859
  void (*swap_out) (bfd *, const Elf_Internal_Rela *, bfd_byte *);
858
  size_t extsize;
860
  size_t extsize;
859
  bfd_byte *dst_rela;
861
  bfd_byte *dst_rela;
860
  unsigned int idx;
862
  unsigned int idx;
861
  asymbol *last_sym;
863
  asymbol *last_sym;
862
  int last_sym_idx;
864
  int last_sym_idx;
863
 
865
 
864
  /* If we have already failed, don't do anything.  */
866
  /* If we have already failed, don't do anything.  */
865
  if (*failedp)
867
  if (*failedp)
866
    return;
868
    return;
867
 
869
 
868
  if ((sec->flags & SEC_RELOC) == 0)
870
  if ((sec->flags & SEC_RELOC) == 0)
869
    return;
871
    return;
870
 
872
 
871
  /* The linker backend writes the relocs out itself, and sets the
873
  /* The linker backend writes the relocs out itself, and sets the
872
     reloc_count field to zero to inhibit writing them here.  Also,
874
     reloc_count field to zero to inhibit writing them here.  Also,
873
     sometimes the SEC_RELOC flag gets set even when there aren't any
875
     sometimes the SEC_RELOC flag gets set even when there aren't any
874
     relocs.  */
876
     relocs.  */
875
  if (sec->reloc_count == 0)
877
  if (sec->reloc_count == 0)
876
    return;
878
    return;
877
 
879
 
878
  /* If we have opened an existing file for update, reloc_count may be
880
  /* If we have opened an existing file for update, reloc_count may be
879
     set even though we are not linking.  In that case we have nothing
881
     set even though we are not linking.  In that case we have nothing
880
     to do.  */
882
     to do.  */
881
  if (sec->orelocation == NULL)
883
  if (sec->orelocation == NULL)
882
    return;
884
    return;
883
 
885
 
884
  rela_hdr = elf_section_data (sec)->rela.hdr;
886
  rela_hdr = elf_section_data (sec)->rela.hdr;
885
  if (rela_hdr == NULL)
887
  if (rela_hdr == NULL)
886
    rela_hdr = elf_section_data (sec)->rel.hdr;
888
    rela_hdr = elf_section_data (sec)->rel.hdr;
887
 
889
 
888
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
890
  rela_hdr->sh_size = rela_hdr->sh_entsize * sec->reloc_count;
889
  rela_hdr->contents = (unsigned char *) bfd_alloc (abfd, rela_hdr->sh_size);
891
  rela_hdr->contents = (unsigned char *) bfd_alloc (abfd, rela_hdr->sh_size);
890
  if (rela_hdr->contents == NULL)
892
  if (rela_hdr->contents == NULL)
891
    {
893
    {
892
      *failedp = TRUE;
894
      *failedp = TRUE;
893
      return;
895
      return;
894
    }
896
    }
895
 
897
 
896
  /* Figure out whether the relocations are RELA or REL relocations.  */
898
  /* Figure out whether the relocations are RELA or REL relocations.  */
897
  if (rela_hdr->sh_type == SHT_RELA)
899
  if (rela_hdr->sh_type == SHT_RELA)
898
    {
900
    {
899
      swap_out = elf_swap_reloca_out;
901
      swap_out = elf_swap_reloca_out;
900
      extsize = sizeof (Elf_External_Rela);
902
      extsize = sizeof (Elf_External_Rela);
901
    }
903
    }
902
  else if (rela_hdr->sh_type == SHT_REL)
904
  else if (rela_hdr->sh_type == SHT_REL)
903
    {
905
    {
904
      swap_out = elf_swap_reloc_out;
906
      swap_out = elf_swap_reloc_out;
905
      extsize = sizeof (Elf_External_Rel);
907
      extsize = sizeof (Elf_External_Rel);
906
    }
908
    }
907
  else
909
  else
908
    /* Every relocation section should be either an SHT_RELA or an
910
    /* Every relocation section should be either an SHT_RELA or an
909
       SHT_REL section.  */
911
       SHT_REL section.  */
910
    abort ();
912
    abort ();
911
 
913
 
912
  /* The address of an ELF reloc is section relative for an object
914
  /* The address of an ELF reloc is section relative for an object
913
     file, and absolute for an executable file or shared library.
915
     file, and absolute for an executable file or shared library.
914
     The address of a BFD reloc is always section relative.  */
916
     The address of a BFD reloc is always section relative.  */
915
  addr_offset = 0;
917
  addr_offset = 0;
916
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
918
  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
917
    addr_offset = sec->vma;
919
    addr_offset = sec->vma;
918
 
920
 
919
  /* orelocation has the data, reloc_count has the count...  */
921
  /* orelocation has the data, reloc_count has the count...  */
920
  last_sym = 0;
922
  last_sym = 0;
921
  last_sym_idx = 0;
923
  last_sym_idx = 0;
922
  dst_rela = rela_hdr->contents;
924
  dst_rela = rela_hdr->contents;
923
 
925
 
924
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
926
  for (idx = 0; idx < sec->reloc_count; idx++, dst_rela += extsize)
925
    {
927
    {
926
      Elf_Internal_Rela src_rela;
928
      Elf_Internal_Rela src_rela;
927
      arelent *ptr;
929
      arelent *ptr;
928
      asymbol *sym;
930
      asymbol *sym;
929
      int n;
931
      int n;
930
 
932
 
931
      ptr = sec->orelocation[idx];
933
      ptr = sec->orelocation[idx];
932
      sym = *ptr->sym_ptr_ptr;
934
      sym = *ptr->sym_ptr_ptr;
933
      if (sym == last_sym)
935
      if (sym == last_sym)
934
	n = last_sym_idx;
936
	n = last_sym_idx;
935
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
937
      else if (bfd_is_abs_section (sym->section) && sym->value == 0)
936
	n = STN_UNDEF;
938
	n = STN_UNDEF;
937
      else
939
      else
938
	{
940
	{
939
	  last_sym = sym;
941
	  last_sym = sym;
940
	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
942
	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
941
	  if (n < 0)
943
	  if (n < 0)
942
	    {
944
	    {
943
	      *failedp = TRUE;
945
	      *failedp = TRUE;
944
	      return;
946
	      return;
945
	    }
947
	    }
946
	  last_sym_idx = n;
948
	  last_sym_idx = n;
947
	}
949
	}
948
 
950
 
949
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
951
      if ((*ptr->sym_ptr_ptr)->the_bfd != NULL
950
	  && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
952
	  && (*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
951
	  && ! _bfd_elf_validate_reloc (abfd, ptr))
953
	  && ! _bfd_elf_validate_reloc (abfd, ptr))
952
	{
954
	{
953
	  *failedp = TRUE;
955
	  *failedp = TRUE;
954
	  return;
956
	  return;
955
	}
957
	}
956
 
958
 
957
      src_rela.r_offset = ptr->address + addr_offset;
959
      src_rela.r_offset = ptr->address + addr_offset;
958
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
960
      src_rela.r_info = ELF_R_INFO (n, ptr->howto->type);
959
      src_rela.r_addend = ptr->addend;
961
      src_rela.r_addend = ptr->addend;
960
      (*swap_out) (abfd, &src_rela, dst_rela);
962
      (*swap_out) (abfd, &src_rela, dst_rela);
961
    }
963
    }
962
}
964
}
963
 
965
 
964
/* Write out the program headers.  */
966
/* Write out the program headers.  */
965
 
967
 
966
int
968
int
967
elf_write_out_phdrs (bfd *abfd,
969
elf_write_out_phdrs (bfd *abfd,
968
		     const Elf_Internal_Phdr *phdr,
970
		     const Elf_Internal_Phdr *phdr,
969
		     unsigned int count)
971
		     unsigned int count)
970
{
972
{
971
  while (count--)
973
  while (count--)
972
    {
974
    {
973
      Elf_External_Phdr extphdr;
975
      Elf_External_Phdr extphdr;
974
      elf_swap_phdr_out (abfd, phdr, &extphdr);
976
      elf_swap_phdr_out (abfd, phdr, &extphdr);
975
      if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
977
      if (bfd_bwrite (&extphdr, sizeof (Elf_External_Phdr), abfd)
976
	  != sizeof (Elf_External_Phdr))
978
	  != sizeof (Elf_External_Phdr))
977
	return -1;
979
	return -1;
978
      phdr++;
980
      phdr++;
979
    }
981
    }
980
  return 0;
982
  return 0;
981
}
983
}
982
 
984
 
983
/* Write out the section headers and the ELF file header.  */
985
/* Write out the section headers and the ELF file header.  */
984
 
986
 
985
bfd_boolean
987
bfd_boolean
986
elf_write_shdrs_and_ehdr (bfd *abfd)
988
elf_write_shdrs_and_ehdr (bfd *abfd)
987
{
989
{
988
  Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
990
  Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
989
  Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form */
991
  Elf_Internal_Ehdr *i_ehdrp;	/* Elf file header, internal form */
990
  Elf_External_Shdr *x_shdrp;	/* Section header table, external form */
992
  Elf_External_Shdr *x_shdrp;	/* Section header table, external form */
991
  Elf_Internal_Shdr **i_shdrp;	/* Section header table, internal form */
993
  Elf_Internal_Shdr **i_shdrp;	/* Section header table, internal form */
992
  unsigned int count;
994
  unsigned int count;
993
  bfd_size_type amt;
995
  bfd_size_type amt;
994
 
996
 
995
  i_ehdrp = elf_elfheader (abfd);
997
  i_ehdrp = elf_elfheader (abfd);
996
  i_shdrp = elf_elfsections (abfd);
998
  i_shdrp = elf_elfsections (abfd);
997
 
999
 
998
  /* swap the header before spitting it out...  */
1000
  /* swap the header before spitting it out...  */
999
 
1001
 
1000
#if DEBUG & 1
1002
#if DEBUG & 1
1001
  elf_debug_file (i_ehdrp);
1003
  elf_debug_file (i_ehdrp);
1002
#endif
1004
#endif
1003
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1005
  elf_swap_ehdr_out (abfd, i_ehdrp, &x_ehdr);
1004
  amt = sizeof (x_ehdr);
1006
  amt = sizeof (x_ehdr);
1005
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1007
  if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
1006
      || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
1008
      || bfd_bwrite (&x_ehdr, amt, abfd) != amt)
1007
    return FALSE;
1009
    return FALSE;
1008
 
1010
 
1009
  /* Some fields in the first section header handle overflow of ehdr
1011
  /* Some fields in the first section header handle overflow of ehdr
1010
     fields.  */
1012
     fields.  */
1011
  if (i_ehdrp->e_phnum >= PN_XNUM)
1013
  if (i_ehdrp->e_phnum >= PN_XNUM)
1012
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1014
    i_shdrp[0]->sh_info = i_ehdrp->e_phnum;
1013
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1015
  if (i_ehdrp->e_shnum >= (SHN_LORESERVE & 0xffff))
1014
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1016
    i_shdrp[0]->sh_size = i_ehdrp->e_shnum;
1015
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1017
  if (i_ehdrp->e_shstrndx >= (SHN_LORESERVE & 0xffff))
1016
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1018
    i_shdrp[0]->sh_link = i_ehdrp->e_shstrndx;
1017
 
1019
 
1018
  /* at this point we've concocted all the ELF sections...  */
1020
  /* at this point we've concocted all the ELF sections...  */
1019
  amt = i_ehdrp->e_shnum;
1021
  amt = i_ehdrp->e_shnum;
1020
  amt *= sizeof (*x_shdrp);
1022
  amt *= sizeof (*x_shdrp);
1021
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1023
  x_shdrp = (Elf_External_Shdr *) bfd_alloc (abfd, amt);
1022
  if (!x_shdrp)
1024
  if (!x_shdrp)
1023
    return FALSE;
1025
    return FALSE;
1024
 
1026
 
1025
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1027
  for (count = 0; count < i_ehdrp->e_shnum; i_shdrp++, count++)
1026
    {
1028
    {
1027
#if DEBUG & 2
1029
#if DEBUG & 2
1028
      elf_debug_section (count, *i_shdrp);
1030
      elf_debug_section (count, *i_shdrp);
1029
#endif
1031
#endif
1030
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1032
      elf_swap_shdr_out (abfd, *i_shdrp, x_shdrp + count);
1031
    }
1033
    }
1032
  if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1034
  if (bfd_seek (abfd, (file_ptr) i_ehdrp->e_shoff, SEEK_SET) != 0
1033
      || bfd_bwrite (x_shdrp, amt, abfd) != amt)
1035
      || bfd_bwrite (x_shdrp, amt, abfd) != amt)
1034
    return FALSE;
1036
    return FALSE;
1035
 
1037
 
1036
  /* need to dump the string table too...  */
1038
  /* need to dump the string table too...  */
1037
 
1039
 
1038
  return TRUE;
1040
  return TRUE;
1039
}
1041
}
1040
 
1042
 
1041
bfd_boolean
1043
bfd_boolean
1042
elf_checksum_contents (bfd *abfd,
1044
elf_checksum_contents (bfd *abfd,
1043
		       void (*process) (const void *, size_t, void *),
1045
		       void (*process) (const void *, size_t, void *),
1044
		       void *arg)
1046
		       void *arg)
1045
{
1047
{
1046
  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1048
  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
1047
  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1049
  Elf_Internal_Shdr **i_shdrp = elf_elfsections (abfd);
1048
  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1050
  Elf_Internal_Phdr *i_phdrp = elf_tdata (abfd)->phdr;
1049
  unsigned int count, num;
1051
  unsigned int count, num;
1050
 
1052
 
1051
  {
1053
  {
1052
    Elf_External_Ehdr x_ehdr;
1054
    Elf_External_Ehdr x_ehdr;
1053
    Elf_Internal_Ehdr i_ehdr;
1055
    Elf_Internal_Ehdr i_ehdr;
1054
 
1056
 
1055
    i_ehdr = *i_ehdrp;
1057
    i_ehdr = *i_ehdrp;
1056
    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1058
    i_ehdr.e_phoff = i_ehdr.e_shoff = 0;
1057
    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1059
    elf_swap_ehdr_out (abfd, &i_ehdr, &x_ehdr);
1058
    (*process) (&x_ehdr, sizeof x_ehdr, arg);
1060
    (*process) (&x_ehdr, sizeof x_ehdr, arg);
1059
  }
1061
  }
1060
 
1062
 
1061
  num = i_ehdrp->e_phnum;
1063
  num = i_ehdrp->e_phnum;
1062
  for (count = 0; count < num; count++)
1064
  for (count = 0; count < num; count++)
1063
    {
1065
    {
1064
      Elf_External_Phdr x_phdr;
1066
      Elf_External_Phdr x_phdr;
1065
      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1067
      elf_swap_phdr_out (abfd, &i_phdrp[count], &x_phdr);
1066
      (*process) (&x_phdr, sizeof x_phdr, arg);
1068
      (*process) (&x_phdr, sizeof x_phdr, arg);
1067
    }
1069
    }
1068
 
1070
 
1069
  num = elf_numsections (abfd);
1071
  num = elf_numsections (abfd);
1070
  for (count = 0; count < num; count++)
1072
  for (count = 0; count < num; count++)
1071
    {
1073
    {
1072
      Elf_Internal_Shdr i_shdr;
1074
      Elf_Internal_Shdr i_shdr;
1073
      Elf_External_Shdr x_shdr;
1075
      Elf_External_Shdr x_shdr;
1074
      bfd_byte *contents, *free_contents;
1076
      bfd_byte *contents, *free_contents;
1075
 
1077
 
1076
      i_shdr = *i_shdrp[count];
1078
      i_shdr = *i_shdrp[count];
1077
      i_shdr.sh_offset = 0;
1079
      i_shdr.sh_offset = 0;
1078
 
1080
 
1079
      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1081
      elf_swap_shdr_out (abfd, &i_shdr, &x_shdr);
1080
      (*process) (&x_shdr, sizeof x_shdr, arg);
1082
      (*process) (&x_shdr, sizeof x_shdr, arg);
1081
 
1083
 
1082
      /* Process the section's contents, if it has some.
1084
      /* Process the section's contents, if it has some.
1083
	 PR ld/12451: Read them in if necessary.  */
1085
	 PR ld/12451: Read them in if necessary.  */
1084
      if (i_shdr.sh_type == SHT_NOBITS)
1086
      if (i_shdr.sh_type == SHT_NOBITS)
1085
	continue;
1087
	continue;
1086
      free_contents = NULL;
1088
      free_contents = NULL;
1087
      contents = i_shdr.contents;
1089
      contents = i_shdr.contents;
1088
      if (contents == NULL)
1090
      if (contents == NULL)
1089
	{
1091
	{
1090
	  asection *sec;
1092
	  asection *sec;
1091
 
1093
 
1092
	  sec = bfd_section_from_elf_index (abfd, count);
1094
	  sec = bfd_section_from_elf_index (abfd, count);
1093
	  if (sec != NULL)
1095
	  if (sec != NULL)
1094
	    {
1096
	    {
1095
	      contents = sec->contents;
1097
	      contents = sec->contents;
1096
	      if (contents == NULL)
1098
	      if (contents == NULL)
1097
		{
1099
		{
1098
		  /* Force rereading from file.  */
1100
		  /* Force rereading from file.  */
1099
		  sec->flags &= ~SEC_IN_MEMORY;
1101
		  sec->flags &= ~SEC_IN_MEMORY;
1100
		  if (!bfd_malloc_and_get_section (abfd, sec, &free_contents))
1102
		  if (!bfd_malloc_and_get_section (abfd, sec, &free_contents))
1101
		    continue;
1103
		    continue;
1102
		  contents = free_contents;
1104
		  contents = free_contents;
1103
		}
1105
		}
1104
	    }
1106
	    }
1105
	}
1107
	}
1106
      if (contents != NULL)
1108
      if (contents != NULL)
1107
	{
1109
	{
1108
	  (*process) (contents, i_shdr.sh_size, arg);
1110
	  (*process) (contents, i_shdr.sh_size, arg);
1109
	  if (free_contents != NULL)
1111
	  if (free_contents != NULL)
1110
	    free (free_contents);
1112
	    free (free_contents);
1111
	}
1113
	}
1112
    }
1114
    }
1113
 
1115
 
1114
  return TRUE;
1116
  return TRUE;
1115
}
1117
}
1116
 
1118
 
1117
long
1119
long
1118
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
1120
elf_slurp_symbol_table (bfd *abfd, asymbol **symptrs, bfd_boolean dynamic)
1119
{
1121
{
1120
  Elf_Internal_Shdr *hdr;
1122
  Elf_Internal_Shdr *hdr;
1121
  Elf_Internal_Shdr *verhdr;
1123
  Elf_Internal_Shdr *verhdr;
1122
  unsigned long symcount;	/* Number of external ELF symbols */
1124
  unsigned long symcount;	/* Number of external ELF symbols */
1123
  elf_symbol_type *sym;		/* Pointer to current bfd symbol */
1125
  elf_symbol_type *sym;		/* Pointer to current bfd symbol */
1124
  elf_symbol_type *symbase;	/* Buffer for generated bfd symbols */
1126
  elf_symbol_type *symbase;	/* Buffer for generated bfd symbols */
1125
  Elf_Internal_Sym *isym;
1127
  Elf_Internal_Sym *isym;
1126
  Elf_Internal_Sym *isymend;
1128
  Elf_Internal_Sym *isymend;
1127
  Elf_Internal_Sym *isymbuf = NULL;
1129
  Elf_Internal_Sym *isymbuf = NULL;
1128
  Elf_External_Versym *xver;
1130
  Elf_External_Versym *xver;
1129
  Elf_External_Versym *xverbuf = NULL;
1131
  Elf_External_Versym *xverbuf = NULL;
1130
  const struct elf_backend_data *ebd;
1132
  const struct elf_backend_data *ebd;
1131
  bfd_size_type amt;
1133
  bfd_size_type amt;
1132
 
1134
 
1133
  /* Read each raw ELF symbol, converting from external ELF form to
1135
  /* Read each raw ELF symbol, converting from external ELF form to
1134
     internal ELF form, and then using the information to create a
1136
     internal ELF form, and then using the information to create a
1135
     canonical bfd symbol table entry.
1137
     canonical bfd symbol table entry.
1136
 
1138
 
1137
     Note that we allocate the initial bfd canonical symbol buffer
1139
     Note that we allocate the initial bfd canonical symbol buffer
1138
     based on a one-to-one mapping of the ELF symbols to canonical
1140
     based on a one-to-one mapping of the ELF symbols to canonical
1139
     symbols.  We actually use all the ELF symbols, so there will be no
1141
     symbols.  We actually use all the ELF symbols, so there will be no
1140
     space left over at the end.  When we have all the symbols, we
1142
     space left over at the end.  When we have all the symbols, we
1141
     build the caller's pointer vector.  */
1143
     build the caller's pointer vector.  */
1142
 
1144
 
1143
  if (! dynamic)
1145
  if (! dynamic)
1144
    {
1146
    {
1145
      hdr = &elf_tdata (abfd)->symtab_hdr;
1147
      hdr = &elf_tdata (abfd)->symtab_hdr;
1146
      verhdr = NULL;
1148
      verhdr = NULL;
1147
    }
1149
    }
1148
  else
1150
  else
1149
    {
1151
    {
1150
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1152
      hdr = &elf_tdata (abfd)->dynsymtab_hdr;
1151
      if (elf_dynversym (abfd) == 0)
1153
      if (elf_dynversym (abfd) == 0)
1152
	verhdr = NULL;
1154
	verhdr = NULL;
1153
      else
1155
      else
1154
	verhdr = &elf_tdata (abfd)->dynversym_hdr;
1156
	verhdr = &elf_tdata (abfd)->dynversym_hdr;
1155
      if ((elf_dynverdef (abfd) != 0
1157
      if ((elf_dynverdef (abfd) != 0
1156
	   && elf_tdata (abfd)->verdef == NULL)
1158
	   && elf_tdata (abfd)->verdef == NULL)
1157
	  || (elf_dynverref (abfd) != 0
1159
	  || (elf_dynverref (abfd) != 0
1158
	      && elf_tdata (abfd)->verref == NULL))
1160
	      && elf_tdata (abfd)->verref == NULL))
1159
	{
1161
	{
1160
	  if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
1162
	  if (!_bfd_elf_slurp_version_tables (abfd, FALSE))
1161
	    return -1;
1163
	    return -1;
1162
	}
1164
	}
1163
    }
1165
    }
1164
 
1166
 
1165
  ebd = get_elf_backend_data (abfd);
1167
  ebd = get_elf_backend_data (abfd);
1166
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1168
  symcount = hdr->sh_size / sizeof (Elf_External_Sym);
1167
  if (symcount == 0)
1169
  if (symcount == 0)
1168
    sym = symbase = NULL;
1170
    sym = symbase = NULL;
1169
  else
1171
  else
1170
    {
1172
    {
1171
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1173
      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, symcount, 0,
1172
				      NULL, NULL, NULL);
1174
				      NULL, NULL, NULL);
1173
      if (isymbuf == NULL)
1175
      if (isymbuf == NULL)
1174
	return -1;
1176
	return -1;
1175
 
1177
 
1176
      amt = symcount;
1178
      amt = symcount;
1177
      amt *= sizeof (elf_symbol_type);
1179
      amt *= sizeof (elf_symbol_type);
1178
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1180
      symbase = (elf_symbol_type *) bfd_zalloc (abfd, amt);
1179
      if (symbase == (elf_symbol_type *) NULL)
1181
      if (symbase == (elf_symbol_type *) NULL)
1180
	goto error_return;
1182
	goto error_return;
1181
 
1183
 
1182
      /* Read the raw ELF version symbol information.  */
1184
      /* Read the raw ELF version symbol information.  */
1183
      if (verhdr != NULL
1185
      if (verhdr != NULL
1184
	  && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1186
	  && verhdr->sh_size / sizeof (Elf_External_Versym) != symcount)
1185
	{
1187
	{
1186
	  (*_bfd_error_handler)
1188
	  (*_bfd_error_handler)
1187
	    (_("%s: version count (%ld) does not match symbol count (%ld)"),
1189
	    (_("%s: version count (%ld) does not match symbol count (%ld)"),
1188
	     abfd->filename,
1190
	     abfd->filename,
1189
	     (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1191
	     (long) (verhdr->sh_size / sizeof (Elf_External_Versym)),
1190
	     symcount);
1192
	     symcount);
1191
 
1193
 
1192
	  /* Slurp in the symbols without the version information,
1194
	  /* Slurp in the symbols without the version information,
1193
	     since that is more helpful than just quitting.  */
1195
	     since that is more helpful than just quitting.  */
1194
	  verhdr = NULL;
1196
	  verhdr = NULL;
1195
	}
1197
	}
1196
 
1198
 
1197
      if (verhdr != NULL)
1199
      if (verhdr != NULL)
1198
	{
1200
	{
1199
	  if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1201
	  if (bfd_seek (abfd, verhdr->sh_offset, SEEK_SET) != 0)
1200
	    goto error_return;
1202
	    goto error_return;
1201
 
1203
 
1202
	  xverbuf = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1204
	  xverbuf = (Elf_External_Versym *) bfd_malloc (verhdr->sh_size);
1203
	  if (xverbuf == NULL && verhdr->sh_size != 0)
1205
	  if (xverbuf == NULL && verhdr->sh_size != 0)
1204
	    goto error_return;
1206
	    goto error_return;
1205
 
1207
 
1206
	  if (bfd_bread (xverbuf, verhdr->sh_size, abfd) != verhdr->sh_size)
1208
	  if (bfd_bread (xverbuf, verhdr->sh_size, abfd) != verhdr->sh_size)
1207
	    goto error_return;
1209
	    goto error_return;
1208
	}
1210
	}
1209
 
1211
 
1210
      /* Skip first symbol, which is a null dummy.  */
1212
      /* Skip first symbol, which is a null dummy.  */
1211
      xver = xverbuf;
1213
      xver = xverbuf;
1212
      if (xver != NULL)
1214
      if (xver != NULL)
1213
	++xver;
1215
	++xver;
1214
      isymend = isymbuf + symcount;
1216
      isymend = isymbuf + symcount;
1215
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1217
      for (isym = isymbuf + 1, sym = symbase; isym < isymend; isym++, sym++)
1216
	{
1218
	{
1217
	  memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1219
	  memcpy (&sym->internal_elf_sym, isym, sizeof (Elf_Internal_Sym));
1218
	  sym->symbol.the_bfd = abfd;
-
 
-
 
1220
 
1219
 
1221
	  sym->symbol.the_bfd = abfd;
1220
	  sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
-
 
1221
 
1222
	  sym->symbol.name = bfd_elf_sym_name (abfd, hdr, isym, NULL);
1222
	  sym->symbol.value = isym->st_value;
1223
	  sym->symbol.value = isym->st_value;
1223
 
1224
 
1224
	  if (isym->st_shndx == SHN_UNDEF)
1225
	  if (isym->st_shndx == SHN_UNDEF)
1225
	    {
1226
	    {
1226
	      sym->symbol.section = bfd_und_section_ptr;
1227
	      sym->symbol.section = bfd_und_section_ptr;
1227
	    }
1228
	    }
1228
	  else if (isym->st_shndx == SHN_ABS)
1229
	  else if (isym->st_shndx == SHN_ABS)
1229
	    {
1230
	    {
1230
	      sym->symbol.section = bfd_abs_section_ptr;
1231
	      sym->symbol.section = bfd_abs_section_ptr;
1231
	    }
1232
	    }
1232
	  else if (isym->st_shndx == SHN_COMMON)
1233
	  else if (isym->st_shndx == SHN_COMMON)
1233
	    {
1234
	    {
1234
	      sym->symbol.section = bfd_com_section_ptr;
1235
	      sym->symbol.section = bfd_com_section_ptr;
1235
	      if ((abfd->flags & BFD_PLUGIN) != 0)
1236
	      if ((abfd->flags & BFD_PLUGIN) != 0)
1236
		{
1237
		{
1237
		  asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1238
		  asection *xc = bfd_get_section_by_name (abfd, "COMMON");
1238
 
1239
 
1239
		  if (xc == NULL)
1240
		  if (xc == NULL)
1240
		    {
1241
		    {
1241
		      flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1242
		      flagword flags = (SEC_ALLOC | SEC_IS_COMMON | SEC_KEEP
1242
					| SEC_EXCLUDE);
1243
					| SEC_EXCLUDE);
1243
		      xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1244
		      xc = bfd_make_section_with_flags (abfd, "COMMON", flags);
1244
		      if (xc == NULL)
1245
		      if (xc == NULL)
1245
			goto error_return;
1246
			goto error_return;
1246
		    }
1247
		    }
1247
		  sym->symbol.section = xc;
1248
		  sym->symbol.section = xc;
1248
		}
1249
		}
1249
	      /* Elf puts the alignment into the `value' field, and
1250
	      /* Elf puts the alignment into the `value' field, and
1250
		 the size into the `size' field.  BFD wants to see the
1251
		 the size into the `size' field.  BFD wants to see the
1251
		 size in the value field, and doesn't care (at the
1252
		 size in the value field, and doesn't care (at the
1252
		 moment) about the alignment.  */
1253
		 moment) about the alignment.  */
1253
	      sym->symbol.value = isym->st_size;
1254
	      sym->symbol.value = isym->st_size;
1254
	    }
1255
	    }
1255
	  else
1256
	  else
1256
	    {
1257
	    {
1257
	      sym->symbol.section
1258
	      sym->symbol.section
1258
		= bfd_section_from_elf_index (abfd, isym->st_shndx);
1259
		= bfd_section_from_elf_index (abfd, isym->st_shndx);
1259
	      if (sym->symbol.section == NULL)
1260
	      if (sym->symbol.section == NULL)
1260
		{
1261
		{
1261
		  /* This symbol is in a section for which we did not
1262
		  /* This symbol is in a section for which we did not
1262
		     create a BFD section.  Just use bfd_abs_section,
1263
		     create a BFD section.  Just use bfd_abs_section,
1263
		     although it is wrong.  FIXME.  */
1264
		     although it is wrong.  FIXME.  */
1264
		  sym->symbol.section = bfd_abs_section_ptr;
1265
		  sym->symbol.section = bfd_abs_section_ptr;
1265
		}
1266
		}
1266
	    }
1267
	    }
1267
 
1268
 
1268
	  /* If this is a relocatable file, then the symbol value is
1269
	  /* If this is a relocatable file, then the symbol value is
1269
	     already section relative.  */
1270
	     already section relative.  */
1270
	  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1271
	  if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
1271
	    sym->symbol.value -= sym->symbol.section->vma;
1272
	    sym->symbol.value -= sym->symbol.section->vma;
1272
 
1273
 
1273
	  switch (ELF_ST_BIND (isym->st_info))
1274
	  switch (ELF_ST_BIND (isym->st_info))
1274
	    {
1275
	    {
1275
	    case STB_LOCAL:
1276
	    case STB_LOCAL:
1276
	      sym->symbol.flags |= BSF_LOCAL;
1277
	      sym->symbol.flags |= BSF_LOCAL;
1277
	      break;
1278
	      break;
1278
	    case STB_GLOBAL:
1279
	    case STB_GLOBAL:
1279
	      if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1280
	      if (isym->st_shndx != SHN_UNDEF && isym->st_shndx != SHN_COMMON)
1280
		sym->symbol.flags |= BSF_GLOBAL;
1281
		sym->symbol.flags |= BSF_GLOBAL;
1281
	      break;
1282
	      break;
1282
	    case STB_WEAK:
1283
	    case STB_WEAK:
1283
	      sym->symbol.flags |= BSF_WEAK;
1284
	      sym->symbol.flags |= BSF_WEAK;
1284
	      break;
1285
	      break;
1285
	    case STB_GNU_UNIQUE:
1286
	    case STB_GNU_UNIQUE:
1286
	      sym->symbol.flags |= BSF_GNU_UNIQUE;
1287
	      sym->symbol.flags |= BSF_GNU_UNIQUE;
1287
	      break;
1288
	      break;
1288
	    }
1289
	    }
1289
 
1290
 
1290
	  switch (ELF_ST_TYPE (isym->st_info))
1291
	  switch (ELF_ST_TYPE (isym->st_info))
1291
	    {
1292
	    {
1292
	    case STT_SECTION:
1293
	    case STT_SECTION:
1293
	      sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1294
	      sym->symbol.flags |= BSF_SECTION_SYM | BSF_DEBUGGING;
1294
	      break;
1295
	      break;
1295
	    case STT_FILE:
1296
	    case STT_FILE:
1296
	      sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1297
	      sym->symbol.flags |= BSF_FILE | BSF_DEBUGGING;
1297
	      break;
1298
	      break;
1298
	    case STT_FUNC:
1299
	    case STT_FUNC:
1299
	      sym->symbol.flags |= BSF_FUNCTION;
1300
	      sym->symbol.flags |= BSF_FUNCTION;
1300
	      break;
1301
	      break;
1301
	    case STT_COMMON:
1302
	    case STT_COMMON:
1302
	      /* FIXME: Do we have to put the size field into the value field
1303
	      /* FIXME: Do we have to put the size field into the value field
1303
		 as we do with symbols in SHN_COMMON sections (see above) ?  */
1304
		 as we do with symbols in SHN_COMMON sections (see above) ?  */
1304
	      /* Fall through.  */
1305
	      /* Fall through.  */
1305
	    case STT_OBJECT:
1306
	    case STT_OBJECT:
1306
	      sym->symbol.flags |= BSF_OBJECT;
1307
	      sym->symbol.flags |= BSF_OBJECT;
1307
	      break;
1308
	      break;
1308
	    case STT_TLS:
1309
	    case STT_TLS:
1309
	      sym->symbol.flags |= BSF_THREAD_LOCAL;
1310
	      sym->symbol.flags |= BSF_THREAD_LOCAL;
1310
	      break;
1311
	      break;
1311
	    case STT_RELC:
1312
	    case STT_RELC:
1312
	      sym->symbol.flags |= BSF_RELC;
1313
	      sym->symbol.flags |= BSF_RELC;
1313
	      break;
1314
	      break;
1314
	    case STT_SRELC:
1315
	    case STT_SRELC:
1315
	      sym->symbol.flags |= BSF_SRELC;
1316
	      sym->symbol.flags |= BSF_SRELC;
1316
	      break;
1317
	      break;
1317
	    case STT_GNU_IFUNC:
1318
	    case STT_GNU_IFUNC:
1318
	      sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1319
	      sym->symbol.flags |= BSF_GNU_INDIRECT_FUNCTION;
1319
	      break;
1320
	      break;
1320
	    }
1321
	    }
1321
 
1322
 
1322
	  if (dynamic)
1323
	  if (dynamic)
1323
	    sym->symbol.flags |= BSF_DYNAMIC;
1324
	    sym->symbol.flags |= BSF_DYNAMIC;
1324
 
1325
 
1325
	  if (xver != NULL)
1326
	  if (xver != NULL)
1326
	    {
1327
	    {
1327
	      Elf_Internal_Versym iversym;
1328
	      Elf_Internal_Versym iversym;
1328
 
1329
 
1329
	      _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1330
	      _bfd_elf_swap_versym_in (abfd, xver, &iversym);
1330
	      sym->version = iversym.vs_vers;
1331
	      sym->version = iversym.vs_vers;
1331
	      xver++;
1332
	      xver++;
1332
	    }
1333
	    }
1333
 
1334
 
1334
	  /* Do some backend-specific processing on this symbol.  */
1335
	  /* Do some backend-specific processing on this symbol.  */
1335
	  if (ebd->elf_backend_symbol_processing)
1336
	  if (ebd->elf_backend_symbol_processing)
1336
	    (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1337
	    (*ebd->elf_backend_symbol_processing) (abfd, &sym->symbol);
1337
	}
1338
	}
1338
    }
1339
    }
1339
 
1340
 
1340
  /* Do some backend-specific processing on this symbol table.  */
1341
  /* Do some backend-specific processing on this symbol table.  */
1341
  if (ebd->elf_backend_symbol_table_processing)
1342
  if (ebd->elf_backend_symbol_table_processing)
1342
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1343
    (*ebd->elf_backend_symbol_table_processing) (abfd, symbase, symcount);
1343
 
1344
 
1344
  /* We rely on the zalloc to clear out the final symbol entry.  */
1345
  /* We rely on the zalloc to clear out the final symbol entry.  */
1345
 
1346
 
1346
  symcount = sym - symbase;
1347
  symcount = sym - symbase;
1347
 
1348
 
1348
  /* Fill in the user's symbol pointer vector if needed.  */
1349
  /* Fill in the user's symbol pointer vector if needed.  */
1349
  if (symptrs)
1350
  if (symptrs)
1350
    {
1351
    {
1351
      long l = symcount;
1352
      long l = symcount;
1352
 
1353
 
1353
      sym = symbase;
1354
      sym = symbase;
1354
      while (l-- > 0)
1355
      while (l-- > 0)
1355
	{
1356
	{
1356
	  *symptrs++ = &sym->symbol;
1357
	  *symptrs++ = &sym->symbol;
1357
	  sym++;
1358
	  sym++;
1358
	}
1359
	}
1359
      *symptrs = 0;		/* Final null pointer */
1360
      *symptrs = 0;		/* Final null pointer */
1360
    }
1361
    }
1361
 
1362
 
1362
  if (xverbuf != NULL)
1363
  if (xverbuf != NULL)
1363
    free (xverbuf);
1364
    free (xverbuf);
1364
  if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1365
  if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1365
    free (isymbuf);
1366
    free (isymbuf);
1366
  return symcount;
1367
  return symcount;
1367
 
1368
 
1368
error_return:
1369
error_return:
1369
  if (xverbuf != NULL)
1370
  if (xverbuf != NULL)
1370
    free (xverbuf);
1371
    free (xverbuf);
1371
  if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1372
  if (isymbuf != NULL && hdr->contents != (unsigned char *) isymbuf)
1372
    free (isymbuf);
1373
    free (isymbuf);
1373
  return -1;
1374
  return -1;
1374
}
1375
}
1375
 
1376
 
1376
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1377
/* Read relocations for ASECT from REL_HDR.  There are RELOC_COUNT of
1377
   them.  */
1378
   them.  */
1378
 
1379
 
1379
static bfd_boolean
1380
static bfd_boolean
1380
elf_slurp_reloc_table_from_section (bfd *abfd,
1381
elf_slurp_reloc_table_from_section (bfd *abfd,
1381
				    asection *asect,
1382
				    asection *asect,
1382
				    Elf_Internal_Shdr *rel_hdr,
1383
				    Elf_Internal_Shdr *rel_hdr,
1383
				    bfd_size_type reloc_count,
1384
				    bfd_size_type reloc_count,
1384
				    arelent *relents,
1385
				    arelent *relents,
1385
				    asymbol **symbols,
1386
				    asymbol **symbols,
1386
				    bfd_boolean dynamic)
1387
				    bfd_boolean dynamic)
1387
{
1388
{
1388
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1389
  const struct elf_backend_data * const ebd = get_elf_backend_data (abfd);
1389
  void *allocated = NULL;
1390
  void *allocated = NULL;
1390
  bfd_byte *native_relocs;
1391
  bfd_byte *native_relocs;
1391
  arelent *relent;
1392
  arelent *relent;
1392
  unsigned int i;
1393
  unsigned int i;
1393
  int entsize;
1394
  int entsize;
1394
  unsigned int symcount;
1395
  unsigned int symcount;
1395
 
1396
 
1396
  allocated = bfd_malloc (rel_hdr->sh_size);
1397
  allocated = bfd_malloc (rel_hdr->sh_size);
1397
  if (allocated == NULL)
1398
  if (allocated == NULL)
1398
    goto error_return;
1399
    goto error_return;
1399
 
1400
 
1400
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1401
  if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
1401
      || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
1402
      || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
1402
	  != rel_hdr->sh_size))
1403
	  != rel_hdr->sh_size))
1403
    goto error_return;
1404
    goto error_return;
1404
 
1405
 
1405
  native_relocs = (bfd_byte *) allocated;
1406
  native_relocs = (bfd_byte *) allocated;
1406
 
1407
 
1407
  entsize = rel_hdr->sh_entsize;
1408
  entsize = rel_hdr->sh_entsize;
1408
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1409
  BFD_ASSERT (entsize == sizeof (Elf_External_Rel)
1409
	      || entsize == sizeof (Elf_External_Rela));
1410
	      || entsize == sizeof (Elf_External_Rela));
1410
 
1411
 
1411
  if (dynamic)
1412
  if (dynamic)
1412
    symcount = bfd_get_dynamic_symcount (abfd);
1413
    symcount = bfd_get_dynamic_symcount (abfd);
1413
  else
1414
  else
1414
    symcount = bfd_get_symcount (abfd);
1415
    symcount = bfd_get_symcount (abfd);
1415
 
1416
 
1416
  for (i = 0, relent = relents;
1417
  for (i = 0, relent = relents;
1417
       i < reloc_count;
1418
       i < reloc_count;
1418
       i++, relent++, native_relocs += entsize)
1419
       i++, relent++, native_relocs += entsize)
1419
    {
1420
    {
1420
      Elf_Internal_Rela rela;
1421
      Elf_Internal_Rela rela;
1421
 
1422
 
1422
      if (entsize == sizeof (Elf_External_Rela))
1423
      if (entsize == sizeof (Elf_External_Rela))
1423
	elf_swap_reloca_in (abfd, native_relocs, &rela);
1424
	elf_swap_reloca_in (abfd, native_relocs, &rela);
1424
      else
1425
      else
1425
	elf_swap_reloc_in (abfd, native_relocs, &rela);
1426
	elf_swap_reloc_in (abfd, native_relocs, &rela);
1426
 
1427
 
1427
      /* The address of an ELF reloc is section relative for an object
1428
      /* The address of an ELF reloc is section relative for an object
1428
	 file, and absolute for an executable file or shared library.
1429
	 file, and absolute for an executable file or shared library.
1429
	 The address of a normal BFD reloc is always section relative,
1430
	 The address of a normal BFD reloc is always section relative,
1430
	 and the address of a dynamic reloc is absolute..  */
1431
	 and the address of a dynamic reloc is absolute..  */
1431
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1432
      if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
1432
	relent->address = rela.r_offset;
1433
	relent->address = rela.r_offset;
1433
      else
1434
      else
1434
	relent->address = rela.r_offset - asect->vma;
1435
	relent->address = rela.r_offset - asect->vma;
1435
 
1436
 
1436
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1437
      if (ELF_R_SYM (rela.r_info) == STN_UNDEF)
1437
	relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1438
	relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1438
      else if (ELF_R_SYM (rela.r_info) > symcount)
1439
      else if (ELF_R_SYM (rela.r_info) > symcount)
1439
	{
1440
	{
1440
	  (*_bfd_error_handler)
1441
	  (*_bfd_error_handler)
1441
	    (_("%s(%s): relocation %d has invalid symbol index %ld"),
1442
	    (_("%s(%s): relocation %d has invalid symbol index %ld"),
1442
	     abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
1443
	     abfd->filename, asect->name, i, ELF_R_SYM (rela.r_info));
1443
	  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1444
	  relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1444
	}
1445
	}
1445
      else
1446
      else
1446
	{
1447
	{
1447
	  asymbol **ps;
1448
	  asymbol **ps;
1448
 
1449
 
1449
	  ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1450
	  ps = symbols + ELF_R_SYM (rela.r_info) - 1;
1450
 
1451
 
1451
	  relent->sym_ptr_ptr = ps;
1452
	  relent->sym_ptr_ptr = ps;
1452
	}
1453
	}
1453
 
1454
 
1454
      relent->addend = rela.r_addend;
1455
      relent->addend = rela.r_addend;
1455
 
1456
 
1456
      if ((entsize == sizeof (Elf_External_Rela)
1457
      if ((entsize == sizeof (Elf_External_Rela)
1457
	   && ebd->elf_info_to_howto != NULL)
1458
	   && ebd->elf_info_to_howto != NULL)
1458
	  || ebd->elf_info_to_howto_rel == NULL)
1459
	  || ebd->elf_info_to_howto_rel == NULL)
1459
	(*ebd->elf_info_to_howto) (abfd, relent, &rela);
1460
	(*ebd->elf_info_to_howto) (abfd, relent, &rela);
1460
      else
1461
      else
1461
	(*ebd->elf_info_to_howto_rel) (abfd, relent, &rela);
1462
	(*ebd->elf_info_to_howto_rel) (abfd, relent, &rela);
1462
    }
1463
    }
1463
 
1464
 
1464
  if (allocated != NULL)
1465
  if (allocated != NULL)
1465
    free (allocated);
1466
    free (allocated);
1466
 
1467
 
1467
  return TRUE;
1468
  return TRUE;
1468
 
1469
 
1469
 error_return:
1470
 error_return:
1470
  if (allocated != NULL)
1471
  if (allocated != NULL)
1471
    free (allocated);
1472
    free (allocated);
1472
  return FALSE;
1473
  return FALSE;
1473
}
1474
}
1474
 
1475
 
1475
/* Read in and swap the external relocs.  */
1476
/* Read in and swap the external relocs.  */
1476
 
1477
 
1477
bfd_boolean
1478
bfd_boolean
1478
elf_slurp_reloc_table (bfd *abfd,
1479
elf_slurp_reloc_table (bfd *abfd,
1479
		       asection *asect,
1480
		       asection *asect,
1480
		       asymbol **symbols,
1481
		       asymbol **symbols,
1481
		       bfd_boolean dynamic)
1482
		       bfd_boolean dynamic)
1482
{
1483
{
1483
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1484
  struct bfd_elf_section_data * const d = elf_section_data (asect);
1484
  Elf_Internal_Shdr *rel_hdr;
1485
  Elf_Internal_Shdr *rel_hdr;
1485
  Elf_Internal_Shdr *rel_hdr2;
1486
  Elf_Internal_Shdr *rel_hdr2;
1486
  bfd_size_type reloc_count;
1487
  bfd_size_type reloc_count;
1487
  bfd_size_type reloc_count2;
1488
  bfd_size_type reloc_count2;
1488
  arelent *relents;
1489
  arelent *relents;
1489
  bfd_size_type amt;
1490
  bfd_size_type amt;
1490
 
1491
 
1491
  if (asect->relocation != NULL)
1492
  if (asect->relocation != NULL)
1492
    return TRUE;
1493
    return TRUE;
1493
 
1494
 
1494
  if (! dynamic)
1495
  if (! dynamic)
1495
    {
1496
    {
1496
      if ((asect->flags & SEC_RELOC) == 0
1497
      if ((asect->flags & SEC_RELOC) == 0
1497
	  || asect->reloc_count == 0)
1498
	  || asect->reloc_count == 0)
1498
	return TRUE;
1499
	return TRUE;
1499
 
1500
 
1500
      rel_hdr = d->rel.hdr;
1501
      rel_hdr = d->rel.hdr;
1501
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1502
      reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
1502
      rel_hdr2 = d->rela.hdr;
1503
      rel_hdr2 = d->rela.hdr;
1503
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
1504
      reloc_count2 = rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0;
-
 
1505
 
1504
 
1506
      /* PR 17512: file: 0b4f81b7.  */
-
 
1507
      if (asect->reloc_count != reloc_count + reloc_count2)
1505
      BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
1508
	return FALSE;
1506
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1509
      BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
1507
		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1510
		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
1508
 
1511
 
1509
    }
1512
    }
1510
  else
1513
  else
1511
    {
1514
    {
1512
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1515
      /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
1513
	 case because relocations against this section may use the
1516
	 case because relocations against this section may use the
1514
	 dynamic symbol table, and in that case bfd_section_from_shdr
1517
	 dynamic symbol table, and in that case bfd_section_from_shdr
1515
	 in elf.c does not update the RELOC_COUNT.  */
1518
	 in elf.c does not update the RELOC_COUNT.  */
1516
      if (asect->size == 0)
1519
      if (asect->size == 0)
1517
	return TRUE;
1520
	return TRUE;
1518
 
1521
 
1519
      rel_hdr = &d->this_hdr;
1522
      rel_hdr = &d->this_hdr;
1520
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1523
      reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
1521
      rel_hdr2 = NULL;
1524
      rel_hdr2 = NULL;
1522
      reloc_count2 = 0;
1525
      reloc_count2 = 0;
1523
    }
1526
    }
1524
 
1527
 
1525
  amt = (reloc_count + reloc_count2) * sizeof (arelent);
1528
  amt = (reloc_count + reloc_count2) * sizeof (arelent);
1526
  relents = (arelent *) bfd_alloc (abfd, amt);
1529
  relents = (arelent *) bfd_alloc (abfd, amt);
1527
  if (relents == NULL)
1530
  if (relents == NULL)
1528
    return FALSE;
1531
    return FALSE;
1529
 
1532
 
1530
  if (rel_hdr
1533
  if (rel_hdr
1531
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1534
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1532
					      rel_hdr, reloc_count,
1535
					      rel_hdr, reloc_count,
1533
					      relents,
1536
					      relents,
1534
					      symbols, dynamic))
1537
					      symbols, dynamic))
1535
    return FALSE;
1538
    return FALSE;
1536
 
1539
 
1537
  if (rel_hdr2
1540
  if (rel_hdr2
1538
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1541
      && !elf_slurp_reloc_table_from_section (abfd, asect,
1539
					      rel_hdr2, reloc_count2,
1542
					      rel_hdr2, reloc_count2,
1540
					      relents + reloc_count,
1543
					      relents + reloc_count,
1541
					      symbols, dynamic))
1544
					      symbols, dynamic))
1542
    return FALSE;
1545
    return FALSE;
1543
 
1546
 
1544
  asect->relocation = relents;
1547
  asect->relocation = relents;
1545
  return TRUE;
1548
  return TRUE;
1546
}
1549
}
1547
 
1550
 
1548
#if DEBUG & 2
1551
#if DEBUG & 2
1549
static void
1552
static void
1550
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1553
elf_debug_section (int num, Elf_Internal_Shdr *hdr)
1551
{
1554
{
1552
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1555
  fprintf (stderr, "\nSection#%d '%s' 0x%.8lx\n", num,
1553
	   hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1556
	   hdr->bfd_section != NULL ? hdr->bfd_section->name : "",
1554
	   (long) hdr);
1557
	   (long) hdr);
1555
  fprintf (stderr,
1558
  fprintf (stderr,
1556
	   "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1559
	   "sh_name      = %ld\tsh_type      = %ld\tsh_flags     = %ld\n",
1557
	   (long) hdr->sh_name,
1560
	   (long) hdr->sh_name,
1558
	   (long) hdr->sh_type,
1561
	   (long) hdr->sh_type,
1559
	   (long) hdr->sh_flags);
1562
	   (long) hdr->sh_flags);
1560
  fprintf (stderr,
1563
  fprintf (stderr,
1561
	   "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1564
	   "sh_addr      = %ld\tsh_offset    = %ld\tsh_size      = %ld\n",
1562
	   (long) hdr->sh_addr,
1565
	   (long) hdr->sh_addr,
1563
	   (long) hdr->sh_offset,
1566
	   (long) hdr->sh_offset,
1564
	   (long) hdr->sh_size);
1567
	   (long) hdr->sh_size);
1565
  fprintf (stderr,
1568
  fprintf (stderr,
1566
	   "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1569
	   "sh_link      = %ld\tsh_info      = %ld\tsh_addralign = %ld\n",
1567
	   (long) hdr->sh_link,
1570
	   (long) hdr->sh_link,
1568
	   (long) hdr->sh_info,
1571
	   (long) hdr->sh_info,
1569
	   (long) hdr->sh_addralign);
1572
	   (long) hdr->sh_addralign);
1570
  fprintf (stderr, "sh_entsize   = %ld\n",
1573
  fprintf (stderr, "sh_entsize   = %ld\n",
1571
	   (long) hdr->sh_entsize);
1574
	   (long) hdr->sh_entsize);
1572
  fflush (stderr);
1575
  fflush (stderr);
1573
}
1576
}
1574
#endif
1577
#endif
1575
 
1578
 
1576
#if DEBUG & 1
1579
#if DEBUG & 1
1577
static void
1580
static void
1578
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1581
elf_debug_file (Elf_Internal_Ehdr *ehdrp)
1579
{
1582
{
1580
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1583
  fprintf (stderr, "e_entry      = 0x%.8lx\n", (long) ehdrp->e_entry);
1581
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1584
  fprintf (stderr, "e_phoff      = %ld\n", (long) ehdrp->e_phoff);
1582
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1585
  fprintf (stderr, "e_phnum      = %ld\n", (long) ehdrp->e_phnum);
1583
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1586
  fprintf (stderr, "e_phentsize  = %ld\n", (long) ehdrp->e_phentsize);
1584
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1587
  fprintf (stderr, "e_shoff      = %ld\n", (long) ehdrp->e_shoff);
1585
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1588
  fprintf (stderr, "e_shnum      = %ld\n", (long) ehdrp->e_shnum);
1586
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1589
  fprintf (stderr, "e_shentsize  = %ld\n", (long) ehdrp->e_shentsize);
1587
}
1590
}
1588
#endif
1591
#endif
1589

1592

1590
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1593
/* Create a new BFD as if by bfd_openr.  Rather than opening a file,
1591
   reconstruct an ELF file by reading the segments out of remote memory
1594
   reconstruct an ELF file by reading the segments out of remote
1592
   based on the ELF file header at EHDR_VMA and the ELF program headers it
1595
   memory based on the ELF file header at EHDR_VMA and the ELF program
-
 
1596
   headers it points to.  If non-zero, SIZE is the known extent of the
1593
   points to.  If not null, *LOADBASEP is filled in with the difference
1597
   object.  If not null, *LOADBASEP is filled in with the difference
1594
   between the VMAs from which the segments were read, and the VMAs the
1598
   between the VMAs from which the segments were read, and the VMAs
1595
   file headers (and hence BFD's idea of each section's VMA) put them at.
1599
   the file headers (and hence BFD's idea of each section's VMA) put
-
 
1600
   them at.
1596
 
1601
 
1597
   The function TARGET_READ_MEMORY is called to copy LEN bytes from the
1602
   The function TARGET_READ_MEMORY is called to copy LEN bytes from
1598
   remote memory at target address VMA into the local buffer at MYADDR; it
1603
   the remote memory at target address VMA into the local buffer at
1599
   should return zero on success or an `errno' code on failure.  TEMPL must
1604
   MYADDR; it should return zero on success or an `errno' code on
1600
   be a BFD for a target with the word size and byte order found in the
1605
   failure.  TEMPL must be a BFD for a target with the word size and
1601
   remote memory.  */
1606
   byte order found in the remote memory.  */
1602
 
1607
 
1603
bfd *
1608
bfd *
1604
NAME(_bfd_elf,bfd_from_remote_memory)
1609
NAME(_bfd_elf,bfd_from_remote_memory)
1605
  (bfd *templ,
1610
  (bfd *templ,
1606
   bfd_vma ehdr_vma,
1611
   bfd_vma ehdr_vma,
-
 
1612
   bfd_size_type size,
1607
   bfd_vma *loadbasep,
1613
   bfd_vma *loadbasep,
1608
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1614
   int (*target_read_memory) (bfd_vma, bfd_byte *, bfd_size_type))
1609
{
1615
{
1610
  Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
1616
  Elf_External_Ehdr x_ehdr;	/* Elf file header, external form */
1611
  Elf_Internal_Ehdr i_ehdr;	/* Elf file header, internal form */
1617
  Elf_Internal_Ehdr i_ehdr;	/* Elf file header, internal form */
1612
  Elf_External_Phdr *x_phdrs;
1618
  Elf_External_Phdr *x_phdrs;
1613
  Elf_Internal_Phdr *i_phdrs, *last_phdr;
1619
  Elf_Internal_Phdr *i_phdrs, *last_phdr, *first_phdr;
1614
  bfd *nbfd;
1620
  bfd *nbfd;
1615
  struct bfd_in_memory *bim;
1621
  struct bfd_in_memory *bim;
1616
  int contents_size;
-
 
1617
  bfd_byte *contents;
1622
  bfd_byte *contents;
1618
  int err;
1623
  int err;
1619
  unsigned int i;
1624
  unsigned int i;
-
 
1625
  bfd_vma high_offset;
-
 
1626
  bfd_vma shdr_end;
1620
  bfd_vma loadbase;
1627
  bfd_vma loadbase;
1621
  bfd_boolean loadbase_set;
-
 
1622
 
1628
 
1623
  /* Read in the ELF header in external format.  */
1629
  /* Read in the ELF header in external format.  */
1624
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1630
  err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr, sizeof x_ehdr);
1625
  if (err)
1631
  if (err)
1626
    {
1632
    {
1627
      bfd_set_error (bfd_error_system_call);
1633
      bfd_set_error (bfd_error_system_call);
1628
      errno = err;
1634
      errno = err;
1629
      return NULL;
1635
      return NULL;
1630
    }
1636
    }
1631
 
1637
 
1632
  /* Now check to see if we have a valid ELF file, and one that BFD can
1638
  /* Now check to see if we have a valid ELF file, and one that BFD can
1633
     make use of.  The magic number must match, the address size ('class')
1639
     make use of.  The magic number must match, the address size ('class')
1634
     and byte-swapping must match our XVEC entry.  */
1640
     and byte-swapping must match our XVEC entry.  */
1635
 
1641
 
1636
  if (! elf_file_p (&x_ehdr)
1642
  if (! elf_file_p (&x_ehdr)
1637
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1643
      || x_ehdr.e_ident[EI_VERSION] != EV_CURRENT
1638
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1644
      || x_ehdr.e_ident[EI_CLASS] != ELFCLASS)
1639
    {
1645
    {
1640
      bfd_set_error (bfd_error_wrong_format);
1646
      bfd_set_error (bfd_error_wrong_format);
1641
      return NULL;
1647
      return NULL;
1642
    }
1648
    }
1643
 
1649
 
1644
  /* Check that file's byte order matches xvec's */
1650
  /* Check that file's byte order matches xvec's */
1645
  switch (x_ehdr.e_ident[EI_DATA])
1651
  switch (x_ehdr.e_ident[EI_DATA])
1646
    {
1652
    {
1647
    case ELFDATA2MSB:		/* Big-endian */
1653
    case ELFDATA2MSB:		/* Big-endian */
1648
      if (! bfd_header_big_endian (templ))
1654
      if (! bfd_header_big_endian (templ))
1649
	{
1655
	{
1650
	  bfd_set_error (bfd_error_wrong_format);
1656
	  bfd_set_error (bfd_error_wrong_format);
1651
	  return NULL;
1657
	  return NULL;
1652
	}
1658
	}
1653
      break;
1659
      break;
1654
    case ELFDATA2LSB:		/* Little-endian */
1660
    case ELFDATA2LSB:		/* Little-endian */
1655
      if (! bfd_header_little_endian (templ))
1661
      if (! bfd_header_little_endian (templ))
1656
	{
1662
	{
1657
	  bfd_set_error (bfd_error_wrong_format);
1663
	  bfd_set_error (bfd_error_wrong_format);
1658
	  return NULL;
1664
	  return NULL;
1659
	}
1665
	}
1660
      break;
1666
      break;
1661
    case ELFDATANONE:		/* No data encoding specified */
1667
    case ELFDATANONE:		/* No data encoding specified */
1662
    default:			/* Unknown data encoding specified */
1668
    default:			/* Unknown data encoding specified */
1663
      bfd_set_error (bfd_error_wrong_format);
1669
      bfd_set_error (bfd_error_wrong_format);
1664
      return NULL;
1670
      return NULL;
1665
    }
1671
    }
1666
 
1672
 
1667
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1673
  elf_swap_ehdr_in (templ, &x_ehdr, &i_ehdr);
1668
 
1674
 
1669
  /* The file header tells where to find the program headers.
1675
  /* The file header tells where to find the program headers.
1670
     These are what we use to actually choose what to read.  */
1676
     These are what we use to actually choose what to read.  */
1671
 
1677
 
1672
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1678
  if (i_ehdr.e_phentsize != sizeof (Elf_External_Phdr) || i_ehdr.e_phnum == 0)
1673
    {
1679
    {
1674
      bfd_set_error (bfd_error_wrong_format);
1680
      bfd_set_error (bfd_error_wrong_format);
1675
      return NULL;
1681
      return NULL;
1676
    }
1682
    }
1677
 
1683
 
1678
  x_phdrs = (Elf_External_Phdr *)
1684
  x_phdrs = (Elf_External_Phdr *)
1679
      bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
1685
      bfd_malloc (i_ehdr.e_phnum * (sizeof *x_phdrs + sizeof *i_phdrs));
1680
  if (x_phdrs == NULL)
1686
  if (x_phdrs == NULL)
1681
    {
-
 
1682
      bfd_set_error (bfd_error_no_memory);
-
 
1683
      return NULL;
1687
    return NULL;
1684
    }
-
 
1685
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1688
  err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs,
1686
			    i_ehdr.e_phnum * sizeof x_phdrs[0]);
1689
			    i_ehdr.e_phnum * sizeof x_phdrs[0]);
1687
  if (err)
1690
  if (err)
1688
    {
1691
    {
1689
      free (x_phdrs);
1692
      free (x_phdrs);
1690
      bfd_set_error (bfd_error_system_call);
1693
      bfd_set_error (bfd_error_system_call);
1691
      errno = err;
1694
      errno = err;
1692
      return NULL;
1695
      return NULL;
1693
    }
1696
    }
1694
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
1697
  i_phdrs = (Elf_Internal_Phdr *) &x_phdrs[i_ehdr.e_phnum];
-
 
1698
 
1695
 
1699
  high_offset = 0;
-
 
1700
  loadbase = 0;
1696
  contents_size = 0;
1701
  first_phdr = NULL;
1697
  last_phdr = NULL;
-
 
1698
  loadbase = ehdr_vma;
-
 
1699
  loadbase_set = FALSE;
1702
  last_phdr = NULL;
1700
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1703
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1701
    {
1704
    {
1702
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1705
      elf_swap_phdr_in (templ, &x_phdrs[i], &i_phdrs[i]);
1703
      if (i_phdrs[i].p_type == PT_LOAD)
1706
      if (i_phdrs[i].p_type == PT_LOAD)
1704
	{
1707
	{
1705
	  bfd_vma segment_end;
-
 
1706
	  segment_end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1708
	  bfd_vma segment_end = i_phdrs[i].p_offset + i_phdrs[i].p_filesz;
1707
			 + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
-
 
1708
	  if (segment_end > (bfd_vma) contents_size)
-
 
1709
	    contents_size = segment_end;
-
 
1710
 
1709
 
1711
	  /* LOADADDR is the `Base address' from the gELF specification:
-
 
1712
	     `lowest p_vaddr value for a PT_LOAD segment' is P_VADDR from the
-
 
1713
	     first PT_LOAD as PT_LOADs are ordered by P_VADDR.  */
-
 
1714
	  if (!loadbase_set && (i_phdrs[i].p_offset & -i_phdrs[i].p_align) == 0)
1710
	  if (segment_end > high_offset)
1715
	    {
1711
	    {
1716
	      loadbase = ehdr_vma - (i_phdrs[i].p_vaddr & -i_phdrs[i].p_align);
1712
	      high_offset = segment_end;
1717
	      loadbase_set = TRUE;
1713
	      last_phdr = &i_phdrs[i];
1718
	    }
1714
	    }
-
 
1715
 
-
 
1716
	  /* If this program header covers offset zero, where the file
-
 
1717
	     header sits, then we can figure out the loadbase.  */
-
 
1718
	  if (first_phdr == NULL)
-
 
1719
	    {
-
 
1720
	      bfd_vma p_offset = i_phdrs[i].p_offset;
-
 
1721
	      bfd_vma p_vaddr = i_phdrs[i].p_vaddr;
-
 
1722
 
-
 
1723
	      if (i_phdrs[i].p_align > 1)
-
 
1724
		{
-
 
1725
		  p_offset &= -i_phdrs[i].p_align;
-
 
1726
		  p_vaddr &= -i_phdrs[i].p_align;
-
 
1727
		}
-
 
1728
	      if (p_offset == 0)
-
 
1729
		{
1719
 
1730
		  loadbase = ehdr_vma - p_vaddr;
-
 
1731
		  first_phdr = &i_phdrs[i];
-
 
1732
		}
1720
	  last_phdr = &i_phdrs[i];
1733
	    }
1721
	}
1734
	}
1722
    }
1735
    }
1723
  if (last_phdr == NULL)
1736
  if (high_offset == 0)
1724
    {
1737
    {
1725
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1738
      /* There were no PT_LOAD segments, so we don't have anything to read.  */
1726
      free (x_phdrs);
1739
      free (x_phdrs);
1727
      bfd_set_error (bfd_error_wrong_format);
1740
      bfd_set_error (bfd_error_wrong_format);
1728
      return NULL;
1741
      return NULL;
1729
    }
1742
    }
1730
 
-
 
1731
  /* Trim the last segment so we don't bother with zeros in the last page
-
 
1732
     that are off the end of the file.  However, if the extra bit in that
-
 
1733
     page includes the section headers, keep them.  */
-
 
1734
  if ((bfd_vma) contents_size > last_phdr->p_offset + last_phdr->p_filesz
1743
 
1735
      && (bfd_vma) contents_size >= (i_ehdr.e_shoff
1744
  shdr_end = 0;
1736
				     + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1745
  if (i_ehdr.e_shoff != 0 && i_ehdr.e_shnum != 0 && i_ehdr.e_shentsize != 0)
1737
    {
1746
    {
-
 
1747
      shdr_end = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1738
      contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1748
 
-
 
1749
      if (last_phdr->p_filesz != last_phdr->p_memsz)
1739
      if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1750
	{
1740
				     + i_ehdr.e_shnum * i_ehdr.e_shentsize))
1751
	  /* If the last PT_LOAD header has a bss area then ld.so will
-
 
1752
	     have cleared anything past p_filesz, zapping the section
1741
	contents_size = i_ehdr.e_shoff + i_ehdr.e_shnum * i_ehdr.e_shentsize;
1753
	     headers.  */
-
 
1754
	}
-
 
1755
      else if (size >= shdr_end)
1742
    }
1756
	high_offset = size;
-
 
1757
      else
-
 
1758
	{
1743
  else
1759
	  bfd_vma page_size = get_elf_backend_data (templ)->minpagesize;
-
 
1760
	  bfd_vma segment_end = last_phdr->p_offset + last_phdr->p_filesz;
-
 
1761
 
-
 
1762
	  /* Assume we loaded full pages, allowing us to sometimes see
-
 
1763
	     section headers.  */
-
 
1764
	  if (page_size > 1 && shdr_end > segment_end)
-
 
1765
	    {
-
 
1766
	      bfd_vma page_end = (segment_end + page_size - 1) & -page_size;
-
 
1767
 
-
 
1768
	      if (page_end >= shdr_end)
-
 
1769
		/* Whee, section headers covered.  */
-
 
1770
		high_offset = shdr_end;
-
 
1771
	    }
-
 
1772
	}
1744
    contents_size = last_phdr->p_offset + last_phdr->p_filesz;
1773
    }
1745
 
1774
 
1746
  /* Now we know the size of the whole image we want read in.  */
1775
  /* Now we know the size of the whole image we want read in.  */
1747
  contents = (bfd_byte *) bfd_zmalloc (contents_size);
1776
  contents = (bfd_byte *) bfd_zmalloc (high_offset);
1748
  if (contents == NULL)
1777
  if (contents == NULL)
1749
    {
1778
    {
1750
      free (x_phdrs);
1779
      free (x_phdrs);
1751
      bfd_set_error (bfd_error_no_memory);
-
 
1752
      return NULL;
1780
      return NULL;
1753
    }
1781
    }
1754
 
1782
 
1755
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1783
  for (i = 0; i < i_ehdr.e_phnum; ++i)
1756
    if (i_phdrs[i].p_type == PT_LOAD)
1784
    if (i_phdrs[i].p_type == PT_LOAD)
1757
      {
1785
      {
1758
	bfd_vma start = i_phdrs[i].p_offset & -i_phdrs[i].p_align;
1786
	bfd_vma start = i_phdrs[i].p_offset;
1759
	bfd_vma end = (i_phdrs[i].p_offset + i_phdrs[i].p_filesz
1787
	bfd_vma end = start + i_phdrs[i].p_filesz;
1760
		       + i_phdrs[i].p_align - 1) & -i_phdrs[i].p_align;
1788
	bfd_vma vaddr = i_phdrs[i].p_vaddr;
-
 
1789
 
-
 
1790
	/* Extend the beginning of the first pt_load to cover file
-
 
1791
	   header and program headers, if we proved earlier that its
-
 
1792
	   aligned offset is 0.  */
1761
	if (end > (bfd_vma) contents_size)
1793
	if (first_phdr == &i_phdrs[i])
-
 
1794
	  {
-
 
1795
	    vaddr -= start;
1762
	  end = contents_size;
1796
	    start = 0;
-
 
1797
	  }
1763
	err = target_read_memory ((loadbase + i_phdrs[i].p_vaddr)
1798
	/* Extend the end of the last pt_load to cover section headers.  */
1764
				  & -i_phdrs[i].p_align,
1799
	if (last_phdr == &i_phdrs[i])
-
 
1800
	  end = high_offset;
-
 
1801
	err = target_read_memory (loadbase + vaddr,
1765
				  contents + start, end - start);
1802
				  contents + start, end - start);
1766
	if (err)
1803
	if (err)
1767
	  {
1804
	  {
1768
	    free (x_phdrs);
1805
	    free (x_phdrs);
1769
	    free (contents);
1806
	    free (contents);
1770
	    bfd_set_error (bfd_error_system_call);
1807
	    bfd_set_error (bfd_error_system_call);
1771
	    errno = err;
1808
	    errno = err;
1772
	    return NULL;
1809
	    return NULL;
1773
	  }
1810
	  }
1774
      }
1811
      }
1775
  free (x_phdrs);
1812
  free (x_phdrs);
1776
 
1813
 
1777
  /* If the segments visible in memory didn't include the section headers,
1814
  /* If the segments visible in memory didn't include the section headers,
1778
     then clear them from the file header.  */
1815
     then clear them from the file header.  */
1779
  if ((bfd_vma) contents_size < (i_ehdr.e_shoff
1816
  if (high_offset < shdr_end)
1780
				 + i_ehdr.e_shnum * i_ehdr.e_shentsize))
-
 
1781
    {
1817
    {
1782
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1818
      memset (&x_ehdr.e_shoff, 0, sizeof x_ehdr.e_shoff);
1783
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1819
      memset (&x_ehdr.e_shnum, 0, sizeof x_ehdr.e_shnum);
1784
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1820
      memset (&x_ehdr.e_shstrndx, 0, sizeof x_ehdr.e_shstrndx);
1785
    }
1821
    }
1786
 
1822
 
1787
  /* This will normally have been in the first PT_LOAD segment.  But it
1823
  /* This will normally have been in the first PT_LOAD segment.  But it
1788
     conceivably could be missing, and we might have just changed it.  */
1824
     conceivably could be missing, and we might have just changed it.  */
1789
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1825
  memcpy (contents, &x_ehdr, sizeof x_ehdr);
1790
 
1826
 
1791
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1827
  /* Now we have a memory image of the ELF file contents.  Make a BFD.  */
1792
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1828
  bim = (struct bfd_in_memory *) bfd_malloc (sizeof (struct bfd_in_memory));
1793
  if (bim == NULL)
1829
  if (bim == NULL)
1794
    {
1830
    {
1795
      free (contents);
1831
      free (contents);
1796
      bfd_set_error (bfd_error_no_memory);
-
 
1797
      return NULL;
1832
      return NULL;
1798
    }
1833
    }
1799
  nbfd = _bfd_new_bfd ();
1834
  nbfd = _bfd_new_bfd ();
1800
  if (nbfd == NULL)
1835
  if (nbfd == NULL)
1801
    {
1836
    {
1802
      free (bim);
1837
      free (bim);
1803
      free (contents);
1838
      free (contents);
1804
      bfd_set_error (bfd_error_no_memory);
-
 
1805
      return NULL;
1839
      return NULL;
1806
    }
1840
    }
1807
  nbfd->filename = "";
1841
  nbfd->filename = xstrdup ("");
1808
  nbfd->xvec = templ->xvec;
1842
  nbfd->xvec = templ->xvec;
1809
  bim->size = contents_size;
1843
  bim->size = high_offset;
1810
  bim->buffer = contents;
1844
  bim->buffer = contents;
1811
  nbfd->iostream = bim;
1845
  nbfd->iostream = bim;
1812
  nbfd->flags = BFD_IN_MEMORY;
1846
  nbfd->flags = BFD_IN_MEMORY;
1813
  nbfd->iovec = &_bfd_memory_iovec;
1847
  nbfd->iovec = &_bfd_memory_iovec;
1814
  nbfd->origin = 0;
1848
  nbfd->origin = 0;
1815
  nbfd->direction = read_direction;
1849
  nbfd->direction = read_direction;
1816
  nbfd->mtime = time (NULL);
1850
  nbfd->mtime = time (NULL);
1817
  nbfd->mtime_set = TRUE;
1851
  nbfd->mtime_set = TRUE;
1818
 
1852
 
1819
  if (loadbasep)
1853
  if (loadbasep)
1820
    *loadbasep = loadbase;
1854
    *loadbasep = loadbase;
1821
  return nbfd;
1855
  return nbfd;
1822
}
1856
}
1823
 
1857
 
1824
/* Function for ELF_R_INFO.  */
1858
/* Function for ELF_R_INFO.  */
1825
 
1859
 
1826
bfd_vma
1860
bfd_vma
1827
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
1861
NAME(elf,r_info) (bfd_vma sym, bfd_vma type)
1828
{
1862
{
1829
  return ELF_R_INFO (sym, type);
1863
  return ELF_R_INFO (sym, type);
1830
}
1864
}
1831
 
1865
 
1832
/* Function for ELF_R_SYM.  */
1866
/* Function for ELF_R_SYM.  */
1833
 
1867
 
1834
bfd_vma
1868
bfd_vma
1835
NAME(elf,r_sym) (bfd_vma r_info)
1869
NAME(elf,r_sym) (bfd_vma r_info)
1836
{
1870
{
1837
  return ELF_R_SYM (r_info);
1871
  return ELF_R_SYM (r_info);
1838
}
1872
}
1839

1873

1840
#include "elfcore.h"
1874
#include "elfcore.h"
1841

1875

1842
/* Size-dependent data and functions.  */
1876
/* Size-dependent data and functions.  */
1843
const struct elf_size_info NAME(_bfd_elf,size_info) = {
1877
const struct elf_size_info NAME(_bfd_elf,size_info) = {
1844
  sizeof (Elf_External_Ehdr),
1878
  sizeof (Elf_External_Ehdr),
1845
  sizeof (Elf_External_Phdr),
1879
  sizeof (Elf_External_Phdr),
1846
  sizeof (Elf_External_Shdr),
1880
  sizeof (Elf_External_Shdr),
1847
  sizeof (Elf_External_Rel),
1881
  sizeof (Elf_External_Rel),
1848
  sizeof (Elf_External_Rela),
1882
  sizeof (Elf_External_Rela),
1849
  sizeof (Elf_External_Sym),
1883
  sizeof (Elf_External_Sym),
1850
  sizeof (Elf_External_Dyn),
1884
  sizeof (Elf_External_Dyn),
1851
  sizeof (Elf_External_Note),
1885
  sizeof (Elf_External_Note),
1852
  4,
1886
  4,
1853
  1,
1887
  1,
1854
  ARCH_SIZE, LOG_FILE_ALIGN,
1888
  ARCH_SIZE, LOG_FILE_ALIGN,
1855
  ELFCLASS, EV_CURRENT,
1889
  ELFCLASS, EV_CURRENT,
1856
  elf_write_out_phdrs,
1890
  elf_write_out_phdrs,
1857
  elf_write_shdrs_and_ehdr,
1891
  elf_write_shdrs_and_ehdr,
1858
  elf_checksum_contents,
1892
  elf_checksum_contents,
1859
  elf_write_relocs,
1893
  elf_write_relocs,
1860
  elf_swap_symbol_in,
1894
  elf_swap_symbol_in,
1861
  elf_swap_symbol_out,
1895
  elf_swap_symbol_out,
1862
  elf_slurp_reloc_table,
1896
  elf_slurp_reloc_table,
1863
  elf_slurp_symbol_table,
1897
  elf_slurp_symbol_table,
1864
  elf_swap_dyn_in,
1898
  elf_swap_dyn_in,
1865
  elf_swap_dyn_out,
1899
  elf_swap_dyn_out,
1866
  elf_swap_reloc_in,
1900
  elf_swap_reloc_in,
1867
  elf_swap_reloc_out,
1901
  elf_swap_reloc_out,
1868
  elf_swap_reloca_in,
1902
  elf_swap_reloca_in,
1869
  elf_swap_reloca_out
1903
  elf_swap_reloca_out
1870
};
1904
};