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