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