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